kopia lustrzana https://github.com/inkstitch/inkstitch
106 wiersze
3.4 KiB
Python
106 wiersze
3.4 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 .stitch import Stitch
|
|
|
|
|
|
class StitchGroup:
|
|
"""A collection of Stitch objects with attached instructions and attributes.
|
|
|
|
StitchGroups will later be combined to make ColorBlocks, which in turn are
|
|
combined to make a StitchPlan. Jump stitches are allowed between
|
|
StitchGroups, but not between stitches inside a StitchGroup. This means
|
|
that EmbroideryElement classes should produce multiple StitchGroups only if
|
|
they want to allow for the possibility of jump stitches to be added in
|
|
between them by the stitch plan generation code.
|
|
"""
|
|
|
|
def __init__(
|
|
self,
|
|
color=None,
|
|
stitches=None,
|
|
min_jump_stitch_length=False,
|
|
trim_after=False,
|
|
stop_after=False,
|
|
lock_stitches=(None, None),
|
|
force_lock_stitches=False,
|
|
tags=None
|
|
):
|
|
# DANGER: if you add new attributes, you MUST also set their default
|
|
# values in __new__() below. Otherwise, cached stitch plans can be
|
|
# loaded and create objects without those properties defined, because
|
|
# unpickling does not call __init__()!
|
|
|
|
self.color = color
|
|
self.trim_after = trim_after
|
|
self.stop_after = stop_after
|
|
self.lock_stitches = lock_stitches
|
|
self.force_lock_stitches = force_lock_stitches
|
|
self.min_jump_stitch_length = min_jump_stitch_length
|
|
self.stitches = []
|
|
|
|
if stitches:
|
|
self.add_stitches(stitches)
|
|
|
|
if tags:
|
|
self.add_tags(tags)
|
|
|
|
def __new__(cls, *args, **kwargs):
|
|
instance = super().__new__(cls)
|
|
|
|
# Set default values for any new attributes here (see note in __init__() above)
|
|
# instance.foo = None
|
|
|
|
instance.lock_stitches = None
|
|
|
|
return instance
|
|
|
|
def __add__(self, other):
|
|
if isinstance(other, StitchGroup):
|
|
return StitchGroup(self.color, self.stitches + other.stitches,
|
|
lock_stitches=self.lock_stitches, force_lock_stitches=self.force_lock_stitches)
|
|
else:
|
|
raise TypeError("StitchGroup can only be added to another StitchGroup")
|
|
|
|
def __len__(self):
|
|
# This method allows `len(stitch_group)` and `if stitch_group:
|
|
return len(self.stitches)
|
|
|
|
def set_minimum_stitch_length(self, min_stitch_length):
|
|
for stitch in self.stitches:
|
|
stitch.min_stitch_length = min_stitch_length
|
|
|
|
def add_stitches(self, stitches, tags=None):
|
|
for stitch in stitches:
|
|
self.add_stitch(stitch, tags=tags)
|
|
|
|
def add_stitch(self, stitch, tags=None):
|
|
if not isinstance(stitch, Stitch):
|
|
# probably a Point
|
|
stitch = Stitch(stitch, tags=tags)
|
|
self.stitches.append(stitch)
|
|
|
|
def reverse(self):
|
|
return StitchGroup(self.color, self.stitches[::-1])
|
|
|
|
def add_tags(self, tags):
|
|
for stitch in self.stitches:
|
|
stitch.add_tags(tags)
|
|
|
|
def add_tag(self, tag):
|
|
for stitch in self.stitches:
|
|
stitch.add_tag(tag)
|
|
|
|
def get_lock_stitches(self, pos, disable_ties=False):
|
|
if len(self.stitches) < 2:
|
|
return []
|
|
|
|
lock_pos = 0 if pos == "start" else 1
|
|
if disable_ties or self.lock_stitches[lock_pos] is None:
|
|
return
|
|
|
|
stitches = self.lock_stitches[lock_pos].stitches(self.stitches, pos)
|
|
return stitches
|