summaryrefslogtreecommitdiff
path: root/lib/elements/satin_column.py
diff options
context:
space:
mode:
authorKaalleen <36401965+kaalleen@users.noreply.github.com>2024-12-15 14:58:30 +0100
committerGitHub <noreply@github.com>2024-12-15 14:58:30 +0100
commitf2d2d154d0d26c13631818c209bc854d262b05a6 (patch)
tree484094d7a872ff7e2337d4296022e6982c12b1e4 /lib/elements/satin_column.py
parent98cf7a59555a30bea106ce05c9107f042f1e91fe (diff)
add rungs when rails are intersecting (#3344)
Diffstat (limited to 'lib/elements/satin_column.py')
-rw-r--r--lib/elements/satin_column.py33
1 files changed, 22 insertions, 11 deletions
diff --git a/lib/elements/satin_column.py b/lib/elements/satin_column.py
index c678c317..71beba6a 100644
--- a/lib/elements/satin_column.py
+++ b/lib/elements/satin_column.py
@@ -1003,23 +1003,34 @@ class SatinColumn(EmbroideryElement):
"""
for path_list in path_lists:
+ num_paths = len(path_list)
if path_list is None:
continue
- if len(path_list) in (2, 4):
+ if num_paths in (2, 4):
# Add the rung just after the start of the satin.
# If the rails have opposite directions it may end up at the end of the satin.
- rung_start = path_list[0].interpolate(0.3)
- rails_to_reverse = self._get_rails_to_reverse()
- if rails_to_reverse[0] == rails_to_reverse[1]:
- rung_end = path_list[1].interpolate(0.3)
- else:
- rung_end = path_list[1].interpolate(-0.3)
- rung = shgeo.LineString((rung_start, rung_end))
+ self._add_rung(path_list, 0.3)
+ # When rails are intersecting, add two more rung to prevent bad rail detection
+ if num_paths == 2 and path_list[0].intersects(path_list[1]):
+ self._add_rung(path_list, 0.5, True)
+ self._add_rung(path_list, -0.3)
+
+ def _add_rung(self, path_list, position, normalized=False):
+ rung_start = path_list[0].interpolate(position, normalized=normalized)
+ rails_to_reverse = self._get_rails_to_reverse()
+ if rails_to_reverse[0] == rails_to_reverse[1]:
+ rung_end = path_list[1].interpolate(position, normalized=normalized)
+ else:
+ rung_end = path_list[1].interpolate(-position, normalized=normalized)
+ rung = shgeo.LineString((rung_start, rung_end))
+
+ # make it a bit bigger so that it definitely intersects
+ rung = shaffinity.scale(rung, 1.1, 1.1)
- # make it a bit bigger so that it definitely intersects
- rung = shaffinity.scale(rung, 1.1, 1.1)
+ if rung.length < 5:
+ rung = shaffinity.scale(rung, 3, 3)
- path_list.append(rung)
+ path_list.append(rung)
def _path_list_to_satins(self, path_list):
linestrings = line_strings_to_csp(path_list)