Procházet zdrojové kódy

- added protection against creating CNCJob from an empty Geometry object (with no geometry inside)
- changed the shortcut key for YouTube channel from F2 to key F4
- changed the way APP LEVEL is showed both in Edit -> Preferences -> General tab and in each Selected Tab. Changed the ToolTips content for this.
- added the functions for GCode View and GCode Save in Tool SolderPaste

Marius Stanciu před 7 roky
rodič
revize
9557e1af60
6 změnil soubory, kde provedl 96 přidání a 74 odebrání
  1. 2 2
      FlatCAMApp.py
  2. 11 10
      FlatCAMGUI.py
  3. 12 12
      FlatCAMObj.py
  4. 13 40
      ObjectUI.py
  5. 3 1
      README.md
  6. 55 9
      flatcamTools/ToolSolderPaste.py

+ 2 - 2
FlatCAMApp.py

@@ -312,7 +312,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_app_level": self.general_defaults_form.general_app_group.app_level_radio,
             "global_compression_level": self.general_defaults_form.general_app_group.compress_combo,
             "global_save_compressed": self.general_defaults_form.general_app_group.save_type_cb,
 
@@ -531,7 +531,7 @@ class App(QtCore.QObject):
             "global_send_stats": True,
             "global_project_at_startup": False,
             "global_project_autohide": True,
-            "global_advanced": False,
+            "global_app_level": 'b',
 
             "global_gridx": 1.0,
             "global_gridy": 1.0,

+ 11 - 10
FlatCAMGUI.py

@@ -3009,6 +3009,16 @@ class GeneralAppPrefGroupUI(OptionsGroupUI):
         self.units_radio = RadioSet([{'label': 'IN', 'value': 'IN'},
                                      {'label': 'MM', 'value': 'MM'}])
 
+        # Application Level for FlatCAM
+        self.app_level_label = QtWidgets.QLabel('<b>APP. LEVEL:</b>')
+        self.app_level_label.setToolTip("Choose the default level of usage for FlatCAM.\n"
+                                        "BASIC level -> reduced functionality, best for beginner's.\n"
+                                        "ADVANCED level -> full functionality.\n\n"
+                                        "The choice here will influence the parameters in\n"
+                                        "the Selected Tab for all kinds of FlatCAM objects.")
+        self.app_level_radio = RadioSet([{'label': 'Basic', 'value': 'b'},
+                                         {'label': 'Advanced', 'value': 'a'}])
+
         # Languages for FlatCAM
         self.languagelabel = QtWidgets.QLabel('<b>Languages:</b>')
         self.languagelabel.setToolTip("Set the language used throughout FlatCAM.")
@@ -3099,6 +3109,7 @@ class GeneralAppPrefGroupUI(OptionsGroupUI):
 
         # Add (label - input field) pair to the QFormLayout
         self.form_box.addRow(self.unitslabel, self.units_radio)
+        self.form_box.addRow(self.app_level_label, self.app_level_radio)
         self.form_box.addRow(self.languagelabel, self.language_cb)
         self.form_box.addRow(self.languagespace, self.language_apply_btn)
 
@@ -3122,16 +3133,6 @@ class GeneralAppPrefGroupUI(OptionsGroupUI):
         # self.layout.addLayout(hlay)
         # hlay.addStretch()
 
-        # 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)
-        self.layout.addWidget(self.advanced_cb)
-
         # Save compressed project CB
         self.save_type_cb = FCCheckBox('Save Compressed Project')
         self.save_type_cb.setToolTip(

+ 12 - 12
FlatCAMObj.py

@@ -491,8 +491,8 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
         self.ui.follow_cb.stateChanged.connect(self.on_follow_cb_click)
 
         # Show/Hide Advanced Options
-        if self.app.defaults["global_advanced"] is False:
-            self.ui.level.setText('<span style="color:green;"><b>BASIC Mode</b></span>')
+        if self.app.defaults["global_app_level"] == 'b':
+            self.ui.level.setText('<span style="color:green;"><b>Basic</b></span>')
             self.ui.apertures_table_label.hide()
             self.ui.aperture_table_visibility_cb.hide()
             self.ui.milling_type_label.hide()
@@ -501,7 +501,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
             self.ui.generate_int_iso_button.hide()
 
         else:
-            self.ui.level.setText('<span style="color:red;"><b>ADVANCED Mode</b></span>')
+            self.ui.level.setText('<span style="color:red;"><b>Advanced</b></span>')
 
         self.build_ui()
 
@@ -1571,8 +1571,8 @@ class FlatCAMExcellon(FlatCAMObj, Excellon):
                 self.tool_offset[dia] = t_default_offset
 
         # Show/Hide Advanced Options
-        if self.app.defaults["global_advanced"] is False:
-            self.ui.level.setText('<span style="color:green;"><b>BASIC Mode</b></span>')
+        if self.app.defaults["global_app_level"] == 'b':
+            self.ui.level.setText('<span style="color:green;"><b>Basic</b></span>')
 
             self.ui.tools_table.setColumnHidden(4, True)
             self.ui.estartz_label.hide()
@@ -1586,7 +1586,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon):
             self.ui.feedrate_probe_label.hide()
             self.ui.feedrate_probe_entry.hide()
         else:
