Pull comp: remove holes again (#3067)

* pull comp: remove holes again
* rescue some more broken shapes
pull/3071/head
Kaalleen 2024-07-09 18:18:49 +02:00 zatwierdzone przez GitHub
rodzic f55571eac1
commit 4644c11949
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
2 zmienionych plików z 14 dodań i 2 usunięć

Wyświetl plik

@ -139,7 +139,7 @@ class StitchPlanPreview(InkstitchExtension):
out = findall(r"(?m)^-?\d+\.?\d*$", out)
# Parse the returned coordinates out into viewport units
x, y, width, height = map(lambda x: svg.viewport_to_unit(f'{x}px', svg.unit), out)
x, y, width, height = map(lambda x: svg.viewport_to_unit(f'{x}px'), out)
# Embed the rasterized stitch plan into the SVG, and replace the original stitch plan
with open(temp_png_path, "rb") as f:

Wyświetl plik

@ -140,7 +140,19 @@ def adjust_shape_for_pull_compensation(shape, angle, row_spacing, pull_compensat
buffered_lines = [line.buffer(buffer_amount) for line in lines]
polygon = unary_union(buffered_lines)
return make_valid(polygon)
exterior = smooth_path(polygon.exterior.coords, 0.2)
min_hole_area = row_spacing ** 2
interiors = [smooth_path(interior.coords) for interior in polygon.interiors if shgeo.Polygon(interior).area > min_hole_area]
shape = make_valid(shgeo.Polygon(exterior, interiors))
if shape.geom_type == 'MultiPolygon':
# the shape is somehow messed up
# rescue it by just using the first geometry
shape = list(shape.geoms)
shape.sort(key=lambda polygon: polygon.area, reverse=True)
shape = shape[0]
return shape
def apply_pull_compensation(segments, pull_compensation_px, pull_compensation_percent):