diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 1fe8b020..fb61874f 100644 --- a/FlatCAMObj.py +++ b/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" diff --git a/README.md b/README.md index 787c2fd4..4c4efb61 100644 --- a/README.md +++ b/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 diff --git a/camlib.py b/camlib.py index 6b48e634..ebcfcdaa 100644 --- a/camlib.py +++ b/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