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()))
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()
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)
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))
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()
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))
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))