Для быстрого поиска и выделения объектов, у которых отсутствуют материалы, можно использовать возможности Blender Python API и написать скрипт, состоящий буквально из нескольких строчек.
Для начала нам нужно пройти во всем объектам сцены в цикле и обработать только те из них, которые имеют тип “меш”:
1 2 |
for obj in bpy.data.objects: if obj.type == 'MESH': |
В простейшем случае, когда меш может или иметь только один материал или не иметь материала совсем, мы можем проверить свойство меша active_material, которе отвечает за указание на текущий активный материал меша. Если это свойство не пустое – значит на меше есть материал.
Для выделения меша воспользуемся методом select_set в параметре которого будем передавать оценку наличия материала: False – если материал есть (такие меши выделять не нужно) и True – если материала нет.
Для активного объекта, у которого нет активного материала:
1 2 |
not bool(bpy.context.object.active_material) # True |
И все вместе:
1 2 3 |
for obj in bpy.data.objects: if obj.type == 'MESH': obj.select_set(not bool(obj.active_material)) |
Таким образом мы выделим те объекты, у которых нет активного материала.
Однако возможен и более сложный случай, когда у объекта есть материал, но он не активный, то есть расположен не текущем активном слоте.
Чтобы не включать подобные объекты в наше выделение, немного изменим код.
Для начала проверим, есть ли данного объекта слоты материала. Если нет – выделяем его.
1 2 |
if len(obj.material_slots) == 0: obj.select_set(True) |
Если слоты есть, проверим, есть ли хотя бы одни слот в котором есть материал и если такого слота нет – выделим объект:
1 2 3 |
else: mat = any(slot for slot in obj.material_slots if slot.material) obj.select_set(not bool(mat)) |
Все вместе:
1 2 3 4 5 6 7 |
for obj in bpy.data.objects: if obj.type == 'MESH': if len(obj.material_slots) == 0: obj.select_set(True) else: mat = any(slot for slot in obj.material_slots if slot.material) obj.select_set(not bool(mat)) |