10

I need some help in removing all material slots in one go using a python script. I am able to use this, would prefer to ave all removed.

bpy.context.object.active_material_index = 0
bpy.ops.object.material_slot_remove()
bpy.context.object.active_material_index = 1
bpy.ops.object.material_slot_remove()
bpy.context.object.active_material_index = 2
bpy.ops.object.material_slot_remove()
lemon
  • 60,295
  • 3
  • 66
  • 136
Michael Teiniker
  • 1,094
  • 1
  • 12
  • 26

3 Answers3

11

You can set the index of the list to 0, iterate through all slots and override the context of material_slot_remove().

Blender 3.2+

import bpy
from bpy import context

for obj in context.selected_editable_objects: obj.active_material_index = 0 for i in range(len(obj.material_slots)): with context.temp_override(object=obj): bpy.ops.object.material_slot_remove()

Blender 2.8+

import bpy

for obj in bpy.context.selected_editable_objects: obj.active_material_index = 0 for i in range(len(obj.material_slots)): bpy.ops.object.material_slot_remove({'object': obj})

p2or
  • 15,860
  • 10
  • 83
  • 143
brockmann
  • 12,613
  • 4
  • 50
  • 93
6
import bpy #import the blender python library
for x in bpy.context.object.material_slots: #For all of the materials in the selected object:
    bpy.context.object.active_material_index = 0 #select the top material
    bpy.ops.object.material_slot_remove() #delete it
4

You can also remove all material slots without calling the operator at all, so you don't have to bother with indexes:

bpy.context.object.data.materials.clear()

In general, I would always try to avoid calling operators unless they do something very specific that is difficult to achieve via calling usual API functions.

Febulix
  • 66
  • 2
  • That would remove the materials, not the slots. – Yousuf Chaudhry Jun 15 '22 at 12:31
  • Sort of. All materials get removed from the data-block by removing all material slots as well. Afterwards the materials do still exist, but they are no longer linked to the object. Unfortunately the Blender API is not very specific here. – Febulix Jun 15 '22 at 15:24
  • Wonder if calling object.data.materials.clear() then calling object.material_slot_remove_unused() is a safe idea - if it works, could be a better solution I guess – jupiterbjy May 28 '23 at 21:28