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

- soled bug in Gerber Editor: the '0' aperture (the region aperture) had no size which created errors. Made the size to be zero.
- solved bug in editors: the canvas selection shape was not deleted on mouse release if the grid snap was OFF
- solved bug in Excellon Editor: when selecting a drill hole on canvas the selected row in the Tools Table was not the correct onw but the next highest row

Marius Stanciu 6 лет назад
Родитель
Сommit
91e6cc0bff

+ 6 - 0
README.md

@@ -9,6 +9,12 @@ CAD program, and create G-Code for Isolation routing.
 
 
 =================================================
 =================================================
 
 
+29.04.2019
+
+- soled bug in Gerber Editor: the '0' aperture (the region aperture) had no size which created errors. Made the size to be zero.
+- solved bug in editors: the canvas selection shape was not deleted on mouse release if the grid snap was OFF
+- solved bug in Excellon Editor: when selecting a drill hole on canvas the selected row in the Tools Table was not the correct onw but the next highest row
+
 26.04.2019
 26.04.2019
 
 
 - small changes in GUI; optimized contextual menu display
 - small changes in GUI; optimized contextual menu display

+ 5 - 0
camlib.py

@@ -2554,6 +2554,7 @@ class Gerber (Geometry):
                     if '0' not in self.apertures:
                     if '0' not in self.apertures:
                         self.apertures['0'] = {}
                         self.apertures['0'] = {}
                         self.apertures['0']['type'] = 'REG'
                         self.apertures['0']['type'] = 'REG'
+                        self.apertures['0']['size'] = 0.0
                         self.apertures['0']['solid_geometry'] = []
                         self.apertures['0']['solid_geometry'] = []
 
 
                     # if D02 happened before G37 we now have a path with 1 element only so we have to add the current
                     # if D02 happened before G37 we now have a path with 1 element only so we have to add the current
@@ -2625,6 +2626,7 @@ class Gerber (Geometry):
                         # else:
                         # else:
                         #     if '0' not in self.apertures:
                         #     if '0' not in self.apertures:
                         #         self.apertures['0'] = {}
                         #         self.apertures['0'] = {}
+                        #         self.apertures['0']['size'] = 0.0
                         #         self.apertures['0']['type'] = 'REG'
                         #         self.apertures['0']['type'] = 'REG'
                         #         self.apertures['0']['solid_geometry'] = []
                         #         self.apertures['0']['solid_geometry'] = []
                         #     used_aperture = '0'
                         #     used_aperture = '0'
@@ -2732,6 +2734,7 @@ class Gerber (Geometry):
                                 if '0' not in self.apertures:
                                 if '0' not in self.apertures:
                                     self.apertures['0'] = {}
                                     self.apertures['0'] = {}
                                     self.apertures['0']['type'] = 'REG'
                                     self.apertures['0']['type'] = 'REG'
+                                    self.apertures['0']['size'] = 0.0
                                     self.apertures['0']['solid_geometry'] = []
                                     self.apertures['0']['solid_geometry'] = []
                                 last_path_aperture = '0'
                                 last_path_aperture = '0'
                         else:
                         else:
@@ -2751,6 +2754,7 @@ class Gerber (Geometry):
                                     if '0' not in self.apertures:
                                     if '0' not in self.apertures:
                                         self.apertures['0'] = {}
                                         self.apertures['0'] = {}
                                         self.apertures['0']['type'] = 'REG'
                                         self.apertures['0']['type'] = 'REG'
+                                        self.apertures['0']['size'] = 0.0
                                         self.apertures['0']['solid_geometry'] = []
                                         self.apertures['0']['solid_geometry'] = []
                                     last_path_aperture = '0'
                                     last_path_aperture = '0'
                                 geo = Polygon()
                                 geo = Polygon()
@@ -2784,6 +2788,7 @@ class Gerber (Geometry):
                                     if '0' not in self.apertures:
                                     if '0' not in self.apertures:
                                         self.apertures['0'] = {}
                                         self.apertures['0'] = {}
                                         self.apertures['0']['type'] = 'REG'
                                         self.apertures['0']['type'] = 'REG'
+                                        self.apertures['0']['size'] = 0.0
                                         self.apertures['0']['solid_geometry'] = []
                                         self.apertures['0']['solid_geometry'] = []
                                     last_path_aperture = '0'
                                     last_path_aperture = '0'
                                 elem = [linear_x, linear_y]
                                 elem = [linear_x, linear_y]

