使用 python 删除单个对象上未使用的材料
delete unused materials on a single object using python
合并和分离对象后,我在单个对象上有 69 个 material,但只有 50% 被该对象使用。如何为每个对象创建未使用 material 的列表?
我已经尝试了页面上的解决方案 (https://blender.stackexchange.com/questions/4817/how-to-know-which-object-is-using-a-material),但我的问题是 materials 被分配给了插槽,但网格的任何面上都没有使用插槽。我必须删除那些。
对象使用的 material 列表可以通过网格多边形生成。
used_mats = []
for f in obj.data.polygons:
used_mats.append(obj.material_slots[f.material_index].material)
如果我们使用 sets,我们可以获得一个唯一的列表,并从列出的 material 中减去使用的 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
您可能还想遍历并删除不同插槽中相同 material 的重复项。
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()
将删除列表中的最后一个插槽,除非您找到 UI 项目的实例并调整其属性。
合并和分离对象后,我在单个对象上有 69 个 material,但只有 50% 被该对象使用。如何为每个对象创建未使用 material 的列表?
我已经尝试了页面上的解决方案 (https://blender.stackexchange.com/questions/4817/how-to-know-which-object-is-using-a-material),但我的问题是 materials 被分配给了插槽,但网格的任何面上都没有使用插槽。我必须删除那些。
对象使用的 material 列表可以通过网格多边形生成。
used_mats = []
for f in obj.data.polygons:
used_mats.append(obj.material_slots[f.material_index].material)
如果我们使用 sets,我们可以获得一个唯一的列表,并从列出的 material 中减去使用的 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
您可能还想遍历并删除不同插槽中相同 material 的重复项。
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()
将删除列表中的最后一个插槽,除非您找到 UI 项目的实例并调整其属性。