Список материалов, используемых объектом, можно создать, пройдя через многоугольники сетки.
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()
, который удалит последний слот в списке, если вы не найдете экземпляр элемента пользовательского интерфейса и не настроите его свойства.