pyembroidery/pyembroidery/PesReader.py

255 wiersze
7.8 KiB
Python

from .EmbThread import EmbThread
from .PecReader import read_pec
from .ReadHelper import (
read_int_8,
read_int_16le,
read_int_24be,
read_int_32le,
read_string_8,
)
def read(f, out, settings=None):
loaded_thread_values = []
pes_string = read_string_8(f, 8)
if pes_string == "#PEC0001":
read_pec(f, out, loaded_thread_values)
out.interpolate_duplicate_color_as_stop()
return
pec_block_position = read_int_32le(f)
# Ignoring several known PES versions, just abort and read PEC block
# All versions allow, abort and read PEC block.
# Metadata started appearing in V4
# Threads appeared in V5.
# We quickly abort if there are any complex items in the header.
if pes_string == "#PES0100":
out.metadata("version", 10)
read_pes_header_version_10(f, out, loaded_thread_values)
elif pes_string == "#PES0090":
out.metadata("version", 9)
read_pes_header_version_9(f, out, loaded_thread_values)
elif pes_string == "#PES0080":
out.metadata("version", 8)
read_pes_header_version_8(f, out, loaded_thread_values)
elif pes_string == "#PES0070":
out.metadata("version", 7)
read_pes_header_version_7(f, out, loaded_thread_values)
elif pes_string == "#PES0060":
out.metadata("version", 6)
read_pes_header_version_6(f, out, loaded_thread_values)
elif pes_string == "#PES0050":
out.metadata("version", 5)
read_pes_header_version_5(f, out, loaded_thread_values)
elif pes_string == "#PES0055":
out.metadata("version", 5.5)
read_pes_header_version_5(f, out, loaded_thread_values)
elif pes_string == "#PES0056":
out.metadata("version", 5.6)
read_pes_header_version_5(f, out, loaded_thread_values)
elif pes_string == "#PES0040":
out.metadata("version", 4)
read_pes_header_version_4(f, out)
elif pes_string == "#PES0030":
out.metadata("version", 3)
elif pes_string == "#PES0022":
out.metadata("version", 2.2)
elif pes_string == "#PES0020":
out.metadata("version", 2)
elif pes_string == "#PES0001":
out.metadata("version", 1)
read_pes_header_version_1(f, out)
else:
pass # Header is unrecognised.
f.seek(pec_block_position, 0)
read_pec(f, out, loaded_thread_values)
out.interpolate_duplicate_color_as_stop()
def read_pes_string(f):
length = read_int_8(f)
if length == 0:
return None
return read_string_8(f, length)
def read_pes_metadata(f, out):
v = read_pes_string(f)
if v is not None and len(v) > 0:
out.metadata("name", v)
v = read_pes_string(f)
if v is not None and len(v) > 0:
out.metadata("category", v)
v = read_pes_string(f)
if v is not None and len(v) > 0:
out.metadata("author", v)
v = read_pes_string(f)
if v is not None and len(v) > 0:
out.metadata("keywords", v)
v = read_pes_string(f)
if v is not None and len(v) > 0:
out.metadata("comments", v)
def read_pes_thread(f, threadlist):
thread = EmbThread()
thread.catalog_number = read_pes_string(f)
thread.color = 0xFF000000 | read_int_24be(f)
f.seek(5, 1)
thread.description = read_pes_string(f)
thread.brand = read_pes_string(f)
thread.chart = read_pes_string(f)
threadlist.append(thread)
def read_pes_header_version_1(f, out):
# Nothing I care about.
pass
def read_pes_header_version_4(f, out):
f.seek(4, 1)
read_pes_metadata(f, out)
def read_pes_header_version_5(f, out, threadlist):
f.seek(4, 1)
read_pes_metadata(f, out)
f.seek(24, 1) # this is 36 in version 6 and 24 in version 5
v = read_pes_string(f)
if v is not None and len(v) > 0:
out.metadata("image", v)
f.seek(24, 1)
count_programmable_fills = read_int_16le(f)
if count_programmable_fills != 0:
return
count_motifs = read_int_16le(f)
if count_motifs != 0:
return
count_feather_patterns = read_int_16le(f)
if count_feather_patterns != 0:
return
count_threads = read_int_16le(f)
for i in range(0, count_threads):
read_pes_thread(f, threadlist)
def read_pes_header_version_6(f, out, threadlist):
f.seek(4, 1)
read_pes_metadata(f, out)
f.seek(36, 1) # this is 36 in version 6 and 24 in version 5
v = read_pes_string(f)
if v is not None and len(v) > 0:
out.metadata("image_file", v)
f.seek(24, 1)
count_programmable_fills = read_int_16le(f)
if count_programmable_fills != 0:
return
count_motifs = read_int_16le(f)
if count_motifs != 0:
return
count_feather_patterns = read_int_16le(f)
if count_feather_patterns != 0:
return
count_threads = read_int_16le(f)
for i in range(0, count_threads):
read_pes_thread(f, threadlist)
def read_pes_header_version_7(f, out, threadlist):
f.seek(4, 1)
read_pes_metadata(f, out)
f.seek(36, 1)
v = read_pes_string(f)
if v is not None and len(v) > 0:
out.metadata("image_file", v)
f.seek(24, 1)
count_programmable_fills = read_int_16le(f)
if count_programmable_fills != 0:
return
count_motifs = read_int_16le(f)
if count_motifs != 0:
return
count_feather_patterns = read_int_16le(f)
if count_feather_patterns != 0:
return
count_threads = read_int_16le(f)
for i in range(0, count_threads):
read_pes_thread(f, threadlist)
def read_pes_header_version_8(f, out, threadlist):
f.seek(4, 1)
read_pes_metadata(f, out)
f.seek(38, 1)
v = read_pes_string(f)
if v is not None and len(v) > 0:
out.metadata("image_file", v)
f.seek(26, 1)
count_programmable_fills = read_int_16le(f)
if count_programmable_fills != 0:
return
count_motifs = read_int_16le(f)
if count_motifs != 0:
return
count_feather_patterns = read_int_16le(f)
if count_feather_patterns != 0:
return
count_threads = read_int_16le(f)
for i in range(0, count_threads):
read_pes_thread(f, threadlist)
def read_pes_header_version_9(f, out, threadlist):
f.seek(4, 1)
read_pes_metadata(f, out)
f.seek(14, 1)
v = read_pes_string(f)
if v is not None and len(v) > 0:
out.metadata("hoop_name", v)
f.seek(30, 1) # this is 36 in version 6 and 24 in version 5
v = read_pes_string(f)
if v is not None and len(v) > 0:
out.metadata("image_file", v)
f.seek(34, 1)
count_programmable_fills = read_int_16le(f)
if count_programmable_fills != 0:
return
count_motifs = read_int_16le(f)
if count_motifs != 0:
return
count_feather_patterns = read_int_16le(f)
if count_feather_patterns != 0:
return
count_threads = read_int_16le(f)
for i in range(0, count_threads):
read_pes_thread(f, threadlist)
def read_pes_header_version_10(f, out, threadlist):
f.seek(4, 1)
read_pes_metadata(f, out)
f.seek(14, 1)
v = read_pes_string(f)
if v is not None and len(v) > 0:
out.metadata("hoop_name", v)
f.seek(38, 1)
v = read_pes_string(f)
if v is not None and len(v) > 0:
out.metadata("image_file", v)
f.seek(34, 1)
count_programmable_fills = read_int_16le(f)
if count_programmable_fills != 0:
return
count_motifs = read_int_16le(f)
if count_motifs != 0:
return
count_feather_patterns = read_int_16le(f)
if count_feather_patterns != 0:
return
count_threads = read_int_16le(f)
for i in range(0, count_threads):
read_pes_thread(f, threadlist)