예제 #1
0
    def createWidgets(self):
        """Creates widgets for positioner, jaws, detector, and script"""
        self.tabs.clear()
        positioner_widget = PositionerWidget(self.parent)
        if self.last_stack_name and self.last_stack_name in self.parent.instrument.positioning_stacks.keys(
        ):
            positioner_widget.changeStack(self.last_stack_name)
        positioner_widget.stack_combobox.activated[str].connect(self.setStack)

        self.tabs.addTab(create_scroll_area(positioner_widget), 'Positioner')
        self.tabs.addTab(create_scroll_area(JawsWidget(self.parent)), 'Jaws')

        collimator_names = {}
        for name in self.parent.instrument.detectors:
            pretty_name = name if name.lower(
            ) == 'detector' else f'{name} Detector'
            detector_widget = DetectorWidget(self.parent, name)
            self.tabs.addTab(create_scroll_area(detector_widget), pretty_name)
            collimator_name = self.last_collimator_name.get(name, '')
            if collimator_name:
                collimator_names[name] = collimator_name
                detector_widget.combobox.setCurrentText(collimator_name)
                detector_widget.changeCollimator()
            detector_widget.collimator_changed.connect(self.setCollimator)
        self.last_collimator_name = collimator_names

        self.script_widget = ScriptWidget(self.parent)
        self.tabs.addTab(create_scroll_area(self.script_widget), 'Script')
        self.tabs.setCurrentIndex(
            clamp(self.last_tab_index, 0, self.tabs.count()))
예제 #2
0
    def __init__(self, parent):
        super().__init__(parent)
        self.parent = parent
        self.parent_model = parent.presenter.model
        self.parent.scenes.switchToInstrumentScene()

        self.instrument = self.parent_model.instrument
        self.main_layout = QtWidgets.QVBoxLayout()

        if self.instrument.jaws.positioner is not None:
            self.createPositionerForm()
            self.main_layout.addSpacing(40)
        self.createApertureForm()
        self.main_layout.addStretch(1)

        widget = QtWidgets.QWidget()
        widget.setLayout(self.main_layout)
        scroll_area = create_scroll_area(widget)

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(scroll_area)
        layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(layout)

        self.title = f'Configure {self.instrument.jaws.name}'
        self.setMinimumWidth(450)
        self.parent_model.instrument_controlled.connect(self.updateForms)
        self.parent.scenes.changeVisibility(Attributes.Beam, True)
        self.formValidation()
예제 #3
0
    def __init__(self, detector, parent):
        super().__init__(parent)
        self.parent = parent
        self.parent_model = parent.presenter.model
        self.parent.scenes.switchToInstrumentScene()

        self.main_layout = QtWidgets.QVBoxLayout()

        self.name = detector
        self.detector = self.parent_model.instrument.detectors[detector]
        if self.detector.positioner is not None:
            self.createPositionerForm()
            self.formValidation()
        self.main_layout.addStretch(1)

        widget = QtWidgets.QWidget()
        widget.setLayout(self.main_layout)
        scroll_area = create_scroll_area(widget)

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(scroll_area)
        layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(layout)

        detector_count = len(self.parent_model.instrument.detectors)
        self.title = 'Configure Detector' if detector_count == 1 else f'Configure {detector} Detector'
        self.setMinimumWidth(450)
        self.parent_model.instrument_controlled.connect(self.updateForms)
        self.parent.scenes.changeVisibility(Attributes.Beam, True)
예제 #4
0
    def generalForm(self):
        """Creates the form inputs for general settings"""
        self.addGroup(settings.Group.General)

        frame = QtWidgets.QWidget()
        main_layout = QtWidgets.QVBoxLayout()

        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Check_Update
        self.global_names.append(key)
        value = settings.value(key)
        checkbox = QtWidgets.QCheckBox('Check for updates on startup')
        checkbox.setChecked(value)
        checkbox.stateChanged.connect(
            lambda ignore, c=checkbox: self.changeSetting(c.isChecked()))
        checkbox.setProperty(self.prop_name, (key, value))
        layout.addWidget(checkbox)
        main_layout.addLayout(layout)
        main_layout.addSpacing(10)

        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Custom_Instruments_Path
        self.global_names.append(key)
        value = settings.value(key)
        layout.addWidget(QtWidgets.QLabel('Custom Instruments: '))
        path_picker = FilePicker(value, select_folder=True)
        path_picker.setProperty(self.prop_name, (key, value))
        path_picker.value_changed.connect(self.changeSetting)
        layout.addWidget(path_picker)
        main_layout.addLayout(layout)

        main_layout.addStretch(1)
        frame.setLayout(main_layout)
        self.stack.addWidget(create_scroll_area(frame))
