summaryrefslogtreecommitdiff
path: root/lib/stitch_plan/stitch.py
diff options
context:
space:
mode:
authorLex Neva <lexelby@users.noreply.github.com>2021-08-16 19:40:44 -0400
committerGitHub <noreply@github.com>2021-08-16 19:40:44 -0400
commit3ebc238561dd2403b19a56a0f3147c70eb4ebe3d (patch)
treec7e4c618335fac2196d42e03f26c3c2ad2a4251d /lib/stitch_plan/stitch.py
parent5a7b7276759b6fb4c85891b13d9ee7a2da8150ab (diff)
parentb49f7d28314f30727f9f963bddb795b88a95f2bd (diff)
Merge pull request #1254 from inkstitch/kaalleen/satin-patterns
Satin pattern and split stitch
Diffstat (limited to 'lib/stitch_plan/stitch.py')
-rw-r--r--lib/stitch_plan/stitch.py54
1 files changed, 44 insertions, 10 deletions
diff --git a/lib/stitch_plan/stitch.py b/lib/stitch_plan/stitch.py
index ae6fa480..f163d09c 100644
--- a/lib/stitch_plan/stitch.py
+++ b/lib/stitch_plan/stitch.py
@@ -4,12 +4,25 @@
# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
from ..utils.geometry import Point
+from copy import deepcopy
class Stitch(Point):
- def __init__(self, x, y=None, color=None, jump=False, stop=False, trim=False, color_change=False, tie_modus=0, no_ties=False):
- self.x = x
- self.y = y
+ """A stitch is a Point with extra information telling how to sew it."""
+
+ def __init__(self, x, y=None, color=None, jump=False, stop=False, trim=False, color_change=False, tie_modus=0, no_ties=False, tags=None):
+ if isinstance(x, Stitch):
+ # Allow creating a Stitch from another Stitch. Attributes passed as
+ # arguments will override any existing attributes.
+ vars(self).update(deepcopy(vars(x)))
+ elif isinstance(x, Point):
+ # Allow creating a Stitch from a Point
+ point = x
+ self.x = point.x
+ self.y = point.y
+ else:
+ Point.__init__(self, x, y)
+
self.color = color
self.jump = jump
self.trim = trim
@@ -17,12 +30,9 @@ class Stitch(Point):
self.color_change = color_change
self.tie_modus = tie_modus
self.no_ties = no_ties
+ self.tags = set()
- # Allow creating a Stitch from a Point
- if isinstance(x, Point):
- point = x
- self.x = point.x
- self.y = point.y
+ self.add_tags(tags or [])
def __repr__(self):
return "Stitch(%s, %s, %s, %s, %s, %s, %s, %s, %s)" % (self.x,
@@ -35,8 +45,32 @@ class Stitch(Point):
"NO TIES" if self.no_ties else " ",
"COLOR CHANGE" if self.color_change else " ")
+ def add_tags(self, tags):
+ for tag in tags:
+ self.add_tag(tag)
+
+ def add_tag(self, tag):
+ """Store arbitrary information about a stitch.
+
+ Tags can be used to store any information about a stitch. This can be
+ used by other parts of the code to keep track of where a Stitch came
+ from. The Stitch treats tags as opaque.
+
+ Use strings as tags. Python automatically optimizes this kind of
+ usage of strings, and it doesn't have to constantly do string
+ comparisons. More details here:
+
+ https://stackabuse.com/guide-to-string-interning-in-python
+ """
+ self.tags.add(tag)
+
+ def has_tag(self, tag):
+ return tag in self.tags
+
def copy(self):
- return Stitch(self.x, self.y, self.color, self.jump, self.stop, self.trim, self.color_change, self.tie_modus, self.no_ties)
+ return Stitch(self.x, self.y, self.color, self.jump, self.stop, self.trim, self.color_change, self.tie_modus, self.no_ties, self.tags)
def __json__(self):
- return vars(self)
+ attributes = dict(vars(self))
+ attributes['tags'] = list(attributes['tags'])
+ return attributes