How To Make My Addon Support “Undo” In Blender
GOAL
Today’s goal is to implement “Undo” in my Blender addon.
Environment
Blender 2.83
Windows10
Method
Add bl_options “UNDO” or “UNDO_GROUPED” into the your custom operator. It’s easy.
UNDO Undo: Push an undo event (needed for operator redo).
from Blender2.93.2 Python API Documentation
UNDO_GROUPED: Grouped Undo, Push a single undo event for repeated instances of this operator.
The following is an example.
class ADDMATRIX_add_cube(bpy.types.Operator): bl_idname = 'add_matrix_obj.add_cube' bl_label = "Add matrix cube" bl_options = {'REGISTER', "UNDO"} # Add "UNDO" option here input1: bpy.props.IntProperty() input2: bpy.props.IntProperty() def execute(self, context): for xi in range(self.input1): x = xi*1.2 for yi in range(self.input2): y = yi*1.2 bpy.ops.mesh.primitive_cube_add(size=0.5, enter_editmode=False, align='WORLD', location=(x, y, 0)) return {'FINISHED'}
Postscript
be aware of the error where Blender crashed when undo after executing script in python console. (Reference: Fix T86293: crash undoing after executing the python console in certain)
That was fixed in Blender 2.93, the latest version. And You can fix the error by adding bl_options “UNDO_GROUPED” into the ConsoleExec operation in C:/Program Files/Blender Foundation/Blender 2.83/2.83/scripts/startup/bl_operators/console.py.
class ConsoleExec(Operator): """Execute the current console line as a python expression""" bl_idname = "console.execute" bl_label = "Console Execute" bl_options = {"UNDO_GROUPED"} # add undo here interactive: BoolProperty( options={'SKIP_SAVE'}, ) @classmethod def poll(cls, context): return (context.area and context.area.type == 'CONSOLE')