예제 #5
0
    def __init__(self, parent):
        super().__init__(parent)
        self.parent = parent
        self.parent_model = parent.presenter.model
        self.parent.scenes.switchToInstrumentScene()

        self.instrument = self.parent_model.instrument
        self.main_layout = QtWidgets.QVBoxLayout()

        if len(self.instrument.positioning_stacks) > 1:
            stack_layout = QtWidgets.QHBoxLayout()
            stack_layout.addStretch(1)
            stack_layout.addWidget(QtWidgets.QLabel('Positioning Stack:'))
            self.stack_combobox = QtWidgets.QComboBox()
            self.stack_combobox.setView(QtWidgets.QListView())
            self.stack_combobox.addItems(
                self.instrument.positioning_stacks.keys())
            self.stack_combobox.setCurrentText(
                self.instrument.positioning_stack.name)
            self.stack_combobox.activated[str].connect(self.changeStack)
            stack_layout.addWidget(self.stack_combobox)
            self.main_layout.addLayout(stack_layout)
            self.main_layout.addSpacing(5)

        self.positioner_forms_layout = QtWidgets.QVBoxLayout()
        self.positioner_forms_layout.setContentsMargins(0, 0, 0, 0)

        self.createForms()
        self.main_layout.addLayout(self.positioner_forms_layout)

        button_layout = QtWidgets.QHBoxLayout()
        self.move_joints_button = QtWidgets.QPushButton('Move Joints')
        self.move_joints_button.clicked.connect(self.moveJointsButtonClicked)
        button_layout.addWidget(self.move_joints_button)
        button_layout.addStretch(1)

        self.main_layout.addLayout(button_layout)
        self.main_layout.addStretch(1)

        widget = QtWidgets.QWidget()
        widget.setLayout(self.main_layout)
        scroll_area = create_scroll_area(widget)

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(scroll_area)
        layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(layout)

        self.title = 'Configure Positioning System'
        self.setMinimumWidth(450)
        self.parent_model.instrument_controlled.connect(self.updateForms)
        self.formValidation()
