On 29/03/2013 at 20:29, xxxxxxxx wrote:
What's the best way to execute a block of code whenever a new object, tag, track, or marker has been created somewhere in the current document?
I'm currently using a MessageData plugin and listening for c4d.EVMSG_CHANGE - but this gives a lot of false positives and counting all objects/tags every time this message arrives seems wasteful. Is there a more specific message that I can be listening for?
On 04/04/2013 at 13:47, xxxxxxxx wrote:
Okay, I'm not sure if this is the best method, but I listen for c4d.EVMSG_CHANGE and then I check to see whether a new object, or material has been selected by comparing the active object to a cache from the last time the EVMSG_CHANGE message was received. Because the code I'm running is rather light, I'm okay with the number of false-positives this will receive:
class MyMessageData(c4d.plugins.MessageData) :
def __init__(self) :
#Caches to help test whether there are new objects or materials
self.active_object_cache = None
self.active_mat_cache = None
def GetTimer(self) :
return 0 #Don't update on a timer
def CoreMessage(self, id, bc) :
#Listen for a change to the document
if id == c4d.EVMSG_CHANGE:
doc = c4d.documents.GetActiveDocument()
active_object = doc.GetActiveObject()
active_mat = doc.GetActiveMaterial()
#Check to see whether a new object or material has been selected
#This is a hack way of checking for new objects in the scene
#NOTE: This will result in some false positives every time
#selection changes but no object has been created
diff_obj = active_object != self.active_object_cache
diff_mat = active_mat != self.active_mat_cache
if diff_obj or diff_mat:
#There's a new selection
self.active_object_cache = active_object
self.active_mat_cache = active_mat
#EXECUTING CODE GOES HERE
On 04/04/2013 at 14:14, xxxxxxxx wrote:
Isn't EVMSG_CHANGE also sent when the selection changes? Didn't check it, though.
I unfortunately do not know a better way to check. I could really need this as well.
On 04/04/2013 at 15:29, xxxxxxxx wrote:
Yes, it also updates with selection changes. I'm tempted to store an object count cache as well and compare that when the selection changes, but I'm not sure if that will be any faster.