Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Recent
    • Tags
    • Users
    • Login

    Dialogs within Tags

    Scheduled Pinned Locked Moved SDK Help
    7 Posts 0 Posters 601 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

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

      On 07/10/2011 at 09:57, xxxxxxxx wrote:

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

      ---------
      I'm trying to figure out how to create a tag plugin that also has a dialog plugin inside of it. So when a button is pressed in the tag. It launches the dialog plugin.
      But I don't know how to handle the registration for something like this.

      Here's my code:

      #include "c4d.h"  
      #include "c4d_symbols.h"  
      #include "tsimpletag.h"  
        
      #define TAG_PLUGIN_ID        1000003    //Be sure to use a unique ID obtained from www.plugincafe.com  
      #define COMMAND_PLUGIN_ID   1000004    //Be sure to use a unique ID obtained from www.plugincafe.com  
        
        
      ///////////////////Dialog and Command sections /////////////////////////////  
        
      class myDialog : public GeDialog  
      {  
        public:  
            myDialog(void);  
            virtual Bool CreateLayout(void);  
            virtual Bool InitValues(void);  
            virtual Bool Command(LONG id,const BaseContainer &msg);  
            virtual LONG Message(const BaseContainer &msg,BaseContainer &result);  
            virtual Bool CoreMessage  (LONG id,const BaseContainer &msg);  
      };  
        
        
      myDialog::myDialog(void)  
      {      
      }  
        
      Bool myDialog::CreateLayout(void)  
      {  
        SetTitle("My Tag's Dialog");  
          
        GroupBegin(0,BFH_SCALEFIT,2,0,"",0);  
        {  
        AddStaticText(0,BFH_LEFT,0,0,"Hello World",0);                  
        }  
        GroupEnd();  
        
        return TRUE;  
      }  
        
        
      class mySimpleDialog : public CommandData   
      {  
        private:  
            myDialog dlg;  
        
        public:  
            virtual Bool Execute(BaseDocument *doc);  
            virtual LONG GetState(BaseDocument *doc);  
            virtual Bool RestoreLayout(void *secret);          
      };  
        
      LONG mySimpleDialog::GetState(BaseDocument *doc)  
      {  
        return CMD_ENABLED;  
      }  
        
      Bool mySimpleDialog::Execute(BaseDocument *doc)  
      {      
        return dlg.Open(DLG_TYPE_ASYNC,COMMAND_PLUGIN_ID, -1, -1, 300,150);      
      }  
        
      Bool mySimpleDialog::RestoreLayout(void *secret)  
      {  
        return dlg.RestoreLayout(COMMAND_PLUGIN_ID,0,secret);  
      }  
        
        
        
        
      ///////////////////////// Tag Section /////////////////////////  
        
      class SimpleTag : public TagData  
      {  
        public:  
            virtual Bool Message(GeListNode *node, LONG type, void *t_data);  
            virtual Bool Init(GeListNode *node);  
            virtual Bool GetDDescription(GeListNode *node, Description *description,DESCFLAGS_DESC &flags);          
            virtual EXECUTIONRESULT Execute(BaseTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, EXECUTIONFLAGS flags);  
              
            static NodeData *Alloc(void) { return gNew SimpleTag; }  
      };  
        
      Bool SimpleTag::Message(GeListNode *node, LONG type, void *data)  
      {  
        switch (type)  
          {          
            case MSG_DESCRIPTION_COMMAND:                           // MSG_DESCRIPTION_COMMAND is sent when button is clicked  
            {              
                DescriptionCommand *dc = (DescriptionCommand* )data; // data contains the description ID of the button             
                LONG button = dc->id[0].id;                         // Get the ID of the button  
                              
                switch (button)                                     // Check for different button IDs  
                {  
                    case BUTTON1:  
                        GePrint("Button1 was pushed");  
                        break;  
                    case BUTTON2:  
                        // I want this button to launch my Command dialog  
                        break;  
                }  
            }  
          }  
        
        
        return TRUE;  
      }  
        
      Bool SimpleTag::Init(GeListNode *node)  
      {          
        
        BaseTag    *tag  = (BaseTag* )node; // Assigns a variable to the tag's node  
        BaseContainer *data = tag->GetDataInstance(); // Assigns a variable to that node's container  
        
        return TRUE;  
      }  
        
        
      Bool SimpleTag::GetDDescription(GeListNode *node, Description *description,DESCFLAGS_DESC &flags)  
      {   
        return TRUE;  
      }  
        
      EXECUTIONRESULT SimpleTag::Execute(BaseTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, EXECUTIONFLAGS flags)  
      {      
        return EXECUTIONRESULT_OK;  
      }  
        
        
      Bool RegisterSimpleTag(void)  
      {  
        return RegisterTagPlugin(TAG_PLUGIN_ID, GeLoadString(IDS_SIMPLETAG),TAG_EXPRESSION|TAG_VISIBLE,SimpleTag::Alloc,"tsimpletag",AutoBitmap("myicon.tif"),0);  
      }
      

      I also need to figure out how to handle the button call that makes the dialog open.
      I think the execute function I'm using in the mySimpleDialog class is wrong. And needs to be somehow placed in the Tag's Button code.
      But first things first....I first need to know how to register the dialog plugin that's inside of the tag.

      -ScottA

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

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

        On 07/10/2011 at 11:20, xxxxxxxx wrote:

        Hey ScottA,

        I think your way to handle button call is not false. 🙂

        When you will look in my thread: https://developers.maxon.net/forum/topic/6048/6199_dialog-in-dialog you will read about starting a dialog from an other. I think it is the same.

        Not tested:

          
          
        . . .  
          
        ///////////////////Dialog and Command sections /////////////////////////////  
          
        class myDialog : public GeDialog  
        {  
          public:  
              myDialog(void);  
              virtual Bool CreateLayout(void);  
              virtual Bool InitValues(void);  
              virtual Bool Command(LONG id,const BaseContainer &msg);  
              virtual LONG Message(const BaseContainer &msg,BaseContainer &result);  
              virtual Bool CoreMessage  (LONG id,const BaseContainer &msg);  
        };  
          
          
        myDialog::myDialog(void)  
        {      
        }  
          
        Bool myDialog::CreateLayout(void)  
        {  
          SetTitle("My Tag's Dialog");  
            
          GroupBegin(0,BFH_SCALEFIT,2,0,"",0);  
          {  
          AddStaticText(0,BFH_LEFT,0,0,"Hello World",0);                  
          }  
          GroupEnd();  
          
          return TRUE;  
        }  
          
          
        ///////////////////////// Tag Section /////////////////////////  
          
        class SimpleTag : public TagData  
        {  
          private  
              mySimpleDialog* dlg;  
          public:  
              SimpleTag();  
              ~SimpleTag();  
              virtual Bool Message(GeListNode *node, LONG type, void *t_data);  
              virtual Bool Init(GeListNode *node);  
              virtual Bool GetDDescription(GeListNode *node, Description *description,DESCFLAGS_DESC &flags);          
              virtual EXECUTIONRESULT Execute(BaseTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, EXECUTIONFLAGS flags);  
                
              static NodeData *Alloc(void) { return gNew SimpleTag; }  
        };  
          
        SimpleTag::SimpleTag  
        {  
          dlg = NULL;  
        }  
          
        SimpleTag::~SimpleTag  
        {  
          GeFree(dlg);  
        }  
          
        Bool SimpleTag::Message(GeListNode *node, LONG type, void *data)  
        {  
          switch (type)  
            {          
              case MSG_DESCRIPTION_COMMAND:                           // MSG_DESCRIPTION_COMMAND is sent when button is clicked  
              {              
                  DescriptionCommand *dc = (DescriptionCommand* )data; // data contains the description ID of the button             
                  LONG button = dc->id[0].id;                         // Get the ID of the button  
                                
                  switch (button)                                     // Check for different button IDs  
                  {  
                      case BUTTON1:  
                          GePrint("Button1 was pushed");  
                          break;  
                      case BUTTON2:  
                          dlg.Open(DLG_TYPE_MODAL, TAG_PLUGIN_ID)  
                          // I want this button to launch my Command dialog  
                          break;  
                  }  
              }  
            }  
          
          
          return TRUE;  
        }  
          
        Bool SimpleTag::Init(GeListNode *node)  
        {          
          
          BaseTag    *tag  = (BaseTag* )node; // Assigns a variable to the tag's node  
          BaseContainer *data = tag->GetDataInstance(); // Assigns a variable to that node's container  
            
          dlg = gNew SimpleTag;  
          
          return TRUE;  
        }  
          
          
        Bool SimpleTag::GetDDescription(GeListNode *node, Description *description,DESCFLAGS_DESC &flags)  
        {   
          return TRUE;  
        }  
          
        EXECUTIONRESULT SimpleTag::Execute(BaseTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, EXECUTIONFLAGS flags)  
        {      
          return EXECUTIONRESULT_OK;  
        }  
          
          
        Bool RegisterSimpleTag(void)  
        {  
          return RegisterTagPlugin(TAG_PLUGIN_ID, GeLoadString(IDS_SIMPLETAG),TAG_EXPRESSION|TAG_VISIBLE,SimpleTag::Alloc,"tsimpletag",AutoBitmap("myicon.tif"),0);  
        }  
        

        You don´t need the CommandData. But if you want to use the CommandData, you can use SendModelingCommand().

        Oh and you don´t registrate the CommandData anywhere.

        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

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

          On 07/10/2011 at 12:08, xxxxxxxx wrote:

          Thanks Toni.

          I think you're on the right track. But I'm getting lots of errors.
          Starting with the declaration of the CommandData class from within the TagData class:

            
          class SimpleTag : public TagData  
          {  
            private  
                mySimpleDialog *dlg; //This does not work
          

          From there it all goes down hill because of that bad declaration.
          I'm not sure how to fix this.

          -ScottA

          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

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

            On 07/10/2011 at 12:09, xxxxxxxx wrote:

            Oh my fault.  Now it should work.

            . . .  
              
            ///////////////////Dialog and Command sections /////////////////////////////  
              
            class myDialog : public GeDialog  
            {  
              public:  
                  myDialog(void);  
                  virtual Bool CreateLayout(void);  
                  virtual Bool InitValues(void);  
                  virtual Bool Command(LONG id,const BaseContainer &msg);  
                  virtual LONG Message(const BaseContainer &msg,BaseContainer &result);  
                  virtual Bool CoreMessage  (LONG id,const BaseContainer &msg);  
            };  
              
              
            myDialog::myDialog(void)  
            {      
            }  
              
            Bool myDialog::CreateLayout(void)  
            {  
              SetTitle("My Tag's Dialog");  
                
              GroupBegin(0,BFH_SCALEFIT,2,0,"",0);  
              {  
              AddStaticText(0,BFH_LEFT,0,0,"Hello World",0);                  
              }  
              GroupEnd();  
              
              return TRUE;  
            }  
              
              
            ///////////////////////// Tag Section /////////////////////////  
              
            class SimpleTag : public TagData  
            {  
              private  
                  myDialog\* dlg;  
              public:  
                  SimpleTag();  
                  ~SimpleTag();  
                  virtual Bool Message(GeListNode \*node, LONG type, void \*t_data);  
                  virtual Bool Init(GeListNode \*node);  
                  virtual Bool GetDDescription(GeListNode \*node, Description \*description,DESCFLAGS_DESC &flags);          
                  virtual EXECUTIONRESULT Execute(BaseTag \*tag, BaseDocument \*doc, BaseObject \*op, BaseThread \*bt, LONG priority, EXECUTIONFLAGS flags);  
                    
                  static NodeData \*Alloc(void) { return gNew SimpleTag; }  
            };  
              
            SimpleTag::SimpleTag  
            {  
              dlg = NULL;  
            }  
              
            SimpleTag::~SimpleTag  
            {  
              GeFree(dlg);  
            }  
              
            Bool SimpleTag::Message(GeListNode \*node, LONG type, void \*data)  
            {  
              switch (type)  
                {          
                  case MSG_DESCRIPTION_COMMAND:                           // MSG_DESCRIPTION_COMMAND is sent when button is clicked  
                  {              
                      DescriptionCommand \*dc = (DescriptionCommand\* )data; // data contains the description ID of the button             
                      LONG button = dc->id[0].id;                         // Get the ID of the button  
                                    
                      switch (button)                                     // Check for different button IDs  
                      {  
                          case BUTTON1:  
                              GePrint("Button1 was pushed");  
                              break;  
                          case BUTTON2:  
                              dlg = gNew myDialog;  
                              dlg->Open(DLG_TYPE_MODAL, TAG_PLUGIN_ID);  
                              // I want this button to launch my Command dialog  
                              break;  
                      }  
                  }  
                }  
              
              
              return TRUE;  
            }  
              
            Bool SimpleTag::Init(GeListNode \*node)  
            {          
              
              BaseTag    \*tag  = (BaseTag\* )node; // Assigns a variable to the tag's node  
              BaseContainer \*data = tag->GetDataInstance(); // Assigns a variable to that node's container  
                
              dlg = gNew myDialog;  
              
              return TRUE;  
            }  
              
              
            Bool SimpleTag::GetDDescription(GeListNode \*node, Description \*description,DESCFLAGS_DESC &flags)  
            {   
              return TRUE;  
            }  
              
            EXECUTIONRESULT SimpleTag::Execute(BaseTag \*tag, BaseDocument \*doc, BaseObject \*op, BaseThread \*bt, LONG priority, EXECUTIONFLAGS flags)  
            {      
              return EXECUTIONRESULT_OK;  
            }  
              
              
            Bool RegisterSimpleTag(void)  
            {  
              return RegisterTagPlugin(TAG_PLUGIN_ID, GeLoadString(IDS_SIMPLETAG),TAG_EXPRESSION|TAG_VISIBLE,SimpleTag::Alloc,"tsimpletag",AutoBitmap("myicon.tif"),0);  
            }
            
            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

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

              On 07/10/2011 at 12:23, xxxxxxxx wrote:

              Hmmm. Nope. Still doesn't work for me.
              It's probably my fault because I'm missing something simple.
              Same type of declaration problems:

              class SimpleTag : public TagData  
              {  
                private  
                    myDialog* dlg;// Does not work..Intellisense says needs a : 
              
              1 Reply Last reply Reply Quote 0
              • H Offline
                Helper
                last edited by

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

                On 07/10/2011 at 12:45, xxxxxxxx wrote:

                Just change private to private :

                1 Reply Last reply Reply Quote 0
                • H Offline
                  Helper
                  last edited by

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

                  On 07/10/2011 at 13:42, xxxxxxxx wrote:

                  Doh!
                  See. I knew it was something simple.😊
                  I actually figured out how to do it another way.

                  Here's the entire code example minus the resource stuff:

                  #include "c4d.h"  
                  #include "c4d_symbols.h"  
                  #include "tsimpletag.h"  
                    
                  #define TAG_PLUGIN_ID    1000003    //Be sure to use a unique ID obtained from www.plugincafe.com  
                    
                  ///////////////////Dialog and Command sections /////////////////////////////  
                    
                  class myDialog : public GeDialog  
                  {  
                    public:  
                        myDialog(void);  
                        virtual Bool CreateLayout(void);  
                        virtual Bool InitValues(void);  
                        virtual Bool Command(LONG id,const BaseContainer &msg);  
                        virtual LONG Message(const BaseContainer &msg,BaseContainer &result);  
                        virtual Bool CoreMessage  (LONG id,const BaseContainer &msg);  
                  };  
                    
                    
                  myDialog::myDialog(void)  
                  {      
                  }  
                    
                  Bool myDialog::CreateLayout(void)  
                  {  
                    SetTitle("My Tag's Dialog");  
                      
                    GroupBegin(0,BFH_SCALEFIT,2,0,"",0);  
                    {  
                    AddStaticText(10005,BFH_LEFT,200,10,"Hello World",0);  
                    AddCheckbox(10006, BFH_LEFT, 4, 4, "mycheckbox");  
                    }  
                    GroupEnd();  
                    
                    return TRUE;  
                  }  
                    
                  Bool myDialog::InitValues(void)  
                  {  
                    // first call the parent instance  
                    if (!GeDialog::InitValues()) return FALSE;          
                    
                    SetString(10005, "Hello World");  
                    SetBool(10006, FALSE);  
                      
                    return TRUE;  
                  }  
                    
                  Bool myDialog::Command(LONG id,const BaseContainer &msg)  
                  {  
                          
                    switch (id) //id is the variable used to trigger an event   
                    {  
                        case 10006:              
                            SetString(10005, "CheckBox is enabled");              
                            break;  
                    }      
                    
                    return TRUE;  
                  }  
                    
                    
                    
                  Bool myDialog::CoreMessage(LONG id,const BaseContainer &msg)  
                  {  
                    return GeDialog::CoreMessage(id,msg);  
                  }  
                    
                  LONG myDialog::Message(const BaseContainer &msg,BaseContainer &result)  
                  {  
                    
                    return GeDialog::Message(msg,result);  
                  }  
                    
                    
                    
                  ///////////////////////// Tag Section /////////////////////////  
                    
                  class SimpleTag : public TagData  
                  {  
                    public:  
                        virtual Bool Message(GeListNode *node, LONG type, void *t_data);  
                        virtual Bool Init(GeListNode *node);  
                        virtual Bool GetDDescription(GeListNode *node, Description *description,DESCFLAGS_DESC &flags);          
                        virtual EXECUTIONRESULT Execute(BaseTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, EXECUTIONFLAGS flags);  
                          
                        static NodeData *Alloc(void) { return gNew SimpleTag; }  
                  };  
                    
                  Bool SimpleTag::Message(GeListNode *node, LONG type, void *data)  
                  {  
                    switch (type)  
                      {          
                        case MSG_DESCRIPTION_COMMAND:                           // MSG_DESCRIPTION_COMMAND is sent when button is clicked  
                        {              
                            DescriptionCommand *dc = (DescriptionCommand* )data; // data contains the description ID of the button             
                            LONG button = dc->id[0].id;                         // Get the ID of the button  
                                          
                            switch (button)                                     // Check for different button IDs  
                            {  
                                case BUTTON1:  
                                    GePrint("Button1 was pushed");  
                                    break;  
                                case BUTTON2:  
                                    myDialog *dlg = gNew myDialog;  
                                    dlg->Open(DLG_TYPE_MODAL, TAG_PLUGIN_ID);  
                                    break;  
                            }  
                        }  
                      }  
                    
                    
                    return TRUE;  
                  }  
                    
                  Bool SimpleTag::Init(GeListNode *node)  
                  {          
                    
                    BaseTag    *tag  = (BaseTag* )node; // Assigns a variable to the tag's node  
                    BaseContainer *data = tag->GetDataInstance(); // Assigns a variable to that node's container  
                    
                    return TRUE;  
                  }  
                    
                    
                  Bool SimpleTag::GetDDescription(GeListNode *node, Description *description,DESCFLAGS_DESC &flags)  
                  {   
                    return TRUE;  
                  }  
                    
                  EXECUTIONRESULT SimpleTag::Execute(BaseTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, EXECUTIONFLAGS flags)  
                  {      
                    return EXECUTIONRESULT_OK;  
                  }  
                    
                    
                  Bool RegisterSimpleTag(void)  
                  {  
                    return RegisterTagPlugin(TAG_PLUGIN_ID, GeLoadString(IDS_SIMPLETAG),TAG_EXPRESSION|TAG_VISIBLE,SimpleTag::Alloc,"tsimpletag",AutoBitmap("myicon.tif"),0);  
                  }
                  

                  Thanks for the help. 🍺

                  -ScottA

                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post