diff options
Diffstat (limited to 'PyEmb.py')
| -rw-r--r-- | PyEmb.py | 160 |
1 files changed, 0 insertions, 160 deletions
diff --git a/PyEmb.py b/PyEmb.py deleted file mode 100644 index 8c02ecc3..00000000 --- a/PyEmb.py +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env python -# http://www.achatina.de/sewing/main/TECHNICL.HTM - -import math -import libembroidery - -PIXELS_PER_MM = 96 / 25.4 - -try: - from functools import lru_cache -except ImportError: - from backports.functools_lru_cache import lru_cache - -# simplify use of lru_cache decorator -def cache(*args, **kwargs): - return lru_cache(maxsize=None)(*args, **kwargs) - -class Point: - - def __init__(self, x, y): - self.x = x - self.y = y - - def __add__(self, other): - return Point(self.x + other.x, self.y + other.y) - - def __sub__(self, other): - return Point(self.x - other.x, self.y - other.y) - - def mul(self, scalar): - return Point(self.x * scalar, self.y * scalar) - - def __mul__(self, other): - if isinstance(other, Point): - # dot product - return self.x * other.x + self.y * other.y - elif isinstance(other, (int, float)): - return Point(self.x * other, self.y * other) - else: - raise ValueError("cannot multiply Point by %s" % type(other)) - - def __rmul__(self, other): - if isinstance(other, (int, float)): - return self.__mul__(other) - else: - raise ValueError("cannot multiply Point by %s" % type(other)) - - def __repr__(self): - return "Point(%s,%s)" % (self.x, self.y) - - def length(self): - return math.sqrt(math.pow(self.x, 2.0) + math.pow(self.y, 2.0)) - - def unit(self): - return self.mul(1.0 / self.length()) - - def rotate_left(self): - return Point(-self.y, self.x) - - def rotate(self, angle): - return Point(self.x * math.cos(angle) - self.y * math.sin(angle), self.y * math.cos(angle) + self.x * math.sin(angle)) - - def as_int(self): - return Point(int(round(self.x)), int(round(self.y))) - - def as_tuple(self): - return (self.x, self.y) - - def __cmp__(self, other): - return cmp(self.as_tuple(), other.as_tuple()) - - def __getitem__(self, item): - return self.as_tuple()[item] - - def __len__(self): - return 2 - - -class Stitch(Point): - def __init__(self, x, y, color=None, jump=False, stop=False, trim=False): - self.x = x - self.y = y - self.color = color - self.jump = jump - self.trim = trim - self.stop = stop - - def __repr__(self): - return "Stitch(%s, %s, %s, %s, %s, %s)" % (self.x, self.y, self.color, "JUMP" if self.jump else "", "TRIM" if self.trim else "", "STOP" if self.stop else "") - -def make_thread(color): - # strip off the leading "#" - if color.startswith("#"): - color = color[1:] - - thread = libembroidery.EmbThread() - thread.color = libembroidery.embColor_fromHexStr(color) - - thread.description = color - thread.catalogNumber = "" - - return thread - -def add_thread(pattern, thread): - """Add a thread to a pattern and return the thread's index""" - - libembroidery.embPattern_addThread(pattern, thread) - - return libembroidery.embThreadList_count(pattern.threadList) - 1 - -def get_flags(stitch): - flags = 0 - - if stitch.jump: - flags |= libembroidery.JUMP - - if stitch.trim: - flags |= libembroidery.TRIM - - if stitch.stop: - flags |= libembroidery.STOP - - return flags - -def write_embroidery_file(file_path, stitches): - # Embroidery machines don't care about our canvas size, so we relocate the - # design to the origin. It might make sense to center it about the origin - # instead. - min_x = min(stitch.x for stitch in stitches) - min_y = min(stitch.y for stitch in stitches) - - pattern = libembroidery.embPattern_create() - threads = {} - - last_color = None - - for stitch in stitches: - if stitch.color != last_color: - if stitch.color not in threads: - thread = make_thread(stitch.color) - thread_index = add_thread(pattern, thread) - threads[stitch.color] = thread_index - else: - thread_index = threads[stitch.color] - - libembroidery.embPattern_changeColor(pattern, thread_index) - last_color = stitch.color - - flags = get_flags(stitch) - libembroidery.embPattern_addStitchAbs(pattern, stitch.x - min_x, stitch.y - min_y, flags, 0) - - libembroidery.embPattern_addStitchAbs(pattern, stitch.x - min_x, stitch.y - min_y, libembroidery.END, 0) - - # convert from pixels to millimeters - libembroidery.embPattern_scale(pattern, 1/PIXELS_PER_MM) - - # SVG and embroidery disagree on the direction of the Y axis - libembroidery.embPattern_flipVertical(pattern) - - libembroidery.embPattern_write(pattern, file_path) |
