summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorLex Neva <github.com@lexneva.name>2018-07-15 20:15:35 -0400
committerLex Neva <github.com@lexneva.name>2018-07-25 21:17:58 -0400
commitdbcbf7cff1c8e76a2715d939818124c33cb5fa1e (patch)
treec26e9abc262fa82d7479ad17112975b410049ab4 /lib
parent04ab1c4ae9a7cc9d282a04977ce840bf93e2120c (diff)
switch to pyembroidery for file generation
Diffstat (limited to 'lib')
-rw-r--r--lib/output.py65
-rw-r--r--lib/threads/color.py9
-rw-r--r--lib/utils/geometry.py3
3 files changed, 39 insertions, 38 deletions
diff --git a/lib/output.py b/lib/output.py
index 84128a25..491c190a 100644
--- a/lib/output.py
+++ b/lib/output.py
@@ -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
+
+ settings = {
+ # correct for the origin
+ "translate": -origin,
- # SVG and embroidery disagree on the direction of the Y axis
- libembroidery.embPattern_flipVertical(pattern)
+ # convert from pixels to millimeters
+ # also multiply by 10 to get tenths of a millimeter as required by pyembroidery
+ "scale": (scale, scale)
+ }
- libembroidery.embPattern_write(pattern, file_path)
+ pyembroidery.write(pattern, file_path, settings)
diff --git a/lib/threads/color.py b/lib/threads/color.py
index fede2ecc..d94f8825 100644
--- a/lib/threads/color.py
+++ b/lib/threads/color.py
@@ -39,6 +39,15 @@ class ThreadColor(object):
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
diff --git a/lib/utils/geometry.py b/lib/utils/geometry.py
index 7ff9b1cd..d0cb96cf 100644
--- a/lib/utils/geometry.py
+++ b/lib/utils/geometry.py
@@ -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)