kopia lustrzana https://github.com/inkstitch/inkstitch
add trim commands in import and stitch plan
rodzic
3ef2ad9be4
commit
bec33656ec
|
@ -289,6 +289,10 @@ def add_connector(document, symbol, element):
|
|||
start_pos = (symbol.get('x'), symbol.get('y'))
|
||||
end_pos = element.shape.centroid
|
||||
|
||||
# Make sure the element's XML node has an id so that we can reference it.
|
||||
if element.node.get('id') is None:
|
||||
element.node.set('id', generate_unique_id(document, "object"))
|
||||
|
||||
path = inkex.etree.Element(SVG_PATH_TAG,
|
||||
{
|
||||
"id": generate_unique_id(document, "connector"),
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
import sys
|
||||
|
||||
import shapely.geometry
|
||||
|
||||
from .element import param, EmbroideryElement, Patch
|
||||
from ..i18n import _
|
||||
from ..utils import cache, Point
|
||||
from ..stitches import running_stitch, bean_stitch
|
||||
from ..svg import parse_length_with_units
|
||||
from ..utils import cache, Point
|
||||
from .element import param, EmbroideryElement, Patch
|
||||
|
||||
|
||||
warned_about_legacy_running_stitch = False
|
||||
|
||||
|
@ -85,7 +87,11 @@ class Stroke(EmbroideryElement):
|
|||
@cache
|
||||
def shape(self):
|
||||
line_strings = [shapely.geometry.LineString(path) for path in self.paths]
|
||||
return shapely.geometry.MultiLineString(line_strings)
|
||||
|
||||
# Using convex_hull here is an important optimization. Otherwise
|
||||
# complex paths cause operations on the shape to take a long time.
|
||||
# This especially happens when importing machine embroidery files.
|
||||
return shapely.geometry.MultiLineString(line_strings).convex_hull
|
||||
|
||||
@property
|
||||
@param('manual_stitch',
|
||||
|
|
|
@ -167,9 +167,7 @@ def get_correction_transform(svg):
|
|||
return transform
|
||||
|
||||
|
||||
def color_block_to_realistic_stitches(color_block, svg):
|
||||
paths = []
|
||||
|
||||
def color_block_to_realistic_stitches(color_block, svg, destination):
|
||||
for point_list in color_block_to_point_lists(color_block):
|
||||
if not point_list:
|
||||
continue
|
||||
|
@ -177,7 +175,7 @@ def color_block_to_realistic_stitches(color_block, svg):
|
|||
color = color_block.color.visible_on_white.darker.to_hex_str()
|
||||
start = point_list[0]
|
||||
for point in point_list[1:]:
|
||||
paths.append(inkex.etree.Element(
|
||||
destination.append(inkex.etree.Element(
|
||||
SVG_PATH_TAG,
|
||||
{'style': simplestyle.formatStyle(
|
||||
{
|
||||
|
@ -190,16 +188,23 @@ def color_block_to_realistic_stitches(color_block, svg):
|
|||
}))
|
||||
start = point
|
||||
|
||||
return paths
|
||||
|
||||
|
||||
def color_block_to_paths(color_block, svg):
|
||||
paths = []
|
||||
def color_block_to_paths(color_block, svg, destination):
|
||||
# We could emit just a single path with one subpath per point list, but
|
||||
# emitting multiple paths makes it easier for the user to manipulate them.
|
||||
first = True
|
||||
for point_list in color_block_to_point_lists(color_block):
|
||||
if first:
|
||||
first = False
|
||||
else:
|
||||
# If we try to import these above, we get into a mess of circular
|
||||
# imports.
|
||||
from ..commands import add_commands
|
||||
from ..elements.stroke import Stroke
|
||||
add_commands(Stroke(destination[-1]), ["trim"])
|
||||
|
||||
color = color_block.color.visible_on_white.to_hex_str()
|
||||
paths.append(inkex.etree.Element(
|
||||
destination.append(inkex.etree.Element(
|
||||
SVG_PATH_TAG,
|
||||
{'style': simplestyle.formatStyle(
|
||||
{'stroke': color,
|
||||
|
@ -207,16 +212,9 @@ def color_block_to_paths(color_block, svg):
|
|||
'fill': 'none'}),
|
||||
'd': "M" + " ".join(" ".join(str(coord) for coord in point) for point in point_list),
|
||||
'transform': get_correction_transform(svg),
|
||||
'embroider_manual_stitch': 'true',
|
||||
'embroider_trim_after': 'true',
|
||||
'embroider_manual_stitch': 'true'
|
||||
}))
|
||||
|
||||
# no need to trim at the end of a thread color
|
||||
if paths:
|
||||
paths[-1].attrib.pop('embroider_trim_after')
|
||||
|
||||
return paths
|
||||
|
||||
|
||||
def render_stitch_plan(svg, stitch_plan, realistic=False):
|
||||
layer = svg.find(".//*[@id='__inkstitch_stitch_plan__']")
|
||||
|
@ -232,17 +230,17 @@ def render_stitch_plan(svg, stitch_plan, realistic=False):
|
|||
# make sure the layer is visible
|
||||
layer.set('style', 'display:inline')
|
||||
|
||||
svg.append(layer)
|
||||
|
||||
for i, color_block in enumerate(stitch_plan):
|
||||
group = inkex.etree.SubElement(layer,
|
||||
SVG_GROUP_TAG,
|
||||
{'id': '__color_block_%d__' % i,
|
||||
INKSCAPE_LABEL: "color block %d" % (i + 1)})
|
||||
if realistic:
|
||||
group.extend(color_block_to_realistic_stitches(color_block, svg))
|
||||
color_block_to_realistic_stitches(color_block, svg, group)
|
||||
else:
|
||||
group.extend(color_block_to_paths(color_block, svg))
|
||||
|
||||
svg.append(layer)
|
||||
color_block_to_paths(color_block, svg, group)
|
||||
|
||||
if realistic:
|
||||
defs = svg.find(SVG_DEFS_TAG)
|
||||
|
|
Ładowanie…
Reference in New Issue