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