MCOMMAND_CURRENTSTATETOOBJECT

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

On 05/03/2010 at 05:35, xxxxxxxx wrote:

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

---------
Is there any way, in COFFEE, to perform a "Current State to Object" to a an object without it having to be selected in the editor? Also, I would like that the resulting object not to be sent to the editor.
What I want is to create a clone of an object, apply it a "Current State to Object" command, get a polygonal object out of it (I intend to access its points and polygonal coordinates just for reference) and then throw away that polygonal object (and the clone).
Is this at all possible in COFFEE or just in C++?

Rui Batista

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

On 05/03/2010 at 06:08, xxxxxxxx wrote:

Sure, use SendModelingCommand() 😉 
Cheers,
Jack

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

On 05/03/2010 at 06:16, xxxxxxxx wrote:

I know that command, Jack. I have already used it before. However, it requires that an object is selected in the editor (can be done with object->SetBit(BIT_AOBJ); I know). Also, it returns a polygonal object in the editor, also.
What I want is a way to simply point to an object in my document (can be the actual object or a clone of it, if required) and I want to get an object that is not placed in the editor. I just want a reference to the internally generated object. Than I would access the point and polygon list of that internally generated object and then I would throw it away. All this without disturbing my object list. What was selected before would still be selected after executing my code.

Rui Batista

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

On 05/03/2010 at 08:16, xxxxxxxx wrote:

I managed it by clone the object and insert it into a new temp document.
Do the calculation in the temp document and then Kill the temp document.
Maybe not to efficient for an expression thou, but you can try.

Cheers
Lennart

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

On 05/03/2010 at 08:35, xxxxxxxx wrote:

That may be a nice solution. But how do I create a new document in COFFEE?

var new_doc=new(BaseDocument);

and then what!?

Rui Batista

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

On 05/03/2010 at 08:51, xxxxxxxx wrote:

My studio is shut down a couple of days, but I'll
look up what I did as soon as I can, probably next week.

I think you should look for "InsertDocument()".
It becomes the first active doc.
(Mark your present doc first so you can go back to
using doc->GetNext() && the name of it maybe.)

Cheers
Lennart

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

On 05/03/2010 at 15:45, xxxxxxxx wrote:

This is what I can come up with from memory (as a command script).
I'd guess you would have a second "scrap" document open
if you want to run an expression.

This works at least in R11.5 but I know I had some issues inserting an object (the clone)
into an empty document (the temp document).
Then I Allocated and inserted a "dummy" Null object from within the temp document
before inserting my clone from the source document.

Cheers
Lennart

  
var thisdoc = GetActiveDocument();   
var opA     = thisdoc->GetFirstObject();   
var opclone = opA->GetClone(CL_NO_HIERARCHY);   
  
CallCommand(12094); //Create new temp document   
  
var tempdoc = GetFirstDocument(); // Thenew doc is first on the list   
    tempdoc->InsertObject(opclone,NULL,NULL); // Insert our clone   
    var bc = new(BaseContainer);   
    SendModelingCommand(MCOMMAND_MAKEEDITABLE,tempdoc,opclone,bc,MODIFY_ALL); // Make it an editable, point object   
  
var amount = tempdoc->GetFirstObject()->GetPointCount(); // Do something   
  
KillDocument(tempdoc); // Done, Kill the temp document   
thisdoc->SetBit(BIT_ADOC); // Make our original document the active one   
  
println(amount); // Print our points   

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

On 06/03/2010 at 06:54, xxxxxxxx wrote:

I still don't see why you need a second document for that. It definitely works even when the source object is not selected:

MyMenuPlugin::Execute(doc)  
{  
   var bc = new(BaseContainer);  
   bc->SetData(MDATA_CURRENTSTATETOOBJECT_INHERITANCE, TRUE);  
   bc->SetData(MDATA_CURRENTSTATETOOBJECT_KEEPANIMATION, TRUE);  
   var op = doc->GetFirstObject();  
   var res = SendModelingCommand(MCOMMAND_CURRENTSTATETOOBJECT, doc, op, bc, MODIFY_ALL);  
   if (res)  
   {  
      TextDialog("Seems to have worked.", DLG_OK);  
      EventAdd(EVENT_FORCEREDRAW);  
   }  
   else  
   {  
      TextDialog("Did not work.", DLG_OK);  
   }  
}  

This code works and creates a polygonized version of the first object in the scene, even if it's not selected. But there's something funny. The result object is inserted into the document automatically.
If I try creating a clone of the object first, then performing the modeling command, and then inserting the result object into the document, nothing gets polygonized. I just get a clone of the unchanged original object. Strange...

MyMenuPlugin::Execute(doc)  
{  
   var bc = new(BaseContainer);  
   bc->SetData(MDATA_CURRENTSTATETOOBJECT_INHERITANCE, TRUE);  
   bc->SetData(MDATA_CURRENTSTATETOOBJECT_KEEPANIMATION, TRUE);  
   var op = doc->GetFirstObject();  
   var clone = op->GetClone(CL_NO_HIERARCHY);  
   var res = SendModelingCommand(MCOMMAND_CURRENTSTATETOOBJECT, doc, clone, bc, MODIFY_ALL);  
   if (res)  
   {  
      TextDialog("Seems to have worked.", DLG_OK);  
      doc->InsertObject(clone, NULL, NULL);  
      EventAdd(EVENT_FORCEREDRAW);  
   }  
   else  
   {  
      TextDialog("Did not work.", DLG_OK);  
   }  
}  

So, you could in fact use the first code from this posting, and remove the newly created object (which also gets magically selected 😉 ) from the document and continue working with it. Cuold be faster than creating dummy documents etc..
Cheers,
Jack

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

On 06/03/2010 at 07:15, xxxxxxxx wrote:

I will give it a try.
However it should not work for that I intend to do because I need to keep my document in the same state as it was before running the Current State to Object and all the other stuff. With the same state I mean that I need to keep the same selections it had.

Rui Batista

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

On 08/03/2010 at 01:03, xxxxxxxx wrote:

Can't you just store the initial selection state before you do anything, and then later restore it?
Cheers,
Jack