-            self.ui.level.setText('<span style="color:red;"><b>ADVANCED Mode</b></span>')
+            self.ui.level.setText('<span style="color:red;"><b>Advanced</b></span>')
 
         assert isinstance(self.ui, ExcellonObjectUI), \
             "Expected a ExcellonObjectUI, got %s" % type(self.ui)
@@ -2805,8 +2805,8 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
             "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('<span style="color:green;"><b>BASIC Mode</b></span>')
+        if self.app.defaults["global_app_level"] == 'b':
+            self.ui.level.setText('<span style="color:green;"><b>Basic</b></span>')
 
             self.ui.geo_tools_table.setColumnHidden(2, True)
             self.ui.geo_tools_table.setColumnHidden(3, True)
@@ -2826,7 +2826,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
             self.ui.feedrate_probe_label.hide()
             self.ui.feedrate_probe_entry.hide()
         else:
-            self.ui.level.setText('<span style="color:red;"><b>ADVANCED Mode</b></span>')
+            self.ui.level.setText('<span style="color:red;"><b>Advanced</b></span>')
 
         self.ui.plot_cb.stateChanged.connect(self.on_plot_cb_click)
         self.ui.generate_cnc_button.clicked.connect(self.on_generatecnc_button_click)
@@ -4857,11 +4857,11 @@ class FlatCAMCNCjob(FlatCAMObj, 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('<span style="color:green;"><b>BASIC Mode</b></span>')
+        if self.app.defaults["global_app_level"] == 'b':
+            self.ui.level.setText('<span style="color:green;"><b>Basic</b></span>')
 
         else:
-            self.ui.level.setText('<span style="color:red;"><b>ADVANCED Mode</b></span>')
+            self.ui.level.setText('<span style="color:red;"><b>Advanced</b></span>')
 
         self.ui.updateplot_button.clicked.connect(self.on_updateplot_button_click)
         self.ui.export_gcode_button.clicked.connect(self.on_exportgcode_button_click)

+ 13 - 40
ObjectUI.py

@@ -32,6 +32,19 @@ class ObjectUI(QtWidgets.QWidget):
         self.title_label.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
         self.title_box.addWidget(self.title_label, stretch=1)
 
+        ## App Level label
+        self.level = QtWidgets.QLabel("")
+        self.level.setToolTip(
+            "BASIC is suitable for a beginner. Many parameters\n"
+            "are hidden from the user in this mode.\n"
+            "ADVANCED mode will make available all parameters.\n\n"
+            "To change the application LEVEL, go to:\n"
+            "Edit -> Preferences -> General and check:\n"
+            "'APP. LEVEL' radio button."
+        )
+        self.level.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
+        self.title_box.addWidget(self.level)
+
         ## Box box for custom widgets
         # This gets populated in offspring implementations.
         self.custom_box = QtWidgets.QVBoxLayout()
@@ -108,16 +121,6 @@ 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)
@@ -442,16 +445,6 @@ 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)
@@ -775,16 +768,6 @@ 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("<b>Plot Options:</b>")
         self.custom_box.addWidget(self.plot_options_label)
@@ -1213,16 +1196,6 @@ 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()):

+ 3 - 1
README.md

@@ -12,7 +12,9 @@ CAD program, and create G-Code for Isolation routing.
 21.02.2019
 
 - added protection against creating CNCJob from an empty Geometry object (with no geometry inside)
