kopia lustrzana https://github.com/EmbroidePy/pyembroidery
554 wiersze
17 KiB
Python
554 wiersze
17 KiB
Python
import os.path
|
|
|
|
from .EmbPattern import EmbPattern
|
|
import pyembroidery.DstWriter as DstWriter
|
|
import pyembroidery.PecWriter as PecWriter
|
|
import pyembroidery.PesWriter as PesWriter
|
|
import pyembroidery.ExpWriter as ExpWriter
|
|
import pyembroidery.Vp3Writer as Vp3Writer
|
|
import pyembroidery.JefWriter as JefWriter
|
|
import pyembroidery.SvgWriter as SvgWriter
|
|
import pyembroidery.CsvWriter as CsvWriter
|
|
import pyembroidery.U01Writer as U01Writer
|
|
|
|
import pyembroidery.DstReader as DstReader
|
|
import pyembroidery.PecReader as PecReader
|
|
import pyembroidery.PesReader as PesReader
|
|
import pyembroidery.ExpReader as ExpReader
|
|
import pyembroidery.Vp3Reader as Vp3Reader
|
|
import pyembroidery.JefReader as JefReader
|
|
import pyembroidery.XxxReader as XxxReader
|
|
import pyembroidery.SewReader as SewReader
|
|
import pyembroidery.U01Reader as U01Reader
|
|
import pyembroidery.ShvReader as ShvReader
|
|
import pyembroidery.A10oReader as A10oReader
|
|
import pyembroidery.A100Reader as A100Reader
|
|
import pyembroidery.BroReader as BroReader
|
|
import pyembroidery.DsbReader as DsbReader
|
|
import pyembroidery.DszReader as DszReader
|
|
import pyembroidery.EmdReader as EmdReader
|
|
import pyembroidery.InbReader as InbReader
|
|
import pyembroidery.TbfReader as TbfReader
|
|
import pyembroidery.KsmReader as KsmReader
|
|
import pyembroidery.TapReader as TapReader
|
|
import pyembroidery.StxReader as StxReader
|
|
import pyembroidery.PhbReader as PhbReader
|
|
import pyembroidery.PcdReader as PcdReader
|
|
import pyembroidery.PcmReader as PcmReader
|
|
import pyembroidery.PcqReader as PcqReader
|
|
import pyembroidery.PcsReader as PcsReader
|
|
import pyembroidery.MitReader as MitReader
|
|
import pyembroidery.NewReader as NewReader
|
|
import pyembroidery.ExyReader as ExyReader
|
|
import pyembroidery.FxyReader as FxyReader
|
|
import pyembroidery.GtReader as GtReader
|
|
import pyembroidery.DatReader as DatReader
|
|
import pyembroidery.PhcReader as PhcReader
|
|
import pyembroidery.MaxReader as MaxReader
|
|
import pyembroidery.JpxReader as JpxReader
|
|
import pyembroidery.StcReader as StcReader
|
|
# import pyembroidery.ZhsReader as ZhsReader
|
|
import pyembroidery.ZxyReader as ZxyReader
|
|
import pyembroidery.PmvReader as PmvReader
|
|
import pyembroidery.PmvWriter as PmvWriter
|
|
import pyembroidery.CsvReader as CsvReader
|
|
|
|
|
|
def supported_formats():
|
|
"""Generates dictionary entries for supported formats. Each entry will
|
|
always have description, extension, mimetype, and category. Reader
|
|
will provide the reader, if one exists, writer will provide the writer,
|
|
if one exists.
|
|
|
|
Metadata gives a list of metadata read and/or written by that type.
|
|
|
|
Options provides accepted options by the format and their accepted values.
|
|
"""
|
|
yield ({
|
|
"description": "Brother Embroidery Format",
|
|
"extension": "pec",
|
|
"mimetype": "application/x-pec",
|
|
"category": "embroidery",
|
|
"reader": PecReader,
|
|
"writer": PecWriter,
|
|
"metadata": ("name")
|
|
})
|
|
yield ({
|
|
"description": "Brother Embroidery Format",
|
|
"extension": "pes",
|
|
"mimetype": "application/x-pes",
|
|
"category": "embroidery",
|
|
"reader": PesReader,
|
|
"writer": PesWriter,
|
|
"options": {
|
|
"pes version": (1, 6),
|
|
"truncated": (True, False)
|
|
},
|
|
"metadata": ("name", "author", "category", "keywords", "comments")
|
|
})
|
|
yield ({
|
|
"description": "Melco Embroidery Format",
|
|
"extension": "exp",
|
|
"mimetype": "application/x-exp",
|
|
"category": "embroidery",
|
|
"reader": ExpReader,
|
|
"writer": ExpWriter,
|
|
})
|
|
yield ({
|
|
"description": "Tajima Embroidery Format",
|
|
"extension": "dst",
|
|
"mimetype": "application/x-dst",
|
|
"category": "embroidery",
|
|
"reader": DstReader,
|
|
"writer": DstWriter,
|
|
"options": {
|
|
"extended headers": (True, False)
|
|
},
|
|
"metadata": ("name")
|
|
})
|
|
yield ({
|
|
"description": "Janome Embroidery Format",
|
|
"extension": "jef",
|
|
"mimetype": "application/x-jef",
|
|
"category": "embroidery",
|
|
"reader": JefReader,
|
|
"writer": JefWriter,
|
|
})
|
|
yield ({
|
|
"description": "Pfaff Embroidery Format",
|
|
"extension": "vp3",
|
|
"mimetype": "application/x-vp3",
|
|
"category": "embroidery",
|
|
"reader": Vp3Reader,
|
|
"writer": Vp3Writer,
|
|
})
|
|
yield ({
|
|
"description": "Scalable Vector Graphics",
|
|
"extension": "svg",
|
|
"mimetype": "image/svg+xml",
|
|
"category": "vector",
|
|
"writer": SvgWriter,
|
|
})
|
|
yield ({
|
|
"description": "Comma-separated values",
|
|
"extension": "csv",
|
|
"mimetype": "text/csv",
|
|
"category": "debug",
|
|
"reader": CsvReader,
|
|
"writer": CsvWriter,
|
|
"options": {
|
|
"deltas": (True, False)
|
|
},
|
|
})
|
|
yield ({
|
|
"description": "Singer Embroidery Format",
|
|
"extension": "xxx",
|
|
"mimetype": "application/x-xxx",
|
|
"category": "embroidery",
|
|
"reader": XxxReader
|
|
})
|
|
yield ({
|
|
"description": "Janome Embroidery Format",
|
|
"extension": "sew",
|
|
"mimetype": "application/x-sew",
|
|
"category": "embroidery",
|
|
"reader": SewReader
|
|
})
|
|
yield ({
|
|
"description": "Barudan Embroidery Format",
|
|
"extension": "u01",
|
|
"mimetype": "application/x-u01",
|
|
"category": "embroidery",
|
|
"reader": U01Reader,
|
|
"writer": U01Writer
|
|
})
|
|
yield ({
|
|
"description": "Husqvarna Viking Embroidery Format",
|
|
"extension": "shv",
|
|
"mimetype": "application/x-shv",
|
|
"category": "embroidery",
|
|
"reader": ShvReader
|
|
})
|
|
yield ({
|
|
"description": "Toyota Embroidery Format",
|
|
"extension": "10o",
|
|
"mimetype": "application/x-10o",
|
|
"category": "embroidery",
|
|
"reader": A10oReader
|
|
})
|
|
yield ({
|
|
"description": "Toyota Embroidery Format",
|
|
"extension": "100",
|
|
"mimetype": "application/x-100",
|
|
"category": "embroidery",
|
|
"reader": A100Reader
|
|
})
|
|
yield ({
|
|
"description": "Bits & Volts Embroidery Format",
|
|
"extension": "bro",
|
|
"mimetype": "application/x-Bro",
|
|
"category": "embroidery",
|
|
"reader": BroReader
|
|
})
|
|
yield ({
|
|
"description": "Sunstar or Barudan Embroidery Format",
|
|
"extension": "dat",
|
|
"mimetype": "application/x-dat",
|
|
"category": "embroidery",
|
|
"reader": DatReader
|
|
})
|
|
yield ({
|
|
"description": "Tajima(Barudan) Embroidery Format",
|
|
"extension": "dsb",
|
|
"mimetype": "application/x-dsb",
|
|
"category": "embroidery",
|
|
"reader": DsbReader
|
|
})
|
|
yield ({
|
|
"description": "ZSK USA Embroidery Format",
|
|
"extension": "dsz",
|
|
"mimetype": "application/x-dsz",
|
|
"category": "embroidery",
|
|
"reader": DszReader
|
|
})
|
|
yield ({
|
|
"description": "Elna Embroidery Format",
|
|
"extension": "emd",
|
|
"mimetype": "application/x-emd",
|
|
"category": "embroidery",
|
|
"reader": EmdReader
|
|
})
|
|
yield ({
|
|
"description": "Eltac Embroidery Format",
|
|
"extension": "exy", # e??, e01
|
|
"mimetype": "application/x-exy",
|
|
"category": "embroidery",
|
|
"reader": ExyReader
|
|
})
|
|
yield ({
|
|
"description": "Fortron Embroidery Format",
|
|
"extension": "fxy", # f??, f01
|
|
"mimetype": "application/x-fxy",
|
|
"category": "embroidery",
|
|
"reader": FxyReader
|
|
})
|
|
yield ({
|
|
"description": "Gold Thread Embroidery Format",
|
|
"extension": "gt",
|
|
"mimetype": "application/x-exy",
|
|
"category": "embroidery",
|
|
"reader": GtReader
|
|
})
|
|
yield ({
|
|
"description": "Inbro Embroidery Format",
|
|
"extension": "inb",
|
|
"mimetype": "application/x-inb",
|
|
"category": "embroidery",
|
|
"reader": InbReader
|
|
})
|
|
yield ({
|
|
"description": "Tajima Embroidery Format",
|
|
"extension": "tbf",
|
|
"mimetype": "application/x-tbf",
|
|
"category": "embroidery",
|
|
"reader": TbfReader
|
|
})
|
|
yield ({
|
|
"description": "Pfaff Embroidery Format",
|
|
"extension": "ksm",
|
|
"mimetype": "application/x-ksm",
|
|
"category": "embroidery",
|
|
"reader": KsmReader
|
|
})
|
|
yield ({
|
|
"description": "Happy Embroidery Format",
|
|
"extension": "tap",
|
|
"mimetype": "application/x-tap",
|
|
"category": "embroidery",
|
|
"reader": TapReader
|
|
})
|
|
yield ({
|
|
"description": "Data Stitch Embroidery Format",
|
|
"extension": "stx",
|
|
"mimetype": "application/x-stx",
|
|
"category": "embroidery",
|
|
"reader": StxReader
|
|
})
|
|
yield ({
|
|
"description": "Brother Embroidery Format",
|
|
"extension": "phb",
|
|
"mimetype": "application/x-phb",
|
|
"category": "embroidery",
|
|
"reader": PhbReader
|
|
})
|
|
yield ({
|
|
"description": "Brother Embroidery Format",
|
|
"extension": "phc",
|
|
"mimetype": "application/x-phc",
|
|
"category": "embroidery",
|
|
"reader": PhcReader
|
|
})
|
|
yield ({
|
|
"description": "Ameco Embroidery Format",
|
|
"extension": "new",
|
|
"mimetype": "application/x-new",
|
|
"category": "embroidery",
|
|
"reader": NewReader
|
|
})
|
|
yield ({
|
|
"description": "Pfaff Embroidery Format",
|
|
"extension": "max",
|
|
"mimetype": "application/x-max",
|
|
"category": "embroidery",
|
|
"reader": MaxReader
|
|
})
|
|
yield ({
|
|
"description": "Mitsubishi Embroidery Format",
|
|
"extension": "mit",
|
|
"mimetype": "application/x-mit",
|
|
"category": "embroidery",
|
|
"reader": MitReader
|
|
})
|
|
yield ({
|
|
"description": "Pfaff Embroidery Format",
|
|
"extension": "pcd",
|
|
"mimetype": "application/x-pcd",
|
|
"category": "embroidery",
|
|
"reader": PcdReader
|
|
})
|
|
yield ({
|
|
"description": "Pfaff Embroidery Format",
|
|
"extension": "pcq",
|
|
"mimetype": "application/x-pcq",
|
|
"category": "embroidery",
|
|
"reader": PcqReader
|
|
})
|
|
yield ({
|
|
"description": "Pfaff Embroidery Format",
|
|
"extension": "pcm",
|
|
"mimetype": "application/x-pcm",
|
|
"category": "embroidery",
|
|
"reader": PcmReader
|
|
})
|
|
yield ({
|
|
"description": "Pfaff Embroidery Format",
|
|
"extension": "pcs",
|
|
"mimetype": "application/x-pcs",
|
|
"category": "embroidery",
|
|
"reader": PcsReader
|
|
})
|
|
yield ({
|
|
"description": "Janome Embroidery Format",
|
|
"extension": "jpx",
|
|
"mimetype": "application/x-jpx",
|
|
"category": "embroidery",
|
|
"reader": JpxReader
|
|
})
|
|
yield ({
|
|
"description": "Gunold Embroidery Format",
|
|
"extension": "stc",
|
|
"mimetype": "application/x-stc",
|
|
"category": "embroidery",
|
|
"reader": StcReader
|
|
})
|
|
# yield ({
|
|
# "description": "Zeng Hsing Embroidery Format",
|
|
# "extension": "zhs",
|
|
# "mimetype": "application/x-zhs",
|
|
# "category": "embroidery",
|
|
# "reader": ZhsReader
|
|
# })
|
|
yield ({
|
|
"description": "ZSK TC Embroidery Format",
|
|
"extension": "zxy",
|
|
"mimetype": "application/x-zxy",
|
|
"category": "embroidery",
|
|
"reader": ZxyReader
|
|
})
|
|
yield ({
|
|
"description": "Brother Stitch Format",
|
|
"extension": "pmv",
|
|
"mimetype": "application/x-pmv",
|
|
"category": "stitch",
|
|
"reader": PmvReader,
|
|
"writer": PmvWriter
|
|
})
|
|
|
|
|
|
def convert(filename_from, filename_to, settings=None):
|
|
pattern = read(filename_from, settings)
|
|
if pattern is None:
|
|
return
|
|
if settings is not None:
|
|
stable = settings.get("stable", True)
|
|
if stable:
|
|
pattern = pattern.get_stable_pattern()
|
|
else:
|
|
pattern = pattern.get_stable_pattern()
|
|
write(pattern, filename_to, settings)
|
|
|
|
|
|
def get_extension_by_filename(filename):
|
|
"""extracts he extension from a filename"""
|
|
return os.path.splitext(filename)[1][1:]
|
|
|
|
|
|
def read_embroidery(reader, f, settings=None, pattern=None):
|
|
"""Reads fileobject or filename with reader."""
|
|
if pattern is None:
|
|
pattern = EmbPattern()
|
|
if isinstance(f, str):
|
|
text_mode = False
|
|
try:
|
|
text_mode = reader.READ_FILE_IN_TEXT_MODE
|
|
except AttributeError:
|
|
pass
|
|
if text_mode:
|
|
try:
|
|
with open(f, "r") as stream:
|
|
reader.read(stream, pattern, settings)
|
|
stream.close()
|
|
except IOError:
|
|
pass
|
|
else:
|
|
try:
|
|
with open(f, "rb") as stream:
|
|
reader.read(stream, pattern, settings)
|
|
stream.close()
|
|
except IOError:
|
|
pass
|
|
else:
|
|
reader.read(f, pattern, settings)
|
|
return pattern
|
|
|
|
|
|
def read_dst(f, settings=None, pattern=None):
|
|
"""Reads fileobject as DST file"""
|
|
return read_embroidery(DstReader, f, settings, pattern)
|
|
|
|
|
|
def read_pec(f, settings=None, pattern=None):
|
|
"""Reads fileobject as PEC file"""
|
|
return read_embroidery(PecReader, f, settings, pattern)
|
|
|
|
|
|
def read_pes(f, settings=None, pattern=None):
|
|
"""Reads fileobject as PES file"""
|
|
return read_embroidery(PesReader, f, settings, pattern)
|
|
|
|
|
|
def read_exp(f, settings=None, pattern=None):
|
|
"""Reads fileobject as EXP file"""
|
|
return read_embroidery(ExpReader, f, settings, pattern)
|
|
|
|
|
|
def read_vp3(f, settings=None, pattern=None):
|
|
"""Reads fileobject as VP3 file"""
|
|
return read_embroidery(Vp3Reader, f, settings, pattern)
|
|
|
|
|
|
def read_jef(f, settings=None, pattern=None):
|
|
"""Reads fileobject as JEF file"""
|
|
return read_embroidery(JefReader, f, settings, pattern)
|
|
|
|
|
|
def read(filename, settings=None, pattern=None):
|
|
"""Reads file, assuming type by extension"""
|
|
extension = get_extension_by_filename(filename)
|
|
extension = extension.lower()
|
|
for file_type in supported_formats():
|
|
if file_type['extension'] != extension:
|
|
continue
|
|
reader = file_type.get("reader", None)
|
|
return read_embroidery(reader, filename, settings, pattern)
|
|
return None
|
|
|
|
|
|
def write_embroidery(writer, pattern, stream, settings=None):
|
|
if settings is None:
|
|
settings = {}
|
|
else:
|
|
settings = settings.copy()
|
|
if settings.get("encode", True):
|
|
if not ("max_jump" in settings):
|
|
try:
|
|
settings["max_jump"] = writer.MAX_JUMP_DISTANCE
|
|
except AttributeError:
|
|
pass
|
|
if not ("max_stitch" in settings):
|
|
try:
|
|
settings["max_stitch"] = writer.MAX_STITCH_DISTANCE
|
|
except AttributeError:
|
|
pass
|
|
if not ("full_jump" in settings):
|
|
try:
|
|
settings["full_jump"] = writer.FULL_JUMP
|
|
except AttributeError:
|
|
pass
|
|
if not ("strip_speeds" in settings):
|
|
try:
|
|
settings["strip_speeds"] = writer.STRIP_SPEEDS
|
|
except AttributeError:
|
|
pass
|
|
if not ("sequin_contingency" in settings):
|
|
try:
|
|
settings["sequin_contingency"] = writer.SEQUIN_CONTINGENCY
|
|
except AttributeError:
|
|
pass
|
|
pattern = pattern.get_normalized_pattern(settings)
|
|
|
|
if isinstance(stream, str):
|
|
with open(stream, "wb") as stream:
|
|
writer.write(pattern, stream, settings)
|
|
else:
|
|
writer.write(pattern, stream, settings)
|
|
|
|
|
|
def write_dst(pattern, stream, settings=None):
|
|
"""Writes fileobject as DST file"""
|
|
write_embroidery(DstWriter, pattern, stream, settings)
|
|
|
|
|
|
def write_pec(pattern, stream, settings=None):
|
|
"""Writes fileobject as DST file"""
|
|
write_embroidery(PecWriter, pattern, stream, settings)
|
|
|
|
|
|
def write_pes(pattern, stream, settings=None):
|
|
"""Writes fileobject as DST file"""
|
|
write_embroidery(PesWriter, pattern, stream, settings)
|
|
|
|
|
|
def write_exp(pattern, stream, settings=None):
|
|
"""Writes fileobject as DST file"""
|
|
write_embroidery(ExpWriter, pattern, stream, settings)
|
|
|
|
|
|
def write_vp3(pattern, stream, settings=None):
|
|
"""Writes fileobject as DST file"""
|
|
write_embroidery(Vp3Writer, pattern, stream, settings)
|
|
|
|
|
|
def write_jef(pattern, stream, settings=None):
|
|
"""Writes fileobject as DST file"""
|
|
write_embroidery(JefWriter, pattern, stream, settings)
|
|
|
|
|
|
def write_svg(pattern, stream, settings=None):
|
|
"""Writes fileobject as DST file"""
|
|
write_embroidery(SvgWriter, pattern, stream, settings)
|
|
|
|
|
|
def write(pattern, filename, settings=None):
|
|
"""Writes file, assuming type by extension"""
|
|
extension = get_extension_by_filename(filename)
|
|
extension = extension.lower()
|
|
|
|
for file_type in supported_formats():
|
|
if file_type['extension'] != extension:
|
|
continue
|
|
writer = file_type.get("writer", None)
|
|
if writer is None:
|
|
continue
|
|
write_embroidery(writer, pattern, filename, settings)
|