summaryrefslogtreecommitdiff
path: root/lib/elements
diff options
context:
space:
mode:
Diffstat (limited to 'lib/elements')
-rw-r--r--lib/elements/satin_column.py42
1 files changed, 38 insertions, 4 deletions
diff --git a/lib/elements/satin_column.py b/lib/elements/satin_column.py
index 42e3362c..8330d67a 100644
--- a/lib/elements/satin_column.py
+++ b/lib/elements/satin_column.py
@@ -16,6 +16,7 @@ from shapely.ops import nearest_points
from ..debug import debug
from ..i18n import _
+from ..metadata import InkStitchMetadata
from ..stitch_plan import StitchGroup
from ..stitches import running_stitch
from ..svg import line_strings_to_csp, point_lists_to_csp
@@ -515,6 +516,12 @@ class SatinColumn(EmbroideryElement):
@property
@cache
+ def min_stitch_len(self):
+ metadata = InkStitchMetadata(self.node.root)
+ return metadata['min_stitch_len_mm'] * PIXELS_PER_MM
+
+ @property
+ @cache
def flattened_sections(self):
"""Flatten the rails, cut with the rungs, and return the sections in pairs."""
@@ -1066,12 +1073,34 @@ class SatinColumn(EmbroideryElement):
self.random_width_decrease.any() or self.random_width_increase.any() or self.random_zigzag_spacing,
)
+ short_pairs = self.inset_short_stitches_sawtooth(pairs)
+ max_stitch_length = self.max_stitch_length_px
+ length_sigma = self.random_split_jitter
+ random_phase = self.random_split_phase
+ min_split_length = self.min_random_split_length_px
+ seed = self.random_seed
+ last_point = None
# "left" and "right" here are kind of arbitrary designations meaning
# a point from the first and second rail respectively
- for left, right in pairs:
- patch.add_stitch(left)
- patch.add_stitch(right)
- patch.add_stitch(left)
+ for i, (left, right), (a_short, b_short) in zip(itertools.count(0), pairs, short_pairs):
+ check_stop_flag()
+ split_points, _ = self.get_split_points(
+ left, right, a_short, b_short, max_stitch_length,
+ None, length_sigma, random_phase, min_split_length,
+ prng.join_args(seed, 'satin-split', 2 * i + 1))
+
+ # zigzag spacing is wider than stitch length, subdivide
+ if last_point is not None and max_stitch_length is not None and self.zigzag_spacing > max_stitch_length:
+ points, _ = self.get_split_points(last_point, left, last_point, left, max_stitch_length)
+ patch.add_stitches(points)
+
+ patch.add_stitch(a_short, ("edge"))
+ patch.add_stitches(split_points, ("split_stitch"))
+ patch.add_stitch(b_short, ("edge"))
+ patch.add_stitches(split_points[::-1], ("split_stitch"))
+ patch.add_stitch(a_short, ("edge"))
+
+ last_point = a_short
if self._center_walk_is_odd():
patch.stitches = list(reversed(patch.stitches))
@@ -1089,6 +1118,11 @@ class SatinColumn(EmbroideryElement):
return ([], 1)
if random_phase:
points = running_stitch.split_segment_random_phase(a_short, b_short, length, length_sigma, seed)
+ # avoid hard stitches: do not insert split stitches near the end points
+ if len(points) > 1 and points[0].distance(shgeo.Point(a)) <= self.min_stitch_len:
+ del points[0]
+ if len(points) > 1 and points[-1].distance(shgeo.Point(b)) <= self.min_stitch_len:
+ del points[-1]
return (points, None)
elif count is not None:
points = running_stitch.split_segment_even_n(a, b, count, length_sigma, seed)