diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 90b39e03..7fc15f8d 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -452,6 +452,8 @@ class App(QtCore.QObject): self.current_units = self.defaults['units'] + + # ########################################################################################################### # #################################### SETUP OBJECT CLASSES ################################################# # ########################################################################################################### @@ -1590,11 +1592,7 @@ class App(QtCore.QObject): self.set_ui_title(name=_("New Project - Not saved")) - # disable the Excellon path optimizations made with Google OR-Tools if the app is run on a 32bit platform - current_platform = platform.architecture()[0] - if current_platform != '64bit': - self.ui.excellon_defaults_form.excellon_gen_group.excellon_optimization_radio.set_value('T') - self.ui.excellon_defaults_form.excellon_gen_group.excellon_optimization_radio.setDisabled(True) + # ########################################################################################################### # ########################################### EXCLUSION AREAS ############################################### @@ -10340,8 +10338,7 @@ class App(QtCore.QObject): alpha_level = 'BF' for sel_obj in sel_obj_list: if sel_obj.kind == 'excellon': - alpha_level = str(hex( - self.ui.excellon_defaults_form.excellon_gen_group.color_alpha_slider.value())[2:]) + alpha_level = self.defaults["excellon_plot_fill"][7:] elif sel_obj.kind == 'gerber': alpha_level = self.defaults["gerber_plot_fill"][7:] elif sel_obj.kind == 'geometry': diff --git a/flatcamGUI/preferences/OptionUI.py b/flatcamGUI/preferences/OptionUI.py index ce851d4f..824c417a 100644 --- a/flatcamGUI/preferences/OptionUI.py +++ b/flatcamGUI/preferences/OptionUI.py @@ -302,7 +302,7 @@ class SeparatorOptionUI(OptionUI): class FullWidthButtonOptionUI(OptionUI): - def __init__(self, option: str, label_text: str, label_tooltip: str): + def __init__(self, option: str, label_text: str, label_tooltip: Union[str, None]): super().__init__(option=option) self.label_text = label_text self.label_tooltip = label_tooltip @@ -310,7 +310,8 @@ class FullWidthButtonOptionUI(OptionUI): def build_button_widget(self): button = FCButton(_(self.label_text)) - button.setToolTip(_(self.label_tooltip)) + if self.label_tooltip is not None: + button.setToolTip(_(self.label_tooltip)) return button def add_to_grid(self, grid: QtWidgets.QGridLayout, row: int) -> int: diff --git a/flatcamGUI/preferences/PreferencesUIManager.py b/flatcamGUI/preferences/PreferencesUIManager.py index de0a23fd..71d8d642 100644 --- a/flatcamGUI/preferences/PreferencesUIManager.py +++ b/flatcamGUI/preferences/PreferencesUIManager.py @@ -49,26 +49,6 @@ class PreferencesUIManager: # def new_object(self, kind, name, initialize, active=True, fit=True, plot=True) self.defaults_form_fields = { - # Excellon General - "excellon_plot": self.ui.excellon_defaults_form.excellon_gen_group.plot_cb, - "excellon_solid": self.ui.excellon_defaults_form.excellon_gen_group.solid_cb, - "excellon_format_upper_in": - self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_in_entry, - "excellon_format_lower_in": - self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_in_entry, - "excellon_format_upper_mm": - self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_mm_entry, - "excellon_format_lower_mm": - self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_mm_entry, - "excellon_zeros": self.ui.excellon_defaults_form.excellon_gen_group.excellon_zeros_radio, - "excellon_units": self.ui.excellon_defaults_form.excellon_gen_group.excellon_units_radio, - "excellon_update": self.ui.excellon_defaults_form.excellon_gen_group.update_excellon_cb, - "excellon_optimization_type": self.ui.excellon_defaults_form.excellon_gen_group.excellon_optimization_radio, - "excellon_search_time": self.ui.excellon_defaults_form.excellon_gen_group.optimization_time_entry, - "excellon_plot_fill": self.ui.excellon_defaults_form.excellon_gen_group.fill_color_entry, - "excellon_plot_line": self.ui.excellon_defaults_form.excellon_gen_group.line_color_entry, - - # Excellon Advanced Options "excellon_offset": self.ui.excellon_defaults_form.excellon_adv_opt_group.offset_entry, "excellon_toolchangexy": self.ui.excellon_defaults_form.excellon_adv_opt_group.toolchangexy_entry, @@ -485,23 +465,6 @@ class PreferencesUIManager: log.debug("Finished Preferences GUI form initialization.") def __init_color_pickers(self): - # Init Excellon Plot Colors - self.ui.excellon_defaults_form.excellon_gen_group.fill_color_entry.set_value( - self.defaults['excellon_plot_fill']) - self.ui.excellon_defaults_form.excellon_gen_group.fill_color_button.setStyleSheet( - "background-color:%s;" - "border-color: dimgray" % str(self.defaults['excellon_plot_fill'])[:7]) - self.ui.excellon_defaults_form.excellon_gen_group.color_alpha_spinner.set_value( - int(self.defaults['excellon_plot_fill'][7:9], 16)) - self.ui.excellon_defaults_form.excellon_gen_group.color_alpha_slider.setValue( - int(self.defaults['excellon_plot_fill'][7:9], 16)) - - self.ui.excellon_defaults_form.excellon_gen_group.line_color_entry.set_value( - self.defaults['excellon_plot_line']) - self.ui.excellon_defaults_form.excellon_gen_group.line_color_button.setStyleSheet( - "background-color:%s;" - "border-color: dimgray" % str(self.defaults['excellon_plot_line'])[:7]) - # Init the Tool Film color self.ui.tools_defaults_form.tools_film_group.film_color_entry.set_value( self.defaults['tools_film_color']) diff --git a/flatcamGUI/preferences/excellon/ExcellonGenPrefGroupUI.py b/flatcamGUI/preferences/excellon/ExcellonGenPrefGroupUI.py index 06d4dfc7..91b3dcde 100644 --- a/flatcamGUI/preferences/excellon/ExcellonGenPrefGroupUI.py +++ b/flatcamGUI/preferences/excellon/ExcellonGenPrefGroupUI.py @@ -1,415 +1,199 @@ import platform +from flatcamGUI.preferences.OptionUI import * +from flatcamGUI.preferences.OptionsGroupUI import OptionsGroupUI2 -from PyQt5 import QtWidgets, QtCore, QtGui -from PyQt5.QtCore import QSettings - -from flatcamGUI.GUIElements import FCCheckBox, FCSpinner, RadioSet, FCEntry -from flatcamGUI.preferences.OptionsGroupUI import OptionsGroupUI import gettext import FlatCAMTranslation as fcTranslate import builtins - fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext -settings = QSettings("Open Source", "FlatCAM") -if settings.contains("machinist"): - machinist_setting = settings.value('machinist', type=int) -else: - machinist_setting = 0 +class ExcellonGenPrefGroupUI(OptionsGroupUI2): -class ExcellonGenPrefGroupUI(OptionsGroupUI): - - def __init__(self, decimals=4, parent=None): - # OptionsGroupUI.__init__(self, "Excellon Options", parent=parent) - super(ExcellonGenPrefGroupUI, self).__init__(self, parent=parent) - - self.setTitle(str(_("Excellon General"))) + def __init__(self, decimals=4, **kwargs): self.decimals = decimals + super().__init__(**kwargs) + self.setTitle(str(_("Excellon General"))) - # Plot options - self.plot_options_label = QtWidgets.QLabel("%s:" % _("Plot Options")) - self.layout.addWidget(self.plot_options_label) + # disable the Excellon path optimizations made with Google OR-Tools if the app is run on a 32bit platform + if platform.architecture()[0] != '64bit': + self.option_dict()["excellon_optimization_type"].get_field().set_value('T') + self.option_dict()["excellon_optimization_type"].get_field().setDisabled(True) + self.option_dict()["excellon_optimization_type"].label_widget.setDisabled(True) - grid1 = QtWidgets.QGridLayout() - self.layout.addLayout(grid1) - - self.plot_cb = FCCheckBox(label=_('Plot')) - self.plot_cb.setToolTip( - "Plot (show) this object." - ) - grid1.addWidget(self.plot_cb, 0, 0) - - self.solid_cb = FCCheckBox(label=_('Solid')) - self.solid_cb.setToolTip( - "Plot as solid circles." - ) - grid1.addWidget(self.solid_cb, 0, 1) - - separator_line = QtWidgets.QFrame() - separator_line.setFrameShape(QtWidgets.QFrame.HLine) - separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) - grid1.addWidget(separator_line, 1, 0, 1, 2) - - grid2 = QtWidgets.QGridLayout() - self.layout.addLayout(grid2) - grid2.setColumnStretch(0, 0) - grid2.setColumnStretch(1, 1) - - # Excellon format - self.excellon_format_label = QtWidgets.QLabel("%s:" % _("Excellon Format")) - self.excellon_format_label.setToolTip( - _("The NC drill files, usually named Excellon files\n" - "are files that can be found in different formats.\n" - "Here we set the format used when the provided\n" - "coordinates are not using period.\n" - "\n" - "Possible presets:\n" - "\n" - "PROTEUS 3:3 MM LZ\n" - "DipTrace 5:2 MM TZ\n" - "DipTrace 4:3 MM LZ\n" - "\n" - "EAGLE 3:3 MM TZ\n" - "EAGLE 4:3 MM TZ\n" - "EAGLE 2:5 INCH TZ\n" - "EAGLE 3:5 INCH TZ\n" - "\n" - "ALTIUM 2:4 INCH LZ\n" - "Sprint Layout 2:4 INCH LZ" - "\n" - "KiCAD 3:5 INCH TZ") - ) - grid2.addWidget(self.excellon_format_label, 0, 0, 1, 2) - - self.excellon_format_in_label = QtWidgets.QLabel('%s:' % _("INCH")) - self.excellon_format_in_label.setToolTip(_("Default values for INCH are 2:4")) - - hlay1 = QtWidgets.QHBoxLayout() - self.excellon_format_upper_in_entry = FCSpinner() - self.excellon_format_upper_in_entry.set_range(0, 9) - self.excellon_format_upper_in_entry.setMinimumWidth(30) - self.excellon_format_upper_in_entry.setToolTip( - _("This numbers signify the number of digits in\n" - "the whole part of Excellon coordinates.") - ) - hlay1.addWidget(self.excellon_format_upper_in_entry) - - excellon_separator_in_label = QtWidgets.QLabel(':') - excellon_separator_in_label.setFixedWidth(5) - hlay1.addWidget(excellon_separator_in_label) - - self.excellon_format_lower_in_entry = FCSpinner() - self.excellon_format_lower_in_entry.set_range(0, 9) - self.excellon_format_lower_in_entry.setMinimumWidth(30) - self.excellon_format_lower_in_entry.setToolTip( - _("This numbers signify the number of digits in\n" - "the decimal part of Excellon coordinates.") - ) - hlay1.addWidget(self.excellon_format_lower_in_entry) - - grid2.addWidget(self.excellon_format_in_label, 1, 0) - grid2.addLayout(hlay1, 1, 1) - - self.excellon_format_mm_label = QtWidgets.QLabel('%s:' % _("METRIC")) - self.excellon_format_mm_label.setToolTip(_("Default values for METRIC are 3:3")) - - hlay2 = QtWidgets.QHBoxLayout() - self.excellon_format_upper_mm_entry = FCSpinner() - self.excellon_format_upper_mm_entry.set_range(0, 9) - self.excellon_format_upper_mm_entry.setMinimumWidth(30) - self.excellon_format_upper_mm_entry.setToolTip( - _("This numbers signify the number of digits in\n" - "the whole part of Excellon coordinates.") - ) - hlay2.addWidget(self.excellon_format_upper_mm_entry) - - excellon_separator_mm_label = QtWidgets.QLabel(':') - excellon_separator_mm_label.setFixedWidth(5) - hlay2.addWidget(excellon_separator_mm_label, QtCore.Qt.AlignLeft) - - self.excellon_format_lower_mm_entry = FCSpinner() - self.excellon_format_lower_mm_entry.set_range(0, 9) - self.excellon_format_lower_mm_entry.setMinimumWidth(30) - self.excellon_format_lower_mm_entry.setToolTip( - _("This numbers signify the number of digits in\n" - "the decimal part of Excellon coordinates.") - ) - hlay2.addWidget(self.excellon_format_lower_mm_entry) - - grid2.addWidget(self.excellon_format_mm_label, 2, 0) - grid2.addLayout(hlay2, 2, 1) - - self.excellon_zeros_label = QtWidgets.QLabel('%s:' % _('Zeros')) - self.excellon_zeros_label.setAlignment(QtCore.Qt.AlignLeft) - self.excellon_zeros_label.setToolTip( - _("This sets the type of Excellon zeros.\n" - "If LZ then Leading Zeros are kept and\n" - "Trailing Zeros are removed.\n" - "If TZ is checked then Trailing Zeros are kept\n" - "and Leading Zeros are removed.\n\n" - "This is used when there is no information\n" - "stored in the Excellon file.") - ) - grid2.addWidget(self.excellon_zeros_label, 3, 0) - - self.excellon_zeros_radio = RadioSet([{'label': _('LZ'), 'value': 'L'}, - {'label': _('TZ'), 'value': 'T'}]) - - grid2.addWidget(self.excellon_zeros_radio, 3, 1) - - self.excellon_units_label = QtWidgets.QLabel('%s:' % _('Units')) - self.excellon_units_label.setAlignment(QtCore.Qt.AlignLeft) - self.excellon_units_label.setToolTip( - _("This sets the default units of Excellon files.\n" - "If it is not detected in the parsed file the value here\n" - "will be used." - "Some Excellon files don't have an header\n" - "therefore this parameter will be used.") - ) - - self.excellon_units_radio = RadioSet([{'label': _('INCH'), 'value': 'INCH'}, - {'label': _('MM'), 'value': 'METRIC'}]) - self.excellon_units_radio.setToolTip( - _("This sets the units of Excellon files.\n" - "Some Excellon files don't have an header\n" - "therefore this parameter will be used.") - ) - - grid2.addWidget(self.excellon_units_label, 4, 0) - grid2.addWidget(self.excellon_units_radio, 4, 1) - - self.update_excellon_cb = FCCheckBox(label=_('Update Export settings')) - self.update_excellon_cb.setToolTip( - "If checked, the Excellon Export settings will be updated with the ones above." - ) - grid2.addWidget(self.update_excellon_cb, 5, 0, 1, 2) - - # Adding the Excellon Format Defaults Button - self.excellon_defaults_button = QtWidgets.QPushButton() - self.excellon_defaults_button.setText(str(_("Restore Defaults"))) - self.excellon_defaults_button.setMinimumWidth(80) - grid2.addWidget(self.excellon_defaults_button, 6, 0, 1, 2) - - separator_line = QtWidgets.QFrame() - separator_line.setFrameShape(QtWidgets.QFrame.HLine) - separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) - grid2.addWidget(separator_line, 7, 0, 1, 2) - - self.excellon_general_label = QtWidgets.QLabel("%s:" % _("Excellon Optimization")) - grid2.addWidget(self.excellon_general_label, 8, 0, 1, 2) - - self.excellon_optimization_label = QtWidgets.QLabel(_('Algorithm:')) - self.excellon_optimization_label.setToolTip( - _("This sets the optimization type for the Excellon drill path.\n" - "If <> is checked then Google OR-Tools algorithm with\n" - "MetaHeuristic Guided Local Path is used. Default search time is 3sec.\n" - "If <> is checked then Google OR-Tools Basic algorithm is used.\n" - "If <> is checked then Travelling Salesman algorithm is used for\n" - "drill path optimization.\n" - "\n" - "If this control is disabled, then FlatCAM works in 32bit mode and it uses\n" - "Travelling Salesman algorithm for path optimization.") - ) - - self.excellon_optimization_radio = RadioSet([{'label': _('MetaHeuristic'), 'value': 'M'}, - {'label': _('Basic'), 'value': 'B'}, - {'label': _('TSA'), 'value': 'T'}], - orientation='vertical', stretch=False) - self.excellon_optimization_radio.setToolTip( - _("This sets the optimization type for the Excellon drill path.\n" - "If <> is checked then Google OR-Tools algorithm with\n" - "MetaHeuristic Guided Local Path is used. Default search time is 3sec.\n" - "If <> is checked then Google OR-Tools Basic algorithm is used.\n" - "If <> is checked then Travelling Salesman algorithm is used for\n" - "drill path optimization.\n" - "\n" - "If this control is disabled, then FlatCAM works in 32bit mode and it uses\n" - "Travelling Salesman algorithm for path optimization.") - ) - - grid2.addWidget(self.excellon_optimization_label, 9, 0) - grid2.addWidget(self.excellon_optimization_radio, 9, 1) - - self.optimization_time_label = QtWidgets.QLabel('%s:' % _('Duration')) - self.optimization_time_label.setAlignment(QtCore.Qt.AlignLeft) - self.optimization_time_label.setToolTip( - _("When OR-Tools Metaheuristic (MH) is enabled there is a\n" - "maximum threshold for how much time is spent doing the\n" - "path optimization. This max duration is set here.\n" - "In seconds.") - - ) - - self.optimization_time_entry = FCSpinner() - self.optimization_time_entry.set_range(0, 999) - - grid2.addWidget(self.optimization_time_label, 10, 0) - grid2.addWidget(self.optimization_time_entry, 10, 1) - - separator_line = QtWidgets.QFrame() - separator_line.setFrameShape(QtWidgets.QFrame.HLine) - separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) - grid2.addWidget(separator_line, 11, 0, 1, 2) - - # Excellon Object Color - self.gerber_color_label = QtWidgets.QLabel('%s' % _('Excellon Object Color')) - grid2.addWidget(self.gerber_color_label, 12, 0, 1, 2) - - # Plot Line Color - self.line_color_label = QtWidgets.QLabel('%s:' % _('Outline')) - self.line_color_label.setToolTip( - _("Set the line color for plotted objects.") - ) - self.line_color_entry = FCEntry() - self.line_color_button = QtWidgets.QPushButton() - self.line_color_button.setFixedSize(15, 15) - - self.form_box_child_2 = QtWidgets.QHBoxLayout() - self.form_box_child_2.addWidget(self.line_color_entry) - self.form_box_child_2.addWidget(self.line_color_button) - self.form_box_child_2.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) - - grid2.addWidget(self.line_color_label, 13, 0) - grid2.addLayout(self.form_box_child_2, 13, 1) - - # Plot Fill Color - self.fill_color_label = QtWidgets.QLabel('%s:' % _('Fill')) - self.fill_color_label.setToolTip( - _("Set the fill color for plotted objects.\n" - "First 6 digits are the color and the last 2\n" - "digits are for alpha (transparency) level.") - ) - self.fill_color_entry = FCEntry() - self.fill_color_button = QtWidgets.QPushButton() - self.fill_color_button.setFixedSize(15, 15) - - self.form_box_child_1 = QtWidgets.QHBoxLayout() - self.form_box_child_1.addWidget(self.fill_color_entry) - self.form_box_child_1.addWidget(self.fill_color_button) - self.form_box_child_1.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) - - grid2.addWidget(self.fill_color_label, 14, 0) - grid2.addLayout(self.form_box_child_1, 14, 1) - - # Plot Fill Transparency Level - self.alpha_label = QtWidgets.QLabel('%s:' % _('Alpha')) - self.alpha_label.setToolTip( - _("Set the fill transparency for plotted objects.") - ) - self.color_alpha_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) - self.color_alpha_slider.setMinimum(0) - self.color_alpha_slider.setMaximum(255) - self.color_alpha_slider.setSingleStep(1) - - self.color_alpha_spinner = FCSpinner() - self.color_alpha_spinner.setMinimumWidth(70) - self.color_alpha_spinner.set_range(0, 255) - - self.form_box_child_3 = QtWidgets.QHBoxLayout() - self.form_box_child_3.addWidget(self.color_alpha_slider) - self.form_box_child_3.addWidget(self.color_alpha_spinner) - - grid2.addWidget(self.alpha_label, 15, 0) - grid2.addLayout(self.form_box_child_3, 15, 1) - - self.layout.addStretch() - - current_platform = platform.architecture()[0] - if current_platform == '64bit': - self.excellon_optimization_label.setDisabled(False) - self.excellon_optimization_radio.setDisabled(False) - self.optimization_time_label.setDisabled(False) - self.optimization_time_entry.setDisabled(False) - self.excellon_optimization_radio.activated_custom.connect(self.optimization_selection) - - else: - self.excellon_optimization_label.setDisabled(True) - self.excellon_optimization_radio.setDisabled(True) - self.optimization_time_label.setDisabled(True) - self.optimization_time_entry.setDisabled(True) - - # Setting plot colors signals - self.line_color_entry.editingFinished.connect(self.on_line_color_entry) - self.line_color_button.clicked.connect(self.on_line_color_button) - self.fill_color_entry.editingFinished.connect(self.on_fill_color_entry) - self.fill_color_button.clicked.connect(self.on_fill_color_button) - self.color_alpha_spinner.valueChanged.connect(self.on_color_spinner) - self.color_alpha_slider.valueChanged.connect(self.on_color_slider) + # Enable/disable the duration box according to type selected + self.option_dict()["excellon_optimization_type"].get_field().activated_custom.connect(self.optimization_selection) + self.optimization_selection() # Load the defaults values into the Excellon Format and Excellon Zeros fields - self.excellon_defaults_button.clicked.connect(self.on_excellon_defaults_button) + self.option_dict()["__excellon_restore_defaults"].get_field().clicked.connect(self.on_defaults_button) + + + def build_options(self) -> [OptionUI]: + return [ + HeadingOptionUI(label_text="Plot Options"), + CheckboxOptionUI( + option="excellon_plot", + label_text="Plot", + label_tooltip="Plot (show) this object." + ), + CheckboxOptionUI( + option="excellon_solid", + label_text="Solid", + label_tooltip="Plot as solid circles." + ), + SeparatorOptionUI(), + + HeadingOptionUI( + label_text="Excellon Format", + label_tooltip="The NC drill files, usually named Excellon files\n" + "are files that can be found in different formats.\n" + "Here we set the format used when the provided\n" + "coordinates are not using period.\n" + "\n" + "Possible presets:\n" + "\n" + "PROTEUS 3:3 MM LZ\n" + "DipTrace 5:2 MM TZ\n" + "DipTrace 4:3 MM LZ\n" + "\n" + "EAGLE 3:3 MM TZ\n" + "EAGLE 4:3 MM TZ\n" + "EAGLE 2:5 INCH TZ\n" + "EAGLE 3:5 INCH TZ\n" + "\n" + "ALTIUM 2:4 INCH LZ\n" + "Sprint Layout 2:4 INCH LZ" + "\n" + "KiCAD 3:5 INCH TZ" + ), + SpinnerOptionUI( + option="excellon_format_upper_in", + label_text="INCH int", + label_tooltip="This number signifies the number of digits in\nthe whole part of Excellon coordinates.", + min_value=0, max_value=9, step=1 + ), + SpinnerOptionUI( + option="excellon_format_lower_in", + label_text="INCH decimals", + label_tooltip="This number signifies the number of digits in\nthe decimal part of Excellon coordinates.", + min_value=0, max_value=9, step=1 + ), + SpinnerOptionUI( + option="excellon_format_upper_mm", + label_text="METRIC int", + label_tooltip="This number signifies the number of digits in\nthe whole part of Excellon coordinates.", + min_value=0, max_value=9, step=1 + ), + SpinnerOptionUI( + option="excellon_format_lower_mm", + label_text="METRIC decimals", + label_tooltip="This number signifies the number of digits in\nthe decimal part of Excellon coordinates.", + min_value=0, max_value=9, step=1 + ), + RadioSetOptionUI( + option="excellon_zeros", + label_text="Zeros", + label_tooltip="This sets the type of Excellon zeros.\n" + "If LZ then Leading Zeros are kept and\n" + "Trailing Zeros are removed.\n" + "If TZ is checked then Trailing Zeros are kept\n" + "and Leading Zeros are removed.\n\n" + "This is used when there is no information\n" + "stored in the Excellon file.", + choices=[ + {'label': _('LZ'), 'value': 'L'}, + {'label': _('TZ'), 'value': 'T'} + ] + ), + RadioSetOptionUI( + option="excellon_units", + label_text="Units", + label_tooltip="This sets the default units of Excellon files.\n" + "If it is not detected in the parsed file the value here\n" + "will be used." + "Some Excellon files don't have an header\n" + "therefore this parameter will be used.", + choices=[ + {'label': _('INCH'), 'value': 'INCH'}, + {'label': _('MM'), 'value': 'METRIC'} + ] + ), + CheckboxOptionUI( + option="excellon_update", + label_text="Update Export settings", + label_tooltip="If checked, the Excellon Export settings will be updated with the ones above." + ), + FullWidthButtonOptionUI( + option="__excellon_restore_defaults", + label_text="Restore Defaults", + label_tooltip=None + ), + SeparatorOptionUI(), + + HeadingOptionUI(label_text="Excellon Optimization"), + RadioSetOptionUI( + option="excellon_optimization_type", + label_text="Algorithm", + label_tooltip="This sets the optimization type for the Excellon drill path.\n" + "If <> is checked then Google OR-Tools algorithm with\n" + "MetaHeuristic Guided Local Path is used. Default search time is 3sec.\n" + "If <> is checked then Google OR-Tools Basic algorithm is used.\n" + "If <> is checked then Travelling Salesman algorithm is used for\n" + "drill path optimization.\n" + "\n" + "If this control is disabled, then FlatCAM works in 32bit mode and it uses\n" + "Travelling Salesman algorithm for path optimization.", + choices=[ + {'label': _('MetaHeuristic'), 'value': 'M'}, + {'label': _('Basic'), 'value': 'B'}, + {'label': _('TSA'), 'value': 'T'} + ], + orientation="vertical" + ), + SpinnerOptionUI( + option="excellon_search_time", + label_text="Duration", + label_tooltip="When OR-Tools Metaheuristic (MH) is enabled there is a\n" + "maximum threshold for how much time is spent doing the\n" + "path optimization. This max duration is set here.\n" + "In seconds.", + min_value=1, max_value=999, step=1 + ), + SeparatorOptionUI(), + + HeadingOptionUI(label_text="Excellon Object Color"), + ColorOptionUI( + option="excellon_plot_line", + label_text="Outline", + label_tooltip="Set the line color for plotted objects.", + ), + ColorOptionUI( + option="excellon_plot_fill", + label_text="Fill", + label_tooltip="Set the fill color for plotted objects.\n" + "First 6 digits are the color and the last 2\n" + "digits are for alpha (transparency) level." + ), + ColorAlphaSliderOptionUI( + applies_to=["excellon_plot_line", "excellon_plot_fill"], + group=self, + label_text="Alpha", + label_tooltip="Set the transparency for plotted objects." + ) + ] def optimization_selection(self): - if self.excellon_optimization_radio.get_value() == 'M': - self.optimization_time_label.setDisabled(False) - self.optimization_time_entry.setDisabled(False) - else: - self.optimization_time_label.setDisabled(True) - self.optimization_time_entry.setDisabled(True) + disable_time = (self.option_dict()["excellon_optimization_type"].get_field().get_value() != 'M') + self.option_dict()["excellon_search_time"].label_widget.setDisabled(disable_time) + self.option_dict()["excellon_search_time"].get_field().setDisabled(disable_time) - # Setting plot colors handlers - def on_fill_color_entry(self): - self.app.defaults['excellon_plot_fill'] = self.fill_color_entry.get_value()[:7] + \ - self.app.defaults['excellon_plot_fill'][7:9] - self.fill_color_button.setStyleSheet("background-color:%s" % str(self.app.defaults['excellon_plot_fill'])[:7]) - - def on_fill_color_button(self): - current_color = QtGui.QColor(self.app.defaults['excellon_plot_fill'][:7]) - - c_dialog = QtWidgets.QColorDialog() - plot_fill_color = c_dialog.getColor(initial=current_color) - - if plot_fill_color.isValid() is False: - return - - self.fill_color_button.setStyleSheet("background-color:%s" % str(plot_fill_color.name())) - - new_val = str(plot_fill_color.name()) + str(self.app.defaults['excellon_plot_fill'][7:9]) - self.fill_color_entry.set_value(new_val) - self.app.defaults['excellon_plot_fill'] = new_val - - def on_color_spinner(self): - spinner_value = self.color_alpha_spinner.value() - self.color_alpha_slider.setValue(spinner_value) - self.app.defaults['excellon_plot_fill'] = \ - self.app.defaults['excellon_plot_fill'][:7] + \ - (hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00') - self.app.defaults['excellon_plot_line'] = \ - self.app.defaults['excellon_plot_line'][:7] + \ - (hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00') - - def on_color_slider(self): - slider_value = self.color_alpha_slider.value() - self.color_alpha_spinner.setValue(slider_value) - - def on_line_color_entry(self): - self.app.defaults['excellon_plot_line'] = self.line_color_entry.get_value()[:7] + \ - self.app.defaults['excellon_plot_line'][7:9] - self.line_color_button.setStyleSheet("background-color:%s" % str(self.app.defaults['excellon_plot_line'])[:7]) - - def on_line_color_button(self): - current_color = QtGui.QColor(self.app.defaults['excellon_plot_line'][:7]) - # print(current_color) - - c_dialog = QtWidgets.QColorDialog() - plot_line_color = c_dialog.getColor(initial=current_color) - - if plot_line_color.isValid() is False: - return - - self.line_color_button.setStyleSheet("background-color:%s" % str(plot_line_color.name())) - - new_val_line = str(plot_line_color.name()) + str(self.app.defaults['excellon_plot_line'][7:9]) - self.line_color_entry.set_value(new_val_line) - self.app.defaults['excellon_plot_line'] = new_val_line - - def on_excellon_defaults_button(self): - self.app.preferencesUiManager.defaults_form_fields["excellon_format_lower_in"].set_value('4') - self.app.preferencesUiManager.defaults_form_fields["excellon_format_upper_in"].set_value('2') - self.app.preferencesUiManager.defaults_form_fields["excellon_format_lower_mm"].set_value('3') - self.app.preferencesUiManager.defaults_form_fields["excellon_format_upper_mm"].set_value('3') - self.app.preferencesUiManager.defaults_form_fields["excellon_zeros"].set_value('L') - self.app.preferencesUiManager.defaults_form_fields["excellon_units"].set_value('INCH') + def on_defaults_button(self): + self.option_dict()["excellon_format_lower_in"].get_field().set_value('4') + self.option_dict()["excellon_format_upper_in"].get_field().set_value('2') + self.option_dict()["excellon_format_lower_mm"].get_field().set_value('3') + self.option_dict()["excellon_format_upper_mm"].get_field().set_value('3') + self.option_dict()["excellon_zeros"].get_field().set_value('L') + self.option_dict()["excellon_units"].get_field().set_value('INCH') diff --git a/flatcamGUI/preferences/excellon/ExcellonPreferencesUI.py b/flatcamGUI/preferences/excellon/ExcellonPreferencesUI.py index f406ca90..364c623c 100644 --- a/flatcamGUI/preferences/excellon/ExcellonPreferencesUI.py +++ b/flatcamGUI/preferences/excellon/ExcellonPreferencesUI.py @@ -26,14 +26,9 @@ class ExcellonPreferencesUI(PreferencesSectionUI): self.excellon_exp_group = ExcellonExpPrefGroupUI(decimals=self.decimals) self.excellon_adv_opt_group = ExcellonAdvOptPrefGroupUI(decimals=self.decimals) self.excellon_editor_group = ExcellonEditorPrefGroupUI(decimals=self.decimals) - super().__init__(**kwargs) - self.excellon_gen_group.excellon_format_upper_in_entry.returnPressed.connect(self.sync_export) - self.excellon_gen_group.excellon_format_lower_in_entry.returnPressed.connect(self.sync_export) - self.excellon_gen_group.excellon_format_upper_mm_entry.returnPressed.connect(self.sync_export) - self.excellon_gen_group.excellon_format_lower_mm_entry.returnPressed.connect(self.sync_export) - self.excellon_gen_group.excellon_zeros_radio.activated_custom.connect(self.sync_export) - self.excellon_gen_group.excellon_units_radio.activated_custom.connect(self.sync_export) + super().__init__(**kwargs) + self.init_sync_export() def build_groups(self) -> [OptionsGroupUI]: @@ -51,18 +46,27 @@ class ExcellonPreferencesUI(PreferencesSectionUI): def get_tab_label(self): return _("EXCELLON") + def init_sync_export(self): + self.option_dict()["excellon_update"].get_field().stateChanged.connect(self.sync_export) + self.option_dict()["excellon_format_upper_in"].get_field().returnPressed.connect(self.sync_export) + self.option_dict()["excellon_format_lower_in"].get_field().returnPressed.connect(self.sync_export) + self.option_dict()["excellon_format_upper_mm"].get_field().returnPressed.connect(self.sync_export) + self.option_dict()["excellon_format_lower_mm"].get_field().returnPressed.connect(self.sync_export) + self.option_dict()["excellon_zeros"].get_field().activated_custom.connect(self.sync_export) + self.option_dict()["excellon_units"].get_field().activated_custom.connect(self.sync_export) + def sync_export(self): - if not self.excellon_gen_group.update_excellon_cb.get_value(): + if not self.option_dict()["excellon_update"].get_field().get_value(): # User has disabled sync. return - self.excellon_exp_group.zeros_radio.set_value(self.excellon_gen_group.excellon_zeros_radio.get_value() + 'Z') - self.excellon_exp_group.excellon_units_radio.set_value(self.excellon_gen_group.excellon_units_radio.get_value()) - if self.excellon_gen_group.excellon_units_radio.get_value().upper() == 'METRIC': - self.excellon_exp_group.format_whole_entry.set_value(self.excellon_gen_group.excellon_format_upper_mm_entry.get_value()) - self.excellon_exp_group.format_dec_entry.set_value(self.excellon_gen_group.excellon_format_lower_mm_entry.get_value()) + self.excellon_exp_group.zeros_radio.set_value(self.option_dict()["excellon_zeros"].get_field().get_value() + 'Z') + self.excellon_exp_group.excellon_units_radio.set_value(self.option_dict()["excellon_units"].get_field().get_value()) + if self.option_dict()["excellon_units"].get_field().get_value().upper() == 'METRIC': + self.excellon_exp_group.format_whole_entry.set_value(self.option_dict()["excellon_format_upper_mm"].get_field().get_value()) + self.excellon_exp_group.format_dec_entry.set_value(self.option_dict()["excellon_format_lower_mm"].get_field().get_value()) else: - self.excellon_exp_group.format_whole_entry.set_value(self.excellon_gen_group.excellon_format_upper_in_entry.get_value()) - self.excellon_exp_group.format_dec_entry.set_value(self.excellon_gen_group.excellon_format_lower_in_entry.get_value()) + self.excellon_exp_group.format_whole_entry.set_value(self.option_dict()["excellon_format_upper_in"].get_field().get_value()) + self.excellon_exp_group.format_dec_entry.set_value(self.option_dict()["excellon_format_lower_in"].get_field().get_value())