コード例 #1
0
ファイル: NukeEditor.py プロジェクト: tehdot/arbotix
    def __init__(self, parent, port=None):
        ToolPane.__init__(self, parent, port)
        # default data
        self.signs = "+" * 18
        self.curpose = ""
        self.ikChoice = ""
        self.optChoice = ""

        self.sizer = wx.GridBagSizer(10, 10)

        # IK styles/Config
        temp = wx.StaticBox(self, -1, 'IK Config')
        temp.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD))
        configBox = wx.StaticBoxSizer(temp, orient=wx.VERTICAL)
        configSizer = wx.GridBagSizer(5, 5)
        configSizer.Add(wx.StaticText(self, -1, "IK Type:"), (0, 0),
                        wx.GBSpan(1, 1), wx.ALIGN_CENTER_VERTICAL | wx.TOP, 10)
        self.ikType = wx.ComboBox(self,
                                  self.ID_IKTYPE,
                                  choices=iKmodels.keys())
        configSizer.Add(self.ikType, (0, 1), wx.GBSpan(1, 1), wx.TOP, 10)

        # IK Option (typical # of legs or # of DOF)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        self.optLabel = wx.StaticText(self, -1, "# of Legs:")
        configSizer.Add(self.optLabel, (1, 0), wx.GBSpan(1, 1),
                        wx.ALIGN_CENTER_VERTICAL)
        self.ikOpt = wx.ComboBox(self, self.ID_IKOPT, choices=["4", "6"])
        configSizer.Add(self.ikOpt, (1, 1))
        configBox.Add(configSizer)
        self.sizer.Add(configBox, (0, 1), wx.GBSpan(1, 1), wx.EXPAND)

        # Actions buttons
        temp = wx.StaticBox(self, -1, 'Actions')
        temp.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD))
        actionBox = wx.StaticBoxSizer(temp, orient=wx.VERTICAL)
        actionSizer = wx.GridBagSizer(5, 5)

        actionSizer.Add(wx.StaticText(self, -1, "Capture Limits:"), (0, 0),
                        wx.GBSpan(1, 1), wx.ALIGN_CENTER_VERTICAL)
        actionSizer.Add(wx.StaticText(self, -1, "Capture Neutral:"), (1, 0),
                        wx.GBSpan(1, 1), wx.ALIGN_CENTER_VERTICAL)
        actionSizer.Add(wx.StaticText(self, -1, "Set/Test Signs:"), (2, 0),
                        wx.GBSpan(1, 1), wx.ALIGN_CENTER_VERTICAL)

        actionSizer.Add(wx.Button(self, self.BT_LIMITS, 'Capture'), (0, 1))
        actionSizer.Add(wx.Button(self, self.BT_NEUTRAL, 'Capture'), (1, 1))
        self.signButton = wx.Button(self, self.BT_SIGN, 'Go')
        actionSizer.Add(self.signButton, (2, 1))

        actionBox.Add(actionSizer)
        self.sizer.Add(actionBox, (1, 1), wx.GBSpan(1, 1), wx.EXPAND)

        # NUKE Label
        nukeIt = wx.StaticText(self, -1, "NUKE: Get Your IK On")
        nukeIt.SetFont(wx.Font(15, wx.DEFAULT, wx.NORMAL, wx.BOLD, wx.ITALIC))
        self.sizer.Add(nukeIt, (2, 0), wx.GBSpan(1, 2),
                       wx.ALIGN_CENTER_VERTICAL)

        # Buttons
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        gaitBut = wx.Button(self, -1, 'Gait Builder')
        gaitBut.Disable()
        hbox.Add(gaitBut)
        viewBut = wx.Button(self, -1, 'Viewer/Tuner')
        viewBut.Disable()
        hbox.Add(viewBut)
        hbox.Add(wx.Button(self, self.BT_DRIVE, 'Test Drive'))
        hbox.Add(wx.Button(self, self.BT_EXPORT, 'Export'))
        self.sizer.Add(hbox, (2, 2), wx.GBSpan(1, 1), wx.ALIGN_CENTER)

        # Load Data (if possible)
        self.loadData()
        self.SetSizer(self.sizer)
        self.SetAutoLayout(1)
        self.sizer.Fit(self)

        # event handling
        wx.EVT_BUTTON(self, self.BT_LIMITS, self.doLimits)
        wx.EVT_BUTTON(self, self.BT_NEUTRAL, self.doNeutral)
        wx.EVT_BUTTON(self, self.BT_SIGN, self.doSignTest)
        wx.EVT_BUTTON(self, self.BT_DRIVE, self.doWalkTest)
        wx.EVT_BUTTON(self, self.BT_EXPORT, self.doExport)

        wx.EVT_COMBOBOX(self, self.ID_IKTYPE, self.doIKType)
        wx.EVT_COMBOBOX(self, self.ID_IKOPT, self.doIkOpt)
        wx.EVT_SPINCTRL(self, self.ID_ANY, self.save)
