Browse through description levels [SOLVED]



  • On 09/11/2015 at 16:21, xxxxxxxx wrote:

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

    ---------
    Howdy,

    OK, I understand how to browse through the descriptions, but I'm not sure how to get to the sub levels of the descriptions.

    Can you provide simple example?

    Adios,
    Cactus Dan



  • On 10/11/2015 at 01:59, xxxxxxxx wrote:

    Hello,

    if you want to access the ID used to identify sub-structures of custom GUIs and datatypes you could simply load the description. Something like this:

      
    AutoAlloc<Description> desc;  
    if (!desc)  
     return false;  
      
    desc->LoadDescription(DTYPE_VECTOR);  
      
    void *browse = desc->BrowseInit();  
    const BaseContainer *bc = nullptr;  
    DescID tid, groupid;  
    while (desc->GetNext(browse, &bc, tid, groupid))  
    {  
     if(bc != nullptr)  
     {  
         GePrint("ID: " + String::IntToString(tid[0].id));  
         GePrint("Type: " + String::IntToString(tid[0].dtype));  
         GePrint("Name: " + bc->GetString(DESC_NAME));  
     }  
    }  
      
    desc->BrowseFree(browse);  
    

    best wishes,
    Sebastian



  • On 10/11/2015 at 07:35, xxxxxxxx wrote:

    Howdy,

    Well, to be more specific, I want to browse through the descriptions and get the Pose Morph tag's sliders. The sliders seem to all have 2 levels with the first level being 4000.

    Here is my browse loop code:

    while(desc->GetNext(h, &bc, id, groupid))
    {
    	if(id[0].id == 4000 && id.GetDepth() > 1)
    	{
    		LONG dID = id[1].id;
    		GeData d;
    		if(tag->GetParameter(DescLevel(dID), d, DESCFLAGS_GET_0))
    		{
    			if(d.GetType() != DA_REAL) GePrint("Not a DA_REAL");
    		}
    	}
    }
    

    But it prints "Not a DA_REAL" every time.

    What am I doing wrong?

    Adios,
    Cactus Dan



  • On 10/11/2015 at 08:58, xxxxxxxx wrote:

    Hello,

    the pose morph tag is represented by a special class in the API: CAPoseMorphTag. This class allows you to loop through the sliders and to get their description ID:

      
    CAPoseMorphTag* poseMorphTag = static_cast<CAPoseMorphTag*>(tag);  
      
    const Int32 count = poseMorphTag->GetMorphCount();  
      
    for (Int32 i = 0; i < count; ++i)  
    {  
     DescID sliderId = poseMorphTag->GetMorphID(i);  
      
     GeData data;  
     poseMorphTag->GetParameter(sliderId, data, DESCFLAGS_GET_0);  
      
     GePrint("Slider Value: " + String::FloatToString(data.GetFloat()));  
    }  
    

    best wishes,
    Sebastian



  • On 10/11/2015 at 09:16, xxxxxxxx wrote:

    Howdy,

    OK, but that's not available in R12. It's only there in R13+. To do it in R12, I have to go the browse route.

    EDIT:
    AHA! That is available in R12. It's just not listed in the R12 documentation. 😲

    Adios,
    Cactus Dan



  • On 13/11/2015 at 07:39, xxxxxxxx wrote:

    Howdy,

    OK, I have your code working where I can set the Pose Morph sliders, but I'm having a problem in my test code.

    What I'm trying to do is create a clone of the object, then set each Pose Morph slider on the clone to 100%, compare the points of the morphed clone with the original object, and select the points that have moved, but it's not working.

    Here is my code:

    bool SelectMorphedPoints(BaseDocument *doc)
    {
    	BaseObject *op = doc->GetActiveObject(); if(!op) return false;
    	BaseTag *tag = op->GetTag(1024237); if(!tag) return false;
    	
    	CAPoseMorphTag* pmTag = static_cast<CAPoseMorphTag*>(tag);
    	
    	LONG i, mCnt = pmTag->GetMorphCount();
    	GeData sSet;
    	
    	// set all sliders to 0.0
    	for(i=0; i<mCnt; ++i)
    	{
    		DescID sliderId = pmTag->GetMorphID(i);
    		sSet = Real(0.0);
    		pmTag->SetParameter(sliderId, sSet, DESCFLAGS_SET_0);
    	}
    	
    	// clone the object
    	BaseObject *clone = (BaseObject* )op->GetClone(COPYFLAGS_0, NULL);
    	if(clone)
    	{
    		Vector *padr = GetPointArray(op);
    		Vector *cpadr = GetPointArray(clone);
      
    		BaseTag *clTag = clone->GetTag(1024237);
    		if(clTag)
    		{
    			CAPoseMorphTag* cpmTag = static_cast<CAPoseMorphTag*>(clTag);
    			if(cpmTag)
    			{
    				for(i=0; i<mCnt; ++i)
    				{
    					DescID sliderId = pmTag->GetMorphID(i);
    					sSet = Real(1.0);
    					pmTag->SetParameter(sliderId, sSet, DESCFLAGS_SET_0);
    					
    					clone->Message(MSG_UPDATE);
    					
    					BaseSelect *bs = ToPoint(op)->GetPointS();
    					if(bs) bs->DeselectAll();
    					
    					LONG p, pCnt = LMin(ToPoint(op)->GetPointCount(),ToPoint(clone)->GetPointCount());
    					for (p=0; p<pCnt; p++)
    					{
    						if(!VectorEqual(padr[p], cpadr[p], 0.001)) bs->Select(p);
    					}
    					
    					if(bs->GetCount() < 1) GePrint(" no points selected");
    					
    					sSet = Real(0.0);
    					pmTag->SetParameter(sliderId, sSet, DESCFLAGS_SET_0);
    				}
    			}
    		}
    		BaseObject::Free(clone);
    	}
    	
    	return true;
    }
    

    It prints "no points selected" every time. Why is it not working?

    Adios,
    Cactus Dan



  • On 13/11/2015 at 09:42, xxxxxxxx wrote:

    Hello,

    could you post your latest question in a new thread? It seems it is no longer related to this thread's original topic.

    Best wishes,
    Sebastian


Log in to reply