Updating Attributes Question



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

    On 01/01/2010 at 15:42, xxxxxxxx wrote:

    Thank you .  I appreciate your help very much.

    ~Shawn



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

    On 04/01/2010 at 12:56, xxxxxxxx wrote:

    Any info on this?    Thanks,

    ~Shawn



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

    On 05/01/2010 at 05:38, xxxxxxxx wrote:

    Here is the complete code of a simple example of a generator (doing nothing) with a dynamic description similar to what you want. The elements for each dynamic decription group are saved in a respective sub-subcontainer. Please check the comments within the sorce code for more details.

      
    /////////////////////////////////////////////////////////////  
    // CINEMA 4D SDK                                           //  
    /////////////////////////////////////////////////////////////  
    // (c) 1989-2004 MAXON Computer GmbH, all rights reserved  //  
    /////////////////////////////////////////////////////////////  
      
    // generator object example (with no input objects)  
      
    #include "c4d.h"  
    #include "c4d_symbols.h"  
    #include "oroundedtube.h"  
      
      
    #define MY_SUBCONTAINER 1024882        //unique ID for the main-subcontaioner  
    #define MY_SUBCONTAINER_CNT 1024883    //unique ID for storing the IDs of the sub-subcontainers  
      
      
    class RoundedTube : public ObjectData  
    {  
      INSTANCEOF(RoundedTube,ObjectData)  
      
      public:  
          virtual Bool Init(GeListNode *node);  
          virtual BaseObject* GetVirtualObjects(PluginObject *op, HierarchyHelp *hh);  
          virtual Bool Message(GeListNode *node, LONG type, void *data);  
          virtual Bool GetDDescription(GeListNode *node, Description *description, LONG &flags);  
      
          static NodeData *Alloc(void) { return gNew RoundedTube; }  
    };  
      
    Bool RoundedTube::Init(GeListNode *node)  
    {  
      BaseContainer *data = ((BaseList2D* )node)->GetDataInstance(); if (!data) return FALSE;  
      
      BaseContainer main;  
      
      data->InsData(MY_SUBCONTAINER, main);        //insert the main-subcontainer  
      data->SetLong(MY_SUBCONTAINER_CNT, 1000);    //store the intial ID for the sub-subcontainers  
      
      return TRUE;  
    }  
      
    Bool RoundedTube::Message(GeListNode *node, LONG type, void *data)  
    {  
      switch (type)  
      {  
          case MSG_DESCRIPTION_COMMAND:  
          {  
              DescriptionCommand *dc = (DescriptionCommand* )data;  
              if (dc->id[0].id == MY_BUTTON)  
              {  
                  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(MY_SUBCONTAINER); if (!main) return FALSE;  
      
                  doc->StartUndo();  
      
                  BaseContainer object;  
                  object.SetLink(MY_LINK, NULL);  
                  object.SetReal(MY_VALUE, 0.0);  
      
                  doc->AddUndo(UNDO_CHANGE_SMALL, node);  
      
                  main->InsData(bc->GetLong(MY_SUBCONTAINER_CNT), object);    //insert the sub-subcontainer  
                  bc->SetLong(MY_SUBCONTAINER_CNT, bc->GetLong(MY_SUBCONTAINER_CNT)+1);    //increase the sub-subcontainer ID  
      
                  doc->EndUndo();  
              }  
          }  
      }  
      
      return     SUPER::Message(node,type,data);  
    }  
      
    Bool RoundedTube::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();  
      
      BaseContainer *bc = ((BaseList2D* )node)->GetDataInstance(); if (!bc) return FALSE;  
      BaseContainer *main  = bc->GetContainerInstance(MY_SUBCONTAINER); if (!main) return FALSE;  
      BaseDocument *doc = ((BaseList2D* )node)->GetDocument();  
      
      Bool initbc1 = FALSE;  
      Bool initbc2 = FALSE;  
      Bool initbc3 = FALSE;  
      BaseContainer bc1, bc2, bc3;  
      
      BrowseContainer brw(main);  
      GeData *data = NULL;  
      LONG id;  
      while (brw.GetNext(&id,&data))    //browse through the main-subcontainer  
      {  
          if (data->GetType() != DA_CONTAINER) continue;  
          BaseContainer *object = data->GetContainer(); if (!object) continue;    //get the sub-subcontainer  
      
          //read out the sub-subcontainer and accordingly add the elements to the description  
          //MY_LINK, MY_VALUE and MY_SEPARATOR are defined along with the button ID (MY_BUTTON) in the header file  
      
          DescID cid = DescID(DescLevel(MY_LINK,DTYPE_SUBCONTAINER,0), DescLevel(id,DTYPE_BASELISTLINK,0));  
          if (!singleid || cid.IsPartOf(*singleid,NULL)) // important to check for speedup c4d!  
          {  
              if (!initbc1)  
              {  
                  initbc1 = TRUE;  
                  bc1 = GetCustomDataTypeDefault(DTYPE_BASELISTLINK);  
                  bc1.SetLong(DESC_CUSTOMGUI, CUSTOMGUI_LINKBOX);  
                  bc1.SetLong(DESC_ANIMATE, DESC_ANIMATE_ON);  
                  bc1.SetBool(DESC_REMOVEABLE, FALSE);  
              }  
              bc1.SetString(DESC_NAME, "Link");  
              bc1.SetString(DESC_SHORT_NAME, "Link");  
              if (!description->SetParameter(cid,bc1,DescLevel(ID_OBJECTPROPERTIES))) return FALSE;  
          }  
      
          cid = DescID(DescLevel(MY_VALUE,DTYPE_SUBCONTAINER,0), DescLevel(id,DTYPE_REAL,0));  
          if (!singleid || cid.IsPartOf(*singleid,NULL)) // important to check for speedup c4d!  
          {  
              if (!initbc2)  
              {  
                  initbc2 = TRUE;  
                  bc2 = GetCustomDataTypeDefault(DTYPE_REAL);  
                  bc2.SetLong(DESC_CUSTOMGUI, CUSTOMGUI_REALSLIDER);  
                  bc2.SetReal(DESC_MIN,0.0);  
                  bc2.SetReal(DESC_MAX,1.0);  
                  bc2.SetReal(DESC_STEP,0.01);  
                  bc2.SetLong(DESC_UNIT,DESC_UNIT_PERCENT);  
                  bc2.SetLong(DESC_ANIMATE, DESC_ANIMATE_ON);  
                  bc2.SetBool(DESC_REMOVEABLE, FALSE);  
              }  
              bc2.SetString(DESC_NAME, "Value");  
              bc2.SetString(DESC_SHORT_NAME, "Value");  
              if (!description->SetParameter(cid,bc2,DescLevel(ID_OBJECTPROPERTIES))) return FALSE;  
          }  
      
          cid = DescID(DescLevel(MY_SEPARATOR,DTYPE_SUBCONTAINER,0), DescLevel(id,DTYPE_SEPARATOR,0));  
          if (!singleid || cid.IsPartOf(*singleid,NULL)) // important to check for speedup c4d!  
          {  
              if (!initbc3)  
              {  
                  initbc3 = TRUE;  
                  bc3 = GetCustomDataTypeDefault(DTYPE_SEPARATOR);  
                  bc3.SetLong(DESC_CUSTOMGUI, CUSTOMGUI_SEPARATOR);  
                  bc3.SetBool(DESC_SEPARATORLINE, TRUE);  
                  bc3.SetLong(DESC_ANIMATE, DESC_ANIMATE_OFF);  
                  bc3.SetBool(DESC_REMOVEABLE, FALSE);  
              }  
              bc3.SetString(DESC_NAME, "");  
              bc3.SetString(DESC_SHORT_NAME, "");  
              if (!description->SetParameter(cid,bc3,DescLevel(ID_OBJECTPROPERTIES))) return FALSE;  
          }  
      }  
      
      flags |= DESCFLAGS_DESC_LOADED;  
      
      return SUPER::GetDDescription(node,description,flags);  
    }  
      
    BaseObject *RoundedTube::GetVirtualObjects(PluginObject *op, HierarchyHelp *hh)  
    {  
      return NULL;  
    }  
      
      
    // be sure to use a unique ID obtained from www.plugincafe.com  
    #define ID_ROUNDEDTUBEOBJECT 1001157  
      
    Bool RegisterRoundedTube(void)  
    {  
      // decide by name if the plugin shall be registered - just for user convenience  
      String name=GeLoadString(IDS_ROUNDED_TUBE); if (!name.Content()) return TRUE;  
      return RegisterObjectPlugin(ID_ROUNDEDTUBEOBJECT,name,OBJECT_GENERATOR,RoundedTube::Alloc,"Oroundedtube","roundedtube.tif",0);  
    }  
    

    hope that helps

    cheers,
    Matthias



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

    On 17/01/2010 at 17:16, xxxxxxxx wrote:

    Thanks for your help Matthias .   I have another question about this.   I am able to add the new dynamic decription elements to my attributes manager,   Now how do I access the data from these new elements?  I would like to be able to draw from the new links and sliders..

    THanks,

    ~Shawn



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

    On 17/05/2010 at 05:54, xxxxxxxx wrote:

    sorry for digging out this old thread.

    I'm also using the example above and changed it slightly to fit my puropse. Now I also don't understand where the new values (in my case just the REAL value) are stored and how I can access them?

    In GetDDescription I tried: 
    object->GetReal(MY_VALUE);  
    main->GetReal(MY_VALUE);
    bc2.GetReal(MY_VALUE); 
    bc->GetReal(MY_VALUE);

    a.s.o.

    so far it's try and error hoping to get the correct value by chance :/

    Would be nice if someone could help out and explain where the values are stored and how I could access the new REAL value set in the attributes manager.

    Thanks.



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

    On 19/05/2010 at 08:13, xxxxxxxx wrote:

    Hey, no one here who could give me a hint? 
    I'm not an experienced programmer I'm doing this plugin for a students project and I spent hours trying to figur out this problem. Any help would be appreciated.

    What I got so far: 
    If I press the Button

    in Message () 
    I create an new (Sub-Sub-) BaseContainer and insert it in the main SubContainer.

    BaseContainer *bc = ((BaseList2D* )node)->GetDataInstance(); if (!bc) return FALSE;
    BaseContainer *main  = bc->GetContainerInstance(MY_SUBCONTAINER); if (!main) return FALSE;
    BaseContainer object;
    object.SetReal(MY_VALUE, 0.0);
    main->InsData(bc->GetLong(MY_SUBCONTAINER_CNT), object);    //insert the sub-subcontainer
    

    then in GetDDescription()
    the main SubContainer ist fetched and with it a BrowseContainer is created. 
    With the BrowseContainer I browse through all the BaseContainer in the main Container and a new BaseContainer (bc2) with the Decription of the Parameters is created and added to the Description.

    while (brw.GetNext(&id,&data))    //browse through the main-subcontainer
        {
            if (data->GetType() != DA_CONTAINER) continue;
            BaseContainer *object = data->GetContainer(); if (!object) continue;    //get the sub-subcontainer
      
            //read out the sub-subcontainer and accordingly add the elements to the description
            //MY_LINK, MY_VALUE and MY_SEPARATOR are defined along with the button ID (MY_BUTTON) in the header file
     DescID cid = scID(DescLevel(MY_VALUE,DTYPE_SUBCONTAINER,0), DescLevel(id,DTYPE_REAL,0));
            if (!singleid || cid.IsPartOf(*singleid,NULL)) // important to check for speedup c4d!
            {
                if (!initbc2)
                {
                    initbc2 = TRUE;
                    bc2 = GetCustomDataTypeDefault(DTYPE_REAL);
                    bc2.SetLong(DESC_CUSTOMGUI, CUSTOMGUI_REALSLIDER);
                    bc2.SetReal(DESC_MIN,0.0);
                    bc2.SetReal(DESC_MAX,1.0);
                    bc2.SetReal(DESC_STEP,0.01);
                    bc2.SetLong(DESC_UNIT,DESC_UNIT_PERCENT);
                    bc2.SetLong(DESC_ANIMATE, DESC_ANIMATE_ON);
                    bc2.SetBool(DESC_REMOVEABLE, FALSE);
                }
                bc2.SetString(DESC_NAME, "Value");
                bc2.SetString(DESC_SHORT_NAME, "Value");
                if (!description->SetParameter(cid,bc2,DescLevel(ID_OBJECTPROPERTIES))) return FALSE;
            }
    

    Now I'm able to access the the Values stored in the SubContainer (the DESC_NAME...)

    But unfortuntaly I can't get the values I enter in the REAL Box in the C4D Parameter Dialog. It seems that they are not stored in my object Sub-Sub- Container as I would've expected . 
    I just can't figure out where there are stored and how I'm able to access them.

    Thanks for taking the time.



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

    On 19/05/2010 at 09:27, xxxxxxxx wrote:

    I will look into this tomorrow.

    cheers,
    Matthias



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

    On 20/05/2010 at 23:48, xxxxxxxx wrote:

    thanks that would be ace.



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

    On 25/05/2010 at 12:08, xxxxxxxx wrote:

    Hi Matthias, did you had the chance to look into it?
    I don't want to bug you but I'm really desperate ;)



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

    On 26/05/2010 at 02:11, xxxxxxxx wrote:

    There was some small but important thing missing in my example. You have to overload the SetD/GetDParameter methods because we are storing dynamic elements in sub-containers.

    Here is the complete code for a example with dynamic slider elements. In the overloaded GetVirtualObjects method you can see how to read out the values.

      
    /////////////////////////////////////////////////////////////  
    // CINEMA 4D SDK                                           //  
    /////////////////////////////////////////////////////////////  
    // (c) 1989-2004 MAXON Computer GmbH, all rights reserved  //  
    /////////////////////////////////////////////////////////////  
      
    // generator object example (with no input objects)  
      
    #include "c4d.h"  
    #include "c4d_symbols.h"  
    #include "oroundedtube.h"  
      
      
    #define MY_SUBCONTAINER 1024882        //unique ID for the main-subcontaioner  
    #define MY_SUBCONTAINER_CNT 1024883    //unique ID for storing the IDs of the sub-subcontainers  
      
      
    class RoundedTube : public ObjectData  
    {  
      INSTANCEOF(RoundedTube,ObjectData)  
      
      public:  
          virtual Bool Init(GeListNode *node);  
          virtual BaseObject* GetVirtualObjects(PluginObject *op, HierarchyHelp *hh);  
          virtual Bool Message(GeListNode *node, LONG type, void *data);  
          virtual Bool GetDDescription(GeListNode *node, Description *description, LONG &flags);  
          virtual Bool GetDParameter(GeListNode *node, const DescID &id, GeData &t_data, LONG &flags);  
          virtual Bool SetDParameter(GeListNode *node, const DescID &id, const GeData &t_data, LONG &flags);  
      
          static NodeData *Alloc(void) { return gNew RoundedTube; }  
    };  
      
    Bool RoundedTube::Init(GeListNode *node)  
    {  
      BaseContainer *data = ((BaseList2D* )node)->GetDataInstance(); if (!data) return FALSE;  
      
      BaseContainer main;  
      
      data->InsData(MY_SUBCONTAINER, main);        //insert the main-subcontainer  
      data->SetLong(MY_SUBCONTAINER_CNT, 1000);    //store the intial ID for the sub-subcontainers  
      
      return TRUE;  
    }  
      
    Bool RoundedTube::Message(GeListNode *node, LONG type, void *data)  
    {  
      switch (type)  
      {  
          case MSG_DESCRIPTION_COMMAND:  
          {  
              DescriptionCommand *dc = (DescriptionCommand* )data;  
              if (dc->id[0].id == MY_BUTTON)  
              {  
                  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(MY_SUBCONTAINER); if (!main) return FALSE;  
      
                  doc->StartUndo();  
      
                  BaseContainer object;  
                  object.SetReal(MY_VALUE, 0.0);  
      
                  doc->AddUndo(UNDO_CHANGE_SMALL, node);  
      
                  main->InsData(bc->GetLong(MY_SUBCONTAINER_CNT), object);    //insert the sub-subcontainer  
                  bc->SetLong(MY_SUBCONTAINER_CNT, bc->GetLong(MY_SUBCONTAINER_CNT)+1);    //increase the sub-subcontainer ID  
      
                  doc->EndUndo();  
              }  
          }  
      }  
      
      return SUPER::Message(node,type,data);  
    }  
      
    Bool RoundedTube::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();  
      
      BaseContainer *bc = ((BaseList2D* )node)->GetDataInstance(); if (!bc) return FALSE;  
      BaseContainer *main  = bc->GetContainerInstance(MY_SUBCONTAINER); if (!main) return FALSE;  
      BaseDocument *doc = ((BaseList2D* )node)->GetDocument();  
      
      Bool initbc1 = FALSE;  
      BaseContainer bc1;  
      
      BrowseContainer brw(main);  
      GeData *data = NULL;  
      LONG id;  
      while (brw.GetNext(&id,&data))    //browse through the main-subcontainer  
      {  
          if (data->GetType() != DA_CONTAINER) continue;  
          BaseContainer *object = data->GetContainer(); if (!object) continue;    //get the sub-subcontainer  
      
          //read out the sub-subcontainer and accordingly add the elements to the description  
          //MY_LINK, MY_VALUE and MY_SEPARATOR are defined along with the button ID (MY_BUTTON) in the header file  
      
          DescID cid = DescID(DescLevel(MY_VALUE,DTYPE_SUBCONTAINER,0), DescLevel(id,DTYPE_REAL,0));  
          if (!singleid || cid.IsPartOf(*singleid,NULL)) // important to check for speedup c4d!  
          {  
              if (!initbc1)  
              {  
                  initbc1 = TRUE;  
                  bc1 = GetCustomDataTypeDefault(DTYPE_REAL);  
                  bc1.SetLong(DESC_CUSTOMGUI, CUSTOMGUI_REALSLIDER);  
                  bc1.SetReal(DESC_MIN,0.0);  
                  bc1.SetReal(DESC_MAX,1.0);  
                  bc1.SetReal(DESC_STEP,0.01);  
                  bc1.SetLong(DESC_UNIT,DESC_UNIT_PERCENT);  
                  bc1.SetLong(DESC_ANIMATE, DESC_ANIMATE_ON);  
                  bc1.SetBool(DESC_REMOVEABLE, FALSE);  
              }  
              bc1.SetString(DESC_NAME, "Value");  
              bc1.SetString(DESC_SHORT_NAME, "Value");  
              if (!description->SetParameter(cid,bc1,DescLevel(ID_OBJECTPROPERTIES))) return FALSE;  
          }  
      }  
      
      flags |= DESCFLAGS_DESC_LOADED;  
      
      return SUPER::GetDDescription(node,description,flags);  
    }  
      
    static BaseContainer *GetPose(GeListNode *node, LONG id)  
    {  
      BaseContainer *bc = ((BaseObject* )node)->GetDataInstance(); if (!bc) return NULL;  
      BaseContainer *main  = bc->GetContainerInstance(MY_SUBCONTAINER); if (!main) return NULL;  
      
      if (main->GetType(id)!=DA_CONTAINER) return NULL;  
      return main->GetContainerInstance(id);  
    }  
      
    Bool RoundedTube::GetDParameter(GeListNode *node, const DescID &id, GeData &t_data, LONG &flags)  
    {  
      BaseContainer *pose=NULL;  
      
      switch (id[0].id)  
      {  
          case MY_VALUE:  
          {  
              pose = GetPose(node,id[1].id); if (!pose) return FALSE;  
              t_data = pose->GetReal(MY_VALUE); flags |= DESCFLAGS_PARAM_GET;  
          }  
          break;  
      }  
      
      return SUPER::GetDParameter(node,id,t_data,flags);  
    }  
      
    Bool RoundedTube::SetDParameter(GeListNode *node, const DescID &id, const GeData &t_data, LONG &flags)  
    {  
      BaseContainer *pose=NULL;  
      
      switch (id[0].id)  
      {  
          case MY_VALUE:  
          {  
              pose = GetPose(node,id[1].id); if (!pose) return FALSE;  
              pose->SetReal(MY_VALUE,t_data.GetReal()); flags |= DESCFLAGS_PARAM_SET;  
          }  
          break;  
      }  
      
      return SUPER::SetDParameter(node,id,t_data,flags);  
    }  
      
    BaseObject *RoundedTube::GetVirtualObjects(PluginObject *op, HierarchyHelp *hh)  
    {  
      BaseContainer *bc = op->GetDataInstance(); if (!bc) return FALSE;  
      BaseContainer *main  = bc->GetContainerInstance(MY_SUBCONTAINER); if (!main) return FALSE;  
      
      BrowseContainer brw(main);  
      GeData *data = NULL;  
      LONG id;  
      while (brw.GetNext(&id,&data))    //browse through the main-subcontainer  
      {  
          if (data->GetType() != DA_CONTAINER) continue;  
          BaseContainer *object = data->GetContainer(); if (!object) continue;    //get the sub-subcontainer  
      
          GePrint("Value "+RealToString(object->GetReal(MY_VALUE)));        //print the value of each dynamic description element  
      }  
      
      return NULL;  
    }  
      
      
    // be sure to use a unique ID obtained from www.plugincafe.com  
    #define ID_ROUNDEDTUBEOBJECT 1001157  
      
    Bool RegisterRoundedTube(void)  
    {  
      // decide by name if the plugin shall be registered - just for user convenience  
      String name=GeLoadString(IDS_ROUNDED_TUBE); if (!name.Content()) return TRUE;  
      return RegisterObjectPlugin(ID_ROUNDEDTUBEOBJECT,name,OBJECT_GENERATOR,RoundedTube::Alloc,"Oroundedtube","roundedtube.tif",0);  
    }  
    

    hope this helps

    cheers,
    Matthias



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

    On 26/05/2010 at 02:37, xxxxxxxx wrote:

    Thank you so much! I just ran the example and it looks very promising :) 
    Now I'm gonna try to apply it to my plugin. You really helped me out here.


Log in to reply