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
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
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()