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())
Example #2
0
 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
Example #3
0
 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
Example #4
0
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()
Example #5
0
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)
Example #6
0
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)
Example #7
0
    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)
Example #8
0
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()
Example #9
0
 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
Example #10
0
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()
        
Example #11
0
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()