switch to pyembroidery for file generation

pull/234/head
Lex Neva 2018-07-15 20:15:35 -04:00
rodzic 04ab1c4ae9
commit dbcbf7cff1
4 zmienionych plików z 40 dodań i 39 usunięć

Wyświetl plik

@ -1,4 +1,4 @@
import libembroidery
import pyembroidery
import inkex
import simpletransform
import shapely.geometry as shgeo
@ -7,15 +7,6 @@ from .utils import Point
from .svg import PIXELS_PER_MM, get_doc_size, get_viewbox_transform
def make_thread(color):
thread = libembroidery.EmbThread()
thread.color = libembroidery.embColor_make(*color.rgb)
thread.description = color.name
thread.catalogNumber = ""
return thread
def add_thread(pattern, thread):
"""Add a thread to a pattern and return the thread's index"""
@ -23,20 +14,17 @@ def add_thread(pattern, thread):
return libembroidery.embThreadList_count(pattern.threadList) - 1
def get_flags(stitch):
flags = 0
def get_command(stitch):
if stitch.jump:
flags |= libembroidery.JUMP
if stitch.trim:
flags |= libembroidery.TRIM
if stitch.color_change:
flags |= libembroidery.STOP
return flags
return pyembroidery.JUMP
elif stitch.trim:
return pyembroidery.TRIM
elif stitch.color_change:
return pyembroidery.COLOR_CHANGE
elif stitch.stop:
return pyembroidery.STOP
else:
return pyembroidery.NEEDLE_AT
def _string_to_floats(string):
floats = string.split(',')
@ -102,27 +90,28 @@ def get_origin(svg):
def write_embroidery_file(file_path, stitch_plan, svg):
origin = get_origin(svg)
pattern = libembroidery.embPattern_create()
pattern = pyembroidery.EmbPattern()
for color_block in stitch_plan:
add_thread(pattern, make_thread(color_block.color))
pattern.add_thread(color_block.color.pyembroidery_thread)
for stitch in color_block:
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))
command = get_command(stitch)
pattern.add_stitch_absolute(command, stitch.x, stitch.y)
flags = get_flags(stitch)
libembroidery.embPattern_addStitchAbs(pattern, stitch.x - origin.x, stitch.y - origin.y, flags, 1)
libembroidery.embPattern_addStitchAbs(pattern, stitch.x - origin.x, stitch.y - origin.y, libembroidery.END, 1)
pattern.add_stitch_absolute(pyembroidery.END, stitch.x, stitch.y)
# convert from pixels to millimeters
libembroidery.embPattern_scale(pattern, 1/PIXELS_PER_MM)
# also multiply by 10 to get tenths of a millimeter as required by pyembroidery
scale = 10 / PIXELS_PER_MM
# SVG and embroidery disagree on the direction of the Y axis
libembroidery.embPattern_flipVertical(pattern)
settings = {
# correct for the origin
"translate": -origin,
libembroidery.embPattern_write(pattern, file_path)
# convert from pixels to millimeters
# also multiply by 10 to get tenths of a millimeter as required by pyembroidery
"scale": (scale, scale)
}
pyembroidery.write(pattern, file_path, settings)

Wyświetl plik

@ -38,6 +38,15 @@ class ThreadColor(object):
def to_hex_str(self):
return "#%s" % self.hex_digits
@property
def pyembroidery_thread(self):
return {
"name": self.name,
"id": self.number,
"manufacturer": self.manufacturer,
"rgb": int(self.hex_digits, 16),
}
@property
def hex_digits(self):
return "%02X%02X%02X" % self.rgb

Wyświetl plik

@ -65,6 +65,9 @@ class Point:
else:
raise ValueError("cannot multiply Point by %s" % type(other))
def __neg__(self):
return self * -1
def __rmul__(self, other):
if isinstance(other, (int, float)):
return self.__mul__(other)

Wyświetl plik

@ -1,4 +1,4 @@
pyembroidery >=1.2.0, <1.3.0
pyembroidery >=1.2.12, <1.3.0
backports.functools_lru_cache
wxPython
networkx