From bc8b2e3b3a05ad1fb67162def3704f4194b04a54 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 2 Jan 2021 22:40:11 +0200 Subject: [PATCH] - Levelling Tool - changed the Beginner mode - Levelling Tool - moved all the Levelling Preferences into its own category --- CHANGELOG.md | 2 + appGUI/preferences/PreferencesUIManager.py | 27 +-- .../cncjob/CNCJobAdvOptPrefGroupUI.py | 149 +-------------- .../tools/ToolsLevelPrefGroupUI.py | 176 ++++++++++++++++++ .../preferences/tools/ToolsPreferencesUI.py | 8 +- appTools/ToolLevelling.py | 19 +- 6 files changed, 216 insertions(+), 165 deletions(-) create mode 100644 appGUI/preferences/tools/ToolsLevelPrefGroupUI.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 25598f82..9145df1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ CHANGELOG for FlatCAM beta - removed the 'machinist setting' and allow all over the app the usages of both negative and positive values (where it is the case) - applied the changes from Andre Spahlinger from PR's #332 and #334 - moved all the Levelling stuff out of the CNCjob Properties Tab to its own tool, Levelling Tool. The functionality itself is not finished yet. +- Levelling Tool - changed the Beginner mode +- Levelling Tool - moved all the Levelling Preferences into its own category 31.12.2020 diff --git a/appGUI/preferences/PreferencesUIManager.py b/appGUI/preferences/PreferencesUIManager.py index b5c46a2b..c2849263 100644 --- a/appGUI/preferences/PreferencesUIManager.py +++ b/appGUI/preferences/PreferencesUIManager.py @@ -308,18 +308,6 @@ class PreferencesUIManager: # CNC Job Advanced Options "cncjob_annotation_fontsize": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.annotation_fontsize_sp, "cncjob_annotation_fontcolor": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.annotation_fontcolor_entry, - # Autolevelling - "cncjob_al_mode": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.al_mode_radio, - "cncjob_al_method": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.al_method_radio, - "cncjob_al_rows": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.al_rows_entry, - "cncjob_al_columns": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.al_columns_entry, - "cncjob_al_travelz": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.ptravelz_entry, - "cncjob_al_probe_depth": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.pdepth_entry, - "cncjob_al_probe_fr": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.feedrate_probe_entry, - "cncjob_al_controller": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.al_controller_combo, - "cncjob_al_grbl_jog_step": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.jog_step_entry, - "cncjob_al_grbl_jog_fr": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.jog_fr_entry, - "cncjob_al_grbl_travelz": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.jog_travelz_entry, # CNC Job (GCode) Editor "cncjob_prepend": self.ui.cncjob_defaults_form.cncjob_editor_group.prepend_text, @@ -349,6 +337,21 @@ class PreferencesUIManager: "tools_iso_area_shape": self.ui.tools_defaults_form.tools_iso_group.area_shape_radio, "tools_iso_plotting": self.ui.tools_defaults_form.tools_iso_group.plotting_radio, + # Milling Tool + + # Autolevelling Tool + "tools_al_mode": self.ui.tools_defaults_form.tools_level_group.al_mode_radio, + "tools_al_method": self.ui.tools_defaults_form.tools_level_group.al_method_radio, + "tools_al_rows": self.ui.tools_defaults_form.tools_level_group.al_rows_entry, + "tools_al_columns": self.ui.tools_defaults_form.tools_level_group.al_columns_entry, + "tools_al_travelz": self.ui.tools_defaults_form.tools_level_group.ptravelz_entry, + "tools_al_probe_depth": self.ui.tools_defaults_form.tools_level_group.pdepth_entry, + "tools_al_probe_fr": self.ui.tools_defaults_form.tools_level_group.feedrate_probe_entry, + "tools_al_controller": self.ui.tools_defaults_form.tools_level_group.al_controller_combo, + "tools_al_grbl_jog_step": self.ui.tools_defaults_form.tools_level_group.jog_step_entry, + "tools_al_grbl_jog_fr": self.ui.tools_defaults_form.tools_level_group.jog_fr_entry, + "tools_al_grbl_travelz": self.ui.tools_defaults_form.tools_level_group.jog_travelz_entry, + # Drilling Tool "tools_drill_tool_order": self.ui.tools_defaults_form.tools_drill_group.order_radio, "tools_drill_cutz": self.ui.tools_defaults_form.tools_drill_group.cutz_entry, diff --git a/appGUI/preferences/cncjob/CNCJobAdvOptPrefGroupUI.py b/appGUI/preferences/cncjob/CNCJobAdvOptPrefGroupUI.py index ca9e5120..4884670b 100644 --- a/appGUI/preferences/cncjob/CNCJobAdvOptPrefGroupUI.py +++ b/appGUI/preferences/cncjob/CNCJobAdvOptPrefGroupUI.py @@ -53,154 +53,7 @@ class CNCJobAdvOptPrefGroupUI(OptionsGroupUI): grid0.addWidget(self.annotation_color_label, 4, 0) grid0.addWidget(self.annotation_fontcolor_entry, 4, 1) - # ## Autolevelling - self.autolevelling_gcode_label = FCLabel("%s" % _("Autolevelling")) - self.autolevelling_gcode_label.setToolTip( - _("Parameters for the autolevelling.") - ) - grid0.addWidget(self.autolevelling_gcode_label, 6, 0, 1, 2) - - # Probe points mode - al_mode_lbl = FCLabel('%s:' % _("Mode")) - al_mode_lbl.setToolTip(_("Choose a mode for height map generation.\n" - "- Manual: will pick a selection of probe points by clicking on canvas\n" - "- Grid: will automatically generate a grid of probe points")) - - self.al_mode_radio = RadioSet( - [ - {'label': _('Manual'), 'value': 'manual'}, - {'label': _('Grid'), 'value': 'grid'} - ]) - grid0.addWidget(al_mode_lbl, 8, 0) - grid0.addWidget(self.al_mode_radio, 8, 1) - - # AUTOLEVELL METHOD - self.al_method_lbl = FCLabel('%s:' % _("Method")) - self.al_method_lbl.setToolTip(_("Choose a method for approximation of heights from autolevelling data.\n" - "- Voronoi: will generate a Voronoi diagram\n" - "- Bilinear: will use bilinear interpolation. Usable only for grid mode.")) - - self.al_method_radio = RadioSet( - [ - {'label': _('Voronoi'), 'value': 'v'}, - {'label': _('Bilinear'), 'value': 'b'} - ]) - grid0.addWidget(self.al_method_lbl, 9, 0) - grid0.addWidget(self.al_method_radio, 9, 1) - - # ## Columns - self.al_columns_entry = FCSpinner() - - self.al_columns_label = FCLabel('%s:' % _("Columns")) - self.al_columns_label.setToolTip( - _("The number of grid columns.") - ) - grid0.addWidget(self.al_columns_label, 10, 0) - grid0.addWidget(self.al_columns_entry, 10, 1) - - # ## Rows - self.al_rows_entry = FCSpinner() - - self.al_rows_label = FCLabel('%s:' % _("Rows")) - self.al_rows_label.setToolTip( - _("The number of grid rows.") - ) - grid0.addWidget(self.al_rows_label, 12, 0) - grid0.addWidget(self.al_rows_entry, 12, 1) - - # Travel Z Probe - self.ptravelz_label = FCLabel('%s:' % _("Probe Z travel")) - self.ptravelz_label.setToolTip( - _("The safe Z for probe travelling between probe points.") - ) - self.ptravelz_entry = FCDoubleSpinner() - self.ptravelz_entry.set_precision(self.decimals) - self.ptravelz_entry.set_range(0.0000, 10000.0000) - - grid0.addWidget(self.ptravelz_label, 14, 0) - grid0.addWidget(self.ptravelz_entry, 14, 1) - - # Probe depth - self.pdepth_label = FCLabel('%s:' % _("Probe Z depth")) - self.pdepth_label.setToolTip( - _("The maximum depth that the probe is allowed\n" - "to probe. Negative value, in current units.") - ) - self.pdepth_entry = FCDoubleSpinner() - self.pdepth_entry.set_precision(self.decimals) - self.pdepth_entry.set_range(-910000.0000, 0.0000) - - grid0.addWidget(self.pdepth_label, 16, 0) - grid0.addWidget(self.pdepth_entry, 16, 1) - - # Probe feedrate - self.feedrate_probe_label = FCLabel('%s:' % _("Probe Feedrate")) - self.feedrate_probe_label.setToolTip( - _("The feedrate used while the probe is probing.") - ) - self.feedrate_probe_entry = FCDoubleSpinner() - self.feedrate_probe_entry.set_precision(self.decimals) - self.feedrate_probe_entry.set_range(0, 910000.0000) - - grid0.addWidget(self.feedrate_probe_label, 18, 0) - grid0.addWidget(self.feedrate_probe_entry, 18, 1) - - separator_line = QtWidgets.QFrame() - separator_line.setFrameShape(QtWidgets.QFrame.HLine) - separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) - grid0.addWidget(separator_line, 20, 0, 1, 2) - - self.al_controller_label = FCLabel('%s:' % _("Controller")) - self.al_controller_label.setToolTip( - _("The kind of controller for which to generate\n" - "height map gcode.") - ) - - self.al_controller_combo = FCComboBox() - self.al_controller_combo.addItems(["MACH3", "MACH4", "LinuxCNC", "GRBL"]) - grid0.addWidget(self.al_controller_label, 22, 0) - grid0.addWidget(self.al_controller_combo, 22, 1) - - # JOG Step - self.jog_step_label = FCLabel('%s:' % _("Step")) - self.jog_step_label.setToolTip( - _("Each jog action will move the axes with this value.") - ) - - self.jog_step_entry = FCDoubleSpinner() - self.jog_step_entry.set_precision(self.decimals) - self.jog_step_entry.set_range(0, 910000.0000) - - grid0.addWidget(self.jog_step_label, 24, 0) - grid0.addWidget(self.jog_step_entry, 24, 1) - - # JOG Feedrate - self.jog_fr_label = FCLabel('%s:' % _("Feedrate")) - self.jog_fr_label.setToolTip( - _("Feedrate when jogging.") - ) - - self.jog_fr_entry = FCDoubleSpinner() - self.jog_fr_entry.set_precision(self.decimals) - self.jog_fr_entry.set_range(0, 910000.0000) - - grid0.addWidget(self.jog_fr_label, 26, 0) - grid0.addWidget(self.jog_fr_entry, 26, 1) - - # JOG Travel Z - self.jog_travelz_label = FCLabel('%s:' % _("Travel Z")) - self.jog_travelz_label.setToolTip( - _("Safe height (Z) distance when jogging to origin.") - ) - - self.jog_travelz_entry = FCDoubleSpinner() - self.jog_travelz_entry.set_precision(self.decimals) - self.jog_travelz_entry.set_range(0, 910000.0000) - - grid0.addWidget(self.jog_travelz_label, 28, 0) - grid0.addWidget(self.jog_travelz_entry, 28, 1) - - self.layout.addStretch() + self.layout.addStretch(1) self.annotation_fontcolor_entry.editingFinished.connect(self.on_annotation_fontcolor_entry) diff --git a/appGUI/preferences/tools/ToolsLevelPrefGroupUI.py b/appGUI/preferences/tools/ToolsLevelPrefGroupUI.py new file mode 100644 index 00000000..580985df --- /dev/null +++ b/appGUI/preferences/tools/ToolsLevelPrefGroupUI.py @@ -0,0 +1,176 @@ +from PyQt5 import QtWidgets + +from appGUI.GUIElements import FCDoubleSpinner, FCSpinner, RadioSet, FCLabel, FCComboBox +from appGUI.preferences.OptionsGroupUI import OptionsGroupUI + +import gettext +import appTranslation as fcTranslate +import builtins + +fcTranslate.apply_language('strings') +if '_' not in builtins.__dict__: + _ = gettext.gettext + + +class ToolsLevelPrefGroupUI(OptionsGroupUI): + def __init__(self, decimals=4, parent=None): + # OptionsGroupUI.__init__(self, "Cutout Tool Options", parent=parent) + super(ToolsLevelPrefGroupUI, self).__init__(self, parent=parent) + + self.setTitle(str(_("Levelling Tool Options"))) + self.decimals = decimals + + # ## Board cuttout + self.levelling_label = FCLabel("%s:" % _("Parameters")) + self.levelling_label.setToolTip( + _("Generate CNC Code with auto-levelled paths.") + ) + self.layout.addWidget(self.levelling_label) + + # Grid Layout + grid0 = QtWidgets.QGridLayout() + grid0.setColumnStretch(0, 0) + grid0.setColumnStretch(1, 1) + self.layout.addLayout(grid0) + + # Probe points mode + al_mode_lbl = FCLabel('%s:' % _("Mode")) + al_mode_lbl.setToolTip(_("Choose a mode for height map generation.\n" + "- Manual: will pick a selection of probe points by clicking on canvas\n" + "- Grid: will automatically generate a grid of probe points")) + + self.al_mode_radio = RadioSet( + [ + {'label': _('Manual'), 'value': 'manual'}, + {'label': _('Grid'), 'value': 'grid'} + ]) + grid0.addWidget(al_mode_lbl, 8, 0) + grid0.addWidget(self.al_mode_radio, 8, 1) + + # AUTOLEVELL METHOD + self.al_method_lbl = FCLabel('%s:' % _("Method")) + self.al_method_lbl.setToolTip(_("Choose a method for approximation of heights from autolevelling data.\n" + "- Voronoi: will generate a Voronoi diagram\n" + "- Bilinear: will use bilinear interpolation. Usable only for grid mode.")) + + self.al_method_radio = RadioSet( + [ + {'label': _('Voronoi'), 'value': 'v'}, + {'label': _('Bilinear'), 'value': 'b'} + ]) + grid0.addWidget(self.al_method_lbl, 9, 0) + grid0.addWidget(self.al_method_radio, 9, 1) + + # ## Columns + self.al_columns_entry = FCSpinner() + + self.al_columns_label = FCLabel('%s:' % _("Columns")) + self.al_columns_label.setToolTip( + _("The number of grid columns.") + ) + grid0.addWidget(self.al_columns_label, 10, 0) + grid0.addWidget(self.al_columns_entry, 10, 1) + + # ## Rows + self.al_rows_entry = FCSpinner() + + self.al_rows_label = FCLabel('%s:' % _("Rows")) + self.al_rows_label.setToolTip( + _("The number of grid rows.") + ) + grid0.addWidget(self.al_rows_label, 12, 0) + grid0.addWidget(self.al_rows_entry, 12, 1) + + # Travel Z Probe + self.ptravelz_label = FCLabel('%s:' % _("Probe Z travel")) + self.ptravelz_label.setToolTip( + _("The safe Z for probe travelling between probe points.") + ) + self.ptravelz_entry = FCDoubleSpinner() + self.ptravelz_entry.set_precision(self.decimals) + self.ptravelz_entry.set_range(0.0000, 10000.0000) + + grid0.addWidget(self.ptravelz_label, 14, 0) + grid0.addWidget(self.ptravelz_entry, 14, 1) + + # Probe depth + self.pdepth_label = FCLabel('%s:' % _("Probe Z depth")) + self.pdepth_label.setToolTip( + _("The maximum depth that the probe is allowed\n" + "to probe. Negative value, in current units.") + ) + self.pdepth_entry = FCDoubleSpinner() + self.pdepth_entry.set_precision(self.decimals) + self.pdepth_entry.set_range(-910000.0000, 0.0000) + + grid0.addWidget(self.pdepth_label, 16, 0) + grid0.addWidget(self.pdepth_entry, 16, 1) + + # Probe feedrate + self.feedrate_probe_label = FCLabel('%s:' % _("Probe Feedrate")) + self.feedrate_probe_label.setToolTip( + _("The feedrate used while the probe is probing.") + ) + self.feedrate_probe_entry = FCDoubleSpinner() + self.feedrate_probe_entry.set_precision(self.decimals) + self.feedrate_probe_entry.set_range(0, 910000.0000) + + grid0.addWidget(self.feedrate_probe_label, 18, 0) + grid0.addWidget(self.feedrate_probe_entry, 18, 1) + + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + grid0.addWidget(separator_line, 20, 0, 1, 2) + + self.al_controller_label = FCLabel('%s:' % _("Controller")) + self.al_controller_label.setToolTip( + _("The kind of controller for which to generate\n" + "height map gcode.") + ) + + self.al_controller_combo = FCComboBox() + self.al_controller_combo.addItems(["MACH3", "MACH4", "LinuxCNC", "GRBL"]) + grid0.addWidget(self.al_controller_label, 22, 0) + grid0.addWidget(self.al_controller_combo, 22, 1) + + # JOG Step + self.jog_step_label = FCLabel('%s:' % _("Step")) + self.jog_step_label.setToolTip( + _("Each jog action will move the axes with this value.") + ) + + self.jog_step_entry = FCDoubleSpinner() + self.jog_step_entry.set_precision(self.decimals) + self.jog_step_entry.set_range(0, 910000.0000) + + grid0.addWidget(self.jog_step_label, 24, 0) + grid0.addWidget(self.jog_step_entry, 24, 1) + + # JOG Feedrate + self.jog_fr_label = FCLabel('%s:' % _("Feedrate")) + self.jog_fr_label.setToolTip( + _("Feedrate when jogging.") + ) + + self.jog_fr_entry = FCDoubleSpinner() + self.jog_fr_entry.set_precision(self.decimals) + self.jog_fr_entry.set_range(0, 910000.0000) + + grid0.addWidget(self.jog_fr_label, 26, 0) + grid0.addWidget(self.jog_fr_entry, 26, 1) + + # JOG Travel Z + self.jog_travelz_label = FCLabel('%s:' % _("Travel Z")) + self.jog_travelz_label.setToolTip( + _("Safe height (Z) distance when jogging to origin.") + ) + + self.jog_travelz_entry = FCDoubleSpinner() + self.jog_travelz_entry.set_precision(self.decimals) + self.jog_travelz_entry.set_range(0, 910000.0000) + + grid0.addWidget(self.jog_travelz_label, 28, 0) + grid0.addWidget(self.jog_travelz_entry, 28, 1) + + self.layout.addStretch(1) diff --git a/appGUI/preferences/tools/ToolsPreferencesUI.py b/appGUI/preferences/tools/ToolsPreferencesUI.py index 1172ecea..4956556a 100644 --- a/appGUI/preferences/tools/ToolsPreferencesUI.py +++ b/appGUI/preferences/tools/ToolsPreferencesUI.py @@ -9,6 +9,8 @@ from appGUI.preferences.tools.ToolsPanelizePrefGroupUI import ToolsPanelizePrefG from appGUI.preferences.tools.ToolsFilmPrefGroupUI import ToolsFilmPrefGroupUI from appGUI.preferences.tools.Tools2sidedPrefGroupUI import Tools2sidedPrefGroupUI +from appGUI.preferences.tools.ToolsLevelPrefGroupUI import ToolsLevelPrefGroupUI + from appGUI.preferences.tools.ToolsCutoutPrefGroupUI import ToolsCutoutPrefGroupUI from appGUI.preferences.tools.ToolsNCCPrefGroupUI import ToolsNCCPrefGroupUI from appGUI.preferences.tools.ToolsPaintPrefGroupUI import ToolsPaintPrefGroupUI @@ -50,6 +52,9 @@ class ToolsPreferencesUI(QtWidgets.QWidget): self.tools_2sided_group = Tools2sidedPrefGroupUI(decimals=self.decimals) self.tools_2sided_group.setMinimumWidth(220) + self.tools_level_group = ToolsLevelPrefGroupUI(decimals=self.decimals) + self.tools_level_group.setMinimumWidth(220) + self.tools_film_group = ToolsFilmPrefGroupUI(decimals=self.decimals) self.tools_film_group.setMinimumWidth(220) @@ -74,7 +79,7 @@ class ToolsPreferencesUI(QtWidgets.QWidget): self.vlay = QtWidgets.QVBoxLayout() self.vlay.addWidget(self.tools_iso_group) - self.vlay.addWidget(self.tools_2sided_group) + self.vlay.addWidget(self.tools_level_group) self.vlay.addWidget(self.tools_cutout_group) self.vlay1 = QtWidgets.QVBoxLayout() @@ -84,6 +89,7 @@ class ToolsPreferencesUI(QtWidgets.QWidget): self.vlay2 = QtWidgets.QVBoxLayout() self.vlay2.addWidget(self.tools_ncc_group) self.vlay2.addWidget(self.tools_paint_group) + self.vlay2.addWidget(self.tools_2sided_group) self.vlay3 = QtWidgets.QVBoxLayout() self.vlay3.addWidget(self.tools_film_group) diff --git a/appTools/ToolLevelling.py b/appTools/ToolLevelling.py index ddefb261..ef3ef71c 100644 --- a/appTools/ToolLevelling.py +++ b/appTools/ToolLevelling.py @@ -129,7 +129,7 @@ class ToolLevelling(AppTool, CNCjob): def run(self, toggle=True): self.app.defaults.report_usage("ToolFollow()") - log.debug("ToolFOllow().run() was launched ...") + log.debug("ToolLevelling().run() was launched ...") if toggle: # if the splitter is hidden, display it @@ -313,6 +313,8 @@ class ToolLevelling(AppTool, CNCjob): pass self.ui.object_combo.currentIndexChanged.connect(self.on_object_changed) + self.build_tool_ui() + def on_object_changed(self): # load the object @@ -379,6 +381,10 @@ class ToolLevelling(AppTool, CNCjob): } """) + self.ui.al_title.hide() + self.ui.show_al_table.hide() + self.ui.al_probe_points_table.hide() + # Context Menu section # self.ui.al_probe_points_table.removeContextMenu() else: @@ -390,6 +396,11 @@ class ToolLevelling(AppTool, CNCjob): } """) + self.ui.al_title.show() + self.ui.show_al_table.show() + if self.ui.show_al_table.get_value(): + self.ui.al_probe_points_table.show() + # Context Menu section # self.ui.al_probe_points_table.setupContextMenu() @@ -1711,15 +1722,15 @@ class LevelUI: grid0.setColumnStretch(1, 1) self.al_box.addLayout(grid0) - al_title = FCLabel('%s' % _("Probe Points Table")) - al_title.setToolTip(_("Generate GCode that will obtain the height map")) + self.al_title = FCLabel('%s' % _("Probe Points Table")) + self.al_title.setToolTip(_("Generate GCode that will obtain the height map")) self.show_al_table = FCCheckBox(_("Show")) self.show_al_table.setToolTip(_("Toggle the display of the Probe Points table.")) self.show_al_table.setChecked(True) hor_lay = QtWidgets.QHBoxLayout() - hor_lay.addWidget(al_title) + hor_lay.addWidget(self.al_title) hor_lay.addStretch() hor_lay.addWidget(self.show_al_table, alignment=QtCore.Qt.AlignRight)