diff options
| author | Andreas <v.andreas.1@web.de> | 2021-10-21 16:24:40 +0200 |
|---|---|---|
| committer | Kaalleen <reni@allenka.de> | 2022-05-04 18:55:40 +0200 |
| commit | 0fcf8bb97ced8df552cd0283b4ea009b6ca42623 (patch) | |
| tree | 9fbb5053db31a15ec140ed95f7b2634e987fe12d /lib/stitches/fill.py | |
| parent | ea66eb8685524881ad34d412a8bbaeb482e5a9cf (diff) | |
added tangential and guided fill
Diffstat (limited to 'lib/stitches/fill.py')
| -rw-r--r-- | lib/stitches/fill.py | 64 |
1 files changed, 61 insertions, 3 deletions
diff --git a/lib/stitches/fill.py b/lib/stitches/fill.py index 21e35d83..4e1669e9 100644 --- a/lib/stitches/fill.py +++ b/lib/stitches/fill.py @@ -6,12 +6,11 @@ import math import shapely - -from ..stitch_plan import Stitch +from shapely.geometry.linestring import LineString from ..svg import PIXELS_PER_MM from ..utils import Point as InkstitchPoint from ..utils import cache - +from ..stitch_plan import Stitch def legacy_fill(shape, angle, row_spacing, end_row_spacing, max_stitch_length, flip, staggers, skip_last): rows_of_segments = intersect_region_with_grating(shape, angle, row_spacing, end_row_spacing, flip) @@ -89,6 +88,65 @@ def stitch_row(stitches, beg, end, angle, row_spacing, max_stitch_length, stagge if (end - stitches[-1]).length() > 0.1 * PIXELS_PER_MM and not skip_last: stitches.append(end) +def extend_line(line, minx,maxx,miny,maxy): + line = line.simplify(0.01, False) + + upper_left = InkstitchPoint(minx, miny) + lower_right = InkstitchPoint(maxx, maxy) + length = (upper_left - lower_right).length() + + point1 = InkstitchPoint(*line.coords[0]) + point2 = InkstitchPoint(*line.coords[1]) + new_starting_point = point1-(point2-point1).unit()*length + + point3 = InkstitchPoint(*line.coords[-2]) + point4 = InkstitchPoint(*line.coords[-1]) + new_ending_point = point4+(point4-point3).unit()*length + + line = LineString([new_starting_point.as_tuple()]+line.coords[1:-1]+[new_ending_point.as_tuple()]) + + +def intersect_region_with_grating_line(shape, line, row_spacing, end_row_spacing=None, flip=False): + + row_spacing = abs(row_spacing) + (minx, miny, maxx, maxy) = shape.bounds + upper_left = InkstitchPoint(minx, miny) + rows = [] + extend_line(line, minx,maxx,miny,maxy) #extend the line towards the ends to increase probability that all offsetted curves cross the shape + + line_offsetted = line + res = line_offsetted.intersection(shape) + while isinstance(res, (shapely.geometry.GeometryCollection, shapely.geometry.MultiLineString)) or (not res.is_empty and len(res.coords) > 1): + if isinstance(res, (shapely.geometry.GeometryCollection, shapely.geometry.MultiLineString)): + runs = [line_string.coords for line_string in res.geoms if (not line_string.is_empty and len(line_string.coords) > 1)] + else: + runs = [res.coords] + + runs.sort(key=lambda seg: (InkstitchPoint(*seg[0]) - upper_left).length()) + if flip: + runs.reverse() + runs = [tuple(reversed(run)) for run in runs] + + if row_spacing > 0: + rows.append(runs) + else: + rows.insert(0,runs) + line_offsetted = line_offsetted.parallel_offset(row_spacing,'left',5) + if row_spacing < 0: + line_offsetted.coords = line_offsetted.coords[::-1] + line_offsetted = line_offsetted.simplify(0.01, False) + res = line_offsetted.intersection(shape) + if row_spacing > 0 and not isinstance(res, (shapely.geometry.GeometryCollection, shapely.geometry.MultiLineString)): + if (res.is_empty or len(res.coords) == 1): + row_spacing = -row_spacing + #print("Set to right") + line_offsetted = line.parallel_offset(row_spacing,'left',5) + line_offsetted.coords = line_offsetted.coords[::-1] #using negative row spacing leads as a side effect to reversed offsetted lines - here we undo this + line_offsetted = line_offsetted.simplify(0.01, False) + res = line_offsetted.intersection(shape) + + return rows + def intersect_region_with_grating(shape, angle, row_spacing, end_row_spacing=None, flip=False): # the max line length I'll need to intersect the whole shape is the diagonal |
