summaryrefslogtreecommitdiff
path: root/lib/elements
diff options
context:
space:
mode:
Diffstat (limited to 'lib/elements')
-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)