+ 11 - 6
flatcamEditors/FlatCAMExcEditor.py

@@ -643,7 +643,7 @@ class FCDrillSelect(DrawTool):
                         sel_tools.add(storage)
                         sel_tools.add(storage)
 
 
             for storage in sel_tools:
             for storage in sel_tools:
-                self.exc_editor_app.tools_table_exc.selectRow(int(storage))
+                self.exc_editor_app.tools_table_exc.selectRow(int(storage) - 1)
                 self.draw_app.last_tool_selected = int(storage)
                 self.draw_app.last_tool_selected = int(storage)
 
 
             self.exc_editor_app.tools_table_exc.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
             self.exc_editor_app.tools_table_exc.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
@@ -2129,11 +2129,16 @@ class FlatCAMExcEditor(QtCore.QObject):
                                                    "%.4f    " % (0, 0))
                                                    "%.4f    " % (0, 0))
             self.pos = self.canvas.vispy_canvas.translate_coords(event.pos)
             self.pos = self.canvas.vispy_canvas.translate_coords(event.pos)
 
 
-            ### Snap coordinates
-            x, y = self.app.geo_editor.snap(self.pos[0], self.pos[1])
-
-            self.pos = (x, y)
-            # print(self.active_tool)
+            # Snap coordinates
+            if self.app.grid_status():
+                self.pos = self.app.geo_editor.snap(self.pos[0], self.pos[1])
+                self.app.app_cursor.enabled = True
+                # Update cursor
+                self.app.app_cursor.set_data(np.asarray([(self.pos[0], self.pos[1])]), symbol='++', edge_color='black',
+                                             size=20)
+            else:
+                self.pos = (self.pos[0], self.pos[1])
+                self.app.app_cursor.enabled = False
 
 
             # Selection with left mouse button
             # Selection with left mouse button
             if self.active_tool is not None and event.button is 1:
             if self.active_tool is not None and event.button is 1:

+ 1 - 0
flatcamEditors/FlatCAMGeoEditor.py

@@ -3321,6 +3321,7 @@ class FlatCAMGeoEditor(QtCore.QObject):
             self.app.app_cursor.set_data(np.asarray([(self.pos[0], self.pos[1])]), symbol='++', edge_color='black',
             self.app.app_cursor.set_data(np.asarray([(self.pos[0], self.pos[1])]), symbol='++', edge_color='black',
                                          size=20)
                                          size=20)
         else:
         else:
+            self.pos = (self.pos[0], self.pos[1])
             self.app.app_cursor.enabled = False
             self.app.app_cursor.enabled = False
 
 
         if event.button is 1:
         if event.button is 1:

+ 2 - 1
flatcamEditors/FlatCAMGrbEditor.py

@@ -3245,9 +3245,9 @@ class FlatCAMGrbEditor(QtCore.QObject):
             self.app.app_cursor.set_data(np.asarray([(self.pos[0], self.pos[1])]), symbol='++', edge_color='black',
             self.app.app_cursor.set_data(np.asarray([(self.pos[0], self.pos[1])]), symbol='++', edge_color='black',
                                          size=20)
                                          size=20)
         else:
         else:
+            self.pos = (self.pos[0], self.pos[1])
             self.app.app_cursor.enabled = False
             self.app.app_cursor.enabled = False
 
 
-
         if event.button is 1:
         if event.button is 1:
             self.app.ui.rel_position_label.setText("<b>Dx</b>: %.4f&nbsp;&nbsp;  <b>Dy</b>: "
             self.app.ui.rel_position_label.setText("<b>Dx</b>: %.4f&nbsp;&nbsp;  <b>Dy</b>: "
                                                    "%.4f&nbsp;&nbsp;&nbsp;&nbsp;" % (0, 0))
                                                    "%.4f&nbsp;&nbsp;&nbsp;&nbsp;" % (0, 0))
@@ -3377,6 +3377,7 @@ class FlatCAMGrbEditor(QtCore.QObject):
         :type Bool
         :type Bool
         :return:
         :return:
         """
         """
+
         poly_selection = Polygon([start_pos, (end_pos[0], start_pos[1]), end_pos, (start_pos[0], end_pos[1])])
         poly_selection = Polygon([start_pos, (end_pos[0], start_pos[1]), end_pos, (start_pos[0], end_pos[1])])
         sel_aperture = set()
         sel_aperture = set()
         self.apertures_table.clearSelection()
         self.apertures_table.clearSelection()

+ 18 - 29
flatcamTools/ToolSilk.py

@@ -181,32 +181,30 @@ class ToolSilk(FlatCAMTool):
 
 
         # start the QTimer with 1 second period check
         # start the QTimer with 1 second period check
         self.periodic_check(1000)
         self.periodic_check(1000)
+
         for apid in self.silk_obj.apertures:
         for apid in self.silk_obj.apertures:
             ap_size = self.silk_obj.apertures[apid]['size']
             ap_size = self.silk_obj.apertures[apid]['size']
-            geo_list = self.silk_obj.apertures[apid]['solid_geometry']
+            geo = self.silk_obj.apertures[apid]['solid_geometry']
             self.app.worker_task.emit({'fcn': self.aperture_intersection,
             self.app.worker_task.emit({'fcn': self.aperture_intersection,
-                                       'params': [apid, geo_list]})
+                                       'params': [apid, geo]})
 
 
-    def aperture_intersection(self, apid, geo_list):
+    def aperture_intersection(self, apid, geo):
         self.promises.append(apid)
         self.promises.append(apid)
         new_solid_geometry = []
         new_solid_geometry = []
 
 
         with self.app.proc_container.new(_("Parsing aperture %s geometry ..." % str(apid))):
         with self.app.proc_container.new(_("Parsing aperture %s geometry ..." % str(apid))):
-            for geo_silk in geo_list:
+            for geo_silk in geo:
                 for ap in self.sm_obj.apertures:
                 for ap in self.sm_obj.apertures:
                     for solder_poly in self.sm_obj.apertures[ap]['solid_geometry']:
                     for solder_poly in self.sm_obj.apertures[ap]['solid_geometry']:
-                        if geo_silk.exterior.intersects(solder_poly):
+                        if geo_silk.intersects(solder_poly):
+
+                            new_geo = self.subtract_polygon(geo_silk, solder_poly.exterior)
 
 
-                            new_geo = self.subtract_polygon(geo_silk, solder_poly)
                             if not new_geo.is_empty:
                             if not new_geo.is_empty:
-                                # if the resulting geometry is not empty add it to the new_apertures solid_geometry
-                                try:
-                                    for g in new_geo:
-                                        new_solid_geometry.append(g)
-                                except TypeError:
-                                    new_solid_geometry.append(new_geo)
-                        # else:
-                        #     new_solid_geometry.append(geo_silk)
+                                new_solid_geometry.append(new_geo)
+                        else:
+                            new_solid_geometry.append(geo)
+
         if new_solid_geometry:
         if new_solid_geometry:
             while True:
             while True:
                 if self.new_apertures[apid]['solid_geometry']:
                 if self.new_apertures[apid]['solid_geometry']:
@@ -224,28 +222,19 @@ class ToolSilk(FlatCAMTool):
 
 
         log.debug("Promise fulfilled: %s" % str(apid))
         log.debug("Promise fulfilled: %s" % str(apid))
 
 
-    def subtract_polygon(self, geometry, polygon):
+    def subtract_polygon(self, silk_geo, sm_exterior):
         """
         """
         Subtract polygon from the given object. This only operates on the paths in the original geometry, i.e.
         Subtract polygon from the given object. This only operates on the paths in the original geometry, i.e.
         it converts polygons into paths.
         it converts polygons into paths.
 
 
-        :param geometry: The geometry from which to substract.
-        :param polygon: The substractor geometry
+        :param silk_geo: The geometry from which to substract.
+        :param sm_exterior: The substractor geometry
         :return: none
         :return: none
         """
         """
 
 
-        # pathonly should be always True, otherwise polygons are not subtracted
-        flat_geometry = self.flatten(geometry=geometry, pathonly=True)
-
-        toolgeo = cascaded_union(polygon)
-        diffs = []
-        for target in flat_geometry:
-            if type(target) == LineString or type(target) == LinearRing:
-                diffs.append(target.difference(toolgeo))
-            else:
-                log.warning("Not implemented.")
-
-        return cascaded_union(diffs)
+        geo = cascaded_union(silk_geo)
+        diff_geo = geo.difference(sm_exterior)
+        return diff_geo
 
 
     def flatten(self, geometry=None, reset=True, pathonly=False):
     def flatten(self, geometry=None, reset=True, pathonly=False):
         """
         """