Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    Creating subobjects

    SDK Help
    0
    5
    503
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      Helper
      last edited by

      On 09/02/2016 at 09:44, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   R15-R17 
      Platform:   Windows  ;   
      Language(s) :     C++  ;

      ---------
      Probably this is an stupid question but I'm totally newbie to C4D itself (not only SDK) but as far as I could imagine this should work...

      Lets imagine I have an ObjectData called OD_A and other called OD_B I can create both properly from plugins menu and all is ok, but at certain point I need to create several OD_B instances inside my OD_A

      And I did something like:

      for(int i=0;i<maximumB;i++)
      {
      BaseObject* obj = BaseObject::Alloc(ID_OD_B);
      if (obj)
      {
      OD_B* node = (OD_B* )obj->GetNodeData();
      obj->SetName(myName _);
      //obj->InsertUnder(virtualparent);
      }
      }

      but nothing seems to happen, obviusly the code is already running since I can insert a messagebox in the if(obj) part and it was shown.

      Thank you to everyone in advance.

      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        On 09/02/2016 at 10:14, xxxxxxxx wrote:

        Have you inserted the 'virtualparent' into the document (GetActiveDocument())?  Typically it goes like this:

        // Allocate and insert object into document
        BaseObject* objA = BaseObject::Alloc(type_A);
        if (objA)
        {
        	// Insert object into current document
        	GetActiveDocument()->InsertObject(objA, NULL, NULL);
        	// Notify to update everything
        	EventAdd();
        	BaseObject* objB = BaseObject::Alloc(type_b);
        	if (objB)
        	{
        		// Insert object as child of first objA
        		objB->InsertUnder(objA);
        		EventAdd();
        	}
        }
        
        1 Reply Last reply Reply Quote 0
        • H
          Helper
          last edited by

          On 09/02/2016 at 10:21, xxxxxxxx wrote:

          👏 THANK YOU SO MUCH!!!

          I've spent lots of ours without any luck trying to figure this!!!

          1 Reply Last reply Reply Quote 0
          • H
            Helper
            last edited by

            On 10/02/2016 at 09:10, xxxxxxxx wrote:

            Hi,

            sorry for being late to the party.
            Actually you don't tell us, where you want to execute your code.
            But as a general rule, you shouldn't use GetActiveDocument() in NodeData derived plugins (so this applies for ObjectData as well). Instead you should rather retrieve the document from the node (e.g. obj->GetDocument()).
            The thing is, these NodeData plugins get executed in situations, where there is no active document (e.g. when being rendered).

            Next thing of course, always check for nullptrs. Never ever use GetActiveDocument()->..., because there could be a nullptr returned. Of course there may be situations, where you can be sure to have an active document. And if you are, the above code can still be fine. But you should think about it to make sure.

            Same is true, when using GetDocument() on a node. There are situations, where a node is not inserted in a document (for example in CopyTo() situations, the destination node). So you need to check for nullptr there as well.

            So please keep this in mind. As I said, I can't tell if it's wrong in your case, but you should rather check.

            1 Reply Last reply Reply Quote 0
            • H
              Helper
              last edited by

              On 10/02/2016 at 10:02, xxxxxxxx wrote:

              thank you for the tips!

              1 Reply Last reply Reply Quote 0
              • First post
                Last post