Просмотр исходного кода

- 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.

Marius Stanciu 7 лет назад
Родитель
Сommit
18132eab4c
3 измененных файлов с 72 добавлено и 28 удалено
  1. 55 16
      FlatCAMApp.py
  2. 15 12
      FlatCAMObj.py
  3. 2 0
      README.md

+ 55 - 16
FlatCAMApp.py

@@ -5016,11 +5016,11 @@ class App(QtCore.QObject):
         if type(obj) == FlatCAMGeometry:
         if type(obj) == FlatCAMGeometry:
             self.on_file_exportdxf()
             self.on_file_exportdxf()
         elif type(obj) == FlatCAMExcellon:
         elif type(obj) == FlatCAMExcellon:
-            self.on_file_exportexcellon()
+            self.on_file_saveexcellon()
         elif type(obj) == FlatCAMCNCjob:
         elif type(obj) == FlatCAMCNCjob:
             obj.on_exportgcode_button_click()
             obj.on_exportgcode_button_click()
         elif type(obj) == FlatCAMGerber:
         elif type(obj) == FlatCAMGerber:
-            self.on_file_exportgerber()
+            self.on_file_savegerber()
 
 
     def on_view_source(self):
     def on_view_source(self):
 
 
@@ -5294,18 +5294,18 @@ class App(QtCore.QObject):
             write_png(filename, data)
             write_png(filename, data)
             self.file_saved.emit("png", filename)
             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
         :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()
         obj = self.collection.get_active()
         if obj is None:
         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
             return
 
 
         # Check for more compatible types and add as required
         # 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 (*.*)"
         filter = "Gerber File (*.GBR);;Gerber File (*.GRB);;All Files (*.*)"
         try:
         try:
             filename, _ = QtWidgets.QFileDialog.getSaveFileName(
             filename, _ = QtWidgets.QFileDialog.getSaveFileName(
-                caption="Export Gerber",
+                caption="Save Gerber source file",
                 directory=self.get_last_save_folder() + '/' + name,
                 directory=self.get_last_save_folder() + '/' + name,
                 filter=filter)
                 filter=filter)
         except TypeError:
         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)
         filename = str(filename)
 
 
         if filename == "":
         if filename == "":
-            self.inform.emit("[WARNING_NOTCL]Export Gerber cancelled.")
+            self.inform.emit("[WARNING_NOTCL]Save Gerber source file cancelled.")
             return
             return
         else:
         else:
-            self.export_gerber(name, filename)
+            self.save_source_file(name, filename)
             self.file_saved.emit("Gerber", 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):
     def on_file_exportexcellon(self):
         """
         """
         Callback for menu item File->Export SVG.
         Callback for menu item File->Export SVG.
@@ -5885,19 +5924,19 @@ class App(QtCore.QObject):
         else:
         else:
             make_black_film()
             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.
         Exports a Gerber Object to an Gerber file.
 
 
         :param filename: Path to the Gerber file to save to.
         :param filename: Path to the Gerber file to save to.
         :return:
         :return:
         """
         """
-        self.report_usage("export_gerber()")
+        self.report_usage("save source file()")
 
 
         if filename is None:
         if filename is None:
             filename = self.defaults["global_last_save_folder"]
             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)
         obj = self.collection.get_by_name(obj_name)
 
 
@@ -5906,8 +5945,8 @@ class App(QtCore.QObject):
 
 
         with open(filename, 'w') as file:
         with open(filename, 'w') as file:
             file.writelines('G04*\n')
             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 Filename: %s*\n' % str(obj_name))
             file.writelines('G04 Created on : %s*\n' % time_string)
             file.writelines('G04 Created on : %s*\n' % time_string)
 
 

+ 15 - 12
FlatCAMObj.py

@@ -708,7 +708,8 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
                     break
                     break
 
 
             if self.ui.apertures_table.cellWidget(check_row, 5).isChecked():
             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()
         self.mark_shapes.redraw()
 
 
@@ -738,6 +739,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
                 mark_cb.setChecked(False)
                 mark_cb.setChecked(False)
         for aperture in self.apertures:
         for aperture in self.apertures:
             if mark_all:
             if mark_all:
+                # self.plot_apertures(color='#FF0000BF', marked_aperture=aperture, visible=True)
                 self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True)
                 self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True)
             else:
             else:
                 self.mark_shapes.clear(update=True)
                 self.mark_shapes.clear(update=True)
@@ -1132,7 +1134,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
             assert isinstance(gerber_obj, FlatCAMGerber), \
             assert isinstance(gerber_obj, FlatCAMGerber), \
                 "Expected to initialize a FlatCAMGerber but got %s" % type(gerber_obj)
                 "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.multigeo = False
             gerber_obj.follow = False
             gerber_obj.follow = False
 
 
@@ -1145,9 +1147,10 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
 
 
             # regenerate solid_geometry
             # regenerate solid_geometry
             app_obj.log.debug("Creating new Gerber object. Joining %s polygons.")
             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
             # buffering the poly_buff
             new_geo = MultiPolygon(poly_buff)
             new_geo = MultiPolygon(poly_buff)
@@ -1294,6 +1297,8 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
             visibility = kwargs['visible']
             visibility = kwargs['visible']
 
 
         with self.app.proc_container.new("Plotting Apertures") as proc:
         with self.app.proc_container.new("Plotting Apertures") as proc:
+            self.app.progress.emit(30)
+
             def job_thread(app_obj):
             def job_thread(app_obj):
                 geometry = {}
                 geometry = {}
                 for ap in self.apertures:
                 for ap in self.apertures:
@@ -1302,26 +1307,24 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
                         _ = iter(geometry[int(ap)])
                         _ = iter(geometry[int(ap)])
                     except TypeError:
                     except TypeError:
                         geometry[int(ap)] = [geometry[int(ap)]]
                         geometry[int(ap)] = [geometry[int(ap)]]
-                self.app.progress.emit(10)
+                self.app.progress.emit(30)
 
 
                 try:
                 try:
                     if aperture_to_plot_mark in self.apertures:
                     if aperture_to_plot_mark in self.apertures:
                         for geo in geometry[int(aperture_to_plot_mark)]:
                         for geo in geometry[int(aperture_to_plot_mark)]:
                             if type(geo) == Polygon or type(geo) == LineString:
                             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:
                             else:
                                 for el in geo:
                                 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.mark_shapes.redraw()
-                    self.app.progress.emit(90)
+                    self.app.progress.emit(100)
 
 
                 except (ObjectDeleted, AttributeError):
                 except (ObjectDeleted, AttributeError):
                     self.mark_shapes.clear(update=True)
                     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):
     def serialize(self):
         return {
         return {

+ 2 - 0
README.md

@@ -18,6 +18,8 @@ CAD program, and create G-Code for Isolation routing.
 - fixed Gerber Aperture Table dimensions
 - fixed Gerber Aperture Table dimensions
 - added a Mark All button in the Gerber aperture table.
 - 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.
 - 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
 25.02.2019