tagplugin workflow

On 27/09/2014 at 06:10, xxxxxxxx wrote:

I have a tagplugin with userdata defined in Init(self, node).
Of course only when if (len(node.GetUserDataContainer()) == 0).

What I see happening is that for every change in the userdata Init(), Execute() and Message() are triggered.

So, what is the best place to process user input?
For example when a slider in Userdata is changed?

I guess it should be Execute(). But Execute() is called in a thread context. and thus not everything is possible. For example gui.RenameDialog() is not possible "invalid cross-thread call".

I can not use Message() because I do not know which message should I handle.
It is not MSG_DESCRIPTION_COMMAND or MSG_DESCRIPTION_EDIT_ENTRY.

On 30/09/2014 at 07:37, xxxxxxxx wrote:

MSG_DESCRIPTION_COMMAND is triggered when your tag has a button that is pressed - that is the best location where to open GUI commands.

Never call any blocking operations in TagData.Execute. Imagine you press play and a dialog opens for every frame.

Cheers, s_rath

On 30/09/2014 at 10:27, xxxxxxxx wrote:

But how can I detect a slider interaction with MSG_DESCRIPTION_COMMAND?
There is no data or id.

What´s about

if (type == c4d.MSG_DESCRIPTION_USERINTERACTION_END) :
all ud values must be storerd in a variable and be compared for any userinteraction.

Is this the best way to handle this?? Or just cumbersome?

best wishes
Martin

edit or if it is a slider that should be updated in realtime
if (type == c4d.MSG_DESCRIPTION_CHECKUPDATE)

On 30/09/2014 at 23:46, xxxxxxxx wrote:

So, what is the best place to process user input?
For example when a slider in Userdata is changed?

I guess it should be Execute(). But Execute() is called in a thread context. and thus not everything is possible. For example gui.RenameDialog() is not possible "invalid cross-thread call".

I can not use Message() because I do not know which message should I handl