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')
I added an undo button in my add on
https://youtu.be/zDejCFBsWvg