kopia lustrzana https://github.com/inkstitch/inkstitch
94 wiersze
3.9 KiB
Python
94 wiersze
3.9 KiB
Python
# Authors: see git history
|
|
#
|
|
# Copyright (c) 2010 Authors
|
|
# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
|
|
|
|
from ..utils.geometry import Point
|
|
|
|
|
|
class Stitch(Point):
|
|
"""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, force_lock_stitches=False, no_ties=False, tags=None):
|
|
|
|
base_stitch = None
|
|
if isinstance(x, Stitch):
|
|
# Allow creating a Stitch from another Stitch. Attributes passed as
|
|
# arguments will override any existing attributes.
|
|
base_stitch = x
|
|
self.x = base_stitch.x
|
|
self.y = base_stitch.y
|
|
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._set('color', color, base_stitch)
|
|
self._set('jump', jump, base_stitch)
|
|
self._set('trim', trim, base_stitch)
|
|
self._set('stop', stop, base_stitch)
|
|
self._set('color_change', color_change, base_stitch)
|
|
self._set('force_lock_stitches', force_lock_stitches, base_stitch)
|
|
self._set('tie_modus', tie_modus, base_stitch)
|
|
self._set('no_ties', no_ties, base_stitch)
|
|
|
|
self.tags = set()
|
|
self.add_tags(tags or [])
|
|
if base_stitch is not None:
|
|
self.add_tags(base_stitch.tags)
|
|
|
|
def __repr__(self):
|
|
return "Stitch(%s, %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 " ",
|
|
"TIE MODUS" if self.tie_modus else " ",
|
|
"FORCE LOCK STITCHES" if self.force_lock_stitches else " ",
|
|
"NO TIES" if self.no_ties else " ",
|
|
"COLOR CHANGE" if self.color_change else " ")
|
|
|
|
def _set(self, attribute, value, base_stitch):
|
|
# Set an attribute. If the caller passed a Stitch object, use its value, unless
|
|
# they overrode it with arguments.
|
|
if base_stitch is not None:
|
|
setattr(self, attribute, getattr(base_stitch, attribute))
|
|
if value or base_stitch is None:
|
|
setattr(self, attribute, value)
|
|
|
|
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.force_lock_stitches, self.no_ties, self.tags)
|
|
|
|
def __json__(self):
|
|
attributes = dict(vars(self))
|
|
attributes['tags'] = list(attributes['tags'])
|
|
return attributes
|