GeDialog Set combo default and hide/show fields

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

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(...)

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.

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.

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

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.

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"

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