예제 #6
0
    def graphicsForm(self):
        """Creates form inputs for graphics settings"""
        self.addGroup(settings.Group.Graphics)

        frame = QtWidgets.QWidget()
        main_layout = QtWidgets.QVBoxLayout()

        main_layout.addWidget(create_header('Rendering Size'))

        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Fiducial_Size
        value = settings.value(key)
        layout.addWidget(QtWidgets.QLabel('Fiducials:'))
        size = (5, 15, 30)
        combo_box = QtWidgets.QComboBox()
        combo_box.addItems(['Small', 'Medium', 'Large'])
        combo_box.setProperty(self.prop_name, (key, value))
        combo_box.setCurrentIndex(size.index(value) if value in size else 0)
        combo_box.currentIndexChanged.connect(
            lambda i, v=size: self.changeSetting(v[i]))
        layout.addWidget(combo_box)
        layout.addStretch(1)
        main_layout.addLayout(layout)
        main_layout.addSpacing(5)

        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Measurement_Size
        value = settings.value(key)
        layout.addWidget(QtWidgets.QLabel('Measurement Points:'))
        size = (5, 15, 30)
        combo_box = QtWidgets.QComboBox()
        combo_box.addItems(['Small', 'Medium', 'Large'])
        combo_box.setProperty(self.prop_name, (key, value))
        combo_box.setCurrentIndex(size.index(value) if value in size else 0)
        combo_box.currentIndexChanged.connect(
            lambda i, v=size: self.changeSetting(v[i]))
        layout.addWidget(combo_box)
        layout.addStretch(1)
        main_layout.addLayout(layout)
        main_layout.addSpacing(5)

        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Vector_Size
        value = settings.value(key)
        layout.addWidget(QtWidgets.QLabel('Measurement Vectors:'))
        size = (10, 35, 50)
        combo_box = QtWidgets.QComboBox()
        combo_box.addItems(['Small', 'Medium', 'Large'])
        combo_box.setProperty(self.prop_name, (key, value))
        combo_box.setCurrentIndex(size.index(value) if value in size else 0)
        combo_box.currentIndexChanged.connect(
            lambda i, v=size: self.changeSetting(v[i]))
        layout.addWidget(combo_box)
        layout.addStretch(1)
        main_layout.addLayout(layout)
        main_layout.addSpacing(5)

        main_layout.addWidget(create_header('Rendering Colour'))
        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Sample_Colour
        value = settings.value(key)
        layout.addWidget(QtWidgets.QLabel('Sample:'))
        colour_picker = ColourPicker(QtGui.QColor.fromRgbF(*value))
        colour_picker.value_changed.connect(self.changeSetting)
        colour_picker.setProperty(self.prop_name, (key, value))
        layout.addWidget(colour_picker)
        layout.addStretch(1)
        main_layout.addLayout(layout)

        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Fiducial_Colour
        value = settings.value(key)
        layout.addWidget(QtWidgets.QLabel('Fiducials (Enabled): '))
        colour_picker = ColourPicker(QtGui.QColor.fromRgbF(*value))
        colour_picker.value_changed.connect(self.changeSetting)
        colour_picker.setProperty(self.prop_name, (key, value))
        layout.addWidget(colour_picker)
        layout.addStretch(1)
        main_layout.addLayout(layout)

        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Fiducial_Disabled_Colour
        value = settings.value(key)
        layout.addWidget(QtWidgets.QLabel('Fiducials (Disabled): '))
        colour_picker = ColourPicker(QtGui.QColor.fromRgbF(*value))
        colour_picker.value_changed.connect(self.changeSetting)
        colour_picker.setProperty(self.prop_name, (key, value))
        layout.addWidget(colour_picker)
        layout.addStretch(1)
        main_layout.addLayout(layout)

        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Measurement_Colour
        value = settings.value(key)
        layout.addWidget(QtWidgets.QLabel('Measurement Point (Enabled): '))
        colour_picker = ColourPicker(QtGui.QColor.fromRgbF(*value))
        colour_picker.value_changed.connect(self.changeSetting)
        colour_picker.setProperty(self.prop_name, (key, value))
        layout.addWidget(colour_picker)
        layout.addStretch(1)
        main_layout.addLayout(layout)

        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Measurement_Disabled_Colour
        value = settings.value(key)
        layout.addWidget(QtWidgets.QLabel('Measurement Point (Disabled): '))
        colour_picker = ColourPicker(QtGui.QColor.fromRgbF(*value))
        colour_picker.value_changed.connect(self.changeSetting)
        colour_picker.setProperty(self.prop_name, (key, value))
        layout.addWidget(colour_picker)
        layout.addStretch(1)
        main_layout.addLayout(layout)

        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Vector_1_Colour
        value = settings.value(key)
        layout.addWidget(QtWidgets.QLabel('Measurement Vector 1: '))
        colour_picker = ColourPicker(QtGui.QColor.fromRgbF(*value))
        colour_picker.value_changed.connect(self.changeSetting)
        colour_picker.setProperty(self.prop_name, (key, value))
        layout.addWidget(colour_picker)
        layout.addStretch(1)
        main_layout.addLayout(layout)

        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Vector_2_Colour
        value = settings.value(key)
        layout.addWidget(QtWidgets.QLabel('Measurement Vector 2: '))
        colour_picker = ColourPicker(QtGui.QColor.fromRgbF(*value))
        colour_picker.value_changed.connect(self.changeSetting)
        colour_picker.setProperty(self.prop_name, (key, value))
        layout.addWidget(colour_picker)
        layout.addStretch(1)
        main_layout.addLayout(layout)

        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Cross_Sectional_Plane_Colour
        value = settings.value(key)
        layout.addWidget(QtWidgets.QLabel('Cross-Sectional Plane: '))
        colour_picker = ColourPicker(QtGui.QColor.fromRgbF(*value))
        colour_picker.value_changed.connect(self.changeSetting)
        colour_picker.setProperty(self.prop_name, (key, value))
        layout.addWidget(colour_picker)
        layout.addStretch(1)
        main_layout.addLayout(layout)

        main_layout.addStretch(1)
        frame.setLayout(main_layout)
        self.stack.addWidget(create_scroll_area(frame))
