From 032f68a848169f6e38e86b69c0848656129672b7 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sun, 17 Feb 2019 16:05:06 +0200 Subject: [PATCH] - added ability to save the Gerber file content that is stored in FlatCAM on Gerber file loading. It's useful to recover from saved FlatCAM projects when the source files are no longer available. --- FlatCAMApp.py | 73 +++++++++++++++++++++++++++++++++++++++++++-- ObjectCollection.py | 2 -- README.md | 1 + 3 files changed, 72 insertions(+), 4 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 0ca15efa..bde3bf71 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -4741,7 +4741,8 @@ class App(QtCore.QObject): self.on_file_exportexcellon() elif type(obj) == FlatCAMCNCjob: obj.on_exportgcode_button_click() - + elif type(obj) == FlatCAMGerber: + self.on_file_exportgerber() def on_view_source(self): try: @@ -5023,6 +5024,45 @@ class App(QtCore.QObject): write_png(filename, data) self.file_saved.emit("png", filename) + def on_file_exportgerber(self): + """ + Callback for menu item File->Export SVG. + + :return: None + """ + self.report_usage("on_file_exportgerber") + App.log.debug("on_file_exportgerber()") + + obj = self.collection.get_active() + if obj is None: + self.inform.emit("[WARNING_NOTCL] No object selected. Please Select an Gerber object to export.") + return + + # Check for more compatible types and add as required + if not isinstance(obj, FlatCAMGerber): + self.inform.emit("[ERROR_NOTCL] Failed. Only Gerber objects can be saved as Gerber files...") + return + + name = self.collection.get_active().options["name"] + + filter = "Gerber File (*.GBR);;Gerber File (*.GRB);;All Files (*.*)" + try: + filename, _ = QtWidgets.QFileDialog.getSaveFileName( + caption="Export Gerber", + directory=self.get_last_save_folder() + '/' + name, + filter=filter) + except TypeError: + filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Export Gerber", filter=filter) + + filename = str(filename) + + if filename == "": + self.inform.emit("[WARNING_NOTCL]Export Gerber cancelled.") + return + else: + self.export_gerber(name, filename) + self.file_saved.emit("Gerber", filename) + def on_file_exportexcellon(self): """ Callback for menu item File->Export SVG. @@ -5575,9 +5615,38 @@ class App(QtCore.QObject): else: make_black_film() + def export_gerber(self, obj_name, filename, use_thread=True): + """ + Exports a Gerber Object to an Gerber file. + + :param filename: Path to the Gerber file to save to. + :return: + """ + self.report_usage("export_gerber()") + + if filename is None: + filename = self.defaults["global_last_save_folder"] + + self.log.debug("export_gerber()") + + obj = self.collection.get_by_name(obj_name) + + file_string = StringIO(obj.source_file) + time_string = "{:%A, %d %B %Y at %H:%M}".format(datetime.now()) + + with open(filename, 'w') as file: + file.writelines('G04*\n') + file.writelines('G04 GERBER (RE)GENERATED BY FLATCAM v%s - www.flatcam.org - Version Date: %s*\n' % + (str(self.version), str(self.version_date))) + file.writelines('G04 Filename: %s*\n' % str(obj_name)) + file.writelines('G04 Created on : %s*\n' % time_string) + + for line in file_string: + file.writelines(line) + def export_excellon(self, obj_name, filename, use_thread=True): """ - Exports a Geometry Object to an Excellon file. + Exports a Excellon Object to an Excellon file. :param filename: Path to the Excellon file to save to. :return: diff --git a/ObjectCollection.py b/ObjectCollection.py index ce70b129..97dcb0fd 100644 --- a/ObjectCollection.py +++ b/ObjectCollection.py @@ -523,8 +523,6 @@ class ObjectCollection(QtCore.QAbstractItemModel): self.app.ui.menuprojectgeneratecnc.setVisible(False) if type(obj) != FlatCAMGeometry and type(obj) != FlatCAMExcellon: self.app.ui.menuprojectedit.setVisible(False) - if type(obj) != FlatCAMGeometry and type(obj) != FlatCAMExcellon and type(obj) != FlatCAMCNCjob: - self.app.ui.menuprojectsave.setVisible(False) if type(obj) != FlatCAMGerber and type(obj) != FlatCAMExcellon: self.app.ui.menuprojectviewsource.setVisible(False) else: diff --git a/README.md b/README.md index 8a861e96..e6a2ddc4 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ CAD program, and create G-Code for Isolation routing. - in Geometry Editor, on entry the notebook is automatically hidden and restored on Geometry Editor exit. - when pressing Escape in Geometry Editor it will automatically deselect any shape not only the currently selected tool. - when deselecting an object in Project menu the status bar selection message is deleted +- added ability to save the Gerber file content that is stored in FlatCAM on Gerber file loading. It's useful to recover from saved FlatCAM projects when the source files are no longer available. 16.02.2019