summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaalleen <reni@allenka.de>2023-05-19 18:12:45 +0200
committerKaalleen <reni@allenka.de>2023-05-19 18:12:45 +0200
commit5a0d2b312631d5c6c59c8c6aa7ee0119b5da11d4 (patch)
tree752aac5e5153038df0f9380d622460a5ae2ab549
parent516dafb33ff967390c6e733939192979f1b5f0ae (diff)
adjust smoothed zigzag rungs
-rw-r--r--lib/extensions/zigzag_line_to_satin.py48
1 files changed, 40 insertions, 8 deletions
diff --git a/lib/extensions/zigzag_line_to_satin.py b/lib/extensions/zigzag_line_to_satin.py
index 36933321..8794f4dc 100644
--- a/lib/extensions/zigzag_line_to_satin.py
+++ b/lib/extensions/zigzag_line_to_satin.py
@@ -32,15 +32,17 @@ class ZigzagLineToSatin(InkstitchExtension):
point_list = list(node.get_path().end_points)
rails, rungs = self._get_rails_and_rungs(point_list)
- if self.options.rungs:
- if self.options.reduce_rungs and len(rungs) > 2:
- rungs = rungs[0::2]
- d.extend(self._rung_path(rungs))
if not self.options.smoothing:
for rail in rails:
d.append('M ' + ' '.join([str(point) for point in rail]))
else:
- d.append(self._smooth_path(rails))
+ rails, rungs = self._smooth_path(rails, rungs)
+ d.append(rails)
+
+ if self.options.rungs:
+ if self.options.pattern != 'zigzag' and self.options.reduce_rungs and len(rungs) > 2:
+ rungs = rungs[0::2]
+ d.extend(self._rung_path(rungs))
node.set('d', " ".join(d))
node.set('inkstitch:satin_column', True)
@@ -89,10 +91,14 @@ class ZigzagLineToSatin(InkstitchExtension):
rungs.extend([[points[0], points[1]], [points[2], points[3]]])
return rails, rungs
- def _smooth_path(self, rails):
+ def _smooth_path(self, rails, rungs):
path_commands = []
+ new_rungs = []
+ k = [1, 0]
smoothing = 0.4
- for rail in rails:
+ has_equal_rail_point_count = len(rails[0]) == len(rails[1])
+ for j, rail in enumerate(rails):
+ r = rungs[j:len(rungs):2]
for i, point in enumerate(rail):
if i == 0:
path_commands.append(inkex.paths.Move(*point))
@@ -125,7 +131,33 @@ class ZigzagLineToSatin(InkstitchExtension):
# generate curves
path_commands.append(inkex.paths.Curve(*start, *end, *point))
- return str(inkex.Path(path_commands))
+
+ if self.options.pattern == 'zigzag' and (has_equal_rail_point_count or i <= len(r)) and (not self.options.reduce_rungs or j == 0):
+ # in zigzag mode we do have alternating points on rails
+ # when smoothing them out, rungs may not intersect anymore
+ # so we need to find a spot on the smoothed rail to ensure the correct length
+ rung = r[i-1]
+ line = inkex.DirectedLineSegment(rung[0], rung[1])
+ point0 = line.point_at_length(-50)
+ point1 = line.point_at_length(line.length + 50)
+ new_point = inkex.bezier.linebezierintersect((point0, point1), [prev, start, end, point])
+ if new_point:
+ new_rungs.append((rung[k[j]], new_point[0]))
+ else:
+ new_rungs.append(rung)
+
+ rungs = self._update_rungs(new_rungs, rungs, r, has_equal_rail_point_count)
+ return str(inkex.Path(path_commands)), rungs
+
+ def _update_rungs(self, new_rungs, rungs, r, has_equal_rail_point_count):
+ if self.options.pattern == 'zigzag':
+ rungs = new_rungs
+ if not has_equal_rail_point_count and not self.options.reduce_rungs:
+ # make sure, that the last rail on canvas is also the last rail in the list
+ # this important when we delete the very first and very last rung
+ count = len(r)
+ rungs[count], rungs[-1] = rungs[-1], rungs[count]
+ return rungs
def _rung_path(self, rungs):
if len(rungs) < 3: