Quellcode durchsuchen

- fixed cutting from copper features when doing Gerber isolation with multiple passes

Marius Stanciu vor 7 Jahren
Ursprung
Commit
ddf4884051
3 geänderte Dateien mit 27 neuen und 11 gelöschten Zeilen
  1. 7 4
      FlatCAMObj.py
  2. 1 0
      README.md
  3. 19 7
      camlib.py

+ 7 - 4
FlatCAMObj.py

@@ -604,6 +604,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
                 geom = self.isolation_geometry(offset, iso_type=envelope_iso_type)
             except Exception as e:
                 log.debug(str(e))
+                return 'fail'
 
             if invert:
                 try:
@@ -614,8 +615,10 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
                         geom = MultiPolygon(pl)
                     elif type(geom) is Polygon:
                         geom = Polygon(geom.exterior.coords[::-1], geom.interiors)
+                    else:
+                        log.debug("FlatCAMGerber.isolate().generate_envelope() Error --> Unexpected Geometry")
                 except Exception as e:
-                    s = str("Unexpected Geometry")
+                    log.debug("FlatCAMGerber.isolate().generate_envelope() Error --> %s" % str(e))
             return geom
 
         if combine:
@@ -633,14 +636,14 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
                 geo_obj.options["cnctooldia"] = self.options["isotooldia"]
                 geo_obj.solid_geometry = []
                 for i in range(passes):
-                    offset = (((2 * i + 1) / 2.0) * dia) - (i * overlap * dia)
+                    iso_offset = (((2 * i + 1) / 2.0) * dia) - (i * overlap * dia)
 
                     # if milling type is climb then the move is counter-clockwise around features
                     if milling_type == 'cl':
                         # geom = generate_envelope (offset, i == 0)
-                        geom = generate_envelope(offset, 1, envelope_iso_type=self.iso_type)
+                        geom = generate_envelope(iso_offset, 1, envelope_iso_type=self.iso_type)
                     else:
-                        geom = generate_envelope(offset, 0, envelope_iso_type=self.iso_type)
+                        geom = generate_envelope(iso_offset, 0, envelope_iso_type=self.iso_type)
                     geo_obj.solid_geometry.append(geom)
 
                 # detect if solid_geometry is empty and this require list flattening which is "heavy"

+ 1 - 0
README.md

@@ -12,6 +12,7 @@ CAD program, and create G-Code for Isolation routing.
 7.01.2019
 
 - added tooltips in Edit->Convert menu
+- fixed cutting from copper features when doing Gerber isolation with multiple passes
 
 6.01.2019
 

+ 19 - 7
camlib.py

@@ -519,14 +519,26 @@ class Geometry(object):
         #             geo_iso.append(mp_geo.buffer(offset, int(int(self.geo_steps_per_circle) / 4)))
         #     except TypeError:
         #         geo_iso.append(self.solid_geometry.buffer(offset, int(int(self.geo_steps_per_circle) / 4)))
+        # return geo_iso
 
-        geo_iso = []
-        flattened_geo = self.flatten_list(self.solid_geometry)
-        try:
-            for mp_geo in flattened_geo:
-                geo_iso.append(mp_geo.buffer(offset, int(int(self.geo_steps_per_circle) / 4)))
-        except TypeError:
-            geo_iso.append(self.solid_geometry.buffer(offset, int(int(self.geo_steps_per_circle) / 4)))
+
+        # commented this because of the bug with multiple passes cutting out of the copper
+        # geo_iso = []
+        # flattened_geo = self.flatten_list(self.solid_geometry)
+        # try:
+        #     for mp_geo in flattened_geo:
+        #         geo_iso.append(mp_geo.buffer(offset, int(int(self.geo_steps_per_circle) / 4)))
+        # except TypeError:
+        #     geo_iso.append(self.solid_geometry.buffer(offset, int(int(self.geo_steps_per_circle) / 4)))
+
+
+        # the previously commented block is replaced with this block - regression - to solve the bug with multiple
+        # isolation passes cutting from the copper features
+        if offset == 0:
+            geo_iso = self.solid_geometry
+        else:
+            geo_iso = self.solid_geometry.buffer(offset, int(self.geo_steps_per_circle / 4))
+        # end of replaced block
 
         if iso_type == 2:
             return geo_iso