Merge pull request #732 from inkstitch/kaalleen/fix-break-apart-small-path-issue

fix break apart small path issue
master
Lex Neva 2020-08-18 16:15:11 -04:00 zatwierdzone przez GitHub
commit e5e16edc0d
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
1 zmienionych plików z 11 dodań i 6 usunięć

Wyświetl plik

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