Sending a message to an objectdata plugin

On 26/09/2017 at 15:08, xxxxxxxx wrote:

Is it possible to send a message to a object data plugin?

I am using this little script to trigger an object data plugin.

def main() :
    
    plugin_2_obj = c4d.plugins.FindPlugin(plugin_id)
    MY_CUSTOM_MSG_ID = 4
    python_object_to_send = [1,2,3,4,4] 
    plugin_2_obj.Message(MY_CUSTOM_MSG_ID, python_object_to_send )
  
if __name__=='__main__':
    main()

In the object data plugin I have following:

    def Message(self, node, type, data) :
        if (type == 4) : print "type: ", type
        return True

On 27/09/2017 at 01:19, xxxxxxxx wrote:

Hello,

a NodeData base plugin can only receive the data of special, hardcoded messages. So if you want to sent data to that plugin you must use a registered message type/ID.

There is a message c4d.MSG_BASECONTAINER which allows to send a BaseContainer. It seems that it can be used to send arbitrary data.

  
bc = c4d.BaseContainer()  
bc.SetInt32(0, 100)  
bc.SetInt32(1, 200)  
  
op.Message(c4d.MSG_BASECONTAINER, bc)  
  
def Message(self, node, type, data) :  
  
  if type == c4d.MSG_BASECONTAINER:  
      print("Data:")  
      for value in data:  
          print(value)  

But please test carefully if this has any side effects.

BTW why are you using FindPlugin()? This is not used to access an instance of an ObjectData plugin in a document.

best wishes,
Sebastian

On 27/09/2017 at 01:47, xxxxxxxx wrote:

Another solution could be to use CoreMessage.
https://plugincafe.maxon.net/topic/6808/7564_how-to-identify-different-calls-to-coremessage

So it's the time for asking what the difference beetwen Message and Core Message?
As I understand Message are only send to one object using node.Message()
While CoreMessage are propagate throught all nodes

On 27/09/2017 at 02:13, xxxxxxxx wrote:

Hello,

core messages do NOT propagate through all nodes. Please read the Core Messages Manual carefully.

best wishes,
Sebastian

On 27/09/2017 at 02:59, xxxxxxxx wrote:

Thanks for correct me, was not sure about that!

So what's the difference beetween both? (I speak in term of implementation)

On 27/09/2017 at 03:13, xxxxxxxx wrote:

"BTW why are you using  FindPlugin()? This is   **not  **used to access an instance of an ObjectData plugin in a document."

I need to send a message to the plugin. So I need the plugin object and FindPlugin() gives me the object (I thought).

On 27/09/2017 at 03:45, xxxxxxxx wrote:

An ObjectData return an object, so basicly you do

obj = doc.GetFirstObject()
if not obj.CheckType(YOUR_PLUGIN_ID) : return
  
bc = c4d.BaseContainer()
bc.SetInt32(0, 100)
bc.SetInt32(1, 200)
obj.Message(c4d.MSG_BASECONTAINER, bc)

FindPlugin only give you a BasePlugin which is not an instance of your ObjectData object

c4d.plugins.BasePlugin :
Represents a registered Cinema 4D plugin. Cannot be instantiated.

On 27/09/2017 at 05:32, xxxxxxxx wrote:

Ok, clear.
Thanks, Pim