Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
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? Thanks,
Donovan
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 pass 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 return True
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.
-Niklas
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.