def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._bindings = {} self.state_handlers = [] self.data_panel = ui.Column() self.general_tab = ui.Tab(title="General", layout=ui.Row()) self.control_tabs = ui.Tabs(self.general_tab) self.status_panel = ui.Column() self.control_panel = ui.Row(self.control_tabs, ui.Column(self.status_panel, ui.Spacer(horizontal=False)), stretch=(3, 1)) self.layout.insert(2, self.data_panel) self.layout.insert(3, self.control_panel) self.layout.stretch = 0, 0, 0, 0, 1 self.measurement = None self.data_tabs = ui.Tabs() self.data_panel.append(self.data_tabs) # Add analysis tab self.analysis_tree = ui.Tree(header=["Parameter", "Value"]) self.data_tabs.insert( 0, ui.Tab(title="Analysis", layout=self.analysis_tree)) # Plots self.series_transform = {} self.series_transform_default = lambda x, y: (x, y)
def main(): app = comet.Application() app.title = "UI Demo" values = ["Chapman", "Cleese", "Gilliam", "Idle", "Jones", "Palin"] tab1 = ui.Tab(title="Tab 1", layout=ui.Column( ui.Row(ui.Column( ui.GroupBox(title="Numbers", layout=ui.Column( ui.Label(text="Number 1"), ui.Number(value=1, minimum=0, maximum=10, step=1, prefix="#"), ui.Label(text="Number 2"), ui.Number(value=2.345, minimum=0, maximum=10, step=.1, decimals=3, suffix="mV"), ui.Label(text="Number 3"), ui.Number(value=1.23, minimum=0, maximum=10, decimals=2, suffix="mA", readonly=True), ui.Label(text="Number 4"), ui.Number(value=4.2, minimum=0, maximum=10, decimals=1, suffix="dB", enabled=False)))), ui.Column( ui.GroupBox(title="Text", layout=ui.Column( ui.Label(text="Text 1"), ui.Text(value="Chapman"), ui.Label(text="Text 2"), ui.Text(value="Cleese", clearable=True), ui.Label(text="Text 3"), ui.Text(value="Idle", readonly=True), ui.Label(text="Text 4"), ui.Text(value="Palin", enabled=False)))), ui.Spacer(), stretch=(2, 2, 3)), ui.Spacer(), stretch=(0, 1))) def on_append(): list1.append(f"Spam {len(list1)}") list1.current = list1[0] def on_remove(): if list1.current is not None: list1.remove(list1.current) list1 = ui.List() tab2 = ui.Tab(title="Tab 2", layout=ui.Column(ui.Row( ui.GroupBox(title="List 1", layout=ui.Column( list1, ui.Button(text="&Add", clicked=on_append), ui.Button(text="&Remove", clicked=on_remove))), ui.GroupBox(title="List 2", layout=ui.List(values)), ui.GroupBox(title="List 3", layout=ui.List(values, enabled=False))), ui.Spacer(), stretch=(0, 1))) table1 = ui.Table(header=["Key", "Value"]) tab3 = ui.Tab(title="Tab 3", layout=ui.Column(table1)) tree1 = ui.Tree(header=["Key", "Value"]) tab4 = ui.Tab(title="Tab 4", layout=ui.Column(tree1)) first = ui.Button(text="Click") scroll = ui.ScrollArea(layout=ui.Column(*[ ui.CheckBox(text=f"Option {i+1}", checked=random.choice([True, False])) for i in range(64) ])) second = ui.Column(scroll) tab5 = ui.Tab(title="Tab 5", layout=first) tab5.layout = second del first tab6 = ui.Tab(title="Tab 6", layout=ui.Row(ui.Column( ui.Label("Metric 1"), ui.Metric('V', decimals=3, changed=lambda value: print(value)), ui.Label("Metric 2"), ui.Metric('A', prefixes='munp', changed=lambda value: print(value)), ui.Spacer()), ui.Spacer(), stretch=(1, 2))) def on_changed(value): app.message = value def on_click(): app.message = combobox1.current tabs = ui.Tabs(tab1, tab2, tab3, tab4, tab5, tab6) combobox1 = ui.ComboBox(values) app.layout = ui.Row(ui.Column( ui.GroupBox(title="GroupBox 1", layout=ui.Column( ui.Button(text="Button 1", clicked=on_click), ui.Button(text="Button 2", enabled=False), ui.Button(text="Button 3", checkable=True), ui.Button(text="Button 4", checkable=True, enabled=False), ui.Button(text="Button 5", checkable=True, checked=True))), ui.GroupBox(title="GroupBox 2", layout=ui.Column( ui.CheckBox(text="CheckBox 1"), ui.CheckBox(text="CheckBox 2", enabled=False), ui.CheckBox(text="CheckBox 3", checked=True, enabled=False), ui.CheckBox(text="CheckBox 4", checked=True))), ui.GroupBox(title="GroupBox 3", layout=ui.Column( ui.ComboBox(), combobox1, ui.ComboBox(values, current="Cleese", changed=on_changed), ui.ComboBox(values, current="Idle", enabled=False))), ui.Spacer()), tabs, stretch=(2, 7)) # Populate table spam = table1.append(["Spam", 42]) spam[0].checked = True #spam[0].enabled = False ham = table1.append(["Ham", 41]) ham[0].checked = True #ham[0].enabled = False # Populate tree spam = tree1.append(["Spam", 42]) spam[0].checked = True spam.append(["Ham", 41]) spam.append(["Eggs", 40]) # Add an remove tab tab = ui.Tab() tabs.insert(0, tab) tab.title = "Spam" tabs.remove(tab) app.message = "Notification message..." app.progress = 3, 4 return app.run()
def __init__(self, message_changed=None, progress_changed=None, **kwargs): super().__init__() # Properties self.collapsible = False # Callbacks self.message_changed = message_changed self.progress_changed = progress_changed # Layout self.sequence_tree = SequenceTree( selected=self.on_tree_selected, double_clicked=self.on_tree_double_clicked ) self.sequence_tree.minimum_width = 360 self.start_all_action = ui.Action( text="&All Samples", triggered=self.on_start_all ) self.start_sample_action = ui.Action( text="&Sample", triggered=self.on_start ) self.start_sample_action.qt.setEnabled(False) self.start_contact_action = ui.Action( text="&Contact", triggered=self.on_start ) self.start_contact_action.qt.setEnabled(False) self.start_measurement_action = ui.Action( text="&Measurement", triggered=self.on_start ) self.start_measurement_action.qt.setEnabled(False) self.start_menu = ui.Menu() self.start_menu.append(self.start_all_action) self.start_menu.append(self.start_sample_action) self.start_menu.append(self.start_contact_action) self.start_menu.append(self.start_measurement_action) self.start_button = ui.Button( text="Start", tool_tip="Start measurement sequence.", stylesheet="QPushButton:enabled{color:green;font-weight:bold;}" ) self.start_button.qt.setMenu(self.start_menu.qt) self.stop_button = ui.Button( text="Stop", tool_tip="Stop measurement sequence.", enabled=False, clicked=self.on_stop, stylesheet="QPushButton:enabled{color:red;font-weight:bold;}" ) self.reset_button = ui.Button( text="Reset", tool_tip="Reset measurement sequence state.", clicked=self.on_reset_sequence_state ) self.reload_config_button = ui.ToolButton( icon=make_path('assets', 'icons', 'reload.svg'), tool_tip="Reload sequence configurations from file.", clicked=self.on_reload_config_clicked ) self.add_sample_button = ui.ToolButton( icon=make_path('assets', 'icons', 'add.svg'), tool_tip="Add new sample sequence.", clicked=self.on_add_sample_clicked ) self.remove_sample_button = ui.ToolButton( icon=make_path('assets', 'icons', 'delete.svg'), tool_tip="Remove current sample sequence.", clicked=self.on_remove_sample_clicked ) self.sequence_groupbox = ui.GroupBox( title="Sequence", layout=ui.Column( self.sequence_tree, ui.Row( self.start_button, self.stop_button, self.reset_button, self.reload_config_button, self.add_sample_button, self.remove_sample_button ) ) ) # Environment Controls self.environment_control_widget = EnvironmentControlWidget( toggled=self.on_environment_groupbox_toggled, laser_sensor_toggled=self.on_laser_sensor_toggled, box_light_toggled=self.on_box_light_toggled, microscope_light_toggled=self.on_microscope_light_toggled, microscope_camera_toggled=self.on_microscope_camera_toggled, microscope_control_toggled=self.on_microscope_control_toggled, probecard_light_toggled=self.on_probecard_light_toggled, probecard_camera_toggled=self.on_probecard_camera_toggled, pid_control_toggled=self.on_pid_control_toggled ) # Table controls self.table_control_widget = TableControlWidget( toggled=self.on_table_groupbox_toggled, joystick_toggled=self.on_table_joystick_toggled, control_clicked=self.on_table_control_clicked ) # Operator self.operator_widget = OperatorWidget() self.operator_widget.load_settings() self.operator_groupbox = ui.GroupBox( title="Operator", layout=self.operator_widget ) # Working directory self.output_widget = WorkingDirectoryWidget() self.output_groupbox = ui.GroupBox( title="Working Directory", layout=self.output_widget ) # Controls self.control_widget = ui.Column( self.sequence_groupbox, self.table_control_widget, self.environment_control_widget, ui.Row( self.operator_groupbox, self.output_groupbox, stretch=(3, 7) ), stretch=(1, 0, 0) ) # Tabs self.measurement_tab = MeasurementTab(restore=self.on_measure_restore) self.environment_tab = EnvironmentTab() self.status_tab = StatusTab(reload=self.on_status_start) self.summary_tab = SummaryTab() self.panels = self.measurement_tab.panels self.panels.sample_changed = self.on_sample_changed self.log_widget = LogWidget() self.log_widget.add_logger(logging.getLogger()) self.logging_tab = ui.Tab( title="Logs", layout=self.log_widget ) # Tabs self.tab_widget = ui.Tabs( self.measurement_tab, self.environment_tab, self.status_tab, self.logging_tab, self.summary_tab ) # Layout self.append(self.control_widget) self.append(self.tab_widget) self.stretch = 4, 9 # Setup process callbacks self.environ_process = self.processes.get("environ") self.environ_process.pc_data_updated = self.on_pc_data_updated self.status_process = self.processes.get("status") self.status_process.finished = self.on_status_finished self.table_process = self.processes.get("table") self.table_process.joystick_changed = self.on_table_joystick_changed self.table_process.position_changed = self.on_table_position_changed self.measure_process = self.processes.get("measure") self.measure_process.finished = self.on_finished self.measure_process.measurement_state = self.on_measurement_state self.measure_process.save_to_image = self.on_save_to_image # Experimental # Install timer to update environment controls self.environment_timer = Timer(timeout=self.sync_environment_controls) self.environment_timer.start(self.environment_poll_interval)
def __init__(self, process): super().__init__() self.mount(process) self.resize(640, 480) self.title = "Table Control" self.add_x_button = KeypadButton(text="+X", clicked=self.on_add_x) self.sub_x_button = KeypadButton(text="-X", clicked=self.on_sub_x) self.add_y_button = KeypadButton(text="+Y", clicked=self.on_add_y) self.sub_y_button = KeypadButton(text="-Y", clicked=self.on_sub_y) self.add_z_button = KeypadButton(text="+Z", clicked=self.on_add_z) self.sub_z_button = KeypadButton(text="-Z", clicked=self.on_sub_z) self.control_buttons = (self.add_x_button, self.sub_x_button, self.add_y_button, self.sub_y_button, self.add_z_button, self.sub_z_button) self.probecard_light_button = ToggleButton( text="PC Light", tool_tip="Toggle probe card light", checkable=True, checked=False, enabled=False, toggled=self.on_probecard_light_clicked) self.microscope_light_button = ToggleButton( text="Mic Light", tool_tip="Toggle microscope light", checkable=True, checked=False, enabled=False, toggled=self.on_microscope_light_clicked) self.box_light_button = ToggleButton(text="Box Light", tool_tip="Toggle box light", checkable=True, checked=False, enabled=False, toggled=self.on_box_light_clicked) # Create movement radio buttons self.step_width_buttons = ui.Column() for item in self.load_table_step_sizes(): step_size = item.get('step_size') * comet.ureg('um') step_color = item.get('step_color') step_size_label = format_metric(step_size.to('m').m, 'm', decimals=1) button = ui.RadioButton( text=step_size_label, tool_tip=f"Move in {step_size_label} steps.", stylesheet=f"QRadioButton:enabled{{color:{step_color};}}", checked=len(self.step_width_buttons) == 0, toggled=self.on_step_toggled) button.movement_width = step_size.to('mm').m button.movement_color = step_color self.step_width_buttons.append(button) self.control_layout = ui.Column(ui.Row(ui.Row( ui.Column(KeypadSpacer(), self.sub_y_button, KeypadSpacer()), ui.Column( self.sub_x_button, KeypadSpacer(), self.add_x_button, ), ui.Column( KeypadSpacer(), self.add_y_button, KeypadSpacer(), ), KeypadSpacer(), ui.Column(self.add_z_button, KeypadSpacer(), self.sub_z_button)), ui.Spacer(), stretch=(0, 1)), ui.Spacer(), stretch=(0, 1)) self.positions_widget = TablePositionsWidget( position_picked=self.on_position_picked, absolute_move=self.on_absolute_move) self.contacts_widget = TableContactsWidget( position_picked=self.on_position_picked, absolute_move=self.on_absolute_move) self.pos_x_label = PositionLabel() self.pos_y_label = PositionLabel() self.pos_z_label = PositionLabel() self.cal_x_label = CalibrationLabel("cal") self.cal_y_label = CalibrationLabel("cal") self.cal_z_label = CalibrationLabel("cal") self.rm_x_label = CalibrationLabel("rm") self.rm_y_label = CalibrationLabel("rm") self.rm_z_label = CalibrationLabel("rm") self.z_limit_label = PositionLabel() self.laser_label = SwitchLabel() self.calibrate_button = ui.Button(text="Calibrate", clicked=self.on_calibrate) self.update_interval_number = ui.Number( value=self.settings.get("table_control_update_interval") or 1.0, minimum=.5, maximum=10.0, decimals=2, step=0.25, suffix="s", changed=self.on_update_interval_changed) self.progress_bar = ui.ProgressBar(visible=False) self.message_label = ui.Label() self.stop_button = ui.Button(text="&Stop", default=False, auto_default=False, enabled=False, clicked=self.on_stop) self.close_button = ui.Button(text="&Close", default=False, auto_default=False, clicked=self.on_close) self.layout = ui.Column( ui.Row( ui.Column( ui.Row( ui.GroupBox( title="Control", layout=ui.Column( ui.Spacer(horizontal=False), self.control_layout, ui.Spacer(horizontal=False) ) ), ui.GroupBox( title="Step Width", layout=self.step_width_buttons ), ui.GroupBox( title="Lights", layout=ui.Column( self.probecard_light_button, self.microscope_light_button, self.box_light_button, ui.Spacer() ) ), stretch=(0, 1) ), ui.Tabs( ui.Tab( title="Move", layout=self.positions_widget ), ui.Tab( title="Contacts", layout=self.contacts_widget ), ui.Tab( title="Calibrate", layout=ui.Column( ui.GroupBox( title="Table Calibration", layout=ui.Column( ui.Row( self.calibrate_button, ui.Label("Calibrate table by moving into cal/rm switches\nof every axis in" \ " a safe manner to protect the probe card."), stretch=(0, 1) ) ) ), ui.Spacer(), stretch=(0, 1) ) ), ui.Tab( title="Options", layout=ui.Column( ui.GroupBox( title="Update Interval", layout=ui.Row( self.update_interval_number, ui.Spacer(), stretch=(0, 1) ) ), ui.Spacer(), stretch=(0, 1) ) ) ), stretch=(0, 1) ), ui.Column( ui.GroupBox( title="Position", layout=ui.Row( ui.Column( ui.Label("X"), ui.Label("Y"), ui.Label("Z") ), ui.Column( self.pos_x_label, self.pos_y_label, self.pos_z_label ) ) ), ui.GroupBox( title="Calibration", layout=ui.Row( ui.Column( ui.Label("X"), ui.Label("Y"), ui.Label("Z") ), ui.Column( self.cal_x_label, self.cal_y_label, self.cal_z_label ), ui.Column( self.rm_x_label, self.rm_y_label, self.rm_z_label ), stretch=(1, 1) ) ), ui.GroupBox( title="Limits", layout=ui.Row( ui.Column( ui.Label("Z") ), ui.Column( self.z_limit_label ) ) ), ui.GroupBox( title="Safety", layout=ui.Row( ui.Label( text="Laser Sensor" ), self.laser_label ) ), ui.Spacer() ), stretch=(1, 0) ), ui.Row( self.progress_bar, self.message_label, ui.Spacer(), self.stop_button, self.close_button ), stretch=(1, 0) ) self.close_event = self.on_close_event self.reset_position() self.reset_caldone() self.update_limits() self.reset_safety() self.update_control_buttons()
def __init__(self, process, lcr_process): super().__init__() self.lcr_process = lcr_process self.lcr_process.finished = self.on_lcr_finished self.lcr_process.failed = self.on_lcr_failed self.lcr_process.reading = self.on_lcr_reading self.mount(process) self.resize(640, 480) self.title = "Table Control" self.add_x_button = KeypadButton(text="+X", clicked=self.on_add_x) self.sub_x_button = KeypadButton(text="-X", clicked=self.on_sub_x) self.add_y_button = KeypadButton(text="+Y", clicked=self.on_add_y) self.sub_y_button = KeypadButton(text="-Y", clicked=self.on_sub_y) self.add_z_button = KeypadButton(text="+Z", clicked=self.on_add_z) self.sub_z_button = KeypadButton(text="-Z", clicked=self.on_sub_z) self.step_up_button = KeypadButton( text="↑⇵", tool_tip= "Step up, move single step up then double step down and double step up (experimental).", clicked=self.on_step_up) self.control_buttons = (self.add_x_button, self.sub_x_button, self.add_y_button, self.sub_y_button, self.add_z_button, self.sub_z_button, self.step_up_button) self._lcr_prim_text = ui.Text(readonly=True) self._lcr_sec_text = ui.Text(readonly=True) self._lcr_chart = LCRChart() self._lcr_groupbox = ui.GroupBox( title="Contact Quality (LCR)", checkable=True, checked=False, toggled=self.on_lcr_toggled, layout=ui.Column(ui.Row(ui.Label("Cp"), self._lcr_prim_text), ui.Row(ui.Label("Rp"), self._lcr_sec_text), self._lcr_chart)) self.probecard_light_button = ToggleButton( text="PC Light", tool_tip="Toggle probe card light", checkable=True, checked=False, enabled=False, toggled=self.on_probecard_light_clicked) self.microscope_light_button = ToggleButton( text="Mic Light", tool_tip="Toggle microscope light", checkable=True, checked=False, enabled=False, toggled=self.on_microscope_light_clicked) self.box_light_button = ToggleButton(text="Box Light", tool_tip="Toggle box light", checkable=True, checked=False, enabled=False, toggled=self.on_box_light_clicked) # Create movement radio buttons self.step_width_buttons = ui.Column() for item in self.load_table_step_sizes(): step_size = item.get('step_size') * comet.ureg('um') step_color = item.get('step_color') step_size_label = format_metric(step_size.to('m').m, 'm', decimals=1) button = ui.RadioButton( text=step_size_label, tool_tip=f"Move in {step_size_label} steps.", stylesheet=f"QRadioButton:enabled{{color:{step_color};}}", checked=len(self.step_width_buttons) == 0, toggled=self.on_step_toggled) button.movement_width = step_size.to('mm').m button.movement_color = step_color self.step_width_buttons.append(button) self.control_layout = ui.Column(ui.Row(ui.Row( ui.Column(KeypadSpacer(), self.sub_y_button, KeypadSpacer()), ui.Column( self.sub_x_button, KeypadSpacer(), self.add_x_button, ), ui.Column( KeypadSpacer(), self.add_y_button, KeypadSpacer(), ), KeypadSpacer(), ui.Column(ui.Row(self.add_z_button, self.step_up_button), KeypadSpacer(), self.sub_z_button)), ui.Spacer(), stretch=(0, 1)), ui.Spacer(), stretch=(0, 1)) self.positions_widget = TablePositionsWidget( enabled=False, position_picked=self.on_position_picked, absolute_move=self.on_absolute_move) self.contacts_widget = TableContactsWidget( enabled=False, position_picked=self.on_position_picked, absolute_move=self.on_absolute_move) self._position_widget = PositionWidget() self._calibration_widget = CalibrationWidget() self.z_limit_label = PositionLabel() self.x_hard_limit_label = PositionLabel() self.y_hard_limit_label = PositionLabel() self.z_hard_limit_label = PositionLabel() self.laser_label = SwitchLabel() self._calibrate_button = ui.Button(text="Calibrate", clicked=self.on_calibrate) self._update_interval_number = ui.Number( value=settings.table_control_update_interval, minimum=.5, maximum=10.0, decimals=2, step=0.25, suffix="s", changed=self.on_update_interval_changed) self._interval_groupbox = ui.GroupBox(title="Update Interval", layout=ui.Row( self._update_interval_number, ui.Spacer(), stretch=(0, 1))) self._dodge_height_number = ui.Number( tool_tip="Doge height in microns.", minimum=0, maximum=10000, decimals=0, step=1, suffix="um") self._dodge_groupbox = ui.GroupBox( title="X/Y Dodge", tool_tip="Enables -/+ Z dodge for XY movements.", checkable=True, layout=ui.Row(ui.Label("Height"), self._dodge_height_number, ui.Spacer(), stretch=(0, 0, 1))) self._lcr_reset_on_move_checkbox = ui.CheckBox( text="Reset graph on X/Y move") self._contact_quality_groupbox = ui.GroupBox( title="Contact Quality (LCR)", layout=ui.Row(self._lcr_reset_on_move_checkbox, ui.Spacer(), stretch=(0, 1))) self._step_up_delay_number = ui.Number(minimum=0, maximum=1000, decimals=0, step=25, suffix="ms") self._step_up_multiply_number = ui.Number(minimum=1, maximum=10, decimals=0, suffix="x") self._step_up_groubox = ui.GroupBox( title="Step Up (↑⇵)", layout=ui.Row( ui.Column(ui.Label("Delay"), ui.Label("Multiplicator (⇵)")), ui.Column(self._step_up_delay_number, self._step_up_multiply_number), ui.Spacer())) self._lcr_update_interval_number = ui.Number(minimum=0, maximum=1000, decimals=0, step=25, suffix="ms") self._lcr_matrix_channels_text = ui.Text() self._lcr_options_groupbox = ui.GroupBox( title="Contact Quality (LCR)", layout=ui.Row( ui.Column( ui.Label("Reading Interval"), ui.Label("Matrix Channels"), ), ui.Column( ui.Row(self._lcr_update_interval_number, ui.Spacer()), self._lcr_matrix_channels_text))) self.progress_bar = ui.ProgressBar(visible=False) self.message_label = ui.Label() self.stop_button = ui.Button(text="&Stop", default=False, auto_default=False, enabled=False, clicked=self.on_stop) self.close_button = ui.Button(text="&Close", default=False, auto_default=False, clicked=self.on_close) self.layout = ui.Column( ui.Row( ui.Column( ui.Row( ui.GroupBox( title="Control", layout=ui.Column( ui.Spacer(horizontal=False), self.control_layout, ui.Spacer(horizontal=False) ) ), ui.GroupBox( title="Step Width", layout=self.step_width_buttons ), self._lcr_groupbox, ui.Column( ui.GroupBox( title="Lights", layout=ui.Column( self.probecard_light_button, self.microscope_light_button, self.box_light_button, ui.Spacer() ) ) ), stretch=(0, 0, 1, 0) ), ui.Tabs( ui.Tab( title="Move", layout=self.positions_widget ), ui.Tab( title="Contacts", layout=self.contacts_widget ), ui.Tab( title="Calibrate", layout=ui.Column( ui.GroupBox( title="Table Calibration", layout=ui.Column( ui.Row( self._calibrate_button, ui.Label("Calibrate table by moving into cal/rm switches\nof every axis in" \ " a safe manner to protect the probe card."), stretch=(0, 1) ) ) ), ui.Spacer(), stretch=(0, 1) ) ), ui.Tab( title="Options", layout=ui.Column( ui.Row( self._interval_groupbox, self._dodge_groupbox, self._contact_quality_groupbox, stretch=(0, 0, 1) ), self._step_up_groubox, self._lcr_options_groupbox, ui.Spacer(), stretch=(0, 0, 0, 1) ) ) ), stretch=(0, 1) ), ui.Column( self._position_widget, self._calibration_widget, ui.GroupBox( title="Soft Limits", layout=ui.Row( ui.Column( ui.Label("Z") ), ui.Column( self.z_limit_label ) ) ), ui.GroupBox( title="Hard Limits", layout=ui.Row( ui.Column( ui.Label("X"), ui.Label("Y"), ui.Label("Z") ), ui.Column( self.x_hard_limit_label, self.y_hard_limit_label, self.z_hard_limit_label ) ) ), ui.GroupBox( title="Safety", layout=ui.Row( ui.Label( text="Laser Sensor" ), self.laser_label ) ), ui.Spacer() ), stretch=(1, 0) ), ui.Row( self.progress_bar, self.message_label, ui.Spacer(), self.stop_button, self.close_button ), stretch=(1, 0) ) self.close_event = self.on_close_event self.reset_position() self.reset_caldone() self.update_limits() self.reset_safety() self.update_control_buttons()
def __init__(self, message_changed=None, progress_changed=None, **kwargs): super().__init__() # Callbacks self.message_changed = message_changed self.progress_changed = progress_changed # Layout self.temporary_z_limit_label = ui.Label( text="Temporary Probecard Z-Limit applied. " "Revert after finishing current measurements.", stylesheet= "QLabel{color: black; background-color: yellow; padding: 4px; border-radius: 4px;}", visible=False) self.sequence_widget = SequenceWidget( tree_selected=self.on_tree_selected, tree_double_clicked=self.on_tree_double_clicked, start_all=self.on_start_all, start=self.on_start, stop=self.on_stop, reset_sequence_state=self.on_reset_sequence_state, edit_sequence=self.on_edit_sequence) self.sequence_tree = self.sequence_widget._sequence_tree self.start_sample_action = self.sequence_widget._start_sample_action self.start_contact_action = self.sequence_widget._start_contact_action self.start_measurement_action = self.sequence_widget._start_measurement_action # Environment Controls self.environment_control_widget = EnvironmentControlWidget( toggled=self.on_environment_groupbox_toggled, laser_sensor_toggled=self.on_laser_sensor_toggled, box_light_toggled=self.on_box_light_toggled, microscope_light_toggled=self.on_microscope_light_toggled, microscope_camera_toggled=self.on_microscope_camera_toggled, microscope_control_toggled=self.on_microscope_control_toggled, probecard_light_toggled=self.on_probecard_light_toggled, probecard_camera_toggled=self.on_probecard_camera_toggled, pid_control_toggled=self.on_pid_control_toggled) # Table controls self.table_control_widget = TableControlWidget( toggled=self.on_table_groupbox_toggled, joystick_toggled=self.on_table_joystick_toggled, control_clicked=self.on_table_control_clicked) # Operator self.operator_widget = OperatorWidget() self.operator_widget.load_settings() self.operator_groupbox = ui.GroupBox(title="Operator", layout=self.operator_widget) # Working directory self.output_widget = WorkingDirectoryWidget() self.output_groupbox = ui.GroupBox(title="Working Directory", layout=self.output_widget) # Controls self.control_widget = ui.Column(self.sequence_widget, self.table_control_widget, self.environment_control_widget, ui.Row(self.operator_groupbox, self.output_groupbox, stretch=(3, 7)), stretch=(1, 0, 0)) # Tabs self.measurement_tab = MeasurementTab(restore=self.on_measure_restore) self.environment_tab = EnvironmentTab() self.status_tab = StatusTab(reload=self.on_status_start) self.summary_tab = SummaryTab() self.panels = self.measurement_tab.panels self.panels.sample_changed = self.on_sample_changed self.log_widget = LogWidget() self.log_widget.add_logger(logging.getLogger()) self.logging_tab = ui.Tab(title="Logs", layout=self.log_widget) # Tabs self.tab_widget = ui.Tabs(self.measurement_tab, self.environment_tab, self.status_tab, self.logging_tab, self.summary_tab) # Layout self.splitter = ui.Splitter() self.splitter.append(self.control_widget) self.splitter.append(self.tab_widget) self.splitter.stretch = 4, 9 self.splitter.collapsible = False self.append(self.temporary_z_limit_label) self.append(self.splitter) self.stretch = 0, 1 # Setup process callbacks self.environ_process = self.processes.get("environ") self.environ_process.pc_data_updated = self.on_pc_data_updated self.status_process = self.processes.get("status") self.status_process.finished = self.on_status_finished self.table_process = self.processes.get("table") self.table_process.joystick_changed = self.on_table_joystick_changed self.table_process.position_changed = self.on_table_position_changed self.table_process.caldone_changed = self.on_table_calibration_changed self.measure_process = self.processes.get("measure") self.measure_process.finished = self.on_finished self.measure_process.measurement_state = self.on_measurement_state self.measure_process.measurement_reset = self.on_measurement_reset self.measure_process.save_to_image = self.on_save_to_image self.contact_quality_process = self.processes.get("contact_quality") # Experimental # Install timer to update environment controls self.environment_timer = Timer(timeout=self.sync_environment_controls) self.environment_timer.start(self.environment_poll_interval) self.close_event = self.on_stop