THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 29/12/2009 at 07:31, xxxxxxxx wrote:
User Information:
Cinema 4D Version: 11
Platform: Windows ;
Language(s) : C++ ;
---------
I was following the thread that was posted previously about updating the attributes manager. In my plugin, I want the user to be able to click a button and to insert two new link elements in to the attributes manager. Here is the code I am using.
Bool Planet::Message(GeListNode *node, LONG type, void *t_data)
{
BaseObject* op = static_cast<BaseTag*>(node)->GetObject();
if (!node) return FALSE;
DescriptionCommand *dc = (DescriptionCommand* ) t_data;
switch (type)
{
case MSG_DESCRIPTION_COMMAND:
{
if (dc->id[0].id==ADD_ORBIT_OBJECT)
{
GePrint("Adding an OBJECT");
BaseList2D *op = (BaseList2D* ) node;
BaseDocument *doc = op->GetDocument(); if (!doc) return FALSE;
BaseContainer *bc = ((BaseList2D* )node)->GetDataInstance(); if (!bc) return FALSE;
BaseContainer *main = bc->GetContainerInstance(ID_PLANET_OBJECT); if (!main) return FALSE;
doc->StartUndo();
doc->AddUndo(UNDO_CHANGE_SMALL,node);
main->SetLong(ORBIT_OBJ_CNT, main->GetLong(ORBIT_OBJ_CNT,0)+1);
main->SetLong(ORBIT_PTH_CNT, main->GetLong(ORBIT_PTH_CNT,0)+1);
doc->EndUndo();
op->Message(MSG_CHANGE);
}
}
case MSG_DESCRIPTION_CHECKUPDATE:
{
//Update Planet
GePrint("UPDATED");
return UpdatePlanet(static_cast<BaseObject*>(node), static_cast<GeListNode*>(node));
}
}
if (planetCreated <1)
{
CreatePlanet(op,node);
}
return TRUE;
}
Bool Planet::GetDDescription(GeListNode *node, Description *description,LONG &flags)
{
if (!description->LoadDescription(node->GetType())) return FALSE;
// important to check for speedup c4d!
const DescID *singleid = description->GetSingleDescID();
LONG index1 = ORBIT_INDEX1;
LONG index2 = ORBIT_INDEX2;
BaseObject *op = (BaseObject* )node;
BaseContainer *data = op->GetDataInstance();
BaseContainer *main = data->GetContainerInstance(ID_PLANET_OBJECT);
LONG i,cnt = main->GetLong(ORBIT_OBJ_CNT,0);
LONG j,cnt1 = main->GetLong(ORBIT_PTH_CNT,0);
Bool initbc2 = FALSE;
Bool initbc3 = FALSE;
BaseContainer bc2;
BaseContainer bc3;
for (i=0; i<cnt; i++)
{
DescID cid = DescLevel(index1,DTYPE_BOOL,0);
if (!singleid || cid.IsPartOf(*singleid,NULL)) // important to check for speedup c4d!
{
if (!initbc2)
{
initbc2 = TRUE;
bc2 = GetCustomDataTypeDefault(DTYPE_BASELISTLINK);
bc2.SetLong(DESC_ANIMATE,DESC_ANIMATE_ON);
bc2.SetBool(DESC_REMOVEABLE,FALSE);
}
bc2.SetString(DESC_NAME,"Orbiting Object " +LongToString(i));
bc2.SetString(DESC_SHORT_NAME,"Orbiting Object "+LongToString(i));
if (!description->SetParameter(cid,bc2,DescLevel(ID_ORBITOPTIONS_TAB))) return FALSE;
}
index1++;
}
for (j=0; j<cnt1; j++)
{
DescID cid = DescLevel(index2,DTYPE_BOOL,0);
if (!singleid || cid.IsPartOf(*singleid,NULL)) // important to check for speedup c4d!
{
if (!initbc3)
{
initbc3 = TRUE;
bc2 = GetCustomDataTypeDefault(DTYPE_BASELISTLINK);
bc2.SetLong(DESC_ANIMATE,DESC_ANIMATE_ON);
bc2.SetBool(DESC_REMOVEABLE,FALSE);
}
bc2.SetString(DESC_NAME,"Orbit Path " +LongToString(i));
bc2.SetString(DESC_SHORT_NAME,"Orbit Path "+LongToString(i));
if (!description->SetParameter(cid,bc2,DescLevel(ID_ORBITOPTIONS_TAB))) return FALSE;
}
index2++;
}
flags |= DESCFLAGS_DESC_LOADED;
//return Planet::GetDDescription(node,description,flags);
return TRUE;
}
Everything works well the first time the user clicks the button. It inserts two different link elements with two different names. However, the second time, the user clicks the button, it only adds the PATH link. Could you tell me what I am doing wrong with this?
THanks,
~SHawn