class PositionParameters(wx.Panel): def __init__(self, parent=None): super(PositionParameters, self).__init__(parent) # Parameters self.parent = parent self.SetSize((232,-1)) self.SetSizeHints(232,-1) mainSizer = wx.BoxSizer(wx.VERTICAL) posBox = wx.StaticBox(self, -1, "Position X, Y") posSizer = wx.StaticBoxSizer(posBox, wx.HORIZONTAL) self.positionX = wx.StaticText(self, label='0', style=wx.TR_SINGLE) posSizer.Add(self.positionX, 3, wx.ALL|wx.ALIGN_CENTER, 5) labelX = wx.StaticText(self, label='mm', style=wx.TR_SINGLE) posSizer.Add(labelX, 1, wx.ALL|wx.ALIGN_CENTER, 5) self.positionY = wx.StaticText(self, label='0', style=wx.TR_SINGLE) posSizer.Add(self.positionY, 3, wx.ALL|wx.ALIGN_CENTER, 5) labelY = wx.StaticText(self, label='mm', style=wx.TR_SINGLE) posSizer.Add(labelY, 1, wx.ALL|wx.ALIGN_CENTER, 5) self.setHome = wx.Button(self, name='setHome', label=u'Set \u2302', size=(50,25)) self.setHome.Bind(wx.EVT_BUTTON, self.set_home) posSizer.Add(self.setHome, 1, wx.ALL|wx.ALIGN_CENTER, 5) mainSizer.Add(posSizer, 0, wx.ALL|wx.ALIGN_CENTER, 5) inBox = wx.StaticBox(self, -1, "Increment X, Y | Speed") inSizer = wx.StaticBoxSizer(inBox, wx.HORIZONTAL) self.setIncrementX = NumCtrl(self, name = 'setIncrementX', value = 9, integerWidth = 2, allowNegative = False, min = 0.1, max = 99, fractionWidth = 1, groupDigits = False, autoSize = False, style = wx.TR_SINGLE|wx.CENTER, size = (34,-1)) inSizer.Add(self.setIncrementX, 2, wx.ALL|wx.ALIGN_CENTER, 2) labelIncX = wx.StaticText(self, label='mm', style=wx.TR_SINGLE) inSizer.Add(labelIncX, 1, wx.RIGHT|wx.ALIGN_CENTER, 2) self.setIncrementY = NumCtrl(self, name = 'setIncrementY', value = 9, integerWidth = 2, allowNegative = False, min = 0.1, max = 99, fractionWidth = 1, groupDigits = False, autoSize = False, style = wx.TR_SINGLE|wx.CENTER, size = (34,-1)) inSizer.Add(self.setIncrementY, 2, wx.ALL|wx.ALIGN_CENTER, 5) labelIncY = wx.StaticText(self, label='mm', style=wx.TR_SINGLE) inSizer.Add(labelIncY, 1, wx.RIGHT|wx.ALIGN_CENTER, 2) self.setSpeed = NumCtrl(self, name = 'setSpeed', value = self.parent.control.get_speed(), integerWidth = 2, allowNegative = False, min = 1, max = 99, fractionWidth = 1, groupDigits = False, autoSize = False, style = wx.TR_SINGLE|wx.CENTER, size = (34,-1)) self.setSpeed.Bind(wx.EVT_TEXT, self.set_speed) inSizer.Add(self.setSpeed, 2, wx.ALL|wx.ALIGN_CENTER, 2) labelSpeed = wx.StaticText(self, label='mm/s', style=wx.TR_SINGLE) inSizer.Add(labelSpeed, 1, wx.RIGHT|wx.ALIGN_CENTER, 2) mainSizer.Add(inSizer, 0, wx.ALL|wx.ALIGN_CENTER, 5) self.SetSizer(mainSizer) mainSizer.Fit(self) def set_home(self, event): self.parent.control.set_home() def set_speed(self, event): o = event.GetEventObject() speed_set = float(o.GetValue()) self.parent.control.set_speed(speed_set) speed_get = self.parent.control.get_speed() if ('%f0.1'%round(speed_get,1)) != ('%f0.1'%round(speed_set,1)): o.SetValue('%0.1f'%self.parent.control.get_speed())
def _number_editor(self, settings, name): initial_value = settings[name] editor = NumCtrl(self, value=initial_value, integerWidth=3, allowNone=True) editor.Bind(wx.EVT_TEXT, lambda evt: self._set_value(editor, name)) return editor
def _number_editor(self, settings, name): initial_value = settings[name] editor = NumCtrl(self, value=initial_value, integerWidth=3, allowNone=True) """ editor.SetBackgroundColour(Colour(200, 222, 40)) editor.SetOwnBackgroundColour(Colour(200, 222, 40)) editor.SetForegroundColour(Colour(7, 0, 70)) editor.SetOwnForegroundColour(Colour(7, 0, 70)) """ editor.Bind(wx.EVT_TEXT, lambda evt: self._set_value(editor, name)) return editor
class MainOptionsTab(wx.Panel): def __init__(self, *args, **kwargs): """""" wx.Panel.__init__(self, *args, **kwargs) self.sql_file = './db/INVENTORY.sql' self.SetName('MainOptionsTab') firstSizer = wx.BoxSizer(wx.VERTICAL) secondlevelSizer = wx.BoxSizer(wx.HORIZONTAL) # combochoice_list = [('Department', 'genOptions_department_combobox', 'department'), # ('Category', 'genOptions_category_combobox', 'category'), # ('Sub-Category', 'genOptions_subcategory_combobox', 'subcategory'), # ('Material', 'genOptions_location_combobox','location'), # ('Unit Type', 'genOptions_unittype_combobox','unit_type'), # ('G/L Post', 'genOptions_glpost_txtctrl', 'postacct')] choiced = [' '] self.deptcombo = RH_ComboBox(self, choices=choiced, style=wx.CB_SORT) self.deptcombo.tableName = 'item_options' self.deptcombo.fieldName = 'department' self.deptcombo.sqlfile = 'INVENTORY.sql' self.deptcombo.defTable = 'organizations' self.deptcombo.defField = 'department' tS = tSizer(self, text="Department", ctrl=self.deptcombo) secondlevelSizer.Add(tS, 0, wx.ALL | wx.EXPAND, 3) self.catcombo = RH_ComboBox(self, choices=choiced, style=wx.CB_SORT) self.catcombo.tableName = 'item_options' self.catcombo.fieldName = 'category' self.catcombo.defTable = 'organizations' self.catcombo.defField = 'category' self.catcombo.sqlfile = 'INVENTORY.sql' tS = tSizer(self, text="Category", ctrl=self.catcombo) secondlevelSizer.Add(tS, 0, wx.ALL | wx.EXPAND, 3) self.subcatcombo = RH_ComboBox(self, choices=choiced, style=wx.CB_SORT) self.subcatcombo.tableName = 'item_options' self.subcatcombo.fieldName = 'subcategory' self.subcatcombo.defTable = 'organizations' self.subcatcombo.defField = 'subcategory' tS = tSizer(self, text="SubCategory", ctrl=self.subcatcombo) secondlevelSizer.Add(tS, 0, wx.ALL | wx.EXPAND, 3) self.matcombo = RH_ComboBox(self, choices=choiced, style=wx.CB_SORT) self.matcombo.tableName = 'item_options' self.matcombo.fieldName = 'material' self.matcombo.defTable = 'organizations' self.matcombo.defField = 'material' tS = tSizer(self, text="Material", ctrl=self.matcombo) secondlevelSizer.Add(tS, 0, wx.ALL | wx.EXPAND, 3) self.unitcombo = RH_ComboBox(self, choices=choiced, style=wx.CB_SORT) self.unitcombo.tableName = 'item_options' self.unitcombo.fieldName = 'unit_type' self.unitcombo.defTable = 'organizations' self.unitcombo.defField = 'unit_type' tS = tSizer(self, text="Unit Type", ctrl=self.unitcombo) secondlevelSizer.Add(tS, 0, wx.ALL | wx.EXPAND, 3) #secondlevelSizer.Add(self.deptcombo, 0, wx.ALL|wx.EXPAND, 3) # secondlevelSizer.Add(self.catcombo, 0, wx.ALL|wx.EXPAND, 3) # secondlevelSizer.Add(self.subcatcombo, 0, wx.ALL|wx.EXPAND, 3) # secondlevelSizer.Add(self.matcombo, 0, wx.ALL|wx.EXPAND, 3) # secondlevelSizer.Add(self.unitcombo, 0, wx.ALL|wx.EXPAND, 3) thirdlevelSizer = wx.BoxSizer(wx.HORIZONTAL) self.age_c = Ctrl(self, -1, autoformat='AGE', name="genOptions_agepopup_numctrl") self.age_c.tableName = 'item_options' self.age_c.fieldName = 'agepopup' self.age_c.sqlfile = 'INVENTORY.sql' tS = tSizer(self, text="Age", ctrl=self.age_c) thirdlevelSizer.Add(tS, 0, wx.ALL | wx.EXPAND, 3) fourthlevelSizer = wx.BoxSizer(wx.HORIZONTAL) fifthlevelSizer = wx.BoxSizer(wx.HORIZONTAL) txt = wx.StaticText(self, -1, label="Units\nin Package") self.units_in_pkg_c = NumCtrl( self, -1, value=1, name='genOptions_units_in_package_numctrl', min=1, selectOnEntry=True, style=0, integerWidth=6, fractionWidth=0) self.units_in_pkg_c.tableName = 'item_options' self.units_in_pkg_c.fieldName = 'unitsinpackage' self.units_in_pkg_c.Bind(wx.EVT_KILL_FOCUS, self.NeverZero) fifthlevelSizer.Add(self.units_in_pkg_c, 0, wx.ALL | wx.EXPAND, 5) fifthlevelSizer.Add(txt, 0, wx.ALL | wx.EXPAND, 5) # flc_list = [('Food Stamp Exempt','genOptions_foodStampExempt_checkbox','foodstampexempt'), # ('Loyalty Exempt','genOptions_loyaltyExempt_checkbox','loyaltyexempt'), # ('Consignment','genOptions_consignment_checkbox','consignment'), # ('Closeout','genOptions_closeout_checkbox','closeout')] self.foodstampcb = RH_CheckBox(self, label='Food Stamp Exempt') self.foodstampcb.tableName = 'item_options' self.foodstampcb.fieldName = 'foodstampexempt' self.foodstampcb.sqlfile = 'INVENTORY.sql' fifthlevelSizer.Add(self.foodstampcb, 0, wx.ALL, 5) self.loyaltycb = RH_CheckBox(self, label='Loyalty Exempt') self.loyaltycb.tableName = 'item_options' self.loyaltycb.fieldName = 'loyaltyexempt' self.loyaltycb.sqlfile = 'INVENTORY.sql' fifthlevelSizer.Add(self.loyaltycb, 0, wx.ALL, 5) self.consigncb = RH_CheckBox(self, label='Consignment') self.consigncb.tableName = 'item_options' self.consigncb.fieldName = 'consignment' self.consigncb.sqlfile = 'INVENTORY.sql' fifthlevelSizer.Add(self.consigncb, 0, wx.ALL, 5) self.closeoutcb = RH_CheckBox(self, label='Closeout') self.closeoutcb.tableName = 'item_options' self.closeoutcb.fieldName = 'closeout' self.closeoutcb.sqlfile = 'INVENTORY.sql' fifthlevelSizer.Add(self.closeoutcb, 0, wx.ALL, 5) sixthlevelSizer = wx.BoxSizer(wx.HORIZONTAL) self.partnumtc = RH_TextCtrl(self, size=(140, -1)) self.partnumtc.tableName = 'item_detailed' self.partnumtc.fieldName = 'part_num' self.partnumtc.sqlfile = 'INVENTORY.sql' tS = tSizer(self, text="Part #", ctrl=self.partnumtc) sixthlevelSizer.Add(tS, 0, wx.ALL, 5) self.oemnumtc = RH_TextCtrl(self, size=(140, -1)) self.oemnumtc.tableName = 'item_detailed' self.oemnumtc.fieldName = 'oempart_num' self.oemnumtc.sqlfile = 'INVENTORY.sql' tS = tSizer(self, text="OEM #", ctrl=self.oemnumtc) sixthlevelSizer.Add(tS, 0, wx.ALL, 5) self.zonenumtc = RH_TextCtrl(self, size=(140, -1)) self.zonenumtc.tableName = 'item_options' self.zonenumtc.fieldName = 'location' self.zonenumtc.sqlfile = 'INVENTORY.sql' tS = tSizer(self, text="Zone", ctrl=self.zonenumtc) sixthlevelSizer.Add(tS, 0, wx.ALL, 5) lvl6b_Sizer = wx.BoxSizer(wx.HORIZONTAL) self.kitnumtc = RH_TextCtrl(self, size=(140, -1)) self.kitnumtc.tableName = 'item_detailed' self.kitnumtc.fieldName = 'kit_num' self.kitnumtc.sqlfile = 'INVENTORY.sql' tS = tSizer(self, text="Kit #", ctrl=self.kitnumtc) lvl6b_Sizer.Add(tS, 0, wx.ALL, 5) self.piecestc = RH_TextCtrl(self, size=(140, -1)) self.piecestc.tableName = 'item_detailed' self.piecestc.fieldName = 'kit_pieces' self.piecestc.sqlfile = 'INVENTORY.sql' tS = tSizer(self, text="Kit Pieces", ctrl=self.piecestc) lvl6b_Sizer.Add(tS, 0, wx.ALL, 5) seventhlevelSizer = wx.BoxSizer(wx.HORIZONTAL) self.deactivatedcb = RH_CheckBox(self, label="Deactivated") self.deactivatedcb.SetForegroundColour('Red') self.deactivatedcb.tableName = 'item_options' self.deactivatedcb.fieldName = 'deactivated' self.deactivatedcb.sqlfile = 'INVENTORY.sql' seventhlevelSizer.Add(self.deactivatedcb, 0, wx.ALL, 5) numberofitemstxt = wx.StaticText(self, -1, label="Number Here", name='genOptions_numberofitems_text') returnd = self.GetInvCount() numofItems = "{:,}".format(returnd[0]) inventoryCount = "Number of Items : {}\t".format(str(numofItems)) numberofitemstxt.SetLabel(inventoryCount) seventhlevelSizer.AddStretchSpacer(prop=3) seventhlevelSizer.Add(numberofitemstxt, 0, wx.ALL | wx.EXPAND, 15) firstSizer.Add(secondlevelSizer, 0, wx.ALL | wx.EXPAND, 5) firstSizer.Add(thirdlevelSizer, 0, wx.ALL | wx.EXPAND, 5) firstSizer.Add(fourthlevelSizer, 0, wx.ALL | wx.EXPAND, 5) firstSizer.Add(fifthlevelSizer, 0, wx.ALL | wx.EXPAND, 5) firstSizer.Add(sixthlevelSizer, 0, wx.ALL | wx.EXPAND, 5) firstSizer.Add(lvl6b_Sizer, 0, wx.ALL | wx.EXPAND, 5) firstSizer.AddStretchSpacer(prop=1) firstSizer.Add(seventhlevelSizer, 1, wx.ALL | wx.EXPAND, 10) self.SetSizer(firstSizer) firstSizer.Fit(self) # self.Layout() wx.CallAfter(self.LoadDefaults, event='') def NeverZero(self, event): """ Field can never be set to zero """ valued = event.GetEventObject() raw_value = valued.GetValue() named = valued.GetName() edit_ctrl = wx.FindWindowByName(named) if raw_value == 0: new_value = 1 else: new_value = raw_value if re.search('(txtctrl|numctrl)', named, re.I): edit_ctrl.SetValue(new_value) def GetInvCount(self): q = 'SELECT COUNT(*) FROM item_detailed' d = () r = SQConnect(q, d, self.sql_file).ONE() return r def onAisleNum(self, event): obj = event.GetEventObject() name = obj.GetName() value = wx.FindWindowByName(name).GetValue() sectionNums = wx.FindWindowByName('genOptions_sectionNums_combobox') locations = wx.FindWindowByName('genOptions_extraPlaces_combobox') if value != '0': sectionNums.Enable() locations.Disable() locations.SetValue('') else: locations.Enable() sectionNums.Disable() sectionNums.SetValue('') def LoadDefaults(self, event): DeptCat_list = [('department', self.deptcombo), ('category', self.catcombo), ('subcategory', self.subcatcombo), ('location', self.matcombo), ('unittype', self.unitcombo)] #for field, item in DeptCat_list: # item.LoadDefaults('organizations', field, 'abuser', 'rhp') def OnSave(self): upc = wx.FindWindowByName('inventory_itemNumber_txtctrl').GetCtrl() genOpts_list = [ 'genOptions_department_combobox', 'genOptions_category_combobox', 'genOptions_subcategory_combobox', 'genOptions_location_combobox', 'genOptions_glpost_txtctrl', 'genOptions_unittype_combobox', 'genOptions_itemType_radiobox', 'genOptions_agepopup_numctrl', 'genOptions_POSoptions_radiobox', 'genOptions_units_in_package_numctrl', 'genOptions_foodStampExempt_checkbox', 'genOptions_loyaltyExempt_checkbox', 'genOptions_consignment_checkbox', 'genOptions_partNumber_txtctrl', 'genOptions_oemNumber_txtctrl', 'genOptions_deactivated_checkbox' ] for name, table, field in genOpts_list: item = wx.Window.FindWindowByName(name) item.OnSave('upc', upc) def Clear(self): genOptions_default_list = [ 'genOptions_department_combobox', 'genOptions_category_combobox', 'genOptions_subcategory_combobox', 'genOptions_location_combobox', 'genOptions_glpost_txtctrl', 'genOptions_unittype_combobox', 'genOptions_itemType_radiobox', 'genOptions_agepopup_numctrl', 'genOptions_POSoptions_radiobox', 'genOptions_units_in_package_numctrl', 'genOptions_foodStampExempt_checkbox', 'genOptions_loyaltyExempt_checkbox', 'genOptions_consignment_checkbox', 'genOptions_partNumber_txtctrl', 'genOptions_oemNumber_txtctrl', 'genOptions_deactivated_checkbox' ] for name in genOptions_default_list: item = wx.FindWindowByName(name) item.Clear()
class PowerDependentGUI(wx.Frame): def __init__(self, parent=None, title="Power Dependent Imaging"): super(PowerDependentGUI, self).__init__(parent, title=title, size=(1000, 1000)) self._filedir = "" self._truefilename = "" self._filename = "" self._lcvr_init = False main_panel = wx.Panel(self) main_sizer = wx.BoxSizer(wx.VERTICAL) input_panel = wx.Panel(main_panel) input_sizer = wx.BoxSizer(wx.HORIZONTAL) common_panel = wx.Panel(input_panel) common_sizer = wx.FlexGridSizer(11, 2, 0, 0) lcvr_label = wx.StaticText(common_panel, -1, "LCVR COM Port: ", wx.DefaultPosition, wx.Size(125, 20), wx.ALIGN_RIGHT, "StaticTextNameStr") self._lcvr_val = NumCtrl(common_panel, -1, 0, wx.DefaultPosition, wx.Size(125, 20), wx.TE_PROCESS_TAB | wx.TE_PROCESS_ENTER, wx.DefaultValidator, "masked.num") self._lcvr_val.SetAllowNegative(False) self._lcvr_val.SetBounds(1, 99) self._lcvr_val.SetFractionWidth(0) self._lcvr_val.SetIntegerWidth(2) self._lcvr_val.SetValue(6) self._lcvr_val.SetLimitOnFieldChange(True) self._lcvr_val.Bind(wx.lib.masked.EVT_NUM, self._lcvr_entry) lcvr_chan = wx.StaticText(common_panel, -1, "LCVR Channel: ", wx.DefaultPosition, wx.Size(125, 20), wx.ALIGN_RIGHT, "StaticTextNameStr") self._lcvr_ch = NumCtrl(common_panel, -1, 0, wx.DefaultPosition, wx.Size(125, 20), wx.TE_PROCESS_TAB | wx.TE_PROCESS_ENTER, wx.DefaultValidator, "masked.num") self._lcvr_ch.SetAllowNegative(False) self._lcvr_ch.SetBounds(1, 4) self._lcvr_ch.SetFractionWidth(0) self._lcvr_ch.SetIntegerWidth(1) self._lcvr_ch.SetValue(1) self._lcvr_ch.SetLimitOnFieldChange(True) wavelength_label = wx.StaticText(common_panel, -1, "Laser Wavelength (nm):", wx.DefaultPosition, wx.Size(150, 20), wx.ALIGN_RIGHT, "StaticTextNameStr") self._wavelength_val = NumCtrl(common_panel, -1, 0, wx.DefaultPosition, wx.Size(150, 20), wx.TE_PROCESS_TAB | wx.TE_PROCESS_ENTER, wx.DefaultValidator, "masked.num") self._wavelength_val.SetAllowNegative(False) self._wavelength_val.SetBounds(400, 1100) self._wavelength_val.SetFractionWidth(0) self._wavelength_val.SetIntegerWidth(4) self._wavelength_val.SetValue(780) self._wavelength_val.SetLimitOnFieldChange(True) pow_label = wx.StaticText(common_panel, -1, "Laser Power (mW):", wx.DefaultPosition, wx.Size(150, 20), wx.ALIGN_RIGHT, "StaticTextNameStr") self._pow_val = NumCtrl(common_panel, -1, 0, wx.DefaultPosition, wx.Size(150, 20), wx.TE_PROCESS_TAB | wx.TE_PROCESS_ENTER, wx.DefaultValidator, "masked.num") self._pow_val.SetAllowNegative(False) self._pow_val.SetBounds(0, 1000) self._pow_val.SetFractionWidth(2) self._pow_val.SetIntegerWidth(4) self._pow_val.SetValue(0) self._pow_val.SetLimitOnFieldChange(True) od_label = wx.StaticText(common_panel, -1, "OD:", wx.DefaultPosition, wx.Size(150, 20), wx.ALIGN_RIGHT, "StaticTextNameStr") self._od_val = NumCtrl(common_panel, -1, 0, wx.DefaultPosition, wx.Size(150, 20), wx.TE_PROCESS_TAB | wx.TE_PROCESS_ENTER, wx.DefaultValidator, "masked.num") self._od_val.SetAllowNegative(False) self._od_val.SetBounds(0, 100) self._od_val.SetFractionWidth(0) self._od_val.SetIntegerWidth(4) self._od_val.SetValue(0) self._od_val.SetLimitOnFieldChange(True) start_volt_label = wx.StaticText(common_panel, -1, "Start Voltage (V):", wx.DefaultPosition, wx.Size(150, 20), wx.ALIGN_RIGHT, "StaticTextNameStr") self._start_volt_val = NumCtrl(common_panel, -1, 0, wx.DefaultPosition, wx.Size(150, 20), wx.TE_PROCESS_TAB | wx.TE_PROCESS_ENTER, wx.DefaultValidator, "masked.num") self._start_volt_val.SetAllowNegative(False) self._start_volt_val.SetBounds(0, 10) self._start_volt_val.SetFractionWidth(2) self._start_volt_val.SetIntegerWidth(2) self._start_volt_val.SetValue(0) self._start_volt_val.SetLimitOnFieldChange(True) end_volt_label = wx.StaticText(common_panel, -1, "End Voltage (V):", wx.DefaultPosition, wx.Size(150, 20), wx.ALIGN_RIGHT, "StaticTextNameStr") self._end_volt_val = NumCtrl(common_panel, -1, 0, wx.DefaultPosition, wx.Size(150, 20), wx.TE_PROCESS_TAB | wx.TE_PROCESS_ENTER, wx.DefaultValidator, "masked.num") self._end_volt_val.SetAllowNegative(False) self._end_volt_val.SetBounds(0, 10) self._end_volt_val.SetFractionWidth(2) self._end_volt_val.SetIntegerWidth(2) self._end_volt_val.SetValue(10) self._end_volt_val.SetLimitOnFieldChange(True) step_volt_label = wx.StaticText(common_panel, -1, "Absolute Step Voltage (V):", wx.DefaultPosition, wx.Size(150, 20), wx.ALIGN_RIGHT, "StaticTextNameStr") self._step_volt_val = NumCtrl(common_panel, -1, 0, wx.DefaultPosition, wx.Size(150, 20), wx.TE_PROCESS_TAB | wx.TE_PROCESS_ENTER, wx.DefaultValidator, "masked.num") self._step_volt_val.SetAllowNegative(False) self._step_volt_val.SetBounds(0, 10) self._step_volt_val.SetFractionWidth(2) self._step_volt_val.SetIntegerWidth(2) self._step_volt_val.SetValue(0.1) self._step_volt_val.SetLimitOnFieldChange(True) self._dir_button = wx.Button(common_panel, -1, "Choose Save Location", wx.DefaultPosition, wx.Size(150, 20), 0, wx.DefaultValidator, "ButtonNameStr") self._file_button = wx.Button(common_panel, -1, "Choose Save Filename", wx.DefaultPosition, wx.Size(150, 20), 0, wx.DefaultValidator, "ButtonNameStr") self._go_button = wx.Button(common_panel, -1, "Start", wx.DefaultPosition, wx.Size(150, 20), 0, wx.DefaultValidator, "ButtonNameStr") self._stop_button = wx.Button(common_panel, -1, "Stop", wx.DefaultPosition, wx.Size(150, 20), 0, wx.DefaultValidator, "ButtonNameStr") self._resume_button = wx.Button(common_panel, -1, "Resume", wx.DefaultPosition, wx.Size(150, 20), 0, wx.DefaultValidator, "ButtonNameStr") self._pause_button = wx.Button(common_panel, -1, "Pause", wx.DefaultPosition, wx.Size(150, 20), 0, wx.DefaultValidator, "ButtonNameStr") self._dir_button.Bind(wx.EVT_BUTTON, self._dir_select) self._file_button.Bind(wx.EVT_BUTTON, self._file_select) self._go_button.Bind(wx.EVT_BUTTON, self._go) self._stop_button.Bind(wx.EVT_BUTTON, self._stop) self._resume_button.Bind(wx.EVT_BUTTON, self._resume) self._pause_button.Bind(wx.EVT_BUTTON, self._pause) common_sizer.AddMany([ lcvr_label, self._lcvr_val, lcvr_chan, self._lcvr_ch, wavelength_label, self._wavelength_val, pow_label, self._pow_val, od_label, self._od_val, start_volt_label, self._start_volt_val, end_volt_label, self._end_volt_val, step_volt_label, self._step_volt_val, self._dir_button, self._file_button, self._go_button, self._stop_button, self._resume_button, self._pause_button ]) common_panel.SetSizer(common_sizer) self._stop_button.Disable() self._pause_button.Disable() self._resume_button.Disable() input_sizer.Add(common_panel, 0, wx.ALL, 10) input_panel.SetSizer(input_sizer) self._ccd = CCDPanel("", "", title, main_panel) copyright_str = "\u00a9 2016 QuIN Lab" copyright_str += "Developed by Hayden Jones" copyright_text = wx.StaticText(main_panel, label=copyright_str) main_sizer.Add(input_panel, 0, wx.ALL, 0) main_sizer.Add(self._ccd, 0, wx.ALL, 0) main_sizer.Add(copyright_text, 0, wx.ALL, 0) main_panel.SetSizer(main_sizer) self.Bind(wx.EVT_CLOSE, self._on_close) self.SetWindowStyle(wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX) self.Show() def _on_close(self, evt): if self._lcvr_init is True: self._lcvr.close() evt.Skip() def disable_ui(self): self._lcvr_val.Disable() self._lcvr_ch.Disable() self._wavelength_val.Disable() self._pow_val.Disable() self._od_val.Disable() self._start_volt_val.Disable() self._end_volt_val.Disable() self._step_volt_val.Disable() self._dir_button.Disable() self._file_button.Disable() self._go_button.Disable() self._stop_button.Enable() self._resume_button.Disable() self._pause_button.Enable() def enable_ui(self): self._lcvr_val.Enable() self._lcvr_ch.Enable() self._wavelength_val.Enable() self._pow_val.Enable() self._od_val.Enable() self._start_volt_val.Enable() self._end_volt_val.Enable() self._step_volt_val.Enable() self._dir_button.Enable() self._file_button.Enable() self._go_button.Enable() self._stop_button.Disable() self._resume_button.Disable() self._pause_button.Disable() def get_od(self): return self._od_val.GetValue() def get_wavelength(self): return self._wavelength_val.GetValue() def get_power(self): return self._pow_val.GetValue() def get_start_volt(self): return self._start_volt_val.GetValue() def get_end_volt(self): return self._end_volt_val.GetValue() def get_step_volt(self): return self._step_volt_val.GetValue() def get_lcvr_addr(self): return self._lcvr_ch.GetValue() def _invalid_lcvr_warn(self): warning_message = "Invalid LCVR Controller Address/Connection!" warning = wx.GenericMessageDialog(None, warning_message, "Warning!", wx.OK, wx.DefaultPosition) warning.ShowModal() warning.Destroy() def _lcvr_entry(self, evt): if self._lcvr_init is True or self.get_lcvr_addr() < 1: return try: com_port = self._lcvr_val.GetValue() self._lcvr = MeadowlarkD3050Controller(com_port) except: self._invalid_lcvr_warn() return self._lcvr_init = True def _set_filename(self): self._filename = self._truefilename self._filename += "_OD" + str(self.get_od()) self._filename += "_" + str(self.get_wavelength()) + "nm" self._filename += "_" + str(self.get_power()) + "mW" def _dir_select(self, evt): dir_dialog = wx.DirDialog(self, "Choose file save directory...", "", wx.DD_DEFAULT_STYLE | wx.DD_DIR_MUST_EXIST) if dir_dialog.ShowModal() == wx.ID_CANCEL: return self._filedir = dir_dialog.GetPath() + "\\" dir_dialog.Destroy() def _file_select(self, evt): file_dialog = wx.TextEntryDialog(self, "Enter the file name...", "File Name Selection Dialog", self._truefilename) if file_dialog.ShowModal() == wx.ID_CANCEL: return self._truefilename = file_dialog.GetValue() file_dialog.Destroy() def _go(self, evt): if self._lcvr_init is False: return self.disable_ui() self._ccd.open_xcap() self._kill_automation = False self._pause_automation = False _thread.start_new_thread(self._automation, (self.get_lcvr_addr(), )) def _stop(self, evt): self._kill_automation = True self._pause_automation = False self._ccd.close_xcap() self.enable_ui() def _resume(self, evt): self._od_val.Disable() self._resume_button.Disable() self._pause_button.Enable() self._pause_automation = False def _pause(self, evt): self._pause_automation = True self._od_val.Enable() self._resume_button.Enable() self._pause_button.Disable() def _automation(self, channel): start_volt = self.get_start_volt() end_volt = self.get_end_volt() if start_volt > end_volt: step = -self.get_step_volt() else: step = self.get_step_volt() overlap_holder = [] self._ccd.set_work_dir(self._filedir) for i in range(int(start_volt * 1000), int((end_volt + 0.01) * 1000), int(step * 1000)): v = float(i / 1000) if self._kill_automation is True: break if self._pause_automation is True: i = overlap_holder[0] while self._pause_automation is True: if self._kill_automation is True: break overlap_holder.append(i) self._lcvr.set_voltage(channel, v) if len(overlap_holder) > 5: overlap_holder.pop(0) self._set_filename() self._filename += "_" + str(v) + "V.jpg" self._ccd.set_filename(self._filename) self._ccd.grab_frame() sleep(5) wx.CallAfter(self._stop, wx.EVT_BUTTON)
class SpectroscopyGUI(wx.Frame): def __init__(self, parent=None, title="QuIN Lab Spectroscopy"): super(SpectroscopyGUI, self).__init__(parent, title=title, size=(1340, 690)) self._filedir = os.getcwd() + "\\" self._truefilename = "" self._filename = "" self._lcvr_init = False self._zaber_init = False self._lcvr_swp = True self._zaber_swp = True main_panel = wx.Panel(self) main_sizer = wx.BoxSizer(wx.VERTICAL) input_nb = wx.Notebook(main_panel) common_panel = wx.Panel(input_nb) common_sizer = wx.GridBagSizer() lcvr_swp_txt = wx.StaticText(common_panel, label="LCVR Mode:", size=(140, 20), style=wx.ALIGN_RIGHT) self._lcvr_swp_val = wx.Choice(common_panel, size=(-1, 20), choices=["Sweep", "Fixed"]) self._lcvr_swp_val.Bind(wx.EVT_CHOICE, self._lcvr_swp_sel) zaber_swp_txt = wx.StaticText(common_panel, label="Zaber Mode:", size=(130, 20), style=wx.ALIGN_RIGHT) self._zaber_swp_val = wx.Choice(common_panel, size=(-1, 20), choices=["Sweep", "Fixed"]) self._zaber_swp_val.Bind(wx.EVT_CHOICE, self._zaber_swp_sel) lcvr_label = wx.StaticText(common_panel, label="LCVR COM Port:", size=(140, 20), style=wx.ALIGN_RIGHT) self._lcvr_val = NumCtrl(common_panel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._lcvr_val.SetAllowNegative(False) self._lcvr_val.SetBounds(1, 99) self._lcvr_val.SetFractionWidth(0) self._lcvr_val.SetIntegerWidth(2) self._lcvr_val.SetValue(6) self._lcvr_val.SetLimitOnFieldChange(True) self._lcvr_val.Bind(wx.EVT_KILL_FOCUS, self._lcvr_entry) lcvr_chan = wx.StaticText(common_panel, label="LCVR Channel:", size=(140, 20), style=wx.ALIGN_RIGHT) self._lcvr_ch = wx.Choice(common_panel, size=(-1, 20), choices=["1", "2", "3", "4"]) zaber_txt = wx.StaticText(common_panel, label="Zaber COM Port:", size=(140, 20), style=wx.ALIGN_RIGHT) self._zaber_val = NumCtrl(common_panel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._zaber_val.SetAllowNegative(False) self._zaber_val.SetBounds(1, 99) self._zaber_val.SetFractionWidth(0) self._zaber_val.SetIntegerWidth(2) self._zaber_val.SetValue(9) self._zaber_val.SetLimitOnFieldChange(True) self._zaber_val.Bind(wx.EVT_KILL_FOCUS, self._zaber_entry) wavelength_label = wx.StaticText(common_panel, label="Laser Wavelength (nm):", size=(130, 20), style=wx.ALIGN_RIGHT) self._wavelength_val = NumCtrl(common_panel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._wavelength_val.SetAllowNegative(False) self._wavelength_val.SetBounds(400, 1100) self._wavelength_val.SetFractionWidth(0) self._wavelength_val.SetIntegerWidth(4) self._wavelength_val.SetValue(780) self._wavelength_val.SetLimitOnFieldChange(True) pow_label = wx.StaticText(common_panel, label="Laser Power (mW):", size=(130, 20), style=wx.ALIGN_RIGHT) self._pow_val = NumCtrl(common_panel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._pow_val.SetAllowNegative(False) self._pow_val.SetBounds(0, 1000) self._pow_val.SetFractionWidth(2) self._pow_val.SetIntegerWidth(4) self._pow_val.SetValue(0) self._pow_val.SetLimitOnFieldChange(True) od_label = wx.StaticText(common_panel, label="OD:", size=(130, 20), style=wx.ALIGN_RIGHT) self._od_val = wx.Choice(common_panel, size=(-1, 20), choices=[ "0", "0.5", "1", "1.5", "2", "2.5", "3", "3.5", "4", "4.5", "5" ]) self._start_volt_txt = wx.StaticText(common_panel, label="Start Voltage (V):", size=(140, 20), style=wx.ALIGN_RIGHT) self._start_volt_val = NumCtrl(common_panel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._start_volt_val.SetAllowNegative(False) self._start_volt_val.SetBounds(0, 10) self._start_volt_val.SetFractionWidth(2) self._start_volt_val.SetIntegerWidth(2) self._start_volt_val.SetValue(10) self._start_volt_val.SetLimitOnFieldChange(True) end_volt_label = wx.StaticText(common_panel, label="End Voltage (V):", size=(140, 20), style=wx.ALIGN_RIGHT) self._end_volt_val = NumCtrl(common_panel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._end_volt_val.SetAllowNegative(False) self._end_volt_val.SetBounds(0, 10) self._end_volt_val.SetFractionWidth(2) self._end_volt_val.SetIntegerWidth(2) self._end_volt_val.SetValue(0) self._end_volt_val.SetLimitOnFieldChange(True) step_volt_label = wx.StaticText(common_panel, label="Absolute Step Voltage (V):", size=(140, 20), style=wx.ALIGN_RIGHT) self._step_volt_val = NumCtrl(common_panel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._step_volt_val.SetAllowNegative(False) self._step_volt_val.SetBounds(0, 10) self._step_volt_val.SetFractionWidth(2) self._step_volt_val.SetIntegerWidth(2) self._step_volt_val.SetValue(0.1) self._step_volt_val.SetLimitOnFieldChange(True) self._dir_button = wx.Button(common_panel, label="Choose Save Location", size=(130, 20)) self._dir_button.Bind(wx.EVT_BUTTON, self._dir_select) self._file_button = wx.Button(common_panel, label="Choose Save Filename", size=(130, 20)) self._file_button.Bind(wx.EVT_BUTTON, self._file_select) self._go_button = wx.Button(common_panel, label="Start", size=(130, 20)) self._go_button.SetForegroundColour(wx.Colour("GREEN")) self._go_button.Bind(wx.EVT_BUTTON, self._go) self._stop_button = wx.Button(common_panel, label="Stop", size=(130, 20)) self._stop_button.Bind(wx.EVT_BUTTON, self._stop) self._stop_button.SetForegroundColour(wx.Colour("RED")) self._resume_button = wx.Button(common_panel, label="Resume", size=(130, 20)) self._resume_button.Bind(wx.EVT_BUTTON, self._resume) self._pause_button = wx.Button(common_panel, label="Pause", size=(130, 20)) self._pause_button.Bind(wx.EVT_BUTTON, self._pause) curr_dir_txt = wx.StaticText(common_panel, label="Current Directory:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._curr_dir_disp = wx.StaticText(common_panel, label=self._filedir, size=(-1, 20)) curr_file_txt = wx.StaticText(common_panel, label="Current Filename:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._curr_file_disp = wx.StaticText(common_panel, label=self._filename, size=(-1, 20)) common_sizer.Add(lcvr_label, (0, 0)) common_sizer.Add(self._lcvr_val, (0, 1)) common_sizer.Add(lcvr_chan, (1, 0)) common_sizer.Add(self._lcvr_ch, (1, 1)) common_sizer.Add(self._start_volt_txt, (2, 0)) common_sizer.Add(self._start_volt_val, (2, 1)) common_sizer.Add(end_volt_label, (3, 0)) common_sizer.Add(self._end_volt_val, (3, 1)) common_sizer.Add(step_volt_label, (4, 0)) common_sizer.Add(self._step_volt_val, (4, 1)) common_sizer.Add(zaber_txt, (5, 0)) common_sizer.Add(self._zaber_val, (5, 1)) common_sizer.Add(wavelength_label, (0, 2)) common_sizer.Add(self._wavelength_val, (0, 3)) common_sizer.Add(pow_label, (1, 2)) common_sizer.Add(self._pow_val, (1, 3)) common_sizer.Add(od_label, (2, 2)) common_sizer.Add(self._od_val, (2, 3)) common_sizer.Add(self._dir_button, (3, 2)) common_sizer.Add(self._file_button, (3, 3)) common_sizer.Add(self._go_button, (4, 2)) common_sizer.Add(self._stop_button, (4, 3)) common_sizer.Add(self._resume_button, (5, 2)) common_sizer.Add(self._pause_button, (5, 3)) common_sizer.Add(lcvr_swp_txt, (6, 0)) common_sizer.Add(self._lcvr_swp_val, (6, 1)) common_sizer.Add(zaber_swp_txt, (6, 2)) common_sizer.Add(self._zaber_swp_val, (6, 3)) common_sizer.Add(curr_dir_txt, (7, 0)) common_sizer.Add(self._curr_dir_disp, (7, 1), wx.GBSpan(1, 3)) common_sizer.Add(curr_file_txt, (8, 0)) common_sizer.Add(self._curr_file_disp, (8, 1), wx.GBSpan(1, 3)) common_panel.SetSizer(common_sizer) self._stop_button.Disable() self._pause_button.Disable() self._resume_button.Disable() self._zaber = ZaberLinearActuator() self._zaber_pnl = ZaberControlPanel(self._zaber, input_nb) self._zaber_pnl.disable_ui() self._lf = LightField("", True) self._lf.set_export(True) self._lfcontrol = LightFieldControlPanel(self._lf, input_nb) input_nb.InsertPage(0, common_panel, "Common Settings") input_nb.InsertPage(1, self._zaber_pnl, "Zaber Settings") input_nb.InsertPage(2, self._lfcontrol, "LightField Settings") copyright_str = "\u00a9 2016 QuIN Lab " copyright_str += "Developed by Hayden Jones" copyright_text = wx.StaticText(main_panel, label=copyright_str) self._img = wx.Image(1340, 400, True).ConvertToBitmap() self._display = wx.StaticBitmap(main_panel, -1, self._img, wx.DefaultPosition, wx.Size(1340, 400)) self._display.SetBitmap(self._img) self._set_filename() self.update_file_display() main_sizer.Add(input_nb, 0, wx.ALL, 0) main_sizer.Add(self._display, 0, wx.ALL, 0) main_sizer.Add(copyright_text, 0, wx.ALL, 0) main_panel.SetSizer(main_sizer) main_panel.Layout() self.Bind(wx.EVT_CLOSE, self._on_close) self.SetWindowStyle(wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX) self.Show() def _on_close(self, evt): if self._lcvr_init is True: self._lcvr.close() self._lf.close_lightfield() self._lf.close_matlab() evt.Skip() def disable_ui(self): self._zaber_val.Disable() self._lcvr_val.Disable() self._lcvr_ch.Disable() self._wavelength_val.Disable() self._pow_val.Disable() self._od_val.Disable() self._start_volt_val.Disable() self._end_volt_val.Disable() self._step_volt_val.Disable() self._dir_button.Disable() self._file_button.Disable() self._go_button.Disable() self._stop_button.Enable() self._resume_button.Disable() self._pause_button.Enable() self._zaber_pnl.disable_ui() self._lfcontrol.disable_ui() def enable_ui(self): self._zaber_val.Enable() self._lcvr_val.Enable() self._lcvr_ch.Enable() self._wavelength_val.Enable() self._pow_val.Enable() self._od_val.Enable() self._start_volt_val.Enable() self._end_volt_val.Enable() self._step_volt_val.Enable() self._dir_button.Enable() self._file_button.Enable() self._go_button.Enable() self._stop_button.Disable() self._resume_button.Disable() self._pause_button.Disable() self._zaber_pnl.enable_ui() self._lfcontrol.enable_ui() def get_od(self): return float(self._od_val.GetCurrentSelection() / 2) def get_wavelength(self): return self._wavelength_val.GetValue() def get_power(self): return self._pow_val.GetValue() def get_start_volt(self): return self._start_volt_val.GetValue() def get_end_volt(self): return self._end_volt_val.GetValue() def get_step_volt(self): return self._step_volt_val.GetValue() def get_lcvr_ch(self): return self._lcvr_ch.GetCurrentSelection() + 1 def update_dir_display(self): self._curr_dir_disp.SetLabel(self._filedir) def update_file_display(self): self._curr_file_disp.SetLabel(self._filename) def _lcvr_swp_sel(self, evt): if self._lcvr_swp_val.GetCurrentSelection() == 0: self._lcvr_swp = True else: self._lcvr_swp = False def _zaber_swp_sel(self, evt): if self._zaber_swp_val.GetCurrentSelection() == 0: self._zaber_swp = True else: self._zaber_swp = False def _invalid_lcvr_warn(self): warning_message = "Invalid LCVR Controller Address/Connection!" warning = wx.GenericMessageDialog(None, warning_message, "Warning!", wx.OK, wx.DefaultPosition) warning.ShowModal() warning.Destroy() def _lcvr_entry(self, evt): if self._lcvr_init is True: return try: com_port = self._lcvr_val.GetValue() self._lcvr = MeadowlarkD3050Controller(com_port) except Exception: self._invalid_lcvr_warn() evt.Skip() return self._lcvr_init = True evt.Skip() def _invalid_zaber_warn(self): warning_message = "Invalid Zaber Address/Connection!" warning = wx.GenericMessageDialog(None, warning_message, "Warning!", wx.OK, wx.DefaultPosition) warning.ShowModal() warning.Destroy() def _zaber_entry(self, evt): if self._zaber_init is True: return try: com_port = self._zaber_val.GetValue() self._zaber.open(com_port) except Exception: self._invalid_zaber_warn() evt.Skip() return self._zaber_pnl.enable_ui() self._zaber_init = True evt.Skip() def _set_filename(self): self._filename = self._truefilename self._filename += "_OD" + str(self.get_od()) self._filename += "_" + str(self.get_wavelength()) + "nm" self._filename += "_" + str(self.get_power()) + "mW" def _dir_select(self, evt): dir_dialog = wx.DirDialog(self, "Choose file save directory...", "", wx.DD_DEFAULT_STYLE | wx.DD_DIR_MUST_EXIST) if dir_dialog.ShowModal() == wx.ID_CANCEL: return self._filedir = dir_dialog.GetPath() + "\\" self.update_dir_display() dir_dialog.Destroy() def _file_select(self, evt): file_dialog = wx.TextEntryDialog(self, "Enter the file name...", "File Name Selection Dialog", self._truefilename) if file_dialog.ShowModal() == wx.ID_CANCEL: return self._truefilename = file_dialog.GetValue() self._set_filename() self.update_file_display() file_dialog.Destroy() def _go(self, evt): self._lcvr_entry(wx.EVT_BUTTON) self._zaber_entry(wx.EVT_BUTTON) if self._lcvr_init is False: self._invalid_lcvr_warn() return if self._zaber_init is False: self._invalid_zaber_warn() return self.disable_ui() self._kill_automation = False self._pause_automation = False _thread.start_new_thread(self._automation, (self.get_lcvr_ch(), )) def _stop(self, evt): self._kill_automation = True self._pause_automation = False self.enable_ui() def _resume(self, evt): self._od_val.Disable() self._resume_button.Disable() self._pause_button.Enable() self._pause_automation = False def _pause(self, evt): self._pause_automation = True self._od_val.Enable() self._resume_button.Enable() self._pause_button.Disable() def _automation(self, channel): self._lf.set_directory(self._filedir.rstrip("\\")) start_volt = self.get_start_volt() if self._lcvr_swp is True: end_volt = self.get_end_volt() else: end_volt = start_volt if start_volt > end_volt: step_volt = -self.get_step_volt() else: step_volt = self.get_step_volt() self._zaber.goto_pos(0, 324000) start_zaber = self._zaber_pnl.get_start() if self._zaber_swp is True: end_zaber = self._zaber_pnl.get_end() self._zaber.goto_pos(0, start_zaber) else: end_zaber = start_zaber if start_zaber > end_zaber: step_zaber = -self._zaber_pnl.get_step() else: step_zaber = self._zaber_pnl.get_step() self._lcvr.set_voltage(channel, start_volt) overlap_holder = [] for i in range(int(start_volt * 1000), int((end_volt * 1000) + 1), int(step_volt * 1000)): if self._kill_automation is True: break if self._pause_automation is True: i = overlap_holder[0] while self._pause_automation is True: if self._kill_automation is True: break overlap_holder.append(i) if len(overlap_holder) > 5: overlap_holder.pop(0) v = float(i / 1000) self._set_filename() self._lcvr.set_voltage(channel, v) self._filename += "_" + str(v) + "V" self._lf.set_filename(self._filename) for j in range(start_zaber, end_zaber + 1, step_zaber): if self._kill_automation is True: break if self._pause_automation is True: while self._pause_automation is True: if self._kill_automation is True: break self._filename += "_" + str(j) + "zaber" self._zaber.goby_dist(0, step_zaber) self._lf.set_filename(self._filename) self._lf.acquire(60) self._lf.set_filename(self._filename) newest_spe = max(glob.iglob(self._filedir + '*.spe'), key=os.path.getctime) spe2pngraw.spe2pngraw(self._filedir, newest_spe) newest_png = newest_spe.rstrip('.spe') + '.png' self._img = wx.Image(newest_png, wx.BITMAP_TYPE_ANY).ConvertToBitmap() wx.CallAfter(self._display.SetBitmap, self._img) sleep(1) wx.CallAfter(self._stop, wx.EVT_BUTTON)
def __init__(self, parent=None, config=None, control=None): super(ChannelSliders, self).__init__(parent) # Parameters self.parent = parent self.control = control self.config = config pSizer = wx.BoxSizer(wx.HORIZONTAL) numFont = wx.Font(9, wx.DEFAULT, wx.NORMAL, wx.NORMAL) for channel_no in xrange(1, self.control.channel_num + 1): slideSizer = wx.BoxSizer(wx.VERTICAL) name_n = "nTxt%s" % channel_no name_s = "pSldr%s" % channel_no name_t = "pTxt%s" % channel_no name_c = "pCtrl%s" % channel_no name_z = "zBtn%s" % channel_no try: self.parent.config.chip["flows"][str(channel_no)]["name"] except: self.parent.config.chip["flows"][str(channel_no)] = {} self.parent.config.chip["flows"][str( channel_no)]["name"] = "NA" self.parent.config.chip.update() channel_name = wx.TextCtrl(self, wx.ID_ANY, value=self.parent.config.chip["flows"][ str(channel_no)]["name"], name=name_n, size=(52, -1)) channel_name.Bind(wx.EVT_TEXT, self.name_change) slideSizer.Add(channel_name, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.EXPAND, 5) pressure_slider = wx.Slider(self, wx.ID_ANY, 0, 0, 1034, name=name_s, size=(-1, 300), style=wx.SL_VERTICAL | wx.SL_INVERSE | wx.SL_AUTOTICKS) slideSizer.Add(pressure_slider, 1, wx.ALL | wx.EXPAND, 5) pressure_slider.Bind(wx.EVT_COMMAND_SCROLL_CHANGED, self.set_control) pressure_info = wx.StaticText(self, wx.ID_ANY, name=name_t, label='0 %s' % self.control.unit) slideSizer.Add(pressure_info, 0, wx.ALIGN_CENTER_HORIZONTAL, 5) pressure_set = NumCtrl( self, wx.ID_ANY, name=name_c, value=0, integerWidth=INTEGER_WIDTH[self.control.unit], allowNegative=False, min=0, max=self.control.limit, fractionWidth=FRACTION_WIDTH[self.control.unit], groupDigits=False, autoSize=False, style=wx.TR_SINGLE | wx.CENTER, size=(50, -1)) pressure_set.Bind(wx.EVT_TEXT, self.set_pressure) pressure_set.SetFont(numFont) slideSizer.Add(pressure_set, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.EXPAND, 5) pressure_zero = wx.Button(self, wx.ID_ANY, label=u"Zero", name=name_z, size=(52, 25)) pressure_zero.Bind(wx.EVT_BUTTON, self.set_zero) slideSizer.Add(pressure_zero, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.EXPAND, 5) pSizer.Add(slideSizer, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL | wx.EXPAND, 5) # Set sizer self.SetSizer(pSizer)
class PanelOne(wx.Panel): def __init__(self, parent): self.bot = painter_bot() self.bot.connect_camera([1, 0]) # Initialize Welcome Screen wx.Panel.__init__(self, parent=parent) #################### Welcome Screen Text ################### font1 = wx.Font(18, wx.DECORATIVE, wx.NORMAL, wx.BOLD) txt = wx.StaticText(self, label="Welcome to CARP MQP Painter Application", pos=(20, 10)) txt.SetFont(font1) self.txt2 = wx.StaticText(self, label="Please select an image to process", pos=(20, 45)) # Button For selecting a Video File button = wx.Button(self, label="Choose Image...", pos=(20, 70)) button.Bind(wx.EVT_BUTTON, self.onSelectFile) # Button for Going to the next panel -- Disabled until a video file has been chosen self.paint_button = wx.Button(self, label="Paint", pos=(150, 70)) self.paint_button.Bind(wx.EVT_BUTTON, self.paint) self.paint_button.Disable() # Variable for central image self.main_image = '' # Place Image of CARP logo png = wx.Image('./painter_gui/carp.png', wx.BITMAP_TYPE_ANY).ConvertToBitmap() wx.StaticBitmap(self, -1, png, (530, 5), (120, 120)) ################### Decomposition Section ################### CONTROLS_OFFSET_LEFT = 450 DY = 110 txt3 = wx.StaticText(self, label="Decomposition", pos=(CONTROLS_OFFSET_LEFT, DY)) self.MAX_COLORS = 6 txt31 = wx.StaticText(self, label="# of Colors: ", pos=(CONTROLS_OFFSET_LEFT, DY + 23)) # self.decomp_num_colors = wx.TextCtrl(self, value=self.num_colors, pos=(CONTROLS_OFFSET_LEFT, 150)) self.decomp_num_colors = NumCtrl(self, value=self.MAX_COLORS, size=(40, 20), pos=(CONTROLS_OFFSET_LEFT + 70, DY + 20), integerWidth=2, limitOnFieldChange=True, min=0, max=self.MAX_COLORS) self.decomp_num_colors.Bind(EVT_NUM, self.showColors) self.auto_colors_button = wx.Button(self, label="Auto", pos=(CONTROLS_OFFSET_LEFT + 110, DY + 19)) self.auto_colors_button.Bind( wx.EVT_BUTTON, lambda evt, var=False: self.decomp(evt, var)) self.color_data = wx.ColourData() self.color_data.SetChooseFull(True) self.paint_colors = [] # wx.ColourDialog(self, data=None) for i in range(self.MAX_COLORS): panel = wx.Panel(self, name="color " + str(i + 1), pos=(CONTROLS_OFFSET_LEFT + 30 * i, DY + 50), style=wx.SIMPLE_BORDER) panel.BackgroundColour = wx.WHITE panel.Bind(wx.EVT_LEFT_UP, lambda evt, index=i: self.pickColor(index)) self.paint_colors.append(panel) panel = wx.Panel(self, name="color " + str(self.MAX_COLORS + 1), pos=(CONTROLS_OFFSET_LEFT + 90, DY + 80), style=wx.SIMPLE_BORDER) panel.BackgroundColour = wx.WHITE panel.Bind( wx.EVT_LEFT_UP, lambda evt, index=self.MAX_COLORS: self.pickColor(self.MAX_COLORS)) self.paint_colors.append(panel) self.canvas_checkbox = wx.CheckBox(self, label="Canvas:", pos=(CONTROLS_OFFSET_LEFT + 20, DY + 82)) self.canvas_checkbox.SetValue(True) self.canvas_checkbox.Bind( wx.EVT_CHECKBOX, lambda evt, index=self.MAX_COLORS: self.paint_colors[ self.MAX_COLORS].Show(self.canvas_checkbox.GetValue())) self.decomp_button_apply = wx.Button(self, label="Apply", pos=(CONTROLS_OFFSET_LEFT, DY + 110)) self.decomp_button_apply.Bind(wx.EVT_BUTTON, self.decomp) self.disable_decomp() #################### Recomposition Section ################### RY = 260 txt4 = wx.StaticText(self, label="Recomposition", pos=(CONTROLS_OFFSET_LEFT, RY)) txt5 = wx.StaticText(self, label="Select a Recomposition Method", pos=(CONTROLS_OFFSET_LEFT, RY + 20)) self.rb1 = wx.RadioButton(self, 11, label='Iterative Erosion', pos=(CONTROLS_OFFSET_LEFT, RY + 50), style=wx.RB_GROUP) self.rb2 = wx.RadioButton(self, 22, label='Skeleton', pos=(CONTROLS_OFFSET_LEFT, RY + 70)) self.rb3 = wx.RadioButton(self, 33, label='Blended Recomposition', pos=(CONTROLS_OFFSET_LEFT, RY + 90)) self.Bind(wx.EVT_RADIOBUTTON, self.SetVal, id=self.rb1.GetId()) self.Bind(wx.EVT_RADIOBUTTON, self.SetVal, id=self.rb2.GetId()) self.Bind(wx.EVT_RADIOBUTTON, self.SetVal, id=self.rb3.GetId()) txt31 = wx.StaticText(self, label="Brush Radius: ", pos=(CONTROLS_OFFSET_LEFT, RY + 123)) self.recomp_brush_radius = NumCtrl(self, value=4, pos=(CONTROLS_OFFSET_LEFT + 80, RY + 120), integerWidth=2, limitOnFieldChange=True, min=1, max=99) self.recomp_button_apply = wx.Button(self, label="Apply", pos=(CONTROLS_OFFSET_LEFT, RY + 150)) self.recomp_button_apply.Bind(wx.EVT_BUTTON, self.recomp) self.disable_recomp() def disable_decomp(self): self.enable_decomp(False) def enable_decomp(self, value=True): self.decomp_num_colors.Enable(value) self.decomp_button_apply.Enable(value) self.auto_colors_button.Enable(value) for box in self.paint_colors: box.Enable(value) self.canvas_checkbox.Enable(value) def disable_recomp(self): self.enable_recomp(False) def enable_recomp(self, value=True): self.rb1.Enable(value) self.rb2.Enable(value) self.rb3.Enable(value) self.recomp_button_apply.Enable(value) self.recomp_brush_radius.Enable(value) def enable_paint(self, value=True): self.paint_button.Enable(value) def disable_paint(self): self.enable_paint(False) def pickColor(self, index): print "pick ", index # set the default color in the chooser self.color_data.SetColour( self.paint_colors[index].GetBackgroundColour()) # construct the chooser dlg = wx.ColourDialog(self, self.color_data) if dlg.ShowModal() == wx.ID_OK: # set the panel background color self.color_data = dlg.GetColourData() color = dlg.GetColourData().Colour # self.bot.colors[index] = [color.Blue,color.Green,color.Red] self.paint_colors[index].SetBackgroundColour(color) dlg.Destroy() self.Refresh() def SetVal(self, event): state1 = str(self.rb1.GetValue()) state2 = str(self.rb2.GetValue()) state3 = str(self.rb3.GetValue()) print "state1 ", state1 print "state2 ", state2 print "state3 ", state3 # Method for calling function to paint def paint(self, event): print "Paint" self.bot.connect_eth(ip='192.168.178.7', port=1234) self.bot.paint() # bot.paint_with_feedback([4]) # Method for performing decomp def decomp(self, event, usePallete=True): print "Decomp" self.disable_decomp() self.disable_recomp() self.disable_paint() pallete = [] num_colors = self.decomp_num_colors.GetValue() if usePallete: for i in range(num_colors): color = self.paint_colors[i].GetBackgroundColour() pallete.append( [int(color.Blue()), int(color.Green()), int(color.Red())]) num_colors = 0 canvas_color = None if self.canvas_checkbox.GetValue(): color = self.paint_colors[self.MAX_COLORS].GetBackgroundColour() canvas_color = [ int(color.Blue()), int(color.Green()), int(color.Red()) ] self.bot.decompose(num_colors, pallete, canvas_color) for i in range(len(self.bot.colors)): color = self.bot.colors[i] self.paint_colors[i].BackgroundColour = wx.Colour( color[2], color[1], color[0]) self.color_data.SetCustomColour( 15 - i, wx.Colour(color[2], color[1], color[0])) i = i + 1 if i < len(self.paint_colors): for j in range(i, len(self.paint_colors)): self.paint_colors[j].BackgroundColour = wx.Colour( 255, 255, 255) self.setImage(self.bot.segmentedImg) self.enable_decomp() self.enable_recomp() self.disable_paint() # Method for performing recomp def recomp(self, event): print "Recomp" self.disable_recomp() radius = self.recomp_brush_radius.GetValue() re_func = None if self.rb1.GetValue(): re_func = iterativeErosionRecomp elif self.rb2.GetValue(): re_func = medialAxisRecomp elif self.rb3.GetValue(): re_func = iterativeBlendedRecomp self.bot.recompose([radius], recomp_fun=re_func) self.setImage(self.bot.lltImg) self.enable_recomp() self.enable_paint() def scale_bitmap(self, bitmap, width, height): image = wx.ImageFromBitmap(bitmap) image = image.Scale(width, height, wx.IMAGE_QUALITY_HIGH) result = wx.BitmapFromImage(image) return result def showColors(self, event): n = self.decomp_num_colors.GetValue() for i in range(self.MAX_COLORS): self.paint_colors[i].Show(i < n) def setImage(self, input_image): ideal = np.zeros([400, 400, 3]) resized_image = resize_with_buffer(input_image, ideal, padding_color=[0, 0, 0]) cv2.imwrite('./painter_gui/resized.png', resized_image) self.main_image = wx.Image('./painter_gui/resized.png', wx.BITMAP_TYPE_ANY).ConvertToBitmap() wx.StaticBitmap(self, -1, self.main_image, (20, 110), (resized_image.shape[0], resized_image.shape[1])) self.Refresh() # Method for launching file dialog box def onSelectFile(self, event): # Launch Dialog Box dlg = wx.FileDialog(self, "Choose a file", user.home, "", "*.*") if dlg.ShowModal() == wx.ID_OK: # Save selected file name and directory dirname = dlg.GetDirectory() filename = dlg.GetFilename() # Display Image input_image = readImage(filename, dirname + "/") self.bot.setImage(input_image) self.setImage(self.bot.desiredImg) # Report file selected and enable decomp section self.txt2.SetLabel("Selected file: " + filename) self.enable_decomp() self.disable_recomp() self.disable_paint() self.Refresh() # On Completion destroy dialog box dlg.Destroy()
def _number_editor(self, settings, name): initial_value = settings[name] editor = NumCtrl(self, value=initial_value) editor.Bind(wx.EVT_TEXT, lambda evt: settings.set(name, int(editor.GetValue()))) return editor
class LightFieldControlPanel(wx.Panel): def __init__(self, lightfield, *args): wx.Panel.__init__(self, *args) self._lf = lightfield subpanel = wx.Panel(self) sp_sizer = wx.FlexGridSizer(6, 4, 0, 0) exp_txt = wx.StaticText( subpanel, label="Exposure Time (ms):", size=(115, 20), style=wx.ALIGN_RIGHT) self._exp_val = NumCtrl( subpanel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._exp_val.SetAllowNegative(False) self._exp_val.SetFractionWidth(0) self._exp_val.SetIntegerWidth(9) self._exp_val.SetValue(100) self._exp_val.Bind(wx.EVT_KILL_FOCUS, self._exp_entry) frames_txt = wx.StaticText( subpanel, label="Number of Frames:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._frames_val = NumCtrl( subpanel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._frames_val.SetAllowNegative(False) self._frames_val.SetFractionWidth(0) self._frames_val.SetIntegerWidth(9) self._frames_val.SetValue(1) self._frames_val.Bind(wx.EVT_KILL_FOCUS, self._frames_entry) adcqlty_txt = wx.StaticText( subpanel, label="ADC Quality:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._adcqlty_val = wx.Choice( subpanel, size=(-1, 20), style=wx.CB_SORT, choices=["High Capacity", "Low Noise"]) self._adcqlty_val.Bind(wx.EVT_CHOICE, self._adcqlty_entry) adcspeed_txt = wx.StaticText( subpanel, label="ADC Speed:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._adcspeed_val = wx.Choice( subpanel, size=(-1, 20), choices=["4 MHz", "2 MHz", "1 MHz", "500 kHz", "200 kHz", "100 kHz", "50 kHz"]) self._adcspeed_val.Bind(wx.EVT_CHOICE, self._adcspeed_entry) adcgain_txt = wx.StaticText( subpanel, label="ADC Analog Gain:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._adcgain_val = wx.Choice( subpanel, size=(-1, 20), choices=["High", "Medium", "Low"]) self._adcgain_val.Bind(wx.EVT_CHOICE, self._adcgain_entry) adcbits_txt = wx.StaticText( subpanel, label="ADC Bit Depth:", size=(-1, 20), style=wx.ALIGN_RIGHT) bitdepth = self._lf.get_adcbitdepth() adcbits_val = wx.StaticText( subpanel, label="{0} bits".format(bitdepth), size=(-1, 20), style=wx.ALIGN_LEFT) width_txt = wx.StaticText( subpanel, label="Sensor Bin Width:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._width_val = NumCtrl( subpanel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._width_val.SetAllowNegative(False) self._width_val.SetBounds(1, 1340) self._width_val.SetFractionWidth(0) self._width_val.SetIntegerWidth(4) self._width_val.SetValue(1) self._width_val.SetLimitOnFieldChange(True) self._width_val.Bind(wx.EVT_KILL_FOCUS, self._width_entry) height_txt = wx.StaticText( subpanel, label="Sensor Bin Height:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._height_val = NumCtrl( subpanel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._height_val.SetAllowNegative(False) self._height_val.SetBounds(1, 400) self._height_val.SetFractionWidth(0) self._height_val.SetIntegerWidth(4) self._height_val.SetValue(1) self._height_val.SetLimitOnFieldChange(True) self._height_val.Bind(wx.EVT_KILL_FOCUS, self._height_entry) roi_txt = wx.StaticText( subpanel, label="Sensor Mode:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._roi_val = wx.Choice( subpanel, size=(-1, 20), choices=["Full Sensor", "Line Sensor", "Binned Sensor"]) self._roi_val.Bind(wx.EVT_CHOICE, self._roi_entry) grating_txt = wx.StaticText( subpanel, label="Grating Density:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._grating_val = wx.Choice( subpanel, size=(-1, 20), choices=["300 g/mm", "1200 g/mm", "1800 g/mm"]) self._grating_val.Bind(wx.EVT_CHOICE, self._grating_entry) lambda_txt = wx.StaticText( subpanel, label="Center Wavelength (nm):", size=(135, 20), style=wx.ALIGN_RIGHT) self._lambda_val = NumCtrl( subpanel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._lambda_val.SetAllowNegative(False) self._lambda_val.SetFractionWidth(3) self._lambda_val.SetIntegerWidth(4) self._lambda_val.SetValue(780) self._lambda_val.Bind(wx.EVT_KILL_FOCUS, self._lambda_entry) slit_txt = wx.StaticText( subpanel, label="Slit Width (\u03BCm):", size=(-1, 20), style=wx.ALIGN_RIGHT) self._slit_val = NumCtrl( subpanel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._slit_val.SetAllowNegative(False) self._slit_val.SetBounds(10, 3000) self._slit_val.SetFractionWidth(0) self._slit_val.SetIntegerWidth(4) self._slit_val.SetValue(100) self._slit_val.SetLimitOnFieldChange(True) self._slit_val.Bind(wx.EVT_KILL_FOCUS, self._slit_entry) sp_sizer.AddMany( [exp_txt, self._exp_val, width_txt, self._width_val, frames_txt, self._frames_val, height_txt, self._height_val, adcqlty_txt, self._adcqlty_val, roi_txt, self._roi_val, adcspeed_txt, self._adcspeed_val, grating_txt, self._grating_val, adcgain_txt, self._adcgain_val, lambda_txt, self._lambda_val, adcbits_txt, adcbits_val, slit_txt, self._slit_val]) subpanel.SetSizer(sp_sizer) overall_sizer = wx.BoxSizer() overall_sizer.Add(subpanel, 0, wx.ALL, 10) self.SetSizer(overall_sizer) def disable_ui(self): self._exp_val.Disable() self._frames_val.Disable() self._adcqlty_val.Disable() self._adcspeed_val.Disable() self._adcgain_val.Disable() self._width_val.Disable() self._height_val.Disable() self._roi_val.Disable() self._grating_val.Disable() self._lambda_val.Disable() self._slit_val.Disable() def enable_ui(self): self._exp_val.Enable() self._frames_val.Enable() self._adcqlty_val.Enable() self._adcspeed_val.Enable() self._adcgain_val.Enable() self._width_val.Enable() self._height_val.Enable() self._roi_val.Enable() self._grating_val.Enable() self._lambda_val.Enable() self._slit_val.Enable() def _exp_entry(self, evt): if self._exp_val.GetValue() < 1: return self._lf.set_exposure(self._exp_val.GetValue()) evt.Skip() def _frames_entry(self, evt): if self._frames_val.GetValue() < 1: return self._lf.set_frames(self._frames_val.GetValue()) evt.Skip() def _adcqlty_entry(self, evt): if self._adcqlty_val.GetCurrentSelection() == 0: self._lf.set_adcquality(2) else: self._lf.set_adcquality(1) def _adcspeed_entry(self, evt): speeds = { 0: 4, 1: 2, 2: 1, 3: 0.5, 4: 0.2, 5: 0.1, 6: 0.05 } self._lf.set_adcspeed( speeds[self._adcspeed_val.GetCurrentSelection()]) def _adcgain_entry(self, evt): if self._adcgain_val.GetCurrentSelection() == 0: self._lf.set_adcanaloggain(3) elif self._adcgain_val.GetCurrentSelection() == 1: self._lf.set_adcanaloggain(2) else: self._lf.set_adcanaloggain(1) def _width_entry(self, evt): if self._width_val.GetValue() < 1: return self._lf.set_binwidth(self._width_val.GetValue()) evt.Skip() def _height_entry(self, evt): if self._height_val.GetValue() < 1: return self._lf.set_binheight(self._height_val.GetValue()) evt.Skip() def _roi_entry(self, evt): if self._roi_val.GetCurrentSelection() == 0: self._lf.set_roiselection(1) elif self._roi_val.GetCurrentSelection() == 1: self._lf.set_roiselection(3) else: self._lf.set_roiselection(2) def _grating_entry(self, evt): if self._grating_val.GetCurrentSelection() == 0: self._lf.set_grating(300) elif self._grating_val.GetCurrentSelection() == 1: self._lf.set_grating(1200) else: self._lf.set_grating(1800) def _lambda_entry(self, evt): if self._lambda_val.GetValue() < 1: return self._lf.set_centerwavelength(self._lambda_val.GetValue()) evt.Skip() def _slit_entry(self, evt): if self._slit_val.GetValue() < 1: return self._lf.set_slitwidth(self._slit_val.GetValue()) evt.Skip()
class LCVRCalibrationGUI(wx.Frame): def __init__(self, parent=None, title="LCVR Calibration"): super(LCVRCalibrationGUI, self).__init__( parent, title=title, size=(815, 520), style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX) self._max = "Not yet tested." self._min = "Not yet tested." self._pm_init = False self._lcvr_init = False self._data_set = [] self._filename = "LCVR Calibration.csv" self._kill_calibration = True self._saved_data = True # make panel for frame overall_panel = wx.Panel(self) overall_sizer = wx.GridBagSizer() # make panel for top top_panel = wx.Panel(overall_panel) top_sizer = wx.BoxSizer(wx.VERTICAL) # make panel for main stuff main_panel = wx.Panel(top_panel) main_sizer = wx.FlexGridSizer(11, 2, 0, 0) newport_label = wx.StaticText(main_panel, label="Newport GPIB Port: ", size=(140, 20), style=wx.ALIGN_RIGHT) self._newport_val = NumCtrl(main_panel, size=(140, 20), style=wx.TE_PROCESS_ENTER) self._newport_val.SetAllowNegative(False) self._newport_val.SetBounds(1, 99) self._newport_val.SetFractionWidth(0) self._newport_val.SetIntegerWidth(2) self._newport_val.SetValue(4) self._newport_val.SetLimitOnFieldChange(True) meadowlark_label = wx.StaticText(main_panel, label="Meadowlark COM Port: ", size=(140, 20), style=wx.ALIGN_RIGHT) self._meadowlark_val = NumCtrl(main_panel, size=(140, 20), style=wx.TE_PROCESS_ENTER) self._meadowlark_val.SetAllowNegative(False) self._meadowlark_val.SetBounds(1, 99) self._meadowlark_val.SetFractionWidth(0) self._meadowlark_val.SetIntegerWidth(2) self._meadowlark_val.SetValue(6) self._meadowlark_val.SetLimitOnFieldChange(True) meadowlark_chan = wx.StaticText(main_panel, label="Meadowlark Channel: ", size=(140, 20), style=wx.ALIGN_RIGHT) self._meadowlark_ch = wx.Choice(main_panel, size=(140, 20), choices=["1", "2", "3", "4"]) laser_label = wx.StaticText(main_panel, label="Laser Wavelength (nm): ", size=(140, 20), style=wx.ALIGN_RIGHT) self._laser_lambda = NumCtrl(main_panel, size=(140, 20), style=wx.TE_PROCESS_ENTER) self._laser_lambda.SetAllowNegative(False) self._laser_lambda.SetBounds(400, 1100) self._laser_lambda.SetFractionWidth(0) self._laser_lambda.SetIntegerWidth(4) self._laser_lambda.SetValue(780) self._laser_lambda.SetLimitOnFieldChange(True) start_volt_label = wx.StaticText(main_panel, label="Start Voltage (V):", size=(140, 20), style=wx.ALIGN_RIGHT) self._start_volt_val = NumCtrl(main_panel, size=(140, 20), style=wx.TE_PROCESS_ENTER) self._start_volt_val.SetAllowNegative(False) self._start_volt_val.SetBounds(0, 10) self._start_volt_val.SetFractionWidth(2) self._start_volt_val.SetIntegerWidth(2) self._start_volt_val.SetValue(10) self._start_volt_val.SetLimitOnFieldChange(True) end_volt_label = wx.StaticText(main_panel, label="End Voltage (V):", size=(140, 20), style=wx.ALIGN_RIGHT) self._end_volt_val = NumCtrl(main_panel, size=(150, 20), style=wx.TE_PROCESS_ENTER) self._end_volt_val.SetAllowNegative(False) self._end_volt_val.SetBounds(0, 10) self._end_volt_val.SetFractionWidth(2) self._end_volt_val.SetIntegerWidth(2) self._end_volt_val.SetValue(0) self._end_volt_val.SetLimitOnFieldChange(True) step_volt_label = wx.StaticText(main_panel, label="Absolute Step Voltage (V):", size=(140, 20), style=wx.ALIGN_RIGHT) self._step_volt_val = NumCtrl(main_panel, size=(140, 20), style=wx.TE_PROCESS_ENTER) self._step_volt_val.SetAllowNegative(False) self._step_volt_val.SetBounds(0, 10) self._step_volt_val.SetFractionWidth(2) self._step_volt_val.SetIntegerWidth(2) self._step_volt_val.SetValue(0.1) self._step_volt_val.SetLimitOnFieldChange(True) self._run_button = wx.Button(main_panel, label="Run Calibration", size=(140, 20)) self._run_button.SetForegroundColour(wx.Colour("GREEN")) self._stop_button = wx.Button(main_panel, label="Stop Calibration", size=(140, 20)) self._stop_button.SetForegroundColour(wx.Colour("RED")) self._stop_button.Disable() max_label = wx.StaticText(main_panel, label="Max Power Setting (V): ", size=(140, 20), style=wx.ALIGN_RIGHT) self._max_value = wx.StaticText(main_panel, label=self._max, size=(140, 20), style=wx.ALIGN_LEFT) min_label = wx.StaticText(main_panel, label="Min Power Setting (V): ", size=(140, 20), style=wx.ALIGN_RIGHT) self._min_value = wx.StaticText(main_panel, label=self._min, size=(140, 20), style=wx.ALIGN_LEFT) self._newport_val.Bind(wx.EVT_KILL_FOCUS, self._newport_entry) self._meadowlark_val.Bind(wx.EVT_KILL_FOCUS, self._meadowlark_entry) self._laser_lambda.Bind(wx.EVT_KILL_FOCUS, self._lambda_entry) self._save_button = wx.Button(main_panel, label="Save Values", size=(140, 20)) self._load_button = wx.Button(main_panel, label="Load Values", size=(140, 20)) self._save_button.Bind(wx.EVT_BUTTON, self._save_press) self._load_button.Bind(wx.EVT_BUTTON, self._load_press) self._run_button.Bind(wx.EVT_BUTTON, self._run_press) self._stop_button.Bind(wx.EVT_BUTTON, self._stop_press) main_sizer.AddMany([ newport_label, self._newport_val, meadowlark_label, self._meadowlark_val, meadowlark_chan, self._meadowlark_ch, laser_label, self._laser_lambda, start_volt_label, self._start_volt_val, end_volt_label, self._end_volt_val, step_volt_label, self._step_volt_val, self._run_button, self._stop_button, max_label, self._max_value, min_label, self._min_value, self._save_button, self._load_button ]) main_panel.SetSizer(main_sizer) self.Bind(wx.EVT_CLOSE, self._on_close) self._output_display = wx.TextCtrl(top_panel, size=(280, 180), style=wx.TE_MULTILINE | wx.TE_READONLY) top_sizer.Add(main_panel, 0, wx.ALL, 10) top_sizer.Add(self._output_display, 0, wx.ALL, 10) top_panel.SetSizer(top_sizer) plt_panel = wx.Panel(overall_panel, size=(500, 500)) plt_sizer = wx.BoxSizer() self._live_plt = Figure() self._live_plt.set_facecolor('w') axes_dim = [0.125, 0.125, 0.8, 0.8] self._live_plt_axes = self._live_plt.add_axes(axes_dim) self._live_plt_canvas = FigureCanvasWxAgg(plt_panel, -1, self._live_plt) plot_title = "Laser Power (mW) vs. LCVR Voltage (V)" self._live_plt_axes.set_title(plot_title) self._live_plt_axes.set_ylabel("Power (mW)") self._live_plt_axes.set_xlabel("Voltage (V)") self._live_plt_axes.grid(True) plt_sizer.Add(self._live_plt_canvas) plt_panel.SetSizer(plt_sizer) copyright_str = "\u00a9 2016 QuIN Lab " copyright_str += "Developed by Hayden Jones" copyright = wx.StaticText(overall_panel, label=copyright_str, style=wx.ALIGN_RIGHT) overall_sizer.Add(top_panel, (0, 0)) overall_sizer.Add(plt_panel, (0, 1), (2, 1)) overall_sizer.Add(copyright, (1, 0)) overall_panel.SetSizer(overall_sizer) overall_panel.Layout() self.Show() def _on_close(self, evt): if self._lcvr_init is True: self._lcvr.close() if self._pm_init is True: self._pm.close() if self._saved_data is False: if self._dataloss_warn() == wx.ID_NO: return evt.Skip() def disable_ui(self): self._newport_val.Disable() self._meadowlark_val.Disable() self._meadowlark_ch.Disable() self._laser_lambda.Disable() self._run_button.Disable() self._stop_button.Enable() self._save_button.Disable() self._load_button.Disable() def enable_ui(self): self._newport_val.Enable() self._meadowlark_val.Enable() self._meadowlark_ch.Enable() self._laser_lambda.Enable() self._run_button.Enable() self._stop_button.Disable() self._save_button.Enable() self._load_button.Enable() def get_pm_addr(self): return self._newport_val.GetValue() def get_lcvr_addr(self): return self._meadowlark_val.GetValue() def get_lcvr_ch(self): channels = {0: 1, 1: 2, 2: 3, 3: 4} return channels[self._meadowlark_ch.GetCurrentSelection()] def get_wavelength(self): return self._laser_lambda.GetValue() def get_start_volt(self): return self._start_volt_val.GetValue() def get_end_volt(self): return self._end_volt_val.GetValue() def get_step_volt(self): return self._step_volt_val.GetValue() def get_max(self): return self._max def get_min(self): return self._min def set_max(self): if self._max == self._min: return self._max_value.SetLabel(str(self._max)) def set_min(self): if self._min == self._max: return self._min_value.SetLabel(str(self._min)) def _invalid_pm_warn(self): warning_message = "Invalid Power Meter Address/Connection!" warning = wx.GenericMessageDialog(None, warning_message, "Warning!", wx.OK, wx.DefaultPosition) warning.ShowModal() warning.Destroy() def _invalid_lcvr_warn(self): warning_message = "Invalid LCVR Controller Address/Connection!" warning = wx.GenericMessageDialog(None, warning_message, "Warning!", wx.OK, wx.DefaultPosition) warning.ShowModal() warning.Destroy() def _overwrite_warn(self): warning_message = "Do you want to overwrite previous calibration?" warning = wx.GenericMessageDialog(None, warning_message, "Warning!", wx.YES_NO, wx.DefaultPosition) result = warning.ShowModal() warning.Destroy() return result def _dataloss_warn(self): warning_message = "Do you want to exit without saving data?" warning = wx.GenericMessageDialog(None, warning_message, "Warning!", wx.YES_NO, wx.DefaultPosition) result = warning.ShowModal() warning.Destroy() return result def _newport_entry(self, evt): # change line 308 to turn off attenuator if self._pm_init is True: return try: self._pm = Newport1830C(self.get_pm_addr()) except: self._invalid_pm_warn() return self._pm_init = True self._pm.attenuator_on() evt.Skip() def _meadowlark_entry(self, evt): if self._lcvr_init is True: return try: com_port = self._meadowlark_val.GetValue() self._lcvr = MeadowlarkD3050Controller(com_port) except: self._invalid_lcvr_warn() evt.Skip() return self._lcvr_init = True evt.Skip() def _lambda_entry(self, evt): if self._laser_lambda.IsInBounds() is False: return if self._pm_init is True: self._pm.set_wavelength(self.get_wavelength()) evt.Skip() def _run_press(self, evt): if self._data_set != []: if self._overwrite_warn() == wx.ID_NO: return self._meadowlark_entry(wx.EVT_BUTTON) self._newport_entry(wx.EVT_BUTTON) if self._pm_init is False: return if self._lcvr_init is False: return self.disable_ui() self._kill_calibration = False self._saved_data = False self._data_set = [] self._output_display.Clear() _thread.start_new_thread(self._calibration, (self.get_lcvr_ch(), )) def _stop_press(self, evt): self.enable_ui() self._kill_calibration = True def _save_press(self, evt): file_type = "Comma Separated Values file (*.csv)|*.csv" save_dialog = wx.FileDialog(self, "Save calibration data as...", "", self._filename, file_type, wx.FD_SAVE) if save_dialog.ShowModal() == wx.ID_CANCEL: return self._filename = save_dialog.GetPath() save_dialog.Destroy() with open(self._filename, 'w') as f: writer = csv.writer(f, lineterminator='\n') writer.writerow(["Date:", strftime("_%Y_%m_%d_%H-%M-%S")]) writer.writerow(["Wavelength:", self.get_wavelength()]) writer.writerows(self._data_set) self._saved_data = True def _load_press(self, evt): file_type = "Comma Separated Values file (*.csv)|*.csv" open_dialog = wx.FileDialog(self, "Open calibration data...", "", self._filename, file_type, wx.FD_OPEN) if open_dialog.ShowModal() == wx.ID_CANCEL: return self._filename = open_dialog.GetPath() open_dialog.Destroy() with open(self._filename, 'r') as f: reader = csv.reader(f) reader = list(reader) self._laser_lambda.SetValue(int(reader[1][1])) self._data_set = reader[2:] self._data_set = [[float(x[0]), float(x[1])] for x in self._data_set] self._start_volt_val.SetValue(self._data_set[0][0]) self._end_volt_val.SetValue(self._data_set[-1][0]) self._step_volt_val.SetValue( abs(self._data_set[1][0] - self._data_set[0][0])) for item in self._data_set: v = round(item[0], 3) p = round(item[1], 6) data_string = "Voltage (V):{0} Power (W):{1}\n".format(v, p) self._output_display.AppendText(data_string) self._analyze() self.set_max() self.set_min() self._update_plt(self._data_set) def _clear_plt(self): self._live_plt_axes.clear() plot_title = "Laser Power (mW) vs. LCVR Voltage (V)" self._live_plt_axes.set_title(plot_title) self._live_plt_axes.set_ylabel("Power (mW)") self._live_plt_axes.set_xlabel("Voltage (V)") self._live_plt_axes.grid(True) def _update_plt(self, data): self._clear_plt() x_data = np.array([]) y_data = np.array([]) for item in data: x_data = np.append(x_data, [item[0]]) y_data = np.append(y_data, [item[1] * 1000]) min_power = y_data.min() - y_data.min() / 20 max_power = y_data.max() + y_data.max() / 100 start_v = self.get_start_volt() end_v = self.get_end_volt() if start_v > end_v: temp = end_v end_v = start_v start_v = temp self._live_plt_axes.axis([start_v, end_v, min_power, max_power]) self._live_plt_axes.plot(x_data, y_data, 'rx') self._live_plt_canvas.draw() def _calibration(self, channel): start_v = self.get_start_volt() end_v = self.get_end_volt() if start_v > end_v: step = -self.get_step_volt() else: step = self.get_step_volt() for i in range(int(start_v * 1000), int((end_v + 0.01) * 1000), int(step * 1000)): if self._kill_calibration is True: break v = i / 1000 self._lcvr.set_voltage(channel, v) sleep(0.1) p = self._pm.get_power() self._data_set.append([v, p]) v = round(v, 3) p = round(p, 6) data_string = "Voltage (V):{0} Power (W):{1}\n".format(v, p) wx.CallAfter(self._output_display.AppendText, data_string) wx.CallAfter(self._update_plt, self._data_set) wx.CallAfter(self._stop_press, wx.EVT_BUTTON) wx.CallAfter(self._analyze) def _analyze(self): # Uses median absolute deviation (MAD) to remove outliers pow_arr = np.array([x[1] for x in self._data_set]) d = np.abs(pow_arr - np.median(pow_arr)) mdev = np.median(d) s = d / mdev if mdev else 0 pow_arr = list(pow_arr[s < 20]) min_index = pow_arr.index(min(pow_arr)) max_index = pow_arr.index(max(pow_arr)) self._min = self._data_set[min_index][0] self._max = self._data_set[max_index][0] self.set_max() self.set_min()