Exemple #1
0
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
Exemple #2
0
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)