diff --git a/CHANGELOG.md b/CHANGELOG.md index 520f80f6..40aed027 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ CHANGELOG for FlatCAM beta ================================================= +28.10.2021 + +- cleaned the geometry generated by flattening by removing the empty geometry; fixed issue #539 on jpcgt's bitbucket account + 27.10.2021 - fixed the offseting feature in the Isolation Plugin such that the interiors of the isolated polygons are offset correctly diff --git a/camlib.py b/camlib.py index f397739c..cb9ac65f 100644 --- a/camlib.py +++ b/camlib.py @@ -959,7 +959,8 @@ class Geometry(object): # ## If iterable, expand recursively. try: - for geo in geometry: + work_geo = geometry.geoms if isinstance(geometry, (MultiPolygon, MultiLineString)) else geometry + for geo in work_geo: if geo is not None: self.flatten(geometry=geo, reset=False, @@ -968,12 +969,14 @@ class Geometry(object): # ## Not iterable, do the actual indexing and add. except TypeError: if pathonly and type(geometry) == Polygon: - self.flat_geometry.append(geometry.exterior) - self.flatten(geometry=geometry.interiors, - reset=False, - pathonly=True) + ext_geo = geometry.exterior + ints_geo = geometry.interiors + if ext_geo is not None and not ext_geo.is_empty: + self.flat_geometry.append(ext_geo) + self.flatten(geometry=ints_geo, reset=False, pathonly=True) else: - self.flat_geometry.append(geometry) + if geometry is not None and not geometry.is_empty: + self.flat_geometry.append(geometry) return self.flat_geometry @@ -993,7 +996,8 @@ class Geometry(object): geometry = self.solid_geometry # ## If iterable, expand recursively. try: - for geo in geometry: + work_geo = geometry.geoms if isinstance(geometry, (MultiPolygon, MultiLineString)) else geometry + for geo in work_geo: if geo is not None: ext, ints = self.flatten_exterior_interiors(geo) flat_geo_ext += ext @@ -1001,10 +1005,16 @@ class Geometry(object): # ## Not iterable, do the actual indexing and add. except TypeError: if type(geometry) == Polygon: - flat_geo_ext.append(geometry.exterior) - flat_geo_ints += geometry.interiors + ext_geo = geometry.exterior + ints_geo = geometry.interiors + if ext_geo is not None and not ext_geo.is_empty: + flat_geo_ext.append(ext_geo) + for i_geo in ints_geo: + if i_geo is not None and not i_geo.is_empty: + flat_geo_ints.append(i_geo) elif isinstance(geometry, (LineString, LinearRing)): - flat_geo_ext.append(geometry) + if geometry is not None and not geometry.is_empty: + flat_geo_ext.append(geometry) return flat_geo_ext, flat_geo_ints @@ -3155,13 +3165,17 @@ class CNCjob(Geometry): log.debug("Indexing geometry before generating G-Code...") self.app.inform.emit(_("Indexing geometry before generating G-Code...")) - for geo_shape in geometry: + work_geo = geometry.geoms if isinstance(geometry, (MultiPolygon, MultiLineString)) else geometry + for geo_shape in work_geo: if self.app.abort_flag: # graceful abort requested by the user raise grace if geo_shape is not None: - storage.insert(geo_shape) + try: + storage.insert(geo_shape) + except Exception: + pass current_pt = (0, 0) pt, geo = storage.nearest(current_pt) @@ -3651,6 +3665,8 @@ class CNCjob(Geometry): else: temp_solid_geometry = flat_geometry + temp_solid_geometry = [t_geo for t_geo in temp_solid_geometry if not t_geo.is_empty] + if self.z_cut is None: if 'laser' not in self.pp_geometry_name: self.app.inform.emit( @@ -3774,8 +3790,11 @@ class CNCjob(Geometry): geo_storage = {} for geo in temp_solid_geometry: - if geo is not None: - geo_storage[geo.coords[0]] = geo + if geo is not None and isinstance(geo, (MultiPolygon, MultiLineString, LineString, LinearRing)): + try: + geo_storage[geo.coords[0]] = geo + except Exception: + pass locations = list(geo_storage.keys()) if opt_type == 'M':