pyembroidery/pyembroidery/DstWriter.py

160 wiersze
4.6 KiB
Python

from .EmbConstant import *
from .WriteHelper import write_string_utf8
SEQUIN_CONTINGENCY = CONTINGENCY_SEQUIN_UTILIZE
FULL_JUMP = False
MAX_JUMP_DISTANCE = 121
MAX_STITCH_DISTANCE = 121
PPMM = 10
DSTHEADERSIZE = 512
def bit(b):
return 1 << b
def encode_record(x, y, flags):
y = -y # flips the coordinate y space.
b0 = 0
b1 = 0
b2 = 0
if flags == JUMP or flags == SEQUIN_EJECT:
b2 += bit(7) # jumpstitch 10xxxx11
if flags == STITCH or flags == JUMP or flags == SEQUIN_EJECT:
b2 += bit(0)
b2 += bit(1)
if x > 40:
b2 += bit(2)
x -= 81
if x < -40:
b2 += bit(3)
x += 81
if x > 13:
b1 += bit(2)
x -= 27
if x < -13:
b1 += bit(3)
x += 27
if x > 4:
b0 += bit(2)
x -= 9
if x < -4:
b0 += bit(3)
x += 9
if x > 1:
b1 += bit(0)
x -= 3
if x < -1:
b1 += bit(1)
x += 3
if x > 0:
b0 += bit(0)
x -= 1
if x < 0:
b0 += bit(1)
x += 1
if x != 0:
raise ValueError("The dx value given to the writer exceeds maximum allowed.")
if y > 40:
b2 += bit(5)
y -= 81
if y < -40:
b2 += bit(4)
y += 81
if y > 13:
b1 += bit(5)
y -= 27
if y < -13:
b1 += bit(4)
y += 27
if y > 4:
b0 += bit(5)
y -= 9
if y < -4:
b0 += bit(4)
y += 9
if y > 1:
b1 += bit(7)
y -= 3
if y < -1:
b1 += bit(6)
y += 3
if y > 0:
b0 += bit(7)
y -= 1
if y < 0:
b0 += bit(6)
y += 1
if y != 0:
raise ValueError("The dy value given to the writer exceeds maximum allowed.")
elif flags is COLOR_CHANGE:
b2 = 0b11000011
elif flags is STOP:
b2 = 0b11000011
elif flags is END:
b2 = 0b11110011
elif flags is SEQUIN_MODE:
b2 = 0b01000011
return bytes(bytearray([b0, b1, b2]))
def write(pattern, f, settings=None):
extended_header = False
if settings is not None:
extended_header = settings.get("extended header", extended_header)
extends = pattern.extends()
width = extends[2] - extends[0]
height = extends[3] - extends[1]
name = pattern.get_metadata("name", "Untitled")
write_string_utf8(f, "LA:%-16s\r" % name)
write_string_utf8(f, "ST:%7d\r" % pattern.count_stitches())
write_string_utf8(f, "CO:%3d\r" % pattern.count_color_changes())
x_extend = int(round(PPMM * width / 2))
y_extend = int(round(PPMM * height / 2))
write_string_utf8(f, "+X:%5d\r" % x_extend)
write_string_utf8(f, "-X:%5d\r" % x_extend)
write_string_utf8(f, "+Y:%5d\r" % y_extend)
write_string_utf8(f, "-Y:%5d\r" % y_extend)
write_string_utf8(f, "AX:+%5d\r" % 0)
write_string_utf8(f, "AY:+%5d\r" % 0)
write_string_utf8(f, "MX:+%5d\r" % 0)
write_string_utf8(f, "AY:+%5d\r" % 0)
write_string_utf8(f, "PD:%6s\r" % "******")
if extended_header:
author = pattern.get_metadata("author")
if author is not None:
write_string_utf8(f, "AU:%s\r" % author)
meta_copyright = pattern.get_metadata("copyright")
if meta_copyright is not None:
write_string_utf8(f, "CP:%s\r" % meta_copyright)
if len(pattern.threadlist) > 0:
for thread in pattern.threadlist:
write_string_utf8(f, "TC:%s,%s,%s\r" %
(thread.hex_color(),
thread.description,
thread.catalog_number))
f.write(b'\x1a')
for i in range(f.tell(), DSTHEADERSIZE):
f.write(b'\x20') # space
stitches = pattern.stitches
xx = 0
yy = 0
for stitch in stitches:
x = stitch[0]
y = stitch[1]
data = stitch[2]
dx = int(round(x - xx))
dy = int(round(y - yy))
xx += dx
yy += dy
if data == TRIM:
f.write(encode_record(2, 2, JUMP))
f.write(encode_record(-4, -4, JUMP))
f.write(encode_record(2, 2, JUMP))
else:
f.write(encode_record(dx, dy, data))