-- changed the shortcut key for YOuTube channel from F2 to key F4
+- changed the shortcut key for YouTube channel from F2 to key F4
+- changed the way APP LEVEL is showed both in Edit -> Preferences -> General tab and in each Selected Tab. Changed the ToolTips content for this.
+- added the functions for GCode View and GCode Save in Tool SolderPaste
 
 20.02.2019
 

+ 55 - 9
flatcamTools/ToolSolderPaste.py

@@ -854,18 +854,24 @@ class ToolSolderPaste(FlatCAMTool):
         # self.app.ui.notebook.setCurrentWidget(self.app.ui.project_tab)
 
     def on_view_gcode(self):
-        name = self.obj_combo.currentText()
+        # add the tab if it was closed
+        self.app.ui.plot_tab_area.addTab(self.app.ui.cncjob_tab, "Code Editor")
+
+        # Switch plot_area to CNCJob tab
+        self.app.ui.plot_tab_area.setCurrentWidget(self.app.ui.cncjob_tab)
+
+        name = self.cnc_obj_combo.currentText()
         obj = self.app.collection.get_by_name(name)
 
         # then append the text from GCode to the text editor
         try:
             file = StringIO(obj.gcode)
         except:
-            pass
+            self.app.inform.emit("[ERROR_NOTCL] No Gcode in the object...")
+            return
 
         try:
             for line in file:
-                print(line)
                 proc_line = str(line).strip('\n')
                 self.app.ui.code_editor.append(proc_line)
         except Exception as e:
@@ -879,14 +885,54 @@ class ToolSolderPaste(FlatCAMTool):
         self.app.ui.show()
 
     def on_save_gcode(self):
-        name = self.obj_combo.currentText()
+        time_str = "{:%A, %d %B %Y at %H:%M}".format(datetime.now())
+        name = self.cnc_obj_combo.currentText()
+        obj = self.app.collection.get_by_name(name)
 
-        def geo_init(geo_obj, app_obj):
-           pass
+        _filter_ = "G-Code Files (*.nc);;G-Code Files (*.txt);;G-Code Files (*.tap);;G-Code Files (*.cnc);;" \
+                   "G-Code Files (*.g-code);;All Files (*.*)"
 
-        # self.app.new_object("geometry", name + "_cutout", geo_init)
-        # self.app.inform.emit("[success] Rectangular CutOut operation finished.")
-        # self.app.ui.notebook.setCurrentWidget(self.app.ui.project_tab)
+        try:
+            dir_file_to_save = self.app.get_last_save_folder() + '/' + str(name)
+            filename, _ = QtWidgets.QFileDialog.getSaveFileName(
+                caption="Export GCode ...",
+                directory=dir_file_to_save,
+                filter=_filter_
+            )
+        except TypeError:
+            filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Export Machine Code ...", filter=_filter_)
+
+        if filename == '':
+            self.app.inform.emit("[WARNING_NOTCL]Export Machine Code cancelled ...")
+            return
+
+        gcode = '(G-CODE GENERATED BY FLATCAM v%s - www.flatcam.org - Version Date: %s)\n' % \
+                (str(self.app.version), str(self.app.version_date)) + '\n'
+
+        gcode += '(Name: ' + str(name) + ')\n'
+        gcode += '(Type: ' + "G-code from " + str(obj.options['type']) + " for Solder Paste dispenser" + ')\n'
+
+        # if str(p['options']['type']) == 'Excellon' or str(p['options']['type']) == 'Excellon Geometry':
+        #     gcode += '(Tools in use: ' + str(p['options']['Tools_in_use']) + ')\n'
+
+        gcode += '(Units: ' + self.units.upper() + ')\n' + "\n"
+        gcode += '(Created on ' + time_str + ')\n' + '\n'
+
+        gcode += obj.gcode
+        lines = StringIO(gcode)
+
+        ## Write
+        if filename is not None:
+            try:
+                with open(filename, 'w') as f:
+                    for line in lines:
+                        f.write(line)
+            except FileNotFoundError:
+                self.app.inform.emit("[WARNING_NOTCL] No such file or directory")
+                return
+
+        self.app.file_saved.emit("gcode", filename)
+        self.app.inform.emit("[success] Solder paste dispenser GCode file saved to: %s" % filename)
 
     def on_create_gcode(self, use_thread=True):
         """