How i can recognize changes on my mesh

Hi,

is there a way to recognize changes are done with the knife or extrude operations.
I need information about new added vertices and faces, so that my script can make some calculations.

Some hints would be nice :slight_smile:

First you will have to keep the status of edit modes. You must know when the user enters the EDIT mode and when not. After that you will have to store the initial vertex size when entered and compare it to one when exit.


import bpy
import time


objectHasChanged = False


class MeshChangeNotifier(bpy.types.Operator):
    bl_idname = "wm.modal_meshchangenotifier"
    bl_label = "Mesh Change Notifier"


    timer = None
    
    modeCurrent = None
    modePrevious = None
    
    objectCurrent = None
    objectPrevious = None
    
    objectVerticesCurrent = 0    
    objectVerticesPrevious = 0
    
    editModeEnter = False
    editModeExit = False
    
    def modal(self, context, event):
        if event.type in {"ESC"}:
            self.cancel(context)
            return {"CANCELLED"}


        if context.object.type != "MESH":
            print("Object is not a mesh")
            return {"PASS_THROUGHT"}
        
        if self.objectCurrent != self.objectPrevious:
            print("Objects are not the same")
            return {"PASS_THROUGHT"}


        if event.type == "TIMER":
            self.updateModeStatus(context.mode)
            
            if self.editModeEnter:
                print("Edit Mode Enter")
                self.objectVerticesPrevious = self.getObjectVertices(context.object)
            
            if self.editModeExit:
                print("Edit Mode Exit")
                self.objectVerticesCurrent = self.getObjectVertices(context.object)


                global objectHasChanged                
                if self.objectVerticesPrevious != self.objectVerticesCurrent:
                    objectHasChanged = True
                else:
                    objectHasChanged = False
                    
                print("Object Changed", objectHasChanged)


        return {"PASS_THROUGH"}
    
    def updateModeStatus(self, mode):
        self.modePrevious = self.modeCurrent
        self.modeCurrent = mode


        self.editModeExit = False
        self.editModeEnter = False
        
        if self.modePrevious == "EDIT_MESH" and self.modeCurrent != "EDIT_MESH":
            self.editModeExit = True
                    
        if self.modePrevious != "EDIT_MESH" and self.modeCurrent == "EDIT_MESH":
            self.editModeEnter = True
        
    def getObjectVertices(self, object):
       return len(object.data.vertices.values()) 
        
    def execute(self, context):
        self.timer = context.window_manager.event_timer_add(0.1, context.window)
        context.window_manager.modal_handler_add(self)
        global objectHasChanged
        objectHasChanged = False
        print("Mesh Change Notifier Started")
        return {'RUNNING_MODAL'}


    def cancel(self, context):
        context.window_manager.event_timer_remove(self.timer)
        print("Mesh Change Notifier Stopped")


try:
    bpy.utils.unregister_class(ModalCheckEditModeExit)
except:
    pass


# Register
bpy.utils.register_class(MeshChangeNotifier)
# Test run
bpy.ops.wm.modal_meshchangenotifier()