def filter_objects_by_name(object_parent_widget: QtWidgets.QWidget, object_types: list, names: list = None): list_objects = list() for i in object_types: for j in object_parent_widget.findChildren(i): if names: for k in names: if k in j.objectName(): list_objects.append(j) else: list_objects.append(j) return list_objects
class DLPPrinterGUI(QWidget): closing_window_event = Signal() spinboxValueChanged = Signal(float) def __init__(self, dlp_controller=None, parent=None, printer_setup='BOTTOM-UP'): QWidget.__init__(self, parent) if dlp_controller: self.dlp_controller = dlp_controller else: self.dlp_controller = DLPMainController(printer_setup) self.dlp_controller.block_parameters_signal.connect( self.block_parameters_signals) self.dlp_controller.reactivate_parameters_signal.connect( self.reactivate_parameters_signals) self.dlp_controller.motor_changed_signal.connect( self.update_motor_parameters) self.closing_window_event.connect(self.dlp_controller.close_projector) self.parent = parent self.main_layout = QHBoxLayout() self.__init_widget__() self.setLayout(self.main_layout) def __init_widget__(self): self.__left_widget = QWidget() self.__left_widget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.MinimumExpanding) self.__right_widget = QWidget() self.__right_widget.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding) self.__init_printer_options_widget__(self.__left_widget) self.__init_projector_widget__(self.__left_widget) self.__init_support_widget__(self.__left_widget) self.__init_features_widget__(self.__left_widget) self.__init_advanced_features_widget__(self.__left_widget) # self.__init_expected_time_widget__(self.__left_widget) self.__left_layout = QGridLayout() self.__left_layout.addWidget(self.__printer_options_widget, 0, 0, 1, 2) self.__left_layout.addWidget(self.__projector_widget, 1, 0, 1, 2) self.__left_layout.addWidget(self.__support_widget, 2, 0, 1, 1) self.__left_layout.addWidget(self.__features_widget, 2, 1, 1, 1) self.__left_layout.addWidget(self.__advanced_widget, 3, 0, 1, 2) # self.__left_layout.addWidget(self.__expected_time_widget, 4,0) self.__left_widget.setLayout(self.__left_layout) self.__left_widget.show() self.__init_start_stop_widget__(self.__right_widget) self.__init_preview_widget__(self.__right_widget) self.__init_console_widget__(self.__right_widget) self.__init_username_jobname_widget__() self.__right_layout = QVBoxLayout() self.__right_layout.addWidget(self.__start_stop_widget) self.__right_layout.addWidget(self.__username_jobname_widget) self.__right_layout.addWidget(self.__preview_widget) self.__right_layout.addWidget(self.__console_widget) self.__right_widget.setLayout(self.__right_layout) # print(self.__left_layout.sizeHint(), self.__right_layout.sizeHint()) self.main_layout.addWidget(self.__left_widget) self.main_layout.addWidget(self.__right_widget) def __init_printer_options_widget__(self, parent=None): self.__printer_options_widget = QGroupBox("Printer Options", parent) # self.__printer_options_widget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) port_label = QLabel("Port:", self.__printer_options_widget) self.port_list = MyQComboBox(self.__printer_options_widget) self.port_list.addItems(self.dlp_controller.available_ports()) self.port_list.currentIndexChanged.connect( self.dlp_controller.select_port) self.port_list.combo_box_clicked.connect(self.update_port_list) connect_button = QPushButton("Connect", self.__printer_options_widget) connect_button.clicked.connect(self.dlp_controller.connect_printer) disconnect_button = QPushButton("Disconnect", self.__printer_options_widget) disconnect_button.clicked.connect( self.dlp_controller.disconnect_printer) reset_button = QPushButton("Reset", self.__printer_options_widget) reset_button.clicked.connect(self.dlp_controller.reset_printer) move_button = QPushButton("Move Building Plate", self.__printer_options_widget) self.move_edit = MyDiscreteStepsSpinBox( self.dlp_controller.get_step_length_microns() / 1000.0, self.__printer_options_widget) self.move_edit.setSuffix("mm") self.move_edit.setMaximum(1000) self.move_edit.setMinimum(-1000) self.move_edit.setDecimals(6) self.move_edit.my_value_changed_signal.connect( self.dlp_controller.update_building_plate_distance) move_button.clicked.connect(self.dlp_controller.move_building_plate) set_origin_button = QPushButton("Set Building Plate Origin", self.__printer_options_widget) set_origin_button.clicked.connect( self.dlp_controller.set_building_plate_origin) home_button = QPushButton("Home Building Plate", self.__printer_options_widget) home_button.clicked.connect(self.dlp_controller.home_building_plate) origin_button = QPushButton("Send Building Plate to Origin", self.__printer_options_widget) origin_button.clicked.connect( self.dlp_controller.move_building_plate_to_origin) options_layout = QGridLayout(self.__printer_options_widget) # options_layout.addWidget(options_label, 0, 0, 1, 5) options_layout.addWidget(port_label, 0, 0) options_layout.addWidget(self.port_list, 0, 1) options_layout.addWidget(connect_button, 0, 2) options_layout.addWidget(disconnect_button, 0, 3) options_layout.addWidget(reset_button, 0, 4) options_layout.addWidget(move_button, 1, 0, 1, 2) options_layout.addWidget(self.move_edit, 1, 2) options_layout.addWidget(set_origin_button, 1, 3, 1, 2) options_layout.addWidget(home_button, 2, 0, 1, 2) options_layout.addWidget(origin_button, 2, 2, 1, 2) self.__printer_options_widget.setLayout(options_layout) def __init_projector_widget__(self, parent=None): self.__projector_widget = QGroupBox("Projector Options", parent) # self.__projector_widget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) mirror_x = QCheckBox("Mirror X") mirror_x.setChecked(self.dlp_controller.is_horizontal_mirrored()) mirror_x.toggled.connect(self.dlp_controller.set_horizontal_mirroring) mirror_y = QCheckBox("Mirror Y") mirror_y.setChecked(self.dlp_controller.is_vertical_mirrored()) mirror_y.toggled.connect(self.dlp_controller.set_vertical_mirroring) start_projector_button = QPushButton("Start Projector", self.__projector_widget) start_projector_button.clicked.connect( self.dlp_controller.start_projector) project_pattern_button = QPushButton("Project Pattern", self.__projector_widget) project_pattern_button.clicked.connect( self.dlp_controller.project_calibration_pattern) print_position_button = QPushButton("Print Position", self.__projector_widget) print_position_button.clicked.connect( self.dlp_controller.print_motor_position) home_projector_button = QPushButton("Home Projector", self.__projector_widget) home_projector_button.clicked.connect( self.dlp_controller.home_projector) move_projector_button = QPushButton("Move Projector", self.__projector_widget) move_projector_button.clicked.connect( self.dlp_controller.move_projector) move_projector_edit = QDoubleSpinBox(self.__projector_widget) move_projector_edit.setSuffix("mm") move_projector_edit.setMaximum(10000) move_projector_edit.setMinimum(-10000) move_projector_edit.setDecimals(3) move_projector_edit.setSingleStep(0.001) move_projector_edit.valueChanged.connect( self.dlp_controller.update_projector_distance) set_amplitude_button = QPushButton("Set Projector Amplitude", self.__projector_widget) set_amplitude_button.clicked.connect( self.dlp_controller.set_projector_amplitude) set_amplitude_edit = QSpinBox(self.__projector_widget) set_amplitude_edit.setMaximum(1000) set_amplitude_edit.setMinimum(0) set_amplitude_edit.setValue(self.dlp_controller.projector_amplitude) set_amplitude_edit.valueChanged.connect( self.dlp_controller.update_projector_amplitude) lock_unlock_projector_button = QPushButton("Lock/Unlock Projector", self.__projector_widget) lock_unlock_projector_button.clicked.connect( self.dlp_controller.lock_unlock_projector) projector_layout = QGridLayout(self.__projector_widget) # projector_layout.addWidget(projector_label, 0, 0) projector_layout.addWidget(mirror_x, 0, 1) projector_layout.addWidget(mirror_y, 0, 2) projector_layout.addWidget(start_projector_button, 1, 0, 1, 1) projector_layout.addWidget(project_pattern_button, 1, 1, 1, 1) projector_layout.addWidget(print_position_button, 1, 2, 1, 1) projector_layout.addWidget(home_projector_button, 2, 0, 1, 1) projector_layout.addWidget(move_projector_button, 2, 1, 1, 1) projector_layout.addWidget(move_projector_edit, 2, 2) projector_layout.addWidget(set_amplitude_button, 3, 0, 1, 1) projector_layout.addWidget(set_amplitude_edit, 3, 1) projector_layout.addWidget(lock_unlock_projector_button, 3, 2, 1, 1) self.__projector_widget.setLayout(projector_layout) def __init_support_widget__(self, parent=None): self.__support_widget = QGroupBox("Support Layers Parameters", parent) # self.__support_widget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) thickness_label = QLabel("Layer Thickness", self.__support_widget) self.support_thickness_edit = MyDiscreteStepsSpinBox( self.dlp_controller.get_step_length_microns(), self.__support_widget) self.support_thickness_edit.setSuffix(str('\u03BCm')) self.support_thickness_edit.setMaximum(1000000) self.support_thickness_edit.setMinimum(0) self.support_thickness_edit.setDecimals(3) self.support_thickness_edit.my_value_changed_signal.connect( self.dlp_controller.set_support_thickness) self.support_thickness_edit.setValue( self.dlp_controller.support_thickness * 1000) exposure_label = QLabel("Exposure Time", self.__support_widget) exposure_edit = QDoubleSpinBox(self.__support_widget) exposure_edit.setSuffix(str('ms')) exposure_edit.setMaximum(10000000) exposure_edit.setMinimum(0) exposure_edit.setDecimals(1) exposure_edit.setSingleStep(0.1) exposure_edit.setValue(self.dlp_controller.support_exposure) exposure_edit.valueChanged.connect( self.dlp_controller.set_support_exposure_time) amplitude_label = QLabel("Light Amplitude", self.__support_widget) amplitude_edit = QSpinBox(self.__support_widget) amplitude_edit.setMaximum(1600) amplitude_edit.setMinimum(0) amplitude_edit.setSingleStep(1) amplitude_edit.setValue(self.dlp_controller.support_amplitude) amplitude_edit.valueChanged.connect( self.dlp_controller.set_support_amplitude) burn_layers_label = QLabel("Burn Layers", self.__support_widget) burn_layers_edit = QSpinBox(self.__support_widget) burn_layers_edit.setMaximum(1000) burn_layers_edit.setMinimum(0) burn_layers_edit.setSingleStep(1) burn_layers_edit.setValue(self.dlp_controller.support_burn_layers) burn_layers_edit.valueChanged.connect( self.dlp_controller.set_support_burning_layers) burn_exposure_label = QLabel("Burn Exposure", self.__support_widget) burn_exposure_edit = QDoubleSpinBox(self.__support_widget) burn_exposure_edit.setSuffix(str('ms')) burn_exposure_edit.setMaximum(100000) burn_exposure_edit.setMinimum(0) burn_exposure_edit.setDecimals(1) burn_exposure_edit.setSingleStep(0.1) burn_exposure_edit.setValue(self.dlp_controller.support_burn_exposure) burn_exposure_edit.valueChanged.connect( self.dlp_controller.set_support_burning_exposure_time) burn_amplitude_label = QLabel("Burn Amplitude", self.__support_widget) burn_amplitude_edit = QSpinBox(self.__support_widget) burn_amplitude_edit.setMaximum(1600) burn_amplitude_edit.setMinimum(0) burn_amplitude_edit.setSingleStep(1) burn_amplitude_edit.setValue( self.dlp_controller.support_burn_amplitude) burn_amplitude_edit.valueChanged.connect( self.dlp_controller.set_support_burning_amplitude) select_layers_button = QPushButton("Select Support Images") select_layers_button.clicked.connect(self.load_support_images) support_layout = QGridLayout(self.__support_widget) support_layout.addWidget(thickness_label, 1, 0) support_layout.addWidget(self.support_thickness_edit, 1, 1) support_layout.addWidget(exposure_label, 2, 0) support_layout.addWidget(exposure_edit, 2, 1) support_layout.addWidget(amplitude_label, 3, 0) support_layout.addWidget(amplitude_edit, 3, 1) support_layout.addWidget(burn_layers_label, 4, 0) support_layout.addWidget(burn_layers_edit, 4, 1) support_layout.addWidget(burn_exposure_label, 5, 0) support_layout.addWidget(burn_exposure_edit, 5, 1) support_layout.addWidget(burn_amplitude_label, 6, 0) support_layout.addWidget(burn_amplitude_edit, 6, 1) support_layout.addWidget(select_layers_button, 7, 0, 1, 2) self.__support_widget.setLayout(support_layout) def __init_features_widget__(self, parent=None): self.__features_widget = QGroupBox("Features Layers Parameters", parent) # self.__features_widget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) thickness_label = QLabel("Layer Thickness", self.__features_widget) self.features_thickness_edit = MyDiscreteStepsSpinBox( self.dlp_controller.get_step_length_microns(), self.__features_widget) self.features_thickness_edit.setSuffix(str('\u03BCm')) self.features_thickness_edit.setMaximum(1000000) self.features_thickness_edit.setMinimum(0) self.features_thickness_edit.setDecimals(3) self.features_thickness_edit.my_value_changed_signal.connect( self.dlp_controller.set_features_thickness) self.features_thickness_edit.setValue( self.dlp_controller.features_thickness * 1000) exposure_label = QLabel("Exposure Time", self.__features_widget) exposure_edit = QDoubleSpinBox(self.__features_widget) exposure_edit.setSuffix(str('ms')) exposure_edit.setMaximum(10000000) exposure_edit.setMinimum(0) exposure_edit.setDecimals(1) exposure_edit.setSingleStep(0.1) exposure_edit.setValue(self.dlp_controller.features_exposure) exposure_edit.valueChanged.connect( self.dlp_controller.set_features_exposure_time) amplitude_label = QLabel("Light Amplitude", self.__features_widget) amplitude_edit = QSpinBox(self.__features_widget) amplitude_edit.setMaximum(1600) amplitude_edit.setMinimum(0) amplitude_edit.setSingleStep(1) amplitude_edit.setValue(self.dlp_controller.features_amplitude) amplitude_edit.valueChanged.connect( self.dlp_controller.set_features_amplitude) burn_layers_label = QLabel("Burn Layers", self.__features_widget) burn_layers_edit = QSpinBox(self.__features_widget) burn_layers_edit.setMaximum(1000) burn_layers_edit.setMinimum(0) burn_layers_edit.setSingleStep(1) burn_layers_edit.setValue(self.dlp_controller.features_burn_layers) burn_layers_edit.valueChanged.connect( self.dlp_controller.set_features_burning_layers) burn_exposure_label = QLabel("Burn Exposure", self.__features_widget) burn_exposure_edit = QDoubleSpinBox(self.__features_widget) burn_exposure_edit.setSuffix(str('ms')) burn_exposure_edit.setMaximum(100000) burn_exposure_edit.setMinimum(0) burn_exposure_edit.setDecimals(1) burn_exposure_edit.setSingleStep(0.1) burn_exposure_edit.setValue(self.dlp_controller.features_burn_exposure) burn_exposure_edit.valueChanged.connect( self.dlp_controller.set_features_burning_exposure_time) burn_amplitude_label = QLabel("Burn Amplitude", self.__features_widget) burn_amplitude_edit = QSpinBox(self.__features_widget) burn_amplitude_edit.setMaximum(1600) burn_amplitude_edit.setMinimum(0) burn_amplitude_edit.setSingleStep(1) burn_amplitude_edit.setValue( self.dlp_controller.features_burn_amplitude) burn_amplitude_edit.valueChanged.connect( self.dlp_controller.set_features_burning_amplitude) select_layers_button = QPushButton("Select Features Images") select_layers_button.clicked.connect(self.load_features_images) features_layout = QGridLayout(self.__features_widget) features_layout.addWidget(thickness_label, 1, 0) features_layout.addWidget(self.features_thickness_edit, 1, 1) features_layout.addWidget(exposure_label, 2, 0) features_layout.addWidget(exposure_edit, 2, 1) features_layout.addWidget(amplitude_label, 3, 0) features_layout.addWidget(amplitude_edit, 3, 1) features_layout.addWidget(burn_layers_label, 4, 0) features_layout.addWidget(burn_layers_edit, 4, 1) features_layout.addWidget(burn_exposure_label, 5, 0) features_layout.addWidget(burn_exposure_edit, 5, 1) features_layout.addWidget(burn_amplitude_label, 6, 0) features_layout.addWidget(burn_amplitude_edit, 6, 1) features_layout.addWidget(select_layers_button, 7, 0, 1, 2) self.__features_widget.setLayout(features_layout) def __init_advanced_features_widget__(self, parent=None): self.__advanced_widget = QGroupBox("Advanced Features Options", parent) fixed_layer_check = QCheckBox("Fixed Layer", self.__advanced_widget) fixed_layer_check.setChecked(self.dlp_controller.fixed_layer) fixed_layer_check.toggled.connect(self.dlp_controller.set_fixed_layer) incremental_amplitude_check = QCheckBox("Incremental Amplitude", self.__advanced_widget) incremental_amplitude_check.setChecked( self.dlp_controller.incremental_amplitude) incremental_amplitude_check.toggled.connect( self.dlp_controller.set_incremental_amplitude) starting_amplitude_label = QLabel("Starting Amplitude", self.__advanced_widget) starting_amplitude_edit = QSpinBox(self.__advanced_widget) starting_amplitude_edit.setMaximum(1000) starting_amplitude_edit.setMinimum(0) starting_amplitude_edit.setSingleStep(1) starting_amplitude_edit.setValue( self.dlp_controller.starting_incremental_amplitude) starting_amplitude_edit.valueChanged.connect( self.dlp_controller.set_starting_incremental_amplitude) amplitude_step_label = QLabel("Step Size", self.__advanced_widget) amplitude_step_edit = QSpinBox(self.__advanced_widget) amplitude_step_edit.setMaximum(1000) amplitude_step_edit.setMinimum(0) amplitude_step_edit.setSingleStep(1) amplitude_step_edit.setValue( self.dlp_controller.incremental_step_amplitude) amplitude_step_edit.valueChanged.connect( self.dlp_controller.set_incremental_step_amplitude) incremental_exposure_check = QCheckBox("Incremental Exposure", self.__advanced_widget) incremental_exposure_check.setChecked( self.dlp_controller.incremental_exposure) incremental_exposure_check.toggled.connect( self.dlp_controller.set_incremental_exposure) starting_exposure_label = QLabel("Starting Exposure", self.__advanced_widget) starting_exposure_edit = QDoubleSpinBox(self.__advanced_widget) starting_exposure_edit.setSuffix(str('ms')) starting_exposure_edit.setMaximum(100000) starting_exposure_edit.setMinimum(0) starting_exposure_edit.setDecimals(1) starting_exposure_edit.setSingleStep(0.1) starting_exposure_edit.valueChanged.connect( self.dlp_controller.set_starting_incremental_exposure) starting_exposure_edit.setValue( self.dlp_controller.starting_incremental_exposure) exposure_step_label = QLabel("Step Size", self.__advanced_widget) exposure_step_edit = QDoubleSpinBox(self.__advanced_widget) exposure_step_edit.setSuffix(str('ms')) exposure_step_edit.setMaximum(100000) exposure_step_edit.setMinimum(0) exposure_step_edit.setDecimals(1) exposure_step_edit.setSingleStep(0.1) exposure_step_edit.valueChanged.connect( self.dlp_controller.set_incremental_step_exposure) exposure_step_edit.setValue( self.dlp_controller.incremental_step_exposure) incremental_thickness_check = QCheckBox("Incremental Thickness", self.__advanced_widget) incremental_thickness_check.setChecked( self.dlp_controller.incremental_thickness) incremental_thickness_check.toggled.connect( self.dlp_controller.set_incremental_thickness) thickness_label = QLabel("Starting Thickness", self.__features_widget) self.starting_thickness_edit = MyDiscreteStepsSpinBox( self.dlp_controller.get_step_length_microns(), self.__features_widget) self.starting_thickness_edit.setSuffix(str('\u03BCm')) self.starting_thickness_edit.setMaximum(1000000) self.starting_thickness_edit.setMinimum(0) self.starting_thickness_edit.setDecimals(3) self.starting_thickness_edit.my_value_changed_signal.connect( self.dlp_controller.set_starting_incremental_thickness) self.starting_thickness_edit.setValue( self.dlp_controller.starting_incremental_thickness * 1000) thickness_step_label = QLabel("Step Size", self.__features_widget) self.thickness_step_edit = MyDiscreteStepsSpinBox( self.dlp_controller.get_step_length_microns(), self.__features_widget) self.thickness_step_edit.setSuffix(str('\u03BCm')) self.thickness_step_edit.setMaximum(1000000) self.thickness_step_edit.setMinimum(0) self.thickness_step_edit.setDecimals(3) self.thickness_step_edit.my_value_changed_signal.connect( self.dlp_controller.set_incremental_step_thickness) self.thickness_step_edit.setValue( self.dlp_controller.incremental_step_thickness * 1000) apply_grayscale_correction_check = QCheckBox("Grayscale Correction", self.__advanced_widget) apply_grayscale_correction_check.setChecked( self.dlp_controller.grayscale_correction) apply_grayscale_correction_check.toggled.connect( self.dlp_controller.set_grayscale_correction) grayscale_parameters_widget = QWidget(self.__features_widget) a_parameter_label = QLabel("\u03B1", grayscale_parameters_widget) alpha_parameter_edit = QDoubleSpinBox(grayscale_parameters_widget) alpha_parameter_edit.setMaximum(1000) alpha_parameter_edit.setMinimum(0) alpha_parameter_edit.setDecimals(3) alpha_parameter_edit.setSingleStep(0.001) alpha_parameter_edit.valueChanged.connect( self.dlp_controller.set_grayscale_alpha) alpha_parameter_edit.setValue(self.dlp_controller.grayscale_alpha) beta_parameter_label = QLabel("\u03B2", grayscale_parameters_widget) beta_parameter_edit = QDoubleSpinBox(grayscale_parameters_widget) beta_parameter_edit.setMaximum(1000) beta_parameter_edit.setMinimum(0) beta_parameter_edit.setDecimals(3) beta_parameter_edit.setSingleStep(0.001) beta_parameter_edit.valueChanged.connect( self.dlp_controller.set_grayscale_beta) beta_parameter_edit.setValue(self.dlp_controller.grayscale_beta) gamma_parameter_label = QLabel("\u03B3", grayscale_parameters_widget) gamma_parameter_edit = QDoubleSpinBox(grayscale_parameters_widget) gamma_parameter_edit.setMaximum(1000) gamma_parameter_edit.setMinimum(0) gamma_parameter_edit.setDecimals(3) gamma_parameter_edit.setSingleStep(0.001) gamma_parameter_edit.valueChanged.connect( self.dlp_controller.set_grayscale_gamma) gamma_parameter_edit.setValue(self.dlp_controller.grayscale_gamma) grayscale_parameters_layout = QHBoxLayout(grayscale_parameters_widget) grayscale_parameters_layout.addWidget(a_parameter_label) grayscale_parameters_layout.addWidget(alpha_parameter_edit) grayscale_parameters_layout.addWidget(beta_parameter_label) grayscale_parameters_layout.addWidget(beta_parameter_edit) grayscale_parameters_layout.addWidget(gamma_parameter_label) grayscale_parameters_layout.addWidget(gamma_parameter_edit) grayscale_parameters_widget.setLayout(grayscale_parameters_layout) advanced_features_layout = QGridLayout(self.__advanced_widget) advanced_features_layout.addWidget(incremental_amplitude_check, 1, 0, 1, 2) advanced_features_layout.addWidget(fixed_layer_check, 1, 3) advanced_features_layout.addWidget(starting_amplitude_label, 2, 0) advanced_features_layout.addWidget(starting_amplitude_edit, 2, 1) advanced_features_layout.addWidget(amplitude_step_label, 2, 2) advanced_features_layout.addWidget(amplitude_step_edit, 2, 3) advanced_features_layout.addWidget(incremental_exposure_check, 3, 0, 1, 2) advanced_features_layout.addWidget(starting_exposure_label, 4, 0) advanced_features_layout.addWidget(starting_exposure_edit, 4, 1) advanced_features_layout.addWidget(exposure_step_label, 4, 2) advanced_features_layout.addWidget(exposure_step_edit, 4, 3) advanced_features_layout.addWidget(incremental_thickness_check, 5, 0, 1, 2) advanced_features_layout.addWidget(thickness_label, 6, 0) advanced_features_layout.addWidget(self.starting_thickness_edit, 6, 1) advanced_features_layout.addWidget(thickness_step_label, 6, 2) advanced_features_layout.addWidget(self.thickness_step_edit, 6, 3) advanced_features_layout.addWidget(apply_grayscale_correction_check, 7, 0, 1, 2) advanced_features_layout.addWidget(grayscale_parameters_widget, 8, 0, 1, 4) self.__advanced_widget.setLayout(advanced_features_layout) def __init_start_stop_widget__(self, parent=None): self.__start_stop_widget = QFrame(parent) size = self.__left_layout.sizeHint() start_button = QPushButton("START", self.__start_stop_widget) start_button.setFixedSize(size.width() / 2, size.height() / 7) start_button.clicked.connect( self.dlp_controller.starting_printing_process) stop_button = QPushButton("STOP", self.__start_stop_widget) stop_button.setFixedSize(size.width() / 3, size.height() / 8) stop_button.setStyleSheet( "QPushButton {background-color: red; border-style: outset; border-width: 2px; " "border-radius: 10px; border-color: beige; font: bold 20px; padding: 10px;}" ) stop_button.clicked.connect(self.dlp_controller.stop_printing_process) self.__start_stop_widget.setMinimumSize(size.width(), size.height() / 6) start_stop_layout = QGridLayout(self.__start_stop_widget) start_stop_layout.addWidget(start_button, 0, 0) start_stop_layout.addWidget(stop_button, 0, 1) self.__start_stop_widget.setLayout(start_stop_layout) def __init_preview_widget__(self, parent=None): self.__preview_widget = QLabel(parent) size = self.__left_layout.sizeHint() self.dlp_controller.display_image_signal.connect(self.preview_image) self.__preview_widget.setMinimumSize(size.width(), size.height() / 2.3) # self.__preview_widget.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.__preview_widget.setScaledContents(True) self.__preview_widget.setStyleSheet( "QLabel { background-color : black}") def __init_console_widget__(self, parent=None): self.__console_widget = QPlainTextEdit(parent) self.__console_widget.setReadOnly(True) size = self.__left_layout.sizeHint() # self.__console_widget.setFixedSize(size.width(), size.height()/3) self.__console_widget.setStyleSheet( "QPlainTextEdit { background-color : gray}") palette = self.__console_widget.palette() palette.setColor(QPalette.Text, QColor(255, 255, 255)) self.__console_widget.setPalette(palette) self.dlp_controller.print_text_signal.connect(self.print_to_console) def __init_username_jobname_widget__(self, parent=None): self.__username_jobname_widget = QFrame(parent) self.__username_jobname_widget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) username_label = QLabel("Username", parent=self.__username_jobname_widget) username_edit = QLineEdit(parent=self.__username_jobname_widget) username_edit.setText(self.dlp_controller.username) username_edit.textChanged.connect(self.dlp_controller.set_username) jobname_label = QLabel("Print Job Name", parent=self.__username_jobname_widget) jobname_edit = QLineEdit(parent=self.__username_jobname_widget) jobname_edit.setText(self.dlp_controller.print_job_name) jobname_edit.textChanged.connect(self.dlp_controller.set_printjob_name) etc = self.dlp_controller.evaluate_time_estimate() self.etc_label = QLabel( "ETC: " + QDateTime.fromTime_t(etc / 1000.0).toUTC().toString('hh:mm:ss'), self.__username_jobname_widget) self.dlp_controller.etc_updated_signal.connect( self.update_time_estimate) username_jobname_layout = QHBoxLayout(self.__username_jobname_widget) username_jobname_layout.addWidget(self.etc_label) username_jobname_layout.addWidget(username_label) username_jobname_layout.addWidget(username_edit) username_jobname_layout.addWidget(jobname_label) username_jobname_layout.addWidget(jobname_edit) self.__username_jobname_widget.setLayout(username_jobname_layout) @Slot(QPixmap) def preview_image(self, image): image = image.scaled(self.__preview_widget.width(), self.__preview_widget.height(), Qt.IgnoreAspectRatio) self.__preview_widget.setPixmap(image) @Slot(str) def print_to_console(self, txt): self.__console_widget.appendPlainText(txt) @Slot() def closeEvent(self, event: QCloseEvent): self.closing_window_event.emit() event.accept() @Slot() def load_support_images(self): file_names = QFileDialog.getOpenFileNames( caption='Select images', dir='../', filter="Image Files (*.png *.jpg *.bmp)") self.dlp_controller.set_support_images(file_names[0]) @Slot() def load_features_images(self): file_names = QFileDialog.getOpenFileNames( caption='Select images', dir='../', filter="Image Files (*.png *.jpg *.bmp)") self.dlp_controller.set_features_images(file_names[0]) @Slot() def block_parameters_signals(self): for widget in self.__left_widget.findChildren(QWidget): widget.blockSignals(True) @Slot() def reactivate_parameters_signals(self): for widget in self.__left_widget.findChildren(QWidget): widget.blockSignals(False) @Slot() def update_time_estimate(self, etc_ms): self.etc_label.setText( "ETC: " + QDateTime.fromTime_t(etc_ms / 1000.0).toUTC().toString('hh:mm:ss')) @Slot() def update_port_list(self): self.dlp_controller.update_port_list() self.port_list.clear() self.port_list.addItems(self.dlp_controller.available_ports()) @Slot(bool) def update_motor_parameters(self, is_changed): self.move_edit.set_step_size( self.dlp_controller.get_step_length_microns() / 1000.0) self.support_thickness_edit.set_step_size( self.dlp_controller.get_step_length_microns()) self.support_thickness_edit.spinbox_is_value_valid( self.dlp_controller.support_thickness * 1000) self.features_thickness_edit.set_step_size( self.dlp_controller.get_step_length_microns()) self.features_thickness_edit.spinbox_is_value_valid( self.dlp_controller.features_thickness * 1000) self.starting_thickness_edit.set_step_size( self.dlp_controller.get_step_length_microns()) self.starting_thickness_edit.spinbox_is_value_valid( self.dlp_controller.starting_incremental_thickness * 1000) self.thickness_step_edit.set_step_size( self.dlp_controller.get_step_length_microns()) self.thickness_step_edit.spinbox_is_value_valid( self.dlp_controller.incremental_step_thickness * 1000)