don't do ties around the fake color change of a "STOP after"

pull/171/head
Lex Neva 2018-05-28 22:15:07 -04:00
rodzic 49b8c9f00b
commit f0c8c6a27b
7 zmienionych plików z 32 dodań i 23 usunięć

Wyświetl plik

@ -44,7 +44,7 @@ class Input(object):
if not stitch.flags & END:
color_block.add_stitch(stitch.xx * PIXELS_PER_MM, stitch.yy * PIXELS_PER_MM,
jump=stitch.flags & JUMP,
stop=stitch.flags & STOP,
color_change=stitch.flags & STOP,
trim=stitch.flags & TRIM)
extents = stitch_plan.extents

Wyświetl plik

@ -32,7 +32,7 @@ def get_flags(stitch):
if stitch.trim:
flags |= libembroidery.TRIM
if stitch.stop:
if stitch.color_change:
flags |= libembroidery.STOP
return flags
@ -108,13 +108,10 @@ def write_embroidery_file(file_path, stitch_plan, svg):
add_thread(pattern, make_thread(color_block.color))
for stitch in color_block:
if stitch.stop and stitch is not color_block.last_stitch:
# A STOP stitch that is not at the end of a color block
# occurs when the user specified "STOP after". "STOP" is the
# same thing as a color change, and the user will assign a
# special color at the machine that tells it to pause after.
# We need to add another copy of the same color here so that
# the stitches after the STOP are still the same color.
if stitch.stop:
# This is the start of the extra color block added by the
# "STOP after" handler (see stitch_plan/stop.py). Assign it
# the same color.
add_thread(pattern, make_thread(color_block.color))
flags = get_flags(stitch)

Wyświetl plik

@ -2,17 +2,18 @@ from ..utils.geometry import Point
class Stitch(Point):
def __init__(self, x, y, color=None, jump=False, stop=False, trim=False, no_ties=False):
def __init__(self, x, y, color=None, jump=False, stop=False, trim=False, color_change=False, no_ties=False):
self.x = x
self.y = y
self.color = color
self.jump = jump
self.trim = trim
self.stop = stop
self.color_change = color_change
self.no_ties = no_ties
def __repr__(self):
return "Stitch(%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 " ")
def copy(self):
return Stitch(self.x, self.y, self.color, self.jump, self.stop, self.trim, self.no_ties)
return Stitch(self.x, self.y, self.color, self.jump, self.stop, self.trim, self.color_change, self.no_ties)

Wyświetl plik

@ -39,10 +39,10 @@ def patches_to_stitch_plan(patches, collapse_len=3.0 * PIXELS_PER_MM):
color_block.add_stitch(patch.stitches[0].x, patch.stitches[0].y, jump=True)
else:
# add a color change (only if the last stitch wasn't a "STOP after")
if not color_block.last_stitch.stop:
# add a color change (only if we didn't just do a "STOP after")
if not color_block.last_stitch.color_change:
stitch = color_block.last_stitch.copy()
stitch.stop = True
stitch.color_change = True
color_block.add_stitch(stitch)
color_block = stitch_plan.new_color_block()

Wyświetl plik

@ -5,20 +5,29 @@ def process_stop(color_block):
be useful for applique and similar on multi-needle machines that
normally would not stop between colors.
On such machines, the user assigns needles to the colors in the
design before starting stitching. C01, C02, etc are normal
In machine embroidery files, there's no such thing as an actual
"STOP" instruction. All that exists is a "color change" command
(which libembroidery calls STOP just to be confusing).
On multi-needle machines, the user assigns needles to the colors in
the design before starting stitching. C01, C02, etc are normal
needles, but C00 is special. For a block of stitches assigned
to C00, the machine will continue sewing with the last color it
had and pause after it completes the C00 block.
That means we need to introduce an artificial color change
shortly before the current stitch so that the user can set that
to C00. We'll go back 3 stitches and do that:
That means we need to add an artificial color change instruction
shortly before the current stitch so that the user can set that color
block to C00. We'll go back 3 stitches and mark the start of the C00
block:
"""
if len(color_block.stitches) >= 3:
# make a copy of the stitch and turn it into a STOP code
# make a copy of the stitch and set it as a color change
stitch = color_block.stitches[-3].copy()
stitch.color_change = True
# mark this stitch as a "stop" so that we can avoid
# adding tie stitches in ties.py
stitch.stop = True
# insert it after the stitch
@ -28,7 +37,7 @@ def process_stop(color_block):
# block:
stitch = color_block.stitches[-1].copy()
stitch.stop = True
stitch.color_change = True
color_block.add_stitch(stitch)
# reference for the above: https://github.com/lexelby/inkstitch/pull/29#issuecomment-359175447

Wyświetl plik

@ -34,7 +34,9 @@ def add_ties(stitch_plan):
need_tie_in = True
new_stitches = []
for i, stitch in enumerate(color_block.stitches):
is_special = stitch.trim or stitch.jump or stitch.stop
# Tie before and after TRIMs, JUMPs, and color changes, but ignore
# the fake color change introduced by a "STOP after" (see stop.py).
is_special = stitch.trim or stitch.jump or (stitch.color_change and not stitch.stop)
if is_special and not need_tie_in:
add_tie_off(new_stitches)

Wyświetl plik

@ -15,7 +15,7 @@ def color_block_to_point_lists(color_block):
point_lists.append([])
continue
if not stitch.jump and not stitch.stop:
if not stitch.jump and not stitch.color_change:
point_lists[-1].append(stitch.as_tuple())
return point_lists