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
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    GeDialog Set combo default and hide/show fields

    Scheduled Pinned Locked Moved PYTHON Development
    8 Posts 0 Posters 670 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 22/11/2012 at 03:15, xxxxxxxx wrote:

      Cinema 4D Version:   13 
      Platform:    Mac  ;  
      Language(s) :     Phyton ;

      Hi guys, I'm playing with dialogs and trying to figure out some things. With a little searching on forum I ended up having this code in a script, the code kinda works but I can't get a couple things:
      - How do I set the default value (selected option) of a combo box ? .SetLong doesn't seem to work
      - Is It possible to hide/show gadgets (or disable/enable) upon the selected value in a combo box ?

      This is the code:

      import c4d
      from c4d import gui
         #Welcome to the world of Python
         
        
        
      def sweep_circle(rad) :
          print "Sweep circolare con raggio = ", rad
          return
        
      def sweep_square(lato) :
          print "Sweep quadrata lato = ", lato
          return
        
      class ExampleDlg(gui.GeDialog) :
         
             def CreateLayout(self) :
                 #create the layout of the dialog
                 self.GroupBegin(999, c4d.BFH_SCALEFIT, 2, 1)
                 self.AddStaticText(1000, c4d.BFH_LEFT, name="Sezione")
                 self.AddComboBox(1001, c4d.BFH_SCALEFIT)
                 self.AddChild(1001,10011,"Circle")
                 self.AddChild(1001,10012,"Square")
                 self.AddStaticText(1002, c4d.BFH_LEFT, name="Radius")
                 self.AddEditNumberArrows(1003, c4d.BFH_LEFT)
                 self.AddStaticText(1006, c4d.BFH_LEFT, name="Edge Lenght")
                 self.AddEditNumberArrows(1007, c4d.BFH_LEFT)
                 self.AddButton(1004, c4d.BFH_SCALE, name="Close")
                 self.AddButton(1005, c4d.BFH_SCALE, name="OK")
                 self.GroupEnd()
                 
                 return True
         
             def InitValues(self) :
                 #initiate the gadgets with values
                 self.SetReal(1003, 10, min=0, step=0.1)
                 self.SetReal(1007, 10, min=0, step=0.1)
                 self.SetLong(1001, 1)
                 return True
         
             def Command(self, id, msg) :
                 #handle user input
                 if id==1005:
                     if self.GetLong(1001)==10011:
                          rad = self.GetReal(1003)
                          sweep_circle(rad)
                          self.Close()
                     elif self.GetLong(1001)==10012:
                         lato = self.GetReal(1007)
                         sweep_square(lato)
                         self.Close()
                     else:
                         print "Nessuna sezione"
                         gui.MessageDialog("Seleziona una sezione")               
                 elif id==1004:
                     self.Close()
                 return True
         
         
      dlg = ExampleDlg()
      dlg.Open(c4d.DLG_TYPE_MODAL, defaultw=300, defaulth=50) # ASYNC = floating, MODAL = dialogo standard
      

      What I want is to show Radius field only when Circle option is selected from the combo, and Edge Length only when Square is selected..don't really know if I can do it in a script. 
      Any advice would be great ! thanks
      Massimiliano

      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 22/11/2012 at 05:44, xxxxxxxx wrote:

        Hi Massimiliano,

        Originally posted by xxxxxxxx

        - How do I set the default value (selected option) of a combo box ? .SetLong doesn't seem to work

        self.AddChild(1001,10011,"Circle")
        self.AddChild(1001,10012,"Square")
        

        You add the child with 10011 and 10012 but you set the default value with 1 :

        self.SetLong(1001, 1)
        

        You should pass 10011 instead.

        Originally posted by xxxxxxxx

        - Is It possible to hide/show gadgets (or disable/enable) upon the selected value in a combo box ?

        You can disable/enable gadgets with GeDialog.Enable().
        It's also possible to build dynamic groups with this sequence:

        GeDialog.LayoutFlushGroup(...) # Removes all gadgets from a group 
        GeDialog.GroupBegin(...)
          
        # Add gadgets
          
        GeDialog.GroupEnd()
        self.LayoutChanged(...)
        
        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 22/11/2012 at 05:58, xxxxxxxx wrote:

          Thank for you response Yannick!
          For the combo default, Ok now I'm getting how this works 🙂

          For GeDialog.Enable() I'm a little confused on where should I put it... inside CreateLayout, InitValues or Command ?

          M.

          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 22/11/2012 at 06:20, xxxxxxxx wrote:

            Originally posted by xxxxxxxx

            For GeDialog.Enable() I'm a little confused on where should I put it... inside CreateLayout, InitValues or Command ?

            In both InitValues() (to set the initial state of gadgets) and Command() (to respond to the combo box selection changes) you should call a method of your own named like UpdateGadgets().
            This method would enable or disable the gadgets depending on the combobox selection.

            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 22/11/2012 at 06:45, xxxxxxxx wrote:

              Ok, I will try to make it work 🙂 Thanks

              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 24/11/2012 at 18:44, xxxxxxxx wrote:

                I finally managed to get a dialog...thanks for all the suggestions! 
                I have now a dialog with custom 'Ok' and 'Cancel' buttons...but..is there a way to get the OK button pressed when Enter key is pressed on the keyboard ?

                Thanks
                M.

                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 26/11/2012 at 01:51, xxxxxxxx wrote:

                  Hi Massimiliano,

                  Originally posted by xxxxxxxx

                  I have now a dialog with custom 'Ok' and 'Cancel' buttons...but..is there a way to get the OK button pressed when Enter key is pressed on the keyboard ?

                  With the SDK you can easily add 'OK' and 'Cancel' buttons to a dialog with GeDialog.AddDlgGroup():

                  self.AddDlgGroup(c4d.DLG_OK|c4d.DLG_CANCEL)
                  

                  This method creates 'OK' and 'Cancel' buttons with IDC_OK and IDC_CANCEL identifiers respectively.

                  To sets the focus to 'OK' button use GeDialog.Activate():

                  self.Activate(c4d.IDC_OK)
                  

                  Finally in Command() you can then filter the buttons:

                  if id==c4d.IDC_OK:
                  	print "OK was pressed"
                  elif id==c4d.IDC_CANCEL:
                  	print "Cancel was pressed"
                  
                  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 26/11/2012 at 12:51, xxxxxxxx wrote:

                    Hi Yannick!
                    Thanks again for your help. 
                    This the result of my efforts so far: its a plug-in to sweep multiples splines at once with either circular or square profile..like QuickPipe with a twist 🙂 Surely the code can be improved, but seems to work..

                    import c4d
                      
                    import os
                      
                    from c4d import documents, plugins, bitmaps, gui
                      
                    #updated version
                      
                    PLUGIN_ID = 1029425
                      
                    splineList = None
                      
                    def checkObj(obj_list) :
                        spline = 0
                        tot = len(obj_list)
                        for obj in obj_list:
                            tipo = obj.GetTypeName()
                            if (obj.CheckType(c4d.Ospline) or obj.CheckType(c4d.Ospline4side) or 
                                obj.CheckType(c4d.Osplinearc) or obj.CheckType(c4d.Osplinecircle) or
                                obj.CheckType(c4d.Osplinecissoid) or obj.CheckType(c4d.Osplinecogwheel) or
                                obj.CheckType(c4d.Osplinecontour) or obj.CheckType(c4d.Osplinecycloid) or
                                obj.CheckType(c4d.Osplineflower) or obj.CheckType(c4d.Osplineformula) or
                                obj.CheckType(c4d.Osplinehelix) or obj.CheckType(c4d.Osplinenside) or
                                obj.CheckType(c4d.Osplineprimitive) or obj.CheckType(c4d.Osplineprofile) or
                                obj.CheckType(c4d.Osplinerectangle) or obj.CheckType(c4d.Osplinestar) or
                                tipo == "MoSpline" or
                                obj.CheckType(c4d.Osplinetext) or isinstance(obj, c4d.SplineObject)) :
                                spline = spline+1
                        if spline < tot :
                            #print "Tutti gli oggetti devono essere splines"
                            return False
                        else:
                            return True
                          
                      
                      
                    def main() :
                        doc = documents.GetActiveDocument()
                        obj_list = doc.GetActiveObjects(0)
                        if not obj_list:
                            gui.MessageDialog('At least one spline must be selected')
                            return
                        elif checkObj(obj_list) :
                            global splineList
                            splineList = obj_list
                            dlg = QuickSweepDlg()
                            dlg.Open(c4d.DLG_TYPE_MODAL, defaultw=300, defaulth=50) # ASYNC = floating, MODAL = dialogo standard
                        else:
                            gui.MessageDialog('Only splines can be selected')
                            
                            
                    def sweep_circle(rad,originals) :
                        doc=documents.GetActiveDocument()
                        k=0
                        doc.StartUndo()
                        c4d.CallCommand(100004767)
                        for spline in splineList:
                            k=k+1
                            sweep = c4d.BaseObject(c4d.Osweep)
                            sez = c4d.BaseObject(c4d.Osplinecircle)
                            phong = c4d.BaseTag(c4d.Tphong)
                            phong[c4d.PHONGTAG_PHONG_ANGLELIMIT]=True
                            phong[c4d.PHONGTAG_PHONG_ANGLE]=c4d.utils.Rad(80)
                            phong[c4d.PHONGTAG_PHONG_USEEDGES]=True
                            sez[c4d.ID_BASELIST_NAME] = sez.GetName()+"_section"
                            tracciato = spline.GetClone()
                            sez[c4d.PRIM_CIRCLE_RADIUS] = rad
                            sweep[c4d.ID_BASELIST_NAME] = "Sweep_"+spline.GetName()
                            doc.InsertObject(sweep)
                            doc.AddUndo(c4d.UNDOTYPE_NEW,sweep)
                            if originals==True:
                                tracciato.InsertUnder(sweep)
                                tracciato[c4d.ID_BASELIST_NAME] = tracciato.GetName()+"_path"
                            else:
                                doc.AddUndo(c4d.UNDOTYPE_CHANGE,spline)
                                spline[c4d.ID_BASELIST_NAME] = spline.GetName()+"_path"
                                spline.InsertUnder(sweep)
                            sez.InsertUnder(sweep)
                            sweep.InsertTag(phong)
                        doc.EndUndo()
                        c4d.EventAdd()
                            
                        return
                      
                    def sweep_square(lato,originals) :
                        doc = documents.GetActiveDocument()
                        k=0
                        doc.StartUndo()
                        c4d.CallCommand(100004767)
                        for spline in splineList:
                            k=k+1
                            sweep = c4d.BaseObject(c4d.Osweep)
                            sez = c4d.BaseObject(c4d.Osplinerectangle)
                            phong = c4d.BaseTag(c4d.Tphong)
                            phong[c4d.PHONGTAG_PHONG_ANGLELIMIT]=True
                            phong[c4d.PHONGTAG_PHONG_ANGLE]=c4d.utils.Rad(80)
                            phong[c4d.PHONGTAG_PHONG_USEEDGES]=True
                            sez[c4d.ID_BASELIST_NAME] = sez.GetName()+"_section"
                            tracciato = spline.GetClone()
                            sez[c4d.PRIM_RECTANGLE_WIDTH] = lato
                            sez[c4d.PRIM_RECTANGLE_HEIGHT] = lato
                            sweep[c4d.ID_BASELIST_NAME] = "Sweep_"+spline.GetName()
                            doc.InsertObject(sweep)
                            doc.AddUndo(c4d.UNDOTYPE_NEW,sweep)
                            if originals==True:
                                tracciato.InsertUnder(sweep)
                                tracciato[c4d.ID_BASELIST_NAME] = tracciato.GetName()+"_path"
                            else:
                                doc.AddUndo(c4d.UNDOTYPE_CHANGE,spline)
                                spline[c4d.ID_BASELIST_NAME] = spline.GetName()+"_path"
                                spline.InsertUnder(sweep)
                            sez.InsertUnder(sweep)
                            sweep.InsertTag(phong)
                            
                        return
                      
                    class QuickSweepDlg(gui.GeDialog) :
                           
                            def UpdateDlg(self, id) :
                                if id==10011:
                                    self.Enable(1002,True)
                                    self.Enable(1003,True)
                                    self.Enable(1006,False)
                                    self.Enable(1007,False)
                                elif id==10012:
                                    self.Enable(1002,False)
                                    self.Enable(1003,False)
                                    self.Enable(1006,True)
                                    self.Enable(1007,True)   
                                self.LayoutChanged(999)
                       
                            def CreateLayout(self) :
                               #create the layout of the dialog
                                self.SetTitle("QuickSweep")
                                self.GroupBegin(999, c4d.BFH_SCALEFIT, 2, 5, groupflags=c4d.BFV_GRIDGROUP_EQUALROWS|c4d.BFV_GRIDGROUP_EQUALCOLS)
                                self.GroupBorderSpace(10, 10, 10, 10)
                                self.GroupBorderNoTitle(c4d.BORDER_ROUND)
                                self.AddStaticText(1000, c4d.BFH_LEFT, name="Section")
                                self.AddComboBox(1001, c4d.BFH_SCALEFIT)
                                self.AddChild(1001,10011,"Circle")
                                self.AddChild(1001,10012,"Square")
                                self.AddStaticText(1002, c4d.BFH_LEFT, name="Radius")
                                self.AddEditNumberArrows(1003, c4d.BFH_LEFT)
                                self.AddStaticText(1006, c4d.BFH_LEFT, name="Edge Lenght")
                                self.AddEditNumberArrows(1007, c4d.BFH_LEFT)
                                self.AddCheckbox(1008, c4d.BFH_LEFT, initw=0, inith=0, name="Keep original(s)")
                                self.GroupEnd()
                                self.GroupBegin(998, c4d.BFH_SCALEFIT, 2, 1)
                                self.AddDlgGroup(c4d.DLG_CANCEL|c4d.DLG_OK)
                                #self.AddButton(1004, c4d.BFH_SCALE, name="Close")
                                #self.AddButton(1005, c4d.BFH_SCALE, name="OK")
                                self.GroupEnd()
                                return True
                       
                            def InitValues(self) :
                                #initiate the gadgets with values
                                self.SetReal(1003, 10, min=0, step=0.1)
                                self.SetReal(1007, 10, min=0, step=0.1)
                                self.SetLong(1001, 10011)
                                self.SetBool(1008, False)
                                self.Activate(c4d.IDC_OK)
                                self.UpdateDlg(self.GetLong(1001))
                               
                                return True
                       
                            def Command(self, id, msg) :
                                #handle user input
                                self.UpdateDlg(self.GetLong(1001))
                                if id==c4d.IDC_OK:
                                    if self.GetLong(1001)==10011:
                                        rad = self.GetReal(1003)
                                        sweep_circle(rad,self.GetBool(1008))
                                        self.Close()
                                    elif self.GetLong(1001)==10012:
                                       lato = self.GetReal(1007)
                                       sweep_square(lato,self.GetBool(1008))
                                       self.Close()              
                                elif id==c4d.IDC_CANCEL:
                                    self.Close()
                                elif id==c4d.BFM_INPUT:
                                    if msg[c4d.BFM_ACTION_ESC]==True:
                                        print "Action Escaped"
                                        self.Close()
                                return True
                           
                           
                        
                      
                      
                      
                    class QUICKSWEEP(plugins.CommandData) :
                      
                        pass     
                      
                        def Execute(self, doc) :
                      
                            main()
                      
                            return True
                      
                         
                      
                    if __name__ == "__main__":
                            
                        # load icon.tif from res into bmp 
                        bmp = bitmaps.BaseBitmap() 
                        dir, file = os.path.split(__file__) 
                        fn = os.path.join(dir, "res", "QuickSweep.tif") 
                        bmp.InitWith(fn) 
                        # register the plugin 
                      
                        okyn = plugins.RegisterCommandPlugin(id=PLUGIN_ID, str="Quick Sweep", info=c4d.PLUGINFLAG_COMMAND_HOTKEY, icon=bmp, help="Quick sweep multiple splines", dat=QUICKSWEEP())
                        print ""
                        print "-------------- QuickSweep 1.0 by Visualtricks ----------------"
                        if okyn:
                            print "QuickSweep 1.0 initialized "
                        else:
                            print "Something went wrong - QuickSweep could not initialize"
                        print "----------------------------------------------------------"
                        print ""
                    

                    can be downloaded from here: http://www.visualtricks.it/site/wp-content/uploads/2012/11/QuickSweep1.zip
                    If anyone wants to give any advice, will be appreciated ! 🙂

                    Cheers
                    Massimiliano

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