How to apply a modifier in Python, creating a new mesh?

10,876

Solution 1

I suppose you're using the 2.6 API.

bpy.ops.object.modifier_apply (modifier='EdgeSplit')

...applies to the currently active object its Edge Split modifier. Note that it's object.modifier_apply (...)

You can use

bpy.context.scene.objects.active = my_object

to set the active object. Note that it's objects.active.

Also, check the modifier_apply docs. Lot's of stuff you can only do with bpy.ops.*.

EDIT: Just saw you need a new (presumably temporary) mesh object. Just do

bpy.ops.object.duplicate()

after you set the active object and the new active object then becomes the duplicate (it retains any added modifier; if it was an object named 'Cube', it duplicates it, makes it active and names it 'Cube.001') to which you can then apply the modifier. Hope this was clear enough :)

EDIT: Note, that bpy.ops.object.duplicate() uses not active object, but selected. To ensure the correct object is selected and duplicated do this

bpy.ops.object.select_all(action = 'DESELECT')
object.select = True

Solution 2

There is another way, which seems better suited for custom exporters: Call the to_mesh method on the object you want to export. It gives you a copy of the object's mesh with all the modifiers applied. Use it like this:

mesh = your_object.to_mesh(scene = bpy.context.scene, apply_modifiers = True, settings = 'PREVIEW')

Then use the returned mesh to write any data you need into your custom format. The original object (including it's data) will stay unchanged and the returned mesh can be discarded after the export is finished.

Check the Blender Python API Docs for more info.

There is one possible issue with this method. I'm not sure you can use it to apply only one specific modifier, if you have more than one defined. It seems to apply all of them, so it might not be useful in your case.

Share:
10,876
damix911
Author by

damix911

Updated on June 06, 2022

Comments

  • damix911
    damix911 almost 2 years

    Let's say I have a bpy.types.Object containing a bpy.types.Mesh data field; how can I apply one of the modifiers associated with the object, in order to obtain a NEW bpy.types.Mesh, possibly contained within a NEW bpy.types.Object, thus leaving the original scene unchaged?

    I'm interested in applying the EdgeSplit modifier right before exporting vertex data to my custom format; the reason why I want to do this is to have Blender automatically and transparently duplicate the vertices shared by two faces with very different orientations.