Storing Custom BaseList2D Type in BaseDocument

On 23/12/2014 at 16:59, xxxxxxxx wrote:

Hi,

How would I go about storing a custom type that inherits from c4d.BaseList2D inside of a c4d.documents.BaseDocument? Basically I want to create my own class of object similar to a LayerObject or RenderData and store it inside of a document.

Specifically, I'm trying to store a LayerComp class. I'm currently doing this by storing all of the data in a BaseContainer saved in the c4d.ID_BS_HOOK scene hook - but I don't get the benefit of animation, selection, or Undo support automatically.

I think I'm looking for something like document.InsertObject() - but for my own custom data type - and I don't see anything in the API for this specific case.
Thanks!

Donovan

On 24/12/2014 at 00:45, xxxxxxxx wrote:

Hello,

for such custom objects you can create a class directly based on NodeData. Custom data types are something completely different.

Best wishes,
Sebastian

On 24/12/2014 at 08:28, xxxxxxxx wrote:

Could you please tell us how to get the data from a NodeData plugin?

The docs tell us this much:

NODE_PLUGIN_ID = 1000006  
  
class MyNode(plugins.NodeData) :   
    
  def Init(self, node) :      
      ndData = node.GetDataInstance()  
      ndData.SetString(1000,"My String value")  
      ndData.SetLong(1001, 55)  
      return True  
        
  def Message(self, node, type, data) :  
      doc = c4d.GetActiveDocument()  
      bc = node.GetDataInstance()  
      return True  
        
  def Read(self, node, hf, level) :  
      hf.ReadString(ndData[1000])  
      hf.ReadLong(ndData[1001])      
      return True  
  
  def Write(self, node, hf) :  
      hf.WriteString(ndData[1000])  
      hf.WriteLong(ndData[1001])  
      return True  
  
if __name__ == "__main__":  
  plugins.RegisterNodePlugin(NODE_PLUGIN_ID, "My Node", 0, MyNode(),None, 0)

That's works for creating the plugin...But how do we get at it's data?
In the script manager. I've tried using this: myplugin = c4d.plugins.FindPlugin(1000006, c4d.PLUGINTYPE_ANY)
But I can't seem to get it to return the data values in the plugin that way.

-ScottA

*Edit:
Can we create an instance of it in memory?  Or does this Node need to be physically created in the document like a tag? Maybe that's why I'm not getting any values from it?
If it needs to be physically in the document. Then how do we do that? Do we attach it to a Tag plugin?
The deeper I dive into this. The more I realize how much information is missing from the docs.

On 24/12/2014 at 12:19, xxxxxxxx wrote:

Thanks for pointing me in the right direction in terms of which class to use. Now, after I've created my own NodeData object - how do I insert it into my document?

I want the data to be stored in the document, but I don't want it to show up in the OM, or the Materials Manager - I want to be able to read/write the objects into/from the document and display them in a custom dialog. I think I'm looking for the equivalent of doc.InsertObject() and doc.GetFirstObject() - but I want it for my custom LayerComp class.

On 24/12/2014 at 12:51, xxxxxxxx wrote:

^I have a C++ example of adding a custom Node plugin to the document using a SceneHook plugin.
Which sounds like what you're asking for.
But the problem is that Python has never supported the SceneHook plugins.

I haven't used R16 that much. Are SceneHook plugins supported now?
If not. Maybe we can add a custom Node using a hidden tag, or some other work around?

-ScottA

On 26/12/2014 at 11:21, xxxxxxxx wrote:

I'd like to avoid hidden objects/tags as they're still part of the scene hierarchy and subject to the influence of scene layers. Perhaps this is a problem that can only be solved via the C++ SDK. Thanks!