From 9b619de22807b144373a6166621a7c3002929b2b Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Sat, 15 Sep 2018 21:33:44 -0400 Subject: use faster algorithm for ties --- lib/stitch_plan/stitch.py | 8 +++++++- lib/stitch_plan/ties.py | 29 ++++++++++++++++++++--------- 2 files changed, 27 insertions(+), 10 deletions(-) (limited to 'lib/stitch_plan') diff --git a/lib/stitch_plan/stitch.py b/lib/stitch_plan/stitch.py index 5fe10fb8..0609dd10 100644 --- a/lib/stitch_plan/stitch.py +++ b/lib/stitch_plan/stitch.py @@ -2,7 +2,7 @@ from ..utils.geometry import Point class Stitch(Point): - def __init__(self, x, y, color=None, jump=False, stop=False, trim=False, color_change=False, fake_color_change=False, no_ties=False): + def __init__(self, x, y=None, color=None, jump=False, stop=False, trim=False, color_change=False, fake_color_change=False, no_ties=False): self.x = x self.y = y self.color = color @@ -13,6 +13,12 @@ class Stitch(Point): self.fake_color_change = fake_color_change self.no_ties = no_ties + # Allow creating a Stitch from a Point + if isinstance(x, Point): + point = x + self.x = point.x + self.y = point.y + def __repr__(self): return "Stitch(%s, %s, %s, %s, %s, %s, %s, %s%s)" % (self.x, self.y, diff --git a/lib/stitch_plan/ties.py b/lib/stitch_plan/ties.py index 573469f5..c0d2f8de 100644 --- a/lib/stitch_plan/ties.py +++ b/lib/stitch_plan/ties.py @@ -1,26 +1,37 @@ from copy import deepcopy from .stitch import Stitch -from ..utils import cut_path -from ..stitches import running_stitch +from ..svg import PIXELS_PER_MM def add_tie(stitches, tie_path): - if stitches[-1].no_ties: + if len(tie_path) < 2 or stitches[0].no_ties: # It's from a manual stitch block, so don't add tie stitches. The user # will add them if they want them. return - tie_path = cut_path(tie_path, 0.6) - tie_stitches = running_stitch(tie_path, 0.3) - tie_stitches = [Stitch(stitch.x, stitch.y) for stitch in tie_stitches] + to_previous = tie_path[1] - tie_path[0] + length = to_previous.length() + if length > 0.5 * PIXELS_PER_MM: + # Travel back one stitch, stopping halfway there. + # Then go forward one stitch, stopping halfway between + # again. - stitches.extend(deepcopy(tie_stitches[1:])) - stitches.extend(deepcopy(list(reversed(tie_stitches))[1:])) + # but travel at most 1.5mm + length = min(length, 1.5 * PIXELS_PER_MM) + + direction = to_previous.unit() + for delta in (0.5, 1.0, 0.5, 0): + stitches.append(Stitch(tie_path[0] + delta * length * direction)) + else: + # Too short to travel part of the way to the previous stitch; ust go + # back and forth to it a couple times. + for i in (1, 0, 1, 0): + stitches.append(deepcopy(tie_path[i])) def add_tie_off(stitches): - add_tie(stitches, list(reversed(stitches))) + add_tie(stitches, stitches[-1:-3:-1]) def add_tie_in(stitches, upcoming_stitches): -- cgit v1.3.1 From fa125ff27ef2682f78faf307b3de29456c263ad3 Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Sun, 16 Sep 2018 13:09:00 -0400 Subject: remove obselete 'fake color change' code --- lib/stitch_plan/stitch.py | 22 ++++++++++------------ lib/stitch_plan/ties.py | 5 +---- 2 files changed, 11 insertions(+), 16 deletions(-) (limited to 'lib/stitch_plan') diff --git a/lib/stitch_plan/stitch.py b/lib/stitch_plan/stitch.py index 0609dd10..462634cb 100644 --- a/lib/stitch_plan/stitch.py +++ b/lib/stitch_plan/stitch.py @@ -2,7 +2,7 @@ from ..utils.geometry import Point class Stitch(Point): - def __init__(self, x, y=None, color=None, jump=False, stop=False, trim=False, color_change=False, fake_color_change=False, no_ties=False): + def __init__(self, x, y=None, color=None, jump=False, stop=False, trim=False, color_change=False, no_ties=False): self.x = x self.y = y self.color = color @@ -10,7 +10,6 @@ class Stitch(Point): self.trim = trim self.stop = stop self.color_change = color_change - self.fake_color_change = fake_color_change self.no_ties = no_ties # Allow creating a Stitch from a Point @@ -20,16 +19,15 @@ class Stitch(Point): self.y = point.y def __repr__(self): - return "Stitch(%s, %s, %s, %s, %s, %s, %s, %s%s)" % (self.x, - self.y, - self.color, - "JUMP" if self.jump else " ", - "TRIM" if self.trim else " ", - "STOP" if self.stop else " ", - "NO TIES" if self.no_ties else " ", - "FAKE " if self.fake_color_change else "", - "COLOR CHANGE" if self.color_change else " " - ) + return "Stitch(%s, %s, %s, %s, %s, %s, %s, %s)" % (self.x, + self.y, + self.color, + "JUMP" if self.jump else " ", + "TRIM" if self.trim else " ", + "STOP" if self.stop else " ", + "NO TIES" if self.no_ties else " ", + "COLOR CHANGE" if self.color_change else " " + ) def copy(self): return Stitch(self.x, self.y, self.color, self.jump, self.stop, self.trim, self.color_change, self.no_ties) diff --git a/lib/stitch_plan/ties.py b/lib/stitch_plan/ties.py index c0d2f8de..1d759c0e 100644 --- a/lib/stitch_plan/ties.py +++ b/lib/stitch_plan/ties.py @@ -47,10 +47,7 @@ def add_ties(stitch_plan): for i, stitch in enumerate(color_block.stitches): is_special = stitch.trim or stitch.jump or stitch.color_change or stitch.stop - # see stop.py for an explanation of the fake color change - is_fake = stitch.fake_color_change - - if is_special and not is_fake and not need_tie_in: + if is_special and not need_tie_in: add_tie_off(new_stitches) new_stitches.append(stitch) need_tie_in = True -- cgit v1.3.1