Call function from main thread

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 12/04/2011 at 10:07, xxxxxxxx wrote:

Hello,

the python documentation states for DrawViews(...) :
"Redraws the editor views. Must be called from the main thread!"

So, how do I control which thread is calling my Python Node (or how to know which thread is calling)?
When I try to call the "add" button within the Mograph-Multishader by python:

multishader = material[c4d.MATERIAL_COLOR_SHADER];  
c4d.CallButton(multishader, 1002) #MGMULTISHADER_ADD = 1002,

I get the error:
RuntimeError: Illegal operation. Invalid cross-thread call.

This happens from a Python Node within XPresso.
How can I prevent/control that ?

Thank you,
maxx

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 12/04/2011 at 12:14, xxxxxxxx wrote:

This is not documentated for nodes yet. The hooks for Python in the Python Generator, Python Tag and Python Node are called in a threaded context. Within this hooks you should never call GUI stuff or change the document hierarchy. Methods which are called in a threaded context are documentated with this note:

Important: This function is called in a thread context.
_
_
What exactly do you want to achieve? Maybe there is a workaround for this.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 12/04/2011 at 14:23, xxxxxxxx wrote:

Hy there,

my goal is to automate the loading of Bitmap-Shaders into the MoGraph multi-shader.

I already tried to insert the shader directly to the multishader:

shn = c4d.BaseList2D(c4d.Xbitmap)
 
mat[c4d.MATERIAL_COLOR_SHADER] = shn
material.InsertShader(shn,sh)
material.Message(c4d.MSG_UPDATE)
material.Update(True,True)
c4d.EventAdd()

But this will not work. Actually, the shader is in the (internal) list, but it won't show up in the multi-shader and also has no effect.

So I tried to use the "Add" button, to add the shaders. Yea, desperate measures ;)

Is it then possible to add a hook from within a Python Node which gets called by the main-thread?

Can you give me an example, how to use that CallButton(..) function in the right context ?

Thank you,
maxx

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 01/06/2011 at 09:35, xxxxxxxx wrote:

Sorry for the late reply. I will check out if I can provide you with an example.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 02/06/2011 at 08:26, xxxxxxxx wrote:

.. that would be nice, thank you

On 21/04/2014 at 13:36, xxxxxxxx wrote:

curious if you ever found a solution. Running into this now too. Seems kind of silly we can't call a button in a pynode

On 02/05/2014 at 06:27, xxxxxxxx wrote:

It's by design. A button could do things that you really don't want to happen from an Expression.
Use c4d.SpecialEventAdd() and listen to it with a MessageData plugin. That's one of the work arounds,
but it's not possible without coding a real plugin.

-Niklas

On 02/05/2014 at 16:06, xxxxxxxx wrote:

Dang! I'll look into the SpecialEventAdd. Thanks Niklas.