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

    BaseObject from PolygonObject?

    Scheduled Pinned Locked Moved SDK Help
    8 Posts 0 Posters 557 Views
    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 Offline
      Helper
      last edited by

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

      On 20/07/2007 at 11:16, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   R9-r10 
      Platform:   Windows  ; Mac  ;  Mac OSX  ; 
      Language(s) :     C++  ;

      ---------
         Howdy,

      OK, this is probably very simple, but I just can't get my head around it.

      in a CommandData plugin, I have a function that creates a PolygonObject and inserts it into the document. The function is based on this example code from the SDK docs in the Modeling library:

        
      AutoAlloc<PolygonObject> obj(0,0);  
      if (!obj) return FALSE;  
        
      AutoAlloc<Modeling> mod;  
      if (!mod || !mod->InitObject(obj)) return FALSE;  
        
      LONG a = mod->AddPoint(obj, Vector(0,0,0));  
      LONG b = mod->AddPoint(obj, Vector(100,0,0));  
      LONG c = mod->AddPoint(obj, Vector(150,50,0));  
      LONG d = mod->AddPoint(obj, Vector(100,100,0));  
      LONG e = mod->AddPoint(obj, Vector(0,100,0));  
      if (!a || !b || !c || !d || !e) return FALSE;  
        
      LONG padr[] = {a,b,c,d,e};  
      LONG cnt = sizeof(padr)/sizeof(padr[0]);  
        
      LONG i = mod->CreateNgon(obj, padr, cnt);  
      if (!i) return FALSE;  
        
      if (!mod->Commit()) return FALSE;  
        
      doc->InsertObject(obj.Release(), NULL, NULL);  
      EventAdd();  
      

      The problem is, that the function needs to return a BaseObject pointer to the Execute() function in the CommandData:

        
      BaseObject *polyOp = CreatePolygonObject(doc,op);  
      if(!polyOp)  
      {  
            GePrint("no polyOp");  
            return TRUE;  
      }  
      .... perform other operations on polyOp ...  
      

      The function is setup like this:

        
      BaseObject* CreatePolygonObject(BaseDocument *doc,BaseObject *op)  
      {  
            AutoAlloc<PolygonObject> obj(0,0);  
            if (!obj) return NULL;  
        
            ..... code to create polygon object ....  
              
            return static_cast<BaseObject*>(obj);  
      }  
      

      The function creates the object alright and inserts it into the document, but upon returning to the Execute() function, the console prints "no polyOp" and the Execute() function returns without continuing the rest of the operations on the object.

      What is the proper way to return a BaseObject pointer?
      I've tried several different things on the return. The above example is just the latest thing I tried. 😞

      Adios,
      Cactus Dan

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

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

        On 20/07/2007 at 12:44, xxxxxxxx wrote:

        AutoAlloc<> is your problem. With AutoAlloc<>, the scope is within the current method or block within. As soon as you exit the method, obj is freed!

        You'll have to dig deep and do the BaseObject* obj = BaseObject::Alloc(Opolygon); call and either free it later or insert it into the document. If you just need it temporarily, you'll need to keep obj within scope until you are completely done with it - read: AutoAlloc and set it up in the method where it will be used.

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

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

          On 20/07/2007 at 13:34, xxxxxxxx wrote:

          Howdy,

          Well, the object is inserted in the document with the line:

            
          doc->InsertObject(obj.Release(), NULL, NULL);  
          

          ..... in the function before returning, but I can't seem to get a BaseObject pointer from it.

          Or am I missing something?

          Adios,
          Cactus Dan

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

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

            On 20/07/2007 at 14:33, xxxxxxxx wrote:

            Ah, I see. So Release() transfers ownership - but note that it also sets the pointer to NULL.

            Note also that in the SDK Doc example, the auto allocated object is done in the same method/scope to guarantee that it isn't released prematurely. I'd say that you'll have to remove the CreatePolygonObject() method and integrate it into the Execute() method where everything occurs. There is just no way that you'll get that obj out of scope without it being freed - even the transfer of ownership leaves you with a NULL pointer.

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

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

              On 20/07/2007 at 17:32, xxxxxxxx wrote:

              Howdy,

              Well,this seems to work:

                
                    BaseObject *opRet = (BaseObject* )obj;  
                    doc->InsertObject(obj.Release(),NULL, NULL);  
                    EventAdd();  
                
                    return opRet;  
              }  
              

              ... if I cast the pointer before inserting the object it returns the pointer correctly.

              Adios,
              Cactus Dan

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

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

                On 20/07/2007 at 20:57, xxxxxxxx wrote:

                Howdy,

                Hmmmm, it creates the polgons ok, but I can't select the object in the view port. It's like Cinema doesn't see the object as a selectable object.

                Why is that? Did I forget to do something?

                Adios,
                Cactus Dan

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

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

                  On 20/07/2007 at 21:39, xxxxxxxx wrote:

                  Howdy,

                  DOH! DOH! DOH! the polygon selection filter was disabled. So never mind, everything is working now.

                  Adios,
                  Cactus Dan

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

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

                    On 21/07/2007 at 06:10, xxxxxxxx wrote:

                    Good to here. Wasn't certain if using another pointer would still retain validity but if it works, it works. 🙂

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