удалить неиспользуемые материалы на одном объекте с помощью Python - PullRequest
0 голосов
/ 09 июня 2019

После объединения и разделения объектов у меня есть 69 материалов на один объект, но только 50% из них используются этим объектом. Как я могу создать список неиспользованных материалов для каждого объекта?

Я пробовал решение на странице (https://blender.stackexchange.com/questions/4817/how-to-know-which-object-is-using-a-material), но моя проблема в том, что материалы назначены слотам, но слоты не используются ни на одной грани сетки. Я должен удалить их.

1 Ответ

0 голосов
/ 12 июня 2019

Список материалов, используемых объектом, можно создать, пройдя через многоугольники сетки.

used_mats = []
for f in obj.data.polygons:
    used_mats.append(obj.material_slots[f.material_index].material)

Если мы используем наборы , мы можем получить уникальный список и вычесть использованные материалыиз перечисленных материалов.

import bpy

for obj in [o for o in bpy.data.objects if o.type=='MESH']:
    mat_list = set(ms.material for ms in obj.material_slots)
    used_mats = set(obj.material_slots[f.material_index].material
                     for f in obj.data.polygons)

    unused_mats = mat_list - used_mats

    print(obj.name, unused_mats)

    for ms in obj.material_slots:
        if ms.material in unused_mats:
            ms.material = None

Вы также можете просмотреть и удалить дубликаты одного и того же материала в разных слотах.

for obj in [o for o in bpy.data.objects if o.type=='MESH']:
    for ms in obj.material_slots:
        for cs in [s for s in obj.material_slots if s != ms]:
            if cs.material == ms.material:
                cs.material = None

Хотя это просто очищает неиспользуемые и дублирующие слоты, естьэто шаг удаления любых теперь неиспользуемых слотов.Существует bpy.ops.object.material_slot_remove(), который удалит последний слот в списке, если вы не найдете экземпляр элемента пользовательского интерфейса и не настроите его свойства.

...