예제 #1
0
파일: panel.py 프로젝트: mwulansa/comet-pqc
    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)
예제 #2
0
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()
예제 #3
0
    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)
예제 #4
0
 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()
예제 #5
0
 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()
예제 #6
0
    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