kopia lustrzana https://github.com/EmbroidePy/pyembroidery
160 wiersze
4.6 KiB
Python
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))
|