From 88a0be7cf1e8cf5813b67dee430c63980b4c0d29 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 18 Feb 2019 21:19:57 +0200 Subject: [PATCH] - modified the GUI in Objects Selected Tab to accommodate 2 different modes: basic and Advanced. In Basic mode, some of the functionality's are hidden from the user. --- FlatCAMApp.py | 37 ++++++++++++++++-------- FlatCAMGUI.py | 34 +++++++++++++++++++--- FlatCAMObj.py | 62 ++++++++++++++++++++++++++++++++++++++++ ObjectUI.py | 79 ++++++++++++++++++++++++++++++++++++++------------- README.md | 1 + 5 files changed, 177 insertions(+), 36 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 41943574..91dfd76a 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -311,6 +311,7 @@ class App(QtCore.QObject): "global_send_stats": self.general_defaults_form.general_app_group.send_stats_cb, "global_project_at_startup": self.general_defaults_form.general_app_group.project_startup_cb, "global_project_autohide": self.general_defaults_form.general_app_group.project_autohide_cb, + "global_advanced": self.general_defaults_form.general_app_group.advanced_cb, "global_gridx": self.general_defaults_form.general_gui_group.gridx_entry, "global_gridy": self.general_defaults_form.general_gui_group.gridy_entry, @@ -486,6 +487,7 @@ class App(QtCore.QObject): "global_send_stats": True, "global_project_at_startup": False, "global_project_autohide": True, + "global_advanced": False, "global_gridx": 1.0, "global_gridy": 1.0, @@ -3597,21 +3599,32 @@ class App(QtCore.QObject): # work only if the notebook tab on focus is the Selected_Tab and only if the object is Geometry if notebook_widget_name == 'selected_tab': if str(type(self.collection.get_active())) == "": - tool_add_popup = FCInputDialog(title="New Tool ...", - text='Enter a Tool Diameter:', - min=0.0000, max=99.9999, decimals=4) - tool_add_popup.setWindowIcon(QtGui.QIcon('share/letter_t_32.png')) + # Tool add works for Geometry only if Advanced is True in Preferences + if self.defaults["global_advanced"] is True: + tool_add_popup = FCInputDialog(title="New Tool ...", + text='Enter a Tool Diameter:', + min=0.0000, max=99.9999, decimals=4) + tool_add_popup.setWindowIcon(QtGui.QIcon('share/letter_t_32.png')) - val, ok = tool_add_popup.get_value() - if ok: - if float(val) == 0: + val, ok = tool_add_popup.get_value() + if ok: + if float(val) == 0: + self.inform.emit( + "[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float format.") + return + self.collection.get_active().on_tool_add(dia=float(val)) + else: self.inform.emit( - "[WARNING_NOTCL] Please enter a tool diameter with non-zero value, in Float format.") - return - self.collection.get_active().on_tool_add(dia=float(val)) + "[WARNING_NOTCL] Adding Tool cancelled ...") else: - self.inform.emit( - "[WARNING_NOTCL] Adding Tool cancelled ...") + msgbox = QtWidgets.QMessageBox() + msgbox.setText("Adding Tool works only when Advanced is checked.\n" + "Go to Preferences -> General - Show Advanced Options.") + msgbox.setWindowTitle("Tool adding ...") + msgbox.setWindowIcon(QtGui.QIcon('share/warning.png')) + msgbox.setStandardButtons(QtWidgets.QMessageBox.Ok) + msgbox.setDefaultButton(QtWidgets.QMessageBox.Ok) + msgbox.exec_() # work only if the notebook tab on focus is the Tools_Tab if notebook_widget_name == 'tool_tab': diff --git a/FlatCAMGUI.py b/FlatCAMGUI.py index 92ebe9e0..7d59480f 100644 --- a/FlatCAMGUI.py +++ b/FlatCAMGUI.py @@ -1165,6 +1165,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow):     + + ALT+R +  Editor Transformation Tool + ALT+X  Offset shape on X axis @@ -3104,6 +3108,25 @@ class GeneralAppPrefGroupUI(OptionsGroupUI): # to the main layout of this TAB self.layout.addLayout(self.form_box) + hlay = QtWidgets.QHBoxLayout() + self.layout.addLayout(hlay) + + # Advanced CB + self.advanced_cb = FCCheckBox('Show Advanced Options') + self.advanced_cb.setToolTip( + "When checked, Advanced Options will be\n" + "displayed in the Selected Tab for all\n" + "kind of objects." + ) + # self.advanced_cb.setLayoutDirection(QtCore.Qt.RightToLeft) + hlay.addWidget(self.advanced_cb) + hlay.addStretch() + + self.form_box_2 = QtWidgets.QFormLayout() + self.layout.addLayout(self.form_box_2) + + self.layout.addStretch() + class GerberGenPrefGroupUI(OptionsGroupUI): def __init__(self, parent=None): @@ -3519,8 +3542,11 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI): self.optimization_time_label.setDisabled(True) self.optimization_time_entry.setDisabled(True) - ## Create CNC Job - self.cncjob_label = QtWidgets.QLabel('Create CNC Job') + ###################### + ## ADVANCED OPTIONS ## + ###################### + + self.cncjob_label = QtWidgets.QLabel('Advanced Options:') self.cncjob_label.setToolTip( "Parameters used to create a CNC Job object\n" "for this drill object that are not changed very often." @@ -3965,9 +3991,9 @@ class GeometryGenPrefGroupUI(OptionsGroupUI): # ------------------------------ - ## Create CNC Job + ## Advanced Options # ------------------------------ - self.cncjob_label = QtWidgets.QLabel('Create CNC Job:') + self.cncjob_label = QtWidgets.QLabel('Advanced Options:') self.cncjob_label.setToolTip( "Parameters to create a CNC Job object\n" "tracing the contours of a Geometry object." diff --git a/FlatCAMObj.py b/FlatCAMObj.py index f93090c1..fa80da0f 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -478,6 +478,19 @@ class FlatCAMGerber(FlatCAMObj, Gerber): self.ui.generate_noncopper_button.clicked.connect(self.on_generatenoncopper_button_click) self.ui.aperture_table_visibility_cb.stateChanged.connect(self.on_aperture_table_visibility_change) + # Show/Hide Advanced Options + if self.app.defaults["global_advanced"] is False: + self.ui.level.setText('BASIC Mode') + self.ui.apertures_table_label.hide() + self.ui.aperture_table_visibility_cb.hide() + self.ui.milling_type_label.hide() + self.ui.milling_type_radio.hide() + self.ui.generate_ext_iso_button.hide() + self.ui.generate_int_iso_button.hide() + + else: + self.ui.level.setText('ADVANCED Mode') + self.build_ui() def build_ui(self): @@ -1528,6 +1541,24 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): dia = float('%.3f' % float(value['C'])) self.tool_offset[dia] = t_default_offset + # Show/Hide Advanced Options + if self.app.defaults["global_advanced"] is False: + self.ui.level.setText('BASIC Mode') + + self.ui.tools_table.setColumnHidden(4, True) + self.ui.estartz_label.hide() + self.ui.estartz_entry.hide() + self.ui.eendz_label.hide() + self.ui.eendz_entry.hide() + self.ui.feedrate_rapid_label.hide() + self.ui.feedrate_rapid_entry.hide() + self.ui.pdepth_label.hide() + self.ui.pdepth_entry.hide() + self.ui.feedrate_probe_label.hide() + self.ui.feedrate_probe_entry.hide() + else: + self.ui.level.setText('ADVANCED Mode') + assert isinstance(self.ui, ExcellonObjectUI), \ "Expected a ExcellonObjectUI, got %s" % type(self.ui) self.ui.plot_cb.stateChanged.connect(self.on_plot_cb_click) @@ -2744,6 +2775,30 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): self.ui.geo_tools_table.addContextMenu( "Delete", lambda: self.on_tool_delete(all=None), icon=QtGui.QIcon("share/delete32.png")) + # Show/Hide Advanced Options + if self.app.defaults["global_advanced"] is False: + self.ui.level.setText('BASIC Mode') + + self.ui.geo_tools_table.setColumnHidden(2, True) + self.ui.geo_tools_table.setColumnHidden(3, True) + self.ui.geo_tools_table.setColumnHidden(4, True) + self.ui.addtool_entry_lbl.hide() + self.ui.addtool_entry.hide() + self.ui.addtool_btn.hide() + self.ui.copytool_btn.hide() + self.ui.deltool_btn.hide() + self.ui.endzlabel.hide() + self.ui.gendz_entry.hide() + self.ui.fr_rapidlabel.hide() + self.ui.cncfeedrate_rapid_entry.hide() + self.ui.extracut_cb.hide() + self.ui.pdepth_label.hide() + self.ui.pdepth_entry.hide() + self.ui.feedrate_probe_label.hide() + self.ui.feedrate_probe_entry.hide() + else: + self.ui.level.setText('ADVANCED Mode') + self.ui.plot_cb.stateChanged.connect(self.on_plot_cb_click) self.ui.generate_cnc_button.clicked.connect(self.on_generatecnc_button_click) self.ui.paint_tool_button.clicked.connect(self.app.paint_tool.run) @@ -4762,6 +4817,13 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): # set the kind of geometries are plotted by default with plot2() from camlib.CNCJob self.ui.cncplot_method_combo.set_value(self.app.defaults["cncjob_plot_kind"]) + # Show/Hide Advanced Options + if self.app.defaults["global_advanced"] is False: + self.ui.level.setText('BASIC Mode') + + else: + self.ui.level.setText('ADVANCED Mode') + self.ui.updateplot_button.clicked.connect(self.on_updateplot_button_click) self.ui.export_gcode_button.clicked.connect(self.on_exportgcode_button_click) self.ui.modify_gcode_button.clicked.connect(self.on_modifygcode_button_click) diff --git a/ObjectUI.py b/ObjectUI.py index a97ec8e4..03e3124c 100644 --- a/ObjectUI.py +++ b/ObjectUI.py @@ -108,6 +108,16 @@ class GerberObjectUI(ObjectUI): def __init__(self, parent=None): ObjectUI.__init__(self, title='Gerber Object', parent=parent) + self.level = QtWidgets.QLabel("") + self.level.setToolTip( + "In the BASIC mode certain functionality's\n" + "are hidden from the user.\n" + "To enable them, go to:\n" + "Edit -> Preferences -> General and check:\n" + "'Show Advanced Options' checkbox." + ) + self.custom_box.addWidget(self.level) + # Plot options grid0 = QtWidgets.QGridLayout() grid0.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) @@ -237,13 +247,13 @@ class GerberObjectUI(ObjectUI): grid1.addWidget(self.iso_overlap_entry, 2, 1) # Milling Type Radio Button - milling_type_label = QtWidgets.QLabel('Milling Type:') - milling_type_label.setToolTip( + self.milling_type_label = QtWidgets.QLabel('Milling Type:') + self.milling_type_label.setToolTip( "Milling type:\n" "- climb / best for precision milling and to reduce tool usage\n" "- conventional / useful when there is no backlash compensation" ) - grid1.addWidget(milling_type_label, 3, 0) + grid1.addWidget(self.milling_type_label, 3, 0) self.milling_type_radio = RadioSet([{'label': 'Climb', 'value': 'cl'}, {'label': 'Conv.', 'value': 'cv'}]) grid1.addWidget(self.milling_type_radio, 3, 1) @@ -430,6 +440,16 @@ class ExcellonObjectUI(ObjectUI): icon_file='share/drill32.png', parent=parent) + self.level = QtWidgets.QLabel("") + self.level.setToolTip( + "In the BASIC mode certain functionality's\n" + "are hidden from the user.\n" + "To enable them, go to:\n" + "Edit -> Preferences -> General and check:\n" + "'Show Advanced Options' checkbox." + ) + self.custom_box.addWidget(self.level) + #### Plot options #### hlay_plot = QtWidgets.QHBoxLayout() self.custom_box.addLayout(hlay_plot) @@ -485,7 +505,7 @@ class ExcellonObjectUI(ObjectUI): self.tools_box.addWidget(self.tools_table) self.tools_table.setColumnCount(6) - self.tools_table.setHorizontalHeaderLabels(['#', 'Diameter', 'Drills', 'Slots', 'Offset', 'P']) + self.tools_table.setHorizontalHeaderLabels(['#', 'Diameter', 'Drills', 'Slots', 'Offset Z', 'P']) self.tools_table.setSortingEnabled(False) self.tools_table.horizontalHeaderItem(0).setToolTip( @@ -562,22 +582,22 @@ class ExcellonObjectUI(ObjectUI): self.ois_tcz_e = OptionalInputSection(self.toolchange_cb, [self.toolchangez_entry]) # Start move Z: - startzlabel = QtWidgets.QLabel("Start move Z:") - startzlabel.setToolTip( + self.estartz_label = QtWidgets.QLabel("Start move Z:") + self.estartz_label.setToolTip( "Tool height just before starting the work.\n" "Delete the value if you don't need this feature." ) - grid1.addWidget(startzlabel, 4, 0) + grid1.addWidget(self.estartz_label, 4, 0) self.estartz_entry = FloatEntry() grid1.addWidget(self.estartz_entry, 4, 1) # End move Z: - endzlabel = QtWidgets.QLabel("End move Z:") - endzlabel.setToolTip( + self.eendz_label = QtWidgets.QLabel("End move Z:") + self.eendz_label.setToolTip( "Z-axis position (height) for\n" "the last move." ) - grid1.addWidget(endzlabel, 5, 0) + grid1.addWidget(self.eendz_label, 5, 0) self.eendz_entry = LengthEntry() grid1.addWidget(self.eendz_entry, 5, 1) @@ -593,13 +613,13 @@ class ExcellonObjectUI(ObjectUI): grid1.addWidget(self.feedrate_entry, 6, 1) # Excellon Rapid Feedrate - fr_rapid_label = QtWidgets.QLabel('Feedrate Rapids:') - fr_rapid_label.setToolTip( + self.feedrate_rapid_label = QtWidgets.QLabel('Feedrate Rapids:') + self.feedrate_rapid_label.setToolTip( "Tool speed while drilling\n" "(in units per minute).\n" "This is for the rapid move G00." ) - grid1.addWidget(fr_rapid_label, 7, 0) + grid1.addWidget(self.feedrate_rapid_label, 7, 0) self.feedrate_rapid_entry = LengthEntry() grid1.addWidget(self.feedrate_rapid_entry, 7, 1) @@ -753,6 +773,16 @@ class GeometryObjectUI(ObjectUI): def __init__(self, parent=None): super(GeometryObjectUI, self).__init__(title='Geometry Object', icon_file='share/geometry32.png', parent=parent) + self.level = QtWidgets.QLabel("") + self.level.setToolTip( + "In the BASIC mode certain functionality's\n" + "are hidden from the user.\n" + "To enable them, go to:\n" + "Edit -> Preferences -> General and check:\n" + "'Show Advanced Options' checkbox." + ) + self.custom_box.addWidget(self.level) + # Plot options self.plot_options_label = QtWidgets.QLabel("Plot Options:") self.custom_box.addWidget(self.plot_options_label) @@ -976,7 +1006,6 @@ class GeometryObjectUI(ObjectUI): ) self.grid3.addWidget(self.mpass_cb, 4, 0) - self.maxdepth_entry = LengthEntry() self.maxdepth_entry.setToolTip( "Depth of each pass (positive)." @@ -1026,12 +1055,12 @@ class GeometryObjectUI(ObjectUI): # self.grid3.addWidget(self.gstartz_entry, 8, 1) # The Z value for the end move - endzlabel = QtWidgets.QLabel('End move Z:') - endzlabel.setToolTip( + self.endzlabel = QtWidgets.QLabel('End move Z:') + self.endzlabel.setToolTip( "This is the height (Z) at which the CNC\n" "will go as the last move." ) - self.grid3.addWidget(endzlabel, 9, 0) + self.grid3.addWidget(self.endzlabel, 9, 0) self.gendz_entry = LengthEntry() self.grid3.addWidget(self.gendz_entry, 9, 1) @@ -1056,13 +1085,13 @@ class GeometryObjectUI(ObjectUI): self.grid3.addWidget(self.cncplunge_entry, 11, 1) # Feedrate rapids - fr_rapidlabel = QtWidgets.QLabel('Feed Rate Rapids:') - fr_rapidlabel.setToolTip( + self.fr_rapidlabel = QtWidgets.QLabel('Feed Rate Rapids:') + self.fr_rapidlabel.setToolTip( "Cutting speed in the XY\n" "plane in units per minute\n" "for the rapid movements" ) - self.grid3.addWidget(fr_rapidlabel, 12, 0) + self.grid3.addWidget(self.fr_rapidlabel, 12, 0) self.cncfeedrate_rapid_entry = LengthEntry() self.grid3.addWidget(self.cncfeedrate_rapid_entry, 12, 1) @@ -1182,6 +1211,16 @@ class CNCObjectUI(ObjectUI): ObjectUI.__init__(self, title='CNC Job Object', icon_file='share/cnc32.png', parent=parent) + self.level = QtWidgets.QLabel("") + self.level.setToolTip( + "In the BASIC mode certain functionality's\n" + "are hidden from the user.\n" + "To enable them, go to:\n" + "Edit -> Preferences -> General and check:\n" + "'Show Advanced Options' checkbox." + ) + self.custom_box.addWidget(self.level) + # Scale and offset ans skew are not available for CNCJob objects. # Hiding from the GUI. for i in range(0, self.scale_grid.count()): diff --git a/README.md b/README.md index bd9b6f89..1798678e 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ CAD program, and create G-Code for Isolation routing. - added a button to clear de GUI preferences in Preferences -> General -> Gui Settings -> Clear GUI Settings - added key shortcuts for the shape transformations within Geometry Editor: X, Y keys for Flip(mirror), SHIFT+X, SHIFT+Y combo keys for Skew and ALT+X, ALT+Y combo keys for Offset - adjusted the plotcanvas.zomm_fit() function so the objects are better fit into view (with a border around) +- modified the GUI in Objects Selected Tab to accommodate 2 different modes: basic and Advanced. In Basic mode, some of the functionality's are hidden from the user. 17.02.2019