Inserting as a child without cloning first ?



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

    On 08/08/2012 at 15:42, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   R13 
    Platform:   Windows  ;   
    Language(s) :   C.O.F.F.E.E  ;

    ---------
    Guys is it possible to insert an object already in the scene hierarchy as a child of another object ?

    I tried this and Cinema crashed.
    I think this is not possible using the insertObject() method because there can't be 2 instances of the same unique object in two different positions in the same hierarchy.

    This is my code (I use with a shorcut) where I had to clone the obj first to avoid crashing:

    main(doc,op)
    {
    	var myObj = doc->GetActiveObject(); // Gets the Selected Object
    	if(!myObj) {
    		return;
    	}
    	var myObjParent = myObj->GetUp(); // Gets the Parent
    	if(myObjParent) {
    		if(myObjParent->GetType() == 1007455) { // Is HyperNurbs ?
      
    			/*
    					Snippet to activate/deactivate visibilty on HyperNurbs Object
    			*/
      
    			if (myObjParent#ID_BASEOBJECT_GENERATOR_FLAG == TRUE) { // Active ?
    				myObjParent#ID_BASEOBJECT_GENERATOR_FLAG = FALSE; 
    			}
    			else {
    				myObjParent#ID_BASEOBJECT_GENERATOR_FLAG = TRUE;
    			}
      
    			return;
    		}
    	}
    	
    	// If no parent Hypernurbs Object Found - Create One
      
    	CallCommand(1007455); // Create an HyperNurbs Object
      
    	var myHPN = doc->GetActiveObject(); // And Select that
    	
    	if(!myHPN) {
    		return;
    	}
    	var newObj = myObj->GetClone(0);
    	doc->InsertObject(newObj, myHPN, NULL); // Need an Alternative
    	doc->SetActiveObject(myObj);
    }
    

    Is there any way to access a method that instead of inserting the objects just move that in the hierarchy to avoid cloning ?

    And do you guys know the method to delete an object fron the hierarchy, programmatically, not by selecting it and deleting with CallCommand(100004787); // Delete

    The script is made to improve workflow in SDS modeling, to get a similar behaviour like in Modo.

    Thanks for the attention.

    EDIT: I've found how to delete the object (obj->Remove()).

    But that is not what I want basically because the behaviour I want to implement will make the tool selected or the selected geometry(Polygon,Edges,Points), remain selected.



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

    On 09/08/2012 at 00:24, xxxxxxxx wrote:

    First you have to remove the object from the document and then insert it as a child of the other object.  Everything is in a list (thus the derivation from BaseList2D) and you must insert things into the list and remove them before deletion or reinsertion.  You don't need a clone unless you want to have two objects.

    myObj->Remove();  
    doc->InsertObject(newObj, myHPN);
    


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

    On 09/08/2012 at 07:14, xxxxxxxx wrote:

    So I can remove the Obj without unloading it from the memory, I'm simply removing from the hierarchy then placing it back again where I want.

    Yes with this correction now works flawlessly. I switch on the fly without touching the Hierarchy using TAB key, I'm also improving the script to include a switch between CClark with nGons and without it.

    And adding a check to avoid if the Hypernurbs object get selected in the Hierarchy to create a new One.

    SanX.



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

    On 09/08/2012 at 11:03, xxxxxxxx wrote:

    Exactly.  Removing it from the list does not Free (delete) it, it just removes it from the hierarchy.  That's a good thing to remember.  Before you can free anything in a list (objects, tags, materials, etc.), you must Remove() them first.

    Glad that you have it working! :)


Log in to reply