summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/elements/fill_stitch.py12
-rw-r--r--lib/stitches/meander_fill.py2
-rw-r--r--lib/svg/tags.py1
-rw-r--r--lib/tiles.py20
4 files changed, 24 insertions, 11 deletions
diff --git a/lib/elements/fill_stitch.py b/lib/elements/fill_stitch.py
index 7b146a36..8f22278b 100644
--- a/lib/elements/fill_stitch.py
+++ b/lib/elements/fill_stitch.py
@@ -186,8 +186,20 @@ class FillStitch(EmbroideryElement):
return self.get_param('meander_pattern', min(tiles.all_tiles()).id)
@property
+ @param('meander_angle',
+ _('Meander pattern angle'),
+ type='float', unit="degrees",
+ default=0,
+ select_items=[('fill_method', 'meander_fill')],
+ sort_index=4)
+ def meander_angle(self):
+ return math.radians(self.get_float_param('meander_angle', 0))
+
+ @property
@param('meander_scale_percent',
_('Meander pattern scale'),
+ tooltip=_("Percentage to stretch or compress the meander pattern. You can scale horizontally " +
+ "and vertically individually by giving two percentages separated by a space. "),
type='float', unit="%",
default=100,
select_items=[('fill_method', 'meander_fill')],
diff --git a/lib/stitches/meander_fill.py b/lib/stitches/meander_fill.py
index 6fdd94b8..08ff4999 100644
--- a/lib/stitches/meander_fill.py
+++ b/lib/stitches/meander_fill.py
@@ -27,7 +27,7 @@ def meander_fill(fill, shape, original_shape, shape_index, starting_point, endin
debug.log(f"tile name: {tile.name}")
debug.log_line_strings(lambda: ensure_geometry_collection(shape.boundary).geoms, 'Meander shape')
- graph = tile.to_graph(shape, fill.meander_scale)
+ graph = tile.to_graph(shape, fill.meander_scale, fill.meander_angle)
if not graph:
label = fill.node.label or fill.node.get_id()
diff --git a/lib/svg/tags.py b/lib/svg/tags.py
index 951821b5..bbef6ebb 100644
--- a/lib/svg/tags.py
+++ b/lib/svg/tags.py
@@ -81,6 +81,7 @@ inkstitch_attribs = [
'reverse',
'meander_pattern',
'meander_scale_percent',
+ 'meander_angle',
'expand_mm',
'fill_underlay',
'fill_underlay_angle',
diff --git a/lib/tiles.py b/lib/tiles.py
index 15017e91..0bf92abc 100644
--- a/lib/tiles.py
+++ b/lib/tiles.py
@@ -111,20 +111,20 @@ class Tile:
return translated_tile
- def _scale(self, x_scale, y_scale):
- scaled_shift0 = self.shift0.scale(x_scale, y_scale)
- scaled_shift1 = self.shift1.scale(x_scale, y_scale)
+ def _scale_and_rotate(self, x_scale, y_scale, angle):
+ transformed_shift0 = self.shift0.scale(x_scale, y_scale).rotate(angle)
+ transformed_shift1 = self.shift1.scale(x_scale, y_scale).rotate(angle)
- scaled_tile = []
+ transformed_tile = []
for start, end in self.tile:
- start = start.scale(x_scale, y_scale)
- end = end.scale(x_scale, y_scale)
- scaled_tile.append((start, end))
+ start = start.scale(x_scale, y_scale).rotate(angle)
+ end = end.scale(x_scale, y_scale).rotate(angle)
+ transformed_tile.append((start, end))
- return scaled_shift0, scaled_shift1, scaled_tile
+ return transformed_shift0, transformed_shift1, transformed_tile
@debug.time
- def to_graph(self, shape, scale):
+ def to_graph(self, shape, scale, angle):
"""Apply this tile to a shape, repeating as necessary.
Return value:
@@ -134,7 +134,7 @@ class Tile:
"""
self._load()
x_scale, y_scale = scale
- shift0, shift1, tile = self._scale(x_scale, y_scale)
+ shift0, shift1, tile = self._scale_and_rotate(x_scale, y_scale, angle)
shape_center, shape_width, shape_height = self._get_center_and_dimensions(shape)
prepared_shape = prep(shape)