2
$\begingroup$

I am trying to write a little script that checks if mesh has more than one material, and if it does, remove materials until there is only one left on the item. Here is what I have so far:

import bpy
for ob in bpy.data.objects:
    number_of_mats = len(ob.material_slots.items())
    if number_of_mats > 1:
        for i in range(number_of_mats-1):
            # remove material here?

I cannot seem to figure out the method to remove a mat at this point. Any suggestions?

$\endgroup$
2
$\begingroup$

You can set the index of the list to 1, iterate through the upcoming slots, call and override the context of material_slot_remove(). Demo on how to remove all slots > 0:

for obj in bpy.context.selected_editable_objects:
    obj.active_material_index = 1
    for i in range(1, len(obj.material_slots)):
        bpy.ops.object.material_slot_remove({'object': obj})
$\endgroup$
0
$\begingroup$

When I remove a material in the ui, this is echo'd:

bpy.context.object.active_material_index = 2
bpy.ops.object.material_slot_remove()

Looks like the documentation live here.

Hope that helps, Koen

$\endgroup$
0
$\begingroup$

You can also do it without operators

import bpy
for ob in bpy.data.objects:
    # Skip things without materials (armatures, etc.)
    if not hasattr(ob.data, 'materials'):
        continue

    while len(ob.data.materials) > 1:
        ob.data.materials.pop()
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.