diff --git a/FlatCAMApp.py b/FlatCAMApp.py index edc32556..46c8893d 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -1174,6 +1174,8 @@ class App(QtCore.QObject): self.ui.menufileopenexcellon.triggered.connect(self.on_fileopenexcellon) self.ui.menufileopengcode.triggered.connect(self.on_fileopengcode) self.ui.menufileopenproject.triggered.connect(self.on_file_openproject) + self.ui.menufileopenconfig.triggered.connect(self.on_file_openconfig) + self.ui.menufilerunscript.triggered.connect(self.on_filerunscript) self.ui.menufileimportsvg.triggered.connect(lambda: self.on_file_importsvg("geometry")) @@ -1238,6 +1240,7 @@ class App(QtCore.QObject): self.ui.menuview_zoom_fit.triggered.connect(self.on_zoom_fit) self.ui.menuview_zoom_in.triggered.connect(lambda: self.plotcanvas.zoom(1 / 1.5)) self.ui.menuview_zoom_out.triggered.connect(lambda: self.plotcanvas.zoom(1.5)) + self.ui.menuview_toggle_code_editor.triggered.connect(self.on_toggle_code_editor) self.ui.menuview_toggle_fscreen.triggered.connect(self.on_fullscreen) self.ui.menuview_toggle_parea.triggered.connect(self.on_toggle_plotarea) self.ui.menuview_toggle_notebook.triggered.connect(self.on_toggle_notebook) @@ -1541,6 +1544,9 @@ class App(QtCore.QObject): # Variable to store the status of the fullscreen event self.toggle_fscreen = False + # Variable to store the status of the code editor + self.toggle_codeeditor = False + self.cursor = None # Variable to store the GCODE that was edited @@ -1602,6 +1608,19 @@ class App(QtCore.QObject): except Exception as e: log.debug("Could not open FlatCAM project file as App parameter due: %s" % str(e)) + if '.FlatConfig' in argument: + try: + file_name = str(argument) + + if file_name == "": + self.inform.emit("Open Config file failed.") + else: + run_from_arg = True + self.worker_task.emit({'fcn': self.open_config_file, + 'params': [file_name, run_from_arg]}) + except Exception as e: + log.debug("Could not open FlatCAM Config file as App parameter due: %s" % str(e)) + def defaults_read_form(self): for option in self.defaults_form_fields: try: @@ -3141,6 +3160,27 @@ class App(QtCore.QObject): self.ui.grid_snap_btn.trigger() + def on_toggle_code_editor(self): + self.report_usage("on_toggle_code_editor()") + + if self.toggle_codeeditor is False: + # add the tab if it was closed + self.ui.plot_tab_area.addTab(self.ui.cncjob_tab, "Code Editor") + self.ui.cncjob_tab.setObjectName('cncjob_tab') + # first clear previous text in text editor (if any) + self.ui.code_editor.clear() + + # Switch plot_area to CNCJob tab + self.ui.plot_tab_area.setCurrentWidget(self.ui.cncjob_tab) + + self.toggle_codeeditor = True + else: + for idx in range(self.ui.plot_tab_area.count()): + if self.ui.plot_tab_area.widget(idx).objectName() == "cncjob_tab": + self.ui.plot_tab_area.closeTab(idx) + break + self.toggle_codeeditor = False + def on_options_combo_change(self, sel): """ Called when the combo box to choose between application defaults and @@ -3619,12 +3659,20 @@ class App(QtCore.QObject): # self.ui.buttonPreview.setEnabled(enable) pass - def handleSaveGCode(self): + def handleSaveGCode(self, signal, name=None, filt=None): self.report_usage("handleSaveGCode()") + if name: + obj_name = name + else: + try: + obj_name = self.collection.get_active().options['name'] + except AttributeError: + obj_name = 'file' - obj_name = self.collection.get_active().options['name'] - - _filter_ = " G-Code Files (*.nc);; G-Code Files (*.txt);; G-Code Files (*.tap);; G-Code Files (*.cnc);; " \ + if filt: + _filter_ = filt + else: + _filter_ = " G-Code Files (*.nc);; G-Code Files (*.txt);; G-Code Files (*.tap);; G-Code Files (*.cnc);; " \ "All Files (*.*)" try: filename = str(QtWidgets.QFileDialog.getSaveFileName( @@ -4884,6 +4932,7 @@ class App(QtCore.QObject): obj.on_exportgcode_button_click() elif type(obj) == FlatCAMGerber: self.on_file_exportgerber() + def on_view_source(self): try: @@ -5049,6 +5098,27 @@ class App(QtCore.QObject): # thread safe. The new_project() self.open_project(filename) + def on_file_openconfig(self): + """ + File menu callback for opening a config file. + + :return: None + """ + + self.report_usage("on_file_openconfig") + App.log.debug("on_file_openconfig()") + _filter_ = "FlatCAM Config (*.FlatConfig);;FlatCAM Config (*.json);;All Files (*.*)" + try: + filename, _ = QtWidgets.QFileDialog.getOpenFileName(caption="Open Configuration File", + directory=self.data_path, filter=_filter_) + except TypeError: + filename, _ = QtWidgets.QFileDialog.getOpenFileName(caption="Open Configuration File", filter = _filter_) + + if filename == "": + self.inform.emit("[WARNING_NOTCL]Open COnfig cancelled.") + else: + self.open_config_file(filename) + def on_file_exportsvg(self): """ Callback for menu item File->Export SVG. @@ -6265,6 +6335,37 @@ class App(QtCore.QObject): self.inform.emit("[success] Opened: " + filename) self.progress.emit(100) + def open_config_file(self, filename, run_from_arg=None): + """ + Loads a config file from the specified file. + + :param filename: Name of the file from which to load. + :type filename: str + :return: None + """ + App.log.debug("Opening config file: " + filename) + + # add the tab if it was closed + self.ui.plot_tab_area.addTab(self.ui.cncjob_tab, "Code Editor") + # first clear previous text in text editor (if any) + self.ui.code_editor.clear() + + # Switch plot_area to CNCJob tab + self.ui.plot_tab_area.setCurrentWidget(self.ui.cncjob_tab) + + try: + if filename: + f = QtCore.QFile(filename) + if f.open(QtCore.QIODevice.ReadOnly): + stream = QtCore.QTextStream(f) + gcode_edited = stream.readAll() + self.ui.code_editor.setPlainText(gcode_edited) + f.close() + except IOError: + App.log.error("Failed to open config file: %s" % filename) + self.inform.emit("[ERROR_NOTCL] Failed to open config file: %s" % filename) + return + def open_project(self, filename, run_from_arg=None): """ Loads a project from the specified file. diff --git a/FlatCAMGUI.py b/FlatCAMGUI.py index ffacd647..76457732 100644 --- a/FlatCAMGUI.py +++ b/FlatCAMGUI.py @@ -83,6 +83,12 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.menufileopenproject = QtWidgets.QAction(QtGui.QIcon('share/folder16.png'), 'Open &Project ...', self) self.menufile_open.addAction(self.menufileopenproject) + self.menufile_open.addSeparator() + + # Open Config File... + self.menufileopenconfig = QtWidgets.QAction(QtGui.QIcon('share/folder16.png'), 'Open Config ...', self) + self.menufile_open.addAction(self.menufileopenconfig) + # Recent self.recent = self.menufile.addMenu(QtGui.QIcon('share/recent_files.png'), "Recent files") @@ -299,7 +305,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.menuview_zoom_fit = self.menuview.addAction(QtGui.QIcon('share/zoom_fit32.png'), "&Zoom Fit\tV") self.menuview_zoom_in = self.menuview.addAction(QtGui.QIcon('share/zoom_in32.png'), "&Zoom In\t-") self.menuview_zoom_out = self.menuview.addAction(QtGui.QIcon('share/zoom_out32.png'), "&Zoom Out\t=") + self.menuview.addSeparator() + self.menuview_toggle_code_editor = self.menuview.addAction(QtGui.QIcon('share/code_editor32.png'), + 'Toggle Code Editor\tCTRL+E') self.menuview.addSeparator() self.menuview_toggle_fscreen = self.menuview.addAction( QtGui.QIcon('share/fscreen32.png'), "&Toggle FullScreen\tALT+F10") @@ -715,6 +724,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.geometry_tab_lay.addWidget(self.geometry_scroll_area) self.cncjob_tab = QtWidgets.QWidget() + self.cncjob_tab.setObjectName("cncjob_tab") self.pref_tab_area.addTab(self.cncjob_tab, "CNC-JOB") self.cncjob_tab_lay = QtWidgets.QVBoxLayout() self.cncjob_tab_lay.setContentsMargins(2, 2, 2, 2) @@ -941,6 +951,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow): SHIFT+C  Copy Obj_Name + + SHIFT+E +  Toggle Code Editor + SHIFT+G  Toggle the axis @@ -1692,11 +1706,14 @@ class FlatCAMGUI(QtWidgets.QMainWindow): return elif modifiers == QtCore.Qt.ShiftModifier: - # Copy Object Name # Copy Object Name if key == QtCore.Qt.Key_C: self.app.on_copy_name() + # Toggle Code Editor + if key == QtCore.Qt.Key_E: + self.app.on_toggle_code_editor() + # Toggle axis if key == QtCore.Qt.Key_G: if self.app.toggle_axis is False: diff --git a/README.md b/README.md index 11e0557f..0a110393 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,9 @@ CAD program, and create G-Code for Isolation routing. - fixed a small bug in the Tool Solder Paste: the App don't take into consideration pads already filled with solder paste. - prettified the defaults files and the recent file. Now they are ordered and human readable +- added a Toggle Code Editor Menu and key shortcut +- added the ability to open FlatConfig configuration files in COde Editor, Modify them and then save them. +- added ability to double click the FlatConfig files and open them in the FlatCAM Code Editor (to be verified) 23.02.2019 diff --git a/share/code_editor32.png b/share/code_editor32.png new file mode 100644 index 00000000..b6fdea18 Binary files /dev/null and b/share/code_editor32.png differ