7
$\begingroup$

Lets assume you have 1 object with 4 modifiers added to it. I am curious how one would approach the task to apply all or to delete all modifiers of a just selected object that has many modifiers already added.

The console reads out the modifier delete as

bpy.ops.object.modifier_remove(modifier="Box Right ")

So "Box Right " I might have to replace with something like active.object.modifier.name and then work each modifier off?

This would be very helpful when you want to generate a static mesh for animation or 3D printing.

$\endgroup$
3
  • $\begingroup$ related, very: blender.stackexchange.com/questions/7196/… $\endgroup$
    – zeffii
    Jan 7, 2016 at 23:37
  • $\begingroup$ Ok let me try to figure this own. thank you! $\endgroup$ Jan 7, 2016 at 23:45
  • 1
    $\begingroup$ A short way to apply and remove all modifiers on the active objects is bpy.ops.object.convert(target='MESH') this is the operator called when using Alt-C -> Mesh from curve $\endgroup$
    – sambler
    Jan 8, 2016 at 15:06

1 Answer 1

16
$\begingroup$

Modifier removal

To remove a modifier from an object.

obj below is a reference to an object either obtained via

obj = bpy.context.active_object
obj = bpy.context.object
# or
obj = bpy.data.objects[name]

If you want to remove a modifier it is done by name, not by type. You could have multiple array modifiers, but only want to remove a specific one.

modifier_to_remove = obj.modifiers.get("Bevel")
obj.modifiers.remove(modifier_to_remove)

# or as a one-liner
obj.modifiers.remove(obj.modifiers.get("Bevel"))

# or remove all modifiers from an object
obj.modifiers.clear()

Modifier Apply

Using an operator

As sambler pointed out

# operates on all selected objects (not just the scene's _active_object_)
bpy.ops.object.convert(target='MESH')

lower level

If you want to apply all modifiers it's covered here: How to get a new mesh with modifiers applied using Blender Python API? - This involves using obj.to_mesh and there are a few things to consider, it:

  • generates a new mesh from your current obj (leaves current obj.data intact)
  • does not remove the modifiers automatically from the object. (unlike the Apply button on the Modifiers panel, or Convert to Mesh).

This snippet will:

"""
- make a reference to the current obj.data ( i call it old_mesh)
- make a new Mesh ( new_mesh) using the effect of the combined modifiers on `obj`
- remove all modifiers from `obj`
- assign the new Mesh to obj.data 
- remove old_mesh from the blend
"""

in code:

import bpy

context = bpy.context
scene = context.scene
obj = context.object

# get a reference to the current obj.data
old_mesh = obj.data

# settings for to_mesh
apply_modifiers = True
settings = 'PREVIEW'
new_mesh = obj.to_mesh(scene, apply_modifiers, settings)

# object will still have modifiers, remove them
obj.modifiers.clear()

# assign the new mesh to obj.data 
obj.data = new_mesh

# remove the old mesh from the .blend
bpy.data.meshes.remove(old_mesh)
$\endgroup$
2
  • $\begingroup$ modifiers.clear() is really great. i used to remove modifiers sequentially, but if you have many modifiers it can cause the whole stack to update per removal. $\endgroup$
    – patmo141
    Mar 24, 2018 at 15:11
  • $\begingroup$ Is there a way to make this work with the SURFACE_DEFORM mod? Also related to this, is there are way to bind a surface deform mod without bpy.ops.object.surfacedeform_bind()? $\endgroup$
    – MACHIN3
    Jun 10, 2018 at 13:20

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .