kopia lustrzana https://github.com/inkstitch/inkstitch
				
				
				
			
		
			
				
	
	
		
			116 wiersze
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			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)
 |