コード例 #2
0
ファイル: NukeEditor.py プロジェクト: IanMHoffman/pypose
    def __init__(self, parent, port=None):
        ToolPane.__init__(self, parent, port)
        # default data
        self.signs = "+"*18
        self.curpose = ""
        self.ikChoice = ""
        self.optChoice = ""

        self.sizer = wx.GridBagSizer(10,10)

        # IK styles/Config
        temp = wx.StaticBox(self, -1, 'IK Config')
        temp.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD))
        configBox = wx.StaticBoxSizer(temp,orient=wx.VERTICAL)
        configSizer = wx.GridBagSizer(5,5)
        configSizer.Add(wx.StaticText(self, -1, "IK Type:"),(0,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL|wx.TOP,10)
        self.ikType = wx.ComboBox(self, self.ID_IKTYPE, choices=iKmodels.keys())
        configSizer.Add(self.ikType,(0,1),wx.GBSpan(1,1),wx.TOP,10)

        # IK Option (typical # of legs or # of DOF)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        self.optLabel = wx.StaticText(self, -1, "# of Legs:")
        configSizer.Add(self.optLabel,(1,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        self.ikOpt = wx.ComboBox(self, self.ID_IKOPT, choices=["4","6"])
        configSizer.Add(self.ikOpt,(1,1))
        configBox.Add(configSizer)
        self.sizer.Add(configBox, (0,1), wx.GBSpan(1,1), wx.EXPAND)

        # Actions buttons
        temp = wx.StaticBox(self, -1, 'Actions')
        temp.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD))
        actionBox = wx.StaticBoxSizer(temp,orient=wx.VERTICAL)
        actionSizer = wx.GridBagSizer(5,5)

        actionSizer.Add(wx.StaticText(self, -1, "Capture Limits:"), (0,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        actionSizer.Add(wx.StaticText(self, -1, "Capture Neutral:"), (1,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        actionSizer.Add(wx.StaticText(self, -1, "Set/Test Signs:"), (2,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)

        actionSizer.Add(wx.Button(self, self.BT_LIMITS, 'Capture'),(0,1))
        actionSizer.Add(wx.Button(self, self.BT_NEUTRAL, 'Capture'),(1,1))
        self.signButton = wx.Button(self, self.BT_SIGN, 'Go')
        actionSizer.Add(self.signButton,(2,1))

        actionBox.Add(actionSizer)
        self.sizer.Add(actionBox, (1,1), wx.GBSpan(1,1), wx.EXPAND)

        # NUKE Label
        nukeIt = wx.StaticText(self, -1, "NUKE: Get Your IK On")
        nukeIt.SetFont(wx.Font(15, wx.DEFAULT, wx.NORMAL, wx.BOLD, wx.ITALIC))
        self.sizer.Add(nukeIt, (2,0), wx.GBSpan(1,2), wx.ALIGN_CENTER_VERTICAL)

        # Buttons
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        gaitBut = wx.Button(self,-1,'Gait Builder')
        gaitBut.Disable()
        hbox.Add(gaitBut)
        viewBut = wx.Button(self,-1, 'Viewer/Tuner')
        viewBut.Disable()
        hbox.Add(viewBut)
        hbox.Add(wx.Button(self, self.BT_DRIVE, 'Test Drive'))
        hbox.Add(wx.Button(self,self.BT_EXPORT, 'Export'))
        self.sizer.Add(hbox, (2,2), wx.GBSpan(1,1), wx.ALIGN_CENTER)

        # Load Data (if possible)
        self.loadData()
        self.SetSizer(self.sizer)
        self.SetAutoLayout(1)
        self.sizer.Fit(self)

        # event handling
        wx.EVT_BUTTON(self, self.BT_LIMITS, self.doLimits)
        wx.EVT_BUTTON(self, self.BT_NEUTRAL, self.doNeutral)
        wx.EVT_BUTTON(self, self.BT_SIGN, self.doSignTest)
        wx.EVT_BUTTON(self, self.BT_DRIVE, self.doWalkTest)
        wx.EVT_BUTTON(self, self.BT_EXPORT, self.doExport)

        wx.EVT_COMBOBOX(self, self.ID_IKTYPE, self.doIKType)
        wx.EVT_COMBOBOX(self, self.ID_IKOPT, self.doIkOpt)
        wx.EVT_SPINCTRL(self, self.ID_ANY, self.save)
コード例 #3
0
ファイル: NukeEditor.py プロジェクト: griswaldbrooks/Robot
    def __init__(self, parent, port=None):
        ToolPane.__init__(self, parent, port)
        # default data
        self.signs = "+"*18
        self.curpose = "" 
        self.ikChoice = ""
        self.legChoice = ""
        
        sizer = wx.GridBagSizer(10,10)
        
        # Body Dimensions 
        temp = wx.StaticBox(self, -1, 'Body Dimensions')
        temp.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD))
        bodyBox = wx.StaticBoxSizer(temp,orient=wx.VERTICAL) 
        bodySizer = wx.GridBagSizer(5,5)
    
        bodySizer.Add(wx.StaticText(self, -1, "Leg"), (0,0), wx.GBSpan(1,1), wx.EXPAND | wx.TOP, 10)
        bodySizer.Add(wx.StaticText(self, -1, "Coxa(mm):"), (1,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        bodySizer.Add(wx.StaticText(self, -1, "Femur(mm):"), (2,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        bodySizer.Add(wx.StaticText(self, -1, "Tibia(mm):"), (3,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        bodySizer.Add(wx.StaticText(self, -1, "Offsets"), (4,0), wx.GBSpan(1,1), wx.EXPAND | wx.TOP, 10)
        bodySizer.Add(wx.StaticText(self, -1, "X(mm):"), (5,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        bodySizer.Add(wx.StaticText(self, -1, "Y(mm):"), (6,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        bodySizer.Add(wx.StaticText(self, -1, "Mid-Y(mm):"), (7,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        bodySizer.Add(wx.StaticText(self, -1, "COG Offset"), (8,0), wx.GBSpan(1,1), wx.EXPAND | wx.TOP, 10)
        bodySizer.Add(wx.StaticText(self, -1, "X(mm):"), (9,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        bodySizer.Add(wx.StaticText(self, -1, "Y(mm):"), (10,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        
        # VARS = coxaLen, femurLen, tibiaLen, xBody, yBody, midyBody, xCOG, yCOG
        self.vars = list()
        self.vars.append(wx.SpinCtrl(self, self.ID_ANY, '50', min=1, max=5000))
        bodySizer.Add(self.vars[0], (1,1))
        self.vars.append(wx.SpinCtrl(self, self.ID_ANY, '50', min=1, max=5000))
        bodySizer.Add(self.vars[1], (2,1))
        self.vars.append(wx.SpinCtrl(self, self.ID_ANY, '50', min=1, max=5000))
        bodySizer.Add(self.vars[2], (3,1))
        self.picture = wx.StaticBitmap(self, bitmap=wx.Bitmap("tools/images/leg.jpg"))
        bodySizer.Add(self.picture, (1,2), wx.GBSpan(3,1))

        self.vars.append(wx.SpinCtrl(self, self.ID_ANY, '50', min=1, max=5000))
        bodySizer.Add(self.vars[3], (5,1))
        self.vars.append(wx.SpinCtrl(self, self.ID_ANY, '50', min=1, max=5000))
        bodySizer.Add(self.vars[4], (6,1))
        self.vars.append(wx.SpinCtrl(self, self.ID_ANY, '50', min=1, max=5000))
        bodySizer.Add(self.vars[5], (7,1)) 
        self.picture1 = wx.StaticBitmap(self, bitmap=wx.Bitmap("tools/images/body.jpg"))
        bodySizer.Add(self.picture1, (5,2), wx.GBSpan(3,1))      

        self.vars.append(wx.SpinCtrl(self, self.ID_ANY, '0', min=-200, max=200))
        bodySizer.Add(self.vars[6], (9,1))
        self.vars.append(wx.SpinCtrl(self, self.ID_ANY, '0', min=-200, max=200))
        bodySizer.Add(self.vars[7], (10,1))

        bodyBox.Add(bodySizer)
        sizer.Add(bodyBox, (0,0), wx.GBSpan(2,1), wx.EXPAND)

        # IK styles/Config
        temp = wx.StaticBox(self, -1, 'IK Config')
        temp.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD))
        configBox = wx.StaticBoxSizer(temp,orient=wx.VERTICAL) 
        configSizer = wx.GridBagSizer(5,5)
        configSizer.Add(wx.StaticText(self, -1, "IK Type:"),(0,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL|wx.TOP,10)
        self.ikType = wx.ComboBox(self, self.ID_IKTYPE, choices=iKmodels.keys())
        configSizer.Add(self.ikType,(0,1),wx.GBSpan(1,1),wx.TOP,10)   
        
        # Number of Legs
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        configSizer.Add(wx.StaticText(self, -1, "# of Legs:"),(1,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        self.legCount = wx.ComboBox(self, self.ID_LEGCOUNT, choices=["4","6"])
        configSizer.Add(self.legCount,(1,1))     
        #configSizer.Add(wx.Button(self, -1, 'Advanced View'), (2,1), wx.GBSpan(1,1), wx.ALIGN_RIGHT)
        configBox.Add(configSizer)
        sizer.Add(configBox, (0,1), wx.GBSpan(1,1), wx.EXPAND)

        # Actions buttons
        temp = wx.StaticBox(self, -1, 'Actions')
        temp.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD))
        actionBox = wx.StaticBoxSizer(temp,orient=wx.VERTICAL) 
        actionSizer = wx.GridBagSizer(5,5)

        actionSizer.Add(wx.StaticText(self, -1, "Capture Limits:"), (0,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        actionSizer.Add(wx.StaticText(self, -1, "Capture Neutral:"), (1,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        actionSizer.Add(wx.StaticText(self, -1, "Set/Test Signs:"), (2,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        #actionSizer.Add(wx.StaticText(self, -1, "Test Drive:"), (3,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
                
        actionSizer.Add(wx.Button(self, self.BT_LIMITS, 'Capture'),(0,1))
        actionSizer.Add(wx.Button(self, self.BT_NEUTRAL, 'Capture'),(1,1))
        self.signButton = wx.Button(self, self.BT_SIGN, 'Go')        
        actionSizer.Add(self.signButton,(2,1))
        #driveButton = wx.Button(self, self.BT_DRIVE, 'Drive')
        #driveButton.Disable()
        #actionSizer.Add(driveButton,(3,1))
        
        actionBox.Add(actionSizer)
        sizer.Add(actionBox, (1,1), wx.GBSpan(1,1), wx.EXPAND)    
        
        # Servo ID Selections
        temp = wx.StaticBox(self, -1, 'Servo Assignments')
        temp.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD))
        servoBox = wx.StaticBoxSizer(temp,orient=wx.VERTICAL) 
        servoSizer = wx.GridBagSizer(5,5)
    
        servoSizer.Add(wx.StaticText(self, -1, "LF Coxa:"), (0,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL| wx.TOP, 10)
        servoSizer.Add(wx.StaticText(self, -1, "LF Femur:"), (1,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        servoSizer.Add(wx.StaticText(self, -1, "LF Tibia:"), (2,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        servoSizer.Add(wx.StaticText(self, -1, "RF Coxa:"), (0,2), wx.GBSpan(1,1), wx.ALIGN_CENTER_VERTICAL| wx.TOP, 10)
        servoSizer.Add(wx.StaticText(self, -1, "RF Femur:"), (1,2), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        servoSizer.Add(wx.StaticText(self, -1, "RF Tibia:"), (2,2), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)

        servoSizer.Add(wx.StaticText(self, -1, "LM Coxa:"), (4,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        servoSizer.Add(wx.StaticText(self, -1, "LM Femur:"), (5,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        servoSizer.Add(wx.StaticText(self, -1, "LM Tibia:"), (6,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        servoSizer.Add(wx.StaticText(self, -1, "RM Coxa:"), (4,2), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        servoSizer.Add(wx.StaticText(self, -1, "RM Femur:"), (5,2), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        servoSizer.Add(wx.StaticText(self, -1, "RM Tibia:"), (6,2), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        
        servoSizer.Add(wx.StaticText(self, -1, "LR Coxa:"), (8,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        servoSizer.Add(wx.StaticText(self, -1, "LR Femur:"), (9,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        servoSizer.Add(wx.StaticText(self, -1, "LR Tibia:"), (10,0), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        servoSizer.Add(wx.StaticText(self, -1, "RR Coxa:"), (8,2), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        servoSizer.Add(wx.StaticText(self, -1, "RR Femur:"), (9,2), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        servoSizer.Add(wx.StaticText(self, -1, "RR Tibia:"), (10,2), wx.GBSpan(1,1),wx.ALIGN_CENTER_VERTICAL)
        
        # SERVOS = Coxa, Femur, Tibia (LF, RF, LM, RM, LR, RR)
        self.servos = list()
        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '2', min=1, max=self.parent.project.count))    # LF
        servoSizer.Add(self.servos[0], (0,1), wx.GBSpan(1,1), wx.EXPAND | wx.TOP, 10)
        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '4', min=1, max=self.parent.project.count))
        servoSizer.Add(self.servos[1], (1,1))
        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '6', min=1, max=self.parent.project.count))
        servoSizer.Add(self.servos[2], (2,1))

        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '1', min=1, max=self.parent.project.count))    # RF
        servoSizer.Add(self.servos[3], (0,3), wx.GBSpan(1,1), wx.EXPAND | wx.TOP, 10)
        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '3', min=1, max=self.parent.project.count))
        servoSizer.Add(self.servos[4], (1,3))
        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '5', min=1, max=self.parent.project.count))
        servoSizer.Add(self.servos[5], (2,3))

        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '14', min=1, max=self.parent.project.count))  # LM
        servoSizer.Add(self.servos[6], (4,1))
        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '16', min=1, max=self.parent.project.count))
        servoSizer.Add(self.servos[7], (5,1))
        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '18', min=1, max=self.parent.project.count))
        servoSizer.Add(self.servos[8], (6,1))

        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '13', min=1, max=self.parent.project.count))  # RM
        servoSizer.Add(self.servos[9], (4,3))
        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '15', min=1, max=self.parent.project.count))
        servoSizer.Add(self.servos[10], (5,3))
        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '17', min=1, max=self.parent.project.count))
        servoSizer.Add(self.servos[11], (6,3))

        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '8', min=1, max=self.parent.project.count))   # LR
        servoSizer.Add(self.servos[12], (8,1))
        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '10', min=1, max=self.parent.project.count))
        servoSizer.Add(self.servos[13], (9,1))
        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '12', min=1, max=self.parent.project.count))
        servoSizer.Add(self.servos[14], (10,1))        

        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '7', min=1, max=self.parent.project.count))   # RR
        servoSizer.Add(self.servos[15], (8,3))
        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '9', min=1, max=self.parent.project.count))
        servoSizer.Add(self.servos[16], (9,3))
        self.servos.append(wx.SpinCtrl(self, self.ID_ANY, '11', min=1, max=self.parent.project.count))
        servoSizer.Add(self.servos[17], (10,3))

        servoBox.Add(servoSizer)
        sizer.Add(servoBox, (0,2), wx.GBSpan(2,1), wx.EXPAND)

        # NUKE Label
        nukeIt = wx.StaticText(self, -1, "NUKE: Kinematics Made Easy")
        nukeIt.SetFont(wx.Font(15, wx.DEFAULT, wx.NORMAL, wx.BOLD, wx.ITALIC))
        sizer.Add(nukeIt, (2,0), wx.GBSpan(1,2), wx.ALIGN_CENTER_VERTICAL)        

        # Buttons
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        gaitBut = wx.Button(self,-1,'Gait Builder')
        gaitBut.Disable()        
        hbox.Add(gaitBut)
        viewBut = wx.Button(self,-1, 'Viewer/Tuner')
        viewBut.Disable()
        hbox.Add(viewBut)
        hbox.Add(wx.Button(self, self.BT_DRIVE, 'Test Drive'))
        hbox.Add(wx.Button(self,self.BT_EXPORT, 'Export'))
        sizer.Add(hbox, (2,2), wx.GBSpan(1,1), wx.ALIGN_CENTER) 

        self.SetSizer(sizer)
        self.SetAutoLayout(1)
        sizer.Fit(self)

        # Load Data (if possible)
        self.loadData()

        # event handling
        wx.EVT_BUTTON(self, self.BT_LIMITS, self.doLimits)                
        wx.EVT_BUTTON(self, self.BT_NEUTRAL, self.doNeutral)
        wx.EVT_BUTTON(self, self.BT_SIGN, self.doSignTest) 
        wx.EVT_BUTTON(self, self.BT_DRIVE, self.doWalkTest) 
        wx.EVT_BUTTON(self, self.BT_EXPORT, self.doExport) 

        wx.EVT_COMBOBOX(self, self.ID_IKTYPE, self.doIKType)
        wx.EVT_COMBOBOX(self, self.ID_LEGCOUNT, self.doLegCount) 
        wx.EVT_SPINCTRL(self, self.ID_ANY, self.save)