inkstitch/lib/output.py

116 wiersze
3.5 KiB
Python

# Authors: see git history
#
# Copyright (c) 2010 Authors
# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
import os
import sys
import inkex
import pyembroidery
from .commands import global_command
from .i18n import _
from .stitch_plan import Stitch
from .svg import PIXELS_PER_MM
from .utils import Point
def get_command(stitch):
if stitch.jump:
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(',')
return [float(num) for num in floats]
def get_origin(svg, bounding_box):
(minx, miny, maxx, maxy) = bounding_box
origin_command = global_command(svg, "origin")
if origin_command:
return origin_command.point
else:
bounding_box_center = [(maxx+minx)/2, (maxy+miny)/2]
default = Point(*bounding_box_center)
return default
def jump_to_stop_point(pattern, svg):
stop_position = global_command(svg, "stop_position")
if stop_position:
pattern.add_stitch_absolute(pyembroidery.JUMP, stop_position.point.x, stop_position.point.y)
def write_embroidery_file(file_path, stitch_plan, svg, settings={}):
# convert from pixels to millimeters
# also multiply by 10 to get tenths of a millimeter as required by pyembroidery
scale = 10 / PIXELS_PER_MM
origin = get_origin(svg, stitch_plan.bounding_box)
# origin = origin * scale
pattern = pyembroidery.EmbPattern()
# For later use when writing .dst header title field.
pattern.extras['name'] = os.path.splitext(svg.name)[0]
stitch = Stitch(0, 0)
for color_block in stitch_plan:
pattern.add_thread(color_block.color.pyembroidery_thread)
for stitch in color_block:
if stitch.stop:
jump_to_stop_point(pattern, svg)
command = get_command(stitch)
pattern.add_stitch_absolute(command, stitch.x, stitch.y)
pattern.add_stitch_absolute(pyembroidery.END, stitch.x, stitch.y)
settings.update({
# correct for the origin
"translate": -origin,
# convert from pixels to millimeters
# also multiply by 10 to get tenths of a millimeter as required by pyembroidery
"scale": (scale, scale),
# This forces a jump at the start of the design and after each trim,
# even if we're close enough not to need one.
"full_jump": True,
})
if not file_path.endswith(('.col', '.edr', '.inf')):
settings['encode'] = True
if file_path.endswith('.csv'):
# Special treatment for CSV: instruct pyembroidery not to do any post-
# processing. This will allow the user to match up stitch numbers seen
# in the simulator with commands in the CSV.
settings['max_stitch'] = float('inf')
settings['max_jump'] = float('inf')
settings['explicit_trim'] = False
elif file_path.endswith('.png'):
settings['linewidth'] = 1
settings['background'] = 'white'
try:
pyembroidery.write(pattern, file_path, settings)
except IOError as e:
# L10N low-level file error. %(error)s is (hopefully?) translated by
# the user's system automatically.
msg = _("Error writing to %(path)s: %(error)s") % dict(path=file_path, error=e.strerror)
inkex.errormsg(msg)
sys.exit(1)