pyembroidery/pyembroidery/CsvWriter.py

231 wiersze
6.8 KiB
Python

from .EmbConstant import *
from .WriteHelper import write_string_utf8
from .PecGraphics import get_graphic_as_string
import math
STRIP_SPEEDS = False
SEQUIN_CONTINGENCY = CONTINGENCY_SEQUIN_UTILIZE
MAX_JUMP_DISTANCE = 121
MAX_STITCH_DISTANCE = 121
def csv(f, values):
string = ""
for v in values:
if len(string) > 0:
string += ','
string += ('\"%s\"' % v)
write_string_utf8(f, string + "\n")
def distance(dx, dy):
dx *= dx
dy *= dy
return math.sqrt(dx + dy)
def angle(dx, dy):
tau = math.pi * 2
angle = math.atan2(dy, dx)
angle += tau / float(2)
angle /= tau
return angle
def write(pattern, f, settings=None):
names = get_common_name_dictionary()
deltas = settings is not None and "deltas" in settings
displacement = settings is not None and "displacement" in settings
extends = pattern.extends()
width = extends[2] - extends[0]
height = extends[3] - extends[1]
csv(f, ('#', '[VAR_NAME]', '[VAR_VALUE]'))
count_stitches = pattern.count_stitches()
csv(f, ('>', 'STITCH_COUNT:', str(count_stitches)))
count_threads = pattern.count_color_changes()
csv(f, ('>', 'THREAD_COUNT:', str(count_threads)))
csv(f, ('>', 'EXTENTS_LEFT:', str(extends[0])))
csv(f, ('>', 'EXTENTS_TOP:', str(extends[1])))
csv(f, ('>', 'EXTENTS_RIGHT:', str(extends[2])))
csv(f, ('>', 'EXTENTS_BOTTOM:', str(extends[3])))
csv(f, ('>', 'EXTENTS_WIDTH:', str(width)))
csv(f, ('>', 'EXTENTS_HEIGHT:', str(height)))
stitch_counts = {}
for s in pattern.stitches:
command = s[2]
if command in stitch_counts:
stitch_counts[command] += 1
else:
stitch_counts[command] = 1
if len(stitch_counts) != 0:
for the_key, the_value in stitch_counts.items():
try:
name = "COMMAND_" + names[the_key]
except (IndexError, KeyError):
name = "COMMAND_UNKNOWN_" + str(the_key)
csv(f, (
'>',
name,
str(the_value)
))
write_string_utf8(f, "\n")
if len(pattern.extras) > 0:
csv(f, (
'#',
'[METADATA_NAME]',
'[METADATA]'
))
for the_key, the_value in pattern.extras.items():
if isinstance(the_value, tuple):
the_value = "\n" + get_graphic_as_string(the_value)
csv(f, (
'@',
str(the_key),
str(the_value)
))
write_string_utf8(f, "\n")
if len(pattern.threadlist) > 0:
csv(f, (
'#',
'[THREAD_NUMBER]',
'[HEX_COLOR]',
'[DESCRIPTION]',
'[BRAND]',
'[CATALOG_NUMBER]',
'[DETAILS]',
'[WEIGHT]'
))
for i, thread in enumerate(pattern.threadlist):
csv(f, (
'$',
str(i),
thread.hex_color(),
thread.description,
thread.brand,
thread.catalog_number,
thread.details,
thread.weight,
))
write_string_utf8(f, "\n")
if len(pattern.stitches) > 0:
if displacement:
csv(f, (
'#',
'[STITCH_INDEX]',
'[STITCH_TYPE]',
'[X]',
'[Y]',
'[DX]',
'[R]',
'[ANGLE]'
))
elif deltas:
csv(f, (
'#',
'[STITCH_INDEX]',
'[STITCH_TYPE]',
'[X]',
'[Y]',
'[DX]',
'[DY]'
))
else:
csv(f, (
'#',
'[STITCH_INDEX]',
'[STITCH_TYPE]',
'[X]',
'[Y]'
))
current_x = 0
current_y = 0
for i, stitch in enumerate(pattern.stitches):
try:
name = names[stitch[2]]
except (IndexError, KeyError):
name = "UNKNOWN " + str(stitch[2])
if displacement:
dx = stitch[0] - current_x
dy = stitch[1] - current_y
csv(f, (
'*',
str(i),
name,
str(stitch[0]),
str(stitch[1]),
str(dx),
str(dy),
str(distance(dx, dy)),
str(angle(dx, dy))
))
elif deltas:
dx = stitch[0] - current_x
dy = stitch[1] - current_y
csv(f, (
'*',
str(i),
name,
str(stitch[0]),
str(stitch[1]),
str(dx),
str(dy)
))
else:
csv(f, (
'*',
str(i),
name,
str(stitch[0]),
str(stitch[1]),
))
current_x = stitch[0]
current_y = stitch[1]
def get_common_name_dictionary():
return {
NO_COMMAND: "NO_COMMAND",
STITCH: "STITCH",
JUMP: "JUMP",
TRIM: "TRIM",
STOP: "STOP",
END: "END",
SLOW: "SLOW",
FAST: "FAST",
COLOR_CHANGE: "COLOR_CHANGE",
SEQUIN_MODE: "SEQUIN_MODE",
SEQUIN_EJECT: "SEQUIN_EJECT",
SEW_TO: "SEW_TO",
NEEDLE_AT: "NEEDLE_AT",
STITCH_BREAK: "STITCH_BREAK",
SEQUENCE_BREAK: "SEQUENCE_BREAK",
COLOR_BREAK: "COLOR_BREAK",
TIE_ON: "TIE_ON",
TIE_OFF: "TIE_OFF",
FRAME_EJECT: "FRAME_EJECT",
MATRIX_TRANSLATE: "MATRIX_TRANSLATE",
MATRIX_SCALE: "MATRIX_SCALE",
MATRIX_ROTATE: "MATRIX_ROTATE",
MATRIX_RESET: "MATRIX_RESET",
OPTION_ENABLE_TIE_ON: "OPTION_ENABLE_TIE_ON",
OPTION_ENABLE_TIE_OFF: "OPTION_ENABLE_TIE_OFF",
OPTION_DISABLE_TIE_ON: "OPTION_DISABLE_TIE_ON",
OPTION_DISABLE_TIE_OFF: "OPTION_DISABLE_TIE_OFF",
OPTION_MAX_STITCH_LENGTH: "OPTION_MAX_STITCH_LENGTH",
OPTION_MAX_JUMP_LENGTH: "OPTION_MAX_JUMP_LENGTH",
OPTION_IMPLICIT_TRIM: "OPTION_IMPLICIT_TRIM",
OPTION_EXPLICIT_TRIM: "OPTION_EXPLICIT_TRIM",
CONTINGENCY_NONE: "CONTINGENCY_NONE",
CONTINGENCY_JUMP_NEEDLE: "CONTINGENCY_JUMP_NEEDLE",
CONTINGENCY_SEW_TO: "CONTINGENCY_SEW_TO",
}