kopia lustrzana https://github.com/EmbroidePy/pyembroidery
git-sync
rodzic
e8bec2e035
commit
816afa9ed8
|
@ -3,4 +3,4 @@ python:
|
|||
- "2.7"
|
||||
- "3.6"
|
||||
script:
|
||||
- python -m unittest discover test
|
||||
- python -m unittest discover test
|
|
@ -1,172 +0,0 @@
|
|||
import pyembroidery.EmbPattern as EmbPattern
|
||||
import math
|
||||
|
||||
|
||||
def distance_squared(x0, y0, x1, y1):
|
||||
dx = x1 - x0
|
||||
dy = y1 - y0
|
||||
dx *= dx
|
||||
dy *= dy
|
||||
return dx + dy
|
||||
|
||||
|
||||
def distance(x0, y0, x1, y1):
|
||||
return math.sqrt(distance_squared(x0, y0, x1, y1))
|
||||
|
||||
|
||||
def towards(a, b, amount):
|
||||
return (amount * (b - a)) + a
|
||||
|
||||
|
||||
def angleR(x0, y0, x1, y1):
|
||||
return math.atan2(y1 - y0, x1 - x0)
|
||||
|
||||
|
||||
def oriented(x0, y0, x1, y1, r):
|
||||
radians = angleR(x0, y0, x1, y1)
|
||||
return (x0 + (r * math.cos(radians)), y0 + (r * math.sin(radians)))
|
||||
|
||||
|
||||
class WriteEncoder():
|
||||
def __init__(self):
|
||||
self.max_jump = float('inf') # type: float
|
||||
self.max_stitch = float('inf') # type: float
|
||||
self.tie_on = False # type: bool
|
||||
self.tie_off = False # type: bool
|
||||
self.needle_x = 0 # type: float
|
||||
self.needle_y = 0 # type: float
|
||||
self.translate_x = 0 # type: float
|
||||
self.translate_y = 0 # type: float
|
||||
|
||||
def set_translation(self, x, y):
|
||||
self.translate_x = x
|
||||
self.translate_y = y
|
||||
|
||||
def jumpTo(self, transcode, x, y):
|
||||
self.step_to(transcode, x, y, self.max_jump, EmbPattern.JUMP)
|
||||
transcode.append([x, y, EmbPattern.JUMP])
|
||||
|
||||
def stitchTo(self, transcode, x, y):
|
||||
self.step_to(transcode, x, y, self.max_stitch, EmbPattern.STITCH)
|
||||
transcode.append([x, y, EmbPattern.STITCH])
|
||||
|
||||
def step_to(self, transcode, x, y, length, data):
|
||||
distance_x = x - self.needle_x
|
||||
distance_y = y - self.needle_y
|
||||
if abs(distance_x) > length or abs(distance_y) > length:
|
||||
stepsX = math.ceil(abs(distance_x / length))
|
||||
stepsY = math.ceil(abs(distance_y / length))
|
||||
if (stepsX > stepsY):
|
||||
steps = stepsX
|
||||
else:
|
||||
steps = stepsY
|
||||
stepSizeX = distance_x / steps
|
||||
stepSizeY = distance_y / steps
|
||||
|
||||
q = 0
|
||||
qe = steps
|
||||
qx = self.needle_x
|
||||
qy = self.needle_y
|
||||
while q < qe:
|
||||
transcode.append([round(qx), round(qy), data])
|
||||
q += 1
|
||||
qx += stepSizeX
|
||||
qy += stepSizeY
|
||||
|
||||
def lock_stitch(self, transcode, lock_x, lock_y, anchor_x, anchor_y):
|
||||
dist = distance(lock_x, lock_y, anchor_x, anchor_y)
|
||||
if dist > self.max_stitch:
|
||||
p = oriented(lock_x, lock_y, anchor_x, anchor_y, self.max_stitch)
|
||||
anchor_x = p[0]
|
||||
anchor_y = p[1]
|
||||
f = (towards(lock_x, anchor_x, .33), towards(lock_y, anchor_y, .33))
|
||||
s = (towards(lock_x, anchor_x, .66), towards(lock_y, anchor_y, .66))
|
||||
self.stitchTo(transcode, lock_x, lock_y)
|
||||
self.stitchTo(transcode, f[0], f[1])
|
||||
self.stitchTo(transcode, s[0], s[1])
|
||||
self.stitchTo(transcode, f[0], f[1])
|
||||
|
||||
def process(self, p):
|
||||
self.needle_x = 0
|
||||
self.needle_y = 0
|
||||
copy = EmbPattern.EmbPattern()
|
||||
EmbPattern.set(p, copy)
|
||||
layer = copy.stitches
|
||||
for stitch in layer:
|
||||
stitch[0] = round(stitch[0] - self.translate_x)
|
||||
stitch[1] = round(stitch[1] - self.translate_y)
|
||||
p.stitches = []
|
||||
p.threadlist = []
|
||||
self.write_code(copy, p)
|
||||
self.write_thread(copy, p)
|
||||
return p
|
||||
|
||||
def write_thread(self, pattern_from, pattern_to):
|
||||
threads_to = pattern_to.threadlist
|
||||
threads_to.extend(pattern_from.threadlist)
|
||||
|
||||
def write_code(self, pattern_source, pattern_dest):
|
||||
source = pattern_source.stitches
|
||||
dest = pattern_dest.stitches
|
||||
flags = EmbPattern.NO_COMMAND
|
||||
trimmed = True
|
||||
for i, stitch in enumerate(source):
|
||||
x = stitch[0]
|
||||
y = stitch[1]
|
||||
flags = stitch[2]
|
||||
if flags == EmbPattern.STITCH:
|
||||
if trimmed:
|
||||
self.jumpTo(dest, x, y)
|
||||
self.needle_x = x
|
||||
self.needle_y = y
|
||||
if self.tie_on:
|
||||
b = source[i + 1]
|
||||
bx = b[0]
|
||||
by = b[1]
|
||||
self.lock_stitch(dest, x, y, bx, by)
|
||||
dest.append([x, y, EmbPattern.STITCH])
|
||||
trimmed = False;
|
||||
else:
|
||||
self.stitchTo(dest, x, y)
|
||||
elif flags == EmbPattern.FRAME_EJECT:
|
||||
if not trimmed:
|
||||
dest.append([self.needle_x, self.needle_y, EmbPattern.TRIM])
|
||||
trimmed = True
|
||||
self.jumpTo(dest, x, y)
|
||||
dest.append([x, y, EmbPattern.STOP])
|
||||
elif flags == EmbPattern.BREAK:
|
||||
if not trimmed:
|
||||
dest.append([self.needle_x, self.needle_y, EmbPattern.TRIM])
|
||||
trimmed = True
|
||||
continue # do not update the needle.
|
||||
elif flags == EmbPattern.BREAK_COLOR:
|
||||
if not trimmed:
|
||||
dest.append([self.needle_x, self.needle_y, EmbPattern.TRIM])
|
||||
trimmed = True
|
||||
dest.append([x, y, EmbPattern.COLOR_CHANGE])
|
||||
continue # do not update the needle.
|
||||
elif flags == EmbPattern.STITCH_FINAL:
|
||||
if self.tie_off:
|
||||
b = source[i - 1]
|
||||
bx = b[0]
|
||||
by = b[1]
|
||||
self.lock_stitch(dest, x, y, bx, by)
|
||||
self.stitchTo(dest, x, y)
|
||||
dest.append([x, y, EmbPattern.TRIM])
|
||||
trimmed = True
|
||||
elif flags == EmbPattern.STITCH_FINAL_COLOR:
|
||||
if self.tie_off:
|
||||
b = source[i - 1]
|
||||
bx = b[0]
|
||||
by = b[1]
|
||||
self.lock_stitch(dest, x, y, bx, by)
|
||||
self.stitchTo(dest, x, y)
|
||||
dest.append([x, y, EmbPattern.TRIM])
|
||||
dest.append([x, y, EmbPattern.COLOR_CHANGE])
|
||||
trimmed = True
|
||||
else:
|
||||
dest.append(stitch)
|
||||
self.needle_x = x
|
||||
self.needle_y = y
|
||||
if flags != EmbPattern.END:
|
||||
dest.append([self.needle_x, self.needle_y, EmbPattern.END])
|
|
@ -1 +0,0 @@
|
|||
|
Ładowanie…
Reference in New Issue