diff --git a/lib/extensions/break_apart.py b/lib/extensions/break_apart.py index 32f548f6f..30b2a4b0f 100644 --- a/lib/extensions/break_apart.py +++ b/lib/extensions/break_apart.py @@ -21,7 +21,7 @@ class BreakApart(InkstitchExtension): InkstitchExtension.__init__(self, *args, **kwargs) self.OptionParser.add_option("-m", "--method", type="int", default=1, dest="method") - def effect(self): + def effect(self): # noqa: C901 if not self.selected: inkex.errormsg(_("Please select one or more fill areas to break apart.")) return @@ -38,10 +38,13 @@ class BreakApart(InkstitchExtension): # we don't want to touch valid elements paths = element.flatten(element.parse_path()) - paths.sort(key=lambda point_list: Polygon(point_list).area, reverse=True) - polygon = MultiPolygon([(paths[0], paths[1:])]) - if self.geom_is_valid(polygon): - continue + try: + paths.sort(key=lambda point_list: Polygon(point_list).area, reverse=True) + polygon = MultiPolygon([(paths[0], paths[1:])]) + if self.geom_is_valid(polygon): + continue + except ValueError: + pass polygons = self.break_apart_paths(paths) polygons = self.ensure_minimum_size(polygons, 5) @@ -54,13 +57,15 @@ class BreakApart(InkstitchExtension): def break_apart_paths(self, paths): polygons = [] for path in paths: + if len(path) < 3: + continue linestring = LineString(path) - polygon = Polygon(path).buffer(0) if not linestring.is_simple: linestring = unary_union(linestring) for polygon in polygonize(linestring): polygons.append(polygon) else: + polygon = Polygon(path).buffer(0) polygons.append(polygon) return polygons