예제 #7
0
    def simulationForm(self):
        """Creates the form inputs for simulation settings"""
        self.addGroup(settings.Group.Simulation)

        frame = QtWidgets.QWidget()
        main_layout = QtWidgets.QVBoxLayout()
        main_layout.setSpacing(10)

        layout = QtWidgets.QVBoxLayout()
        key = settings.Key.Skip_Zero_Vectors
        value = settings.value(key)
        layout.addWidget(create_header('Zero Measurement Vector:'))
        group = QtWidgets.QWidget()
        group_layout = QtWidgets.QVBoxLayout()
        group_layout.setContentsMargins(0, 0, 0, 0)
        radio_button_1 = QtWidgets.QRadioButton('Skip the measurement')
        radio_button_1.setChecked(value)
        radio_button_1.setProperty(self.prop_name, (key, value))
        radio_button_1.toggled.connect(lambda: self.changeSetting(True))
        radio_button_2 = QtWidgets.QRadioButton(
            'Perform translation but no rotation')
        radio_button_2.setChecked(not value)
        radio_button_2.setProperty(self.prop_name, (key, value))
        radio_button_2.toggled.connect(lambda: self.changeSetting(False))
        group.setLayout(group_layout)
        group_layout.addWidget(radio_button_1)
        group_layout.addWidget(radio_button_2)
        layout.addWidget(group)
        layout.addStretch(1)
        main_layout.addLayout(layout)

        layout = QtWidgets.QVBoxLayout()
        key = settings.Key.Align_First
        value = settings.value(key)
        layout.addWidget(create_header('Execution Order:'))
        group = QtWidgets.QWidget()
        group_layout = QtWidgets.QVBoxLayout()
        group_layout.setContentsMargins(0, 0, 0, 0)
        radio_button_1 = QtWidgets.QRadioButton(
            'Run alignments before next point', frame)
        radio_button_1.setChecked(value)
        radio_button_1.setProperty(self.prop_name, (key, value))
        radio_button_1.toggled.connect(lambda: self.changeSetting(True))
        radio_button_2 = QtWidgets.QRadioButton(
            'Run next point before alignments', frame)
        radio_button_2.setChecked(not value)
        radio_button_2.setProperty(self.prop_name, (key, value))
        radio_button_2.toggled.connect(lambda: self.changeSetting(False))
        group.setLayout(group_layout)
        group_layout.addWidget(radio_button_1)
        group_layout.addWidget(radio_button_2)
        layout.addWidget(group)
        layout.addStretch(1)
        main_layout.addLayout(layout)

        main_layout.addWidget(create_header('Inverse Kinematics'))
        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Position_Stop_Val
        value = settings.value(key)
        lim = settings.default(key).limits
        layout.addWidget(
            QtWidgets.QLabel('Position termination tolerance (mm): '))
        spin = QtWidgets.QDoubleSpinBox()
        spin.setDecimals(3)
        spin.setRange(*lim)
        spin.setValue(settings.value(key))
        spin.setProperty(self.prop_name, (key, value))
        spin.valueChanged.connect(self.changeSetting)

        layout.addWidget(spin)
        layout.addStretch(1)
        main_layout.addLayout(layout)

        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Angular_Stop_Val
        value = settings.value(key)
        lim = settings.default(key).limits
        layout.addWidget(
            QtWidgets.QLabel('Orientation termination tolerance (degrees): '))
        spin = QtWidgets.QDoubleSpinBox()
        spin.setDecimals(3)
        spin.setRange(*lim)
        spin.setValue(settings.value(key))
        spin.setProperty(self.prop_name, (key, value))
        spin.valueChanged.connect(self.changeSetting)

        layout.addWidget(spin)
        layout.addStretch(1)
        main_layout.addLayout(layout)

        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Global_Max_Eval
        value = settings.value(key)
        lim = settings.default(key).limits
        layout.addWidget(
            QtWidgets.QLabel(
                f'Number of evaluations for global optimization ({lim[0]} - {lim[1]}): '
            ))
        spin = QtWidgets.QSpinBox()
        spin.setRange(*lim)
        spin.setValue(settings.value(key))
        spin.setProperty(self.prop_name, (key, value))
        spin.valueChanged.connect(self.changeSetting)

        layout.addWidget(spin)
        layout.addStretch(1)
        main_layout.addLayout(layout)

        layout = QtWidgets.QHBoxLayout()
        key = settings.Key.Local_Max_Eval
        value = settings.value(key)
        lim = settings.default(key).limits
        layout.addWidget(
            QtWidgets.QLabel(
                f'Number of evaluations for local optimization ({lim[0]} - {lim[1]}): '
            ))
        spin = QtWidgets.QSpinBox()
        spin.setRange(*lim)
        spin.setValue(value)
        spin.setProperty(self.prop_name, (key, value))
        spin.valueChanged.connect(self.changeSetting)
        layout.addWidget(spin)
        layout.addStretch(1)
        main_layout.addLayout(layout)
        main_layout.addStretch(1)

        frame.setLayout(main_layout)
        self.stack.addWidget(create_scroll_area(frame))