使用python删除单个对象上未使用的材料

时间:2019-06-09 15:42:26

标签: python blender

在合并和分离对象之后,我在单个对象上有69种材质,但是该对象仅使用其中的50%。如何为每个对象创建未使用材料的列表?

我已经尝试过页面(https://blender.stackexchange.com/questions/4817/how-to-know-which-object-is-using-a-material)上的解决方案,但是我的问题是将材料分配给了插槽,但是网格的任何面上都没有使用插槽。我必须删除那些。

1 个答案:

答案 0 :(得分:0)

可以通过遍历网格多边形来生成对象使用的材料列表。

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

如果使用sets,我们可以获得唯一的列表,并从列出的材料中减去用过的材料。

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

虽然仅清除未使用和重复的插槽,但是有一个步骤删除所有现在未使用的插槽。除非您找到UI项的实例并调整其属性,否则bpy.ops.object.material_slot_remove()会删除列表中的最后一个插槽。