Undo for a TagData?
-
I have a TagData Python plugin. It uses a loop to iterate all the children of the object it's applied to and changes their parameters after the hierarchy changes. All that happens in Execute().
I tried to wrap it all with usual Start/Add/EndUndo(). But.. It doesn't work.
I simplified the code to check how it works. So after the trigger action it simply changes the main node name.doc.StartUndo() doc.AddUndo(c4d.UNDOTYPE_CHANGE, op) op.SetName("blah") doc.EndUndo() c4d.EventAdd()
It does not undo the name change back on user undo.
What am I doing wrong? -
Hi,
you cannot add or invoke Undos in the execution of nodes (e.g.:
TagData.Execute
), because it runs in a threaded context. See Threading Information.Cheers,
zipit -
You should only create undos for changes done by the user while interacting with the document:
No undos should be created in expressions or generators etc. Undos should be created when the user interacts with the scene.
See Undo System Manual.
-
I forgot about that totally...
But maybe is there a way to catch the undo and do something before the actual undo?
I tried to catch MSG_DESCRIPTION_INITUNDO through the Message() but it didn't work too, all I get is None -
As said previously this is not possible in the execute method to add an undo event because this execute method is called during the execute.
But if I understood correctly you have an UserData attached then this UD drive children parameters. If that's the case you can react to this parameter change (coming from the GUI which is a Main Thread thing) and then apply the undo.
You can find an example in https://developers.maxon.net/forum/topic/12479/update-button/3Cheers,
Maxime.