From 18132eab4c7327bf57035aa93391e06c902cdc75 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Wed, 27 Feb 2019 00:14:53 +0200 Subject: [PATCH] - made the polygon fusing in modified Gerber creation, a list comprehension in an attempt for optimization - when right clicking the files in Project tab, the Save option for Excellon no longer export it but really save the original. --- FlatCAMApp.py | 71 +++++++++++++++++++++++++++++++++++++++------------ FlatCAMObj.py | 27 +++++++++++--------- README.md | 2 ++ 3 files changed, 72 insertions(+), 28 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index f4220414..89a7b098 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -5016,11 +5016,11 @@ class App(QtCore.QObject): if type(obj) == FlatCAMGeometry: self.on_file_exportdxf() elif type(obj) == FlatCAMExcellon: - self.on_file_exportexcellon() + self.on_file_saveexcellon() elif type(obj) == FlatCAMCNCjob: obj.on_exportgcode_button_click() elif type(obj) == FlatCAMGerber: - self.on_file_exportgerber() + self.on_file_savegerber() def on_view_source(self): @@ -5294,18 +5294,18 @@ class App(QtCore.QObject): write_png(filename, data) self.file_saved.emit("png", filename) - def on_file_exportgerber(self): + def on_file_savegerber(self): """ - Callback for menu item File->Export SVG. + Callback for menu item File->Export Gerber. :return: None """ - self.report_usage("on_file_exportgerber") - App.log.debug("on_file_exportgerber()") + self.report_usage("on_file_savegerber") + App.log.debug("on_file_savegerber()") obj = self.collection.get_active() if obj is None: - self.inform.emit("[WARNING_NOTCL] No object selected. Please Select an Gerber object to export.") + 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 @@ -5318,21 +5318,60 @@ class App(QtCore.QObject): filter = "Gerber File (*.GBR);;Gerber File (*.GRB);;All Files (*.*)" try: filename, _ = QtWidgets.QFileDialog.getSaveFileName( - caption="Export Gerber", + caption="Save Gerber source file", directory=self.get_last_save_folder() + '/' + name, filter=filter) except TypeError: - filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Export Gerber", filter=filter) + filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Save Gerber source file", filter=filter) filename = str(filename) if filename == "": - self.inform.emit("[WARNING_NOTCL]Export Gerber cancelled.") + self.inform.emit("[WARNING_NOTCL]Save Gerber source file cancelled.") return else: - self.export_gerber(name, filename) + self.save_source_file(name, filename) self.file_saved.emit("Gerber", filename) + def on_file_saveexcellon(self): + """ + Callback for menu item File->Export Gerber. + + :return: None + """ + self.report_usage("on_file_saveexcellon") + App.log.debug("on_file_saveexcellon()") + + obj = self.collection.get_active() + if obj is None: + self.inform.emit("[WARNING_NOTCL] No object selected. Please select an Excellon object to export.") + return + + # Check for more compatible types and add as required + if not isinstance(obj, FlatCAMExcellon): + self.inform.emit("[ERROR_NOTCL] Failed. Only Excellon objects can be saved as Excellon files...") + return + + name = self.collection.get_active().options["name"] + + filter = "Excellon File (*.DRL);;Excellon File (*.TXT);;All Files (*.*)" + try: + filename, _ = QtWidgets.QFileDialog.getSaveFileName( + caption="Save Excellon source file", + directory=self.get_last_save_folder() + '/' + name, + filter=filter) + except TypeError: + filename, _ = QtWidgets.QFileDialog.getSaveFileName(caption="Save Excellon source file", filter=filter) + + filename = str(filename) + + if filename == "": + self.inform.emit("[WARNING_NOTCL]Saving Excellon source file cancelled.") + return + else: + self.save_source_file(name, filename) + self.file_saved.emit("Excellon", filename) + def on_file_exportexcellon(self): """ Callback for menu item File->Export SVG. @@ -5885,19 +5924,19 @@ class App(QtCore.QObject): else: make_black_film() - def export_gerber(self, obj_name, filename, use_thread=True): + def save_source_file(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()") + self.report_usage("save source file()") if filename is None: filename = self.defaults["global_last_save_folder"] - self.log.debug("export_gerber()") + self.log.debug("save source file()") obj = self.collection.get_by_name(obj_name) @@ -5906,8 +5945,8 @@ class App(QtCore.QObject): 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 %s (RE)GENERATED BY FLATCAM v%s - www.flatcam.org - Version Date: %s*\n' % + (obj.kind.upper(), 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) diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 4def20e2..567c4234 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -708,7 +708,8 @@ class FlatCAMGerber(FlatCAMObj, Gerber): break if self.ui.apertures_table.cellWidget(check_row, 5).isChecked(): - self.plot_apertures(color = '#2d4606bf', marked_aperture=aperture, visible=True) + # self.plot_apertures(color='#FF0000BF', marked_aperture=aperture, visible=True) + self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True) self.mark_shapes.redraw() @@ -738,6 +739,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber): mark_cb.setChecked(False) for aperture in self.apertures: if mark_all: + # self.plot_apertures(color='#FF0000BF', marked_aperture=aperture, visible=True) self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True) else: self.mark_shapes.clear(update=True) @@ -1132,7 +1134,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber): assert isinstance(gerber_obj, FlatCAMGerber), \ "Expected to initialize a FlatCAMGerber but got %s" % type(gerber_obj) - gerber_obj.source_file = '' + gerber_obj.source_file = self.source_file gerber_obj.multigeo = False gerber_obj.follow = False @@ -1145,9 +1147,10 @@ class FlatCAMGerber(FlatCAMObj, Gerber): # regenerate solid_geometry app_obj.log.debug("Creating new Gerber object. Joining %s polygons.") - for ap in apertures: - for geo in apertures[ap]['solid_geometry']: - poly_buff.append(geo) + # for ap in apertures: + # for geo in apertures[ap]['solid_geometry']: + # poly_buff.append(geo) + poly_buff = [geo for ap in apertures for geo in apertures[ap]['solid_geometry']] # buffering the poly_buff new_geo = MultiPolygon(poly_buff) @@ -1294,6 +1297,8 @@ class FlatCAMGerber(FlatCAMObj, Gerber): visibility = kwargs['visible'] with self.app.proc_container.new("Plotting Apertures") as proc: + self.app.progress.emit(30) + def job_thread(app_obj): geometry = {} for ap in self.apertures: @@ -1302,26 +1307,24 @@ class FlatCAMGerber(FlatCAMObj, Gerber): _ = iter(geometry[int(ap)]) except TypeError: geometry[int(ap)] = [geometry[int(ap)]] - self.app.progress.emit(10) + self.app.progress.emit(30) try: if aperture_to_plot_mark in self.apertures: for geo in geometry[int(aperture_to_plot_mark)]: if type(geo) == Polygon or type(geo) == LineString: - self.add_mark_shape(shape=geo, color=color, - face_color=color, visible=visibility) + self.add_mark_shape(shape=geo, color=color, face_color=color, visible=visibility) else: for el in geo: - self.add_mark_shape(shape=el, color=color, - face_color=color, visible=visibility) + self.add_mark_shape(shape=el, color=color, face_color=color, visible=visibility) self.mark_shapes.redraw() - self.app.progress.emit(90) + self.app.progress.emit(100) except (ObjectDeleted, AttributeError): self.mark_shapes.clear(update=True) - self.app.worker_task.emit({'fcn': job_thread, 'params': [self.app]}) + self.app.worker_task.emit({'fcn': job_thread, 'params': [self]}) def serialize(self): return { diff --git a/README.md b/README.md index 9b3a7690..f8518b0c 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,8 @@ CAD program, and create G-Code for Isolation routing. - fixed Gerber Aperture Table dimensions - added a Mark All button in the Gerber aperture table. - because adding shapes to the shapes collection (when doing Mark or Mark All) is time consuming I made the plot_apertures() threaded. +- made the polygon fusing in modified Gerber creation, a list comprehension in an attempt for optimization +- when right clicking the files in Project tab, the Save option for Excellon no longer export it but really save the original. 25.02.2019