summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/elements/clone.py25
-rw-r--r--lib/extensions/unlink_clone.py13
2 files changed, 28 insertions, 10 deletions
diff --git a/lib/elements/clone.py b/lib/elements/clone.py
index 0db8bf4c..943428b8 100644
--- a/lib/elements/clone.py
+++ b/lib/elements/clone.py
@@ -7,7 +7,8 @@ from contextlib import contextmanager
from math import degrees
from typing import Dict, Generator, List
-from inkex import BaseElement, Transform
+from inkex import BaseElement, Title, Transform
+from lxml.etree import _Comment
from shapely import MultiLineString
from ..commands import (find_commands, is_command_symbol,
@@ -17,7 +18,8 @@ from ..stitch_plan.stitch_group import StitchGroup
from ..svg.path import get_node_transform
from ..svg.svg import copy_no_children
from ..svg.tags import (CONNECTION_END, CONNECTION_START, EMBROIDERABLE_TAGS,
- INKSTITCH_ATTRIBS, SVG_GROUP_TAG, SVG_USE_TAG)
+ INKSTITCH_ATTRIBS, SVG_GROUP_TAG, SVG_SYMBOL_TAG,
+ SVG_USE_TAG)
from ..utils import cache
from .element import EmbroideryElement, param
from .validation import ValidationWarning
@@ -182,7 +184,13 @@ class Clone(EmbroideryElement):
parent.add(cloned_node)
# The transform of a resolved clone is based on the clone's transform as well as the source element's transform.
# This makes intuitive sense: The clone of a scaled item is also scaled, the clone of a rotated item is also rotated, etc.
- cloned_node.transform = self.node.transform @ cloned_node.transform
+ clone_translate = Transform(f"translate({float(self.node.get('x', '0'))}, {float(self.node.get('y', '0'))})")
+
+ if cloned_node.tag == SVG_SYMBOL_TAG:
+ for child in cloned_node:
+ child.transform = self.node.transform @ clone_translate @ child.transform
+ else:
+ cloned_node.transform = self.node.transform @ clone_translate @ cloned_node.transform
# Merge the style, if any: Note that the source node's style applies on top of the use's, not the other way around.
cloned_node.style = self.node.style + cloned_node.style
@@ -190,7 +198,10 @@ class Clone(EmbroideryElement):
# Compute angle transform:
# Effectively, this is (local clone transform) * (to parent space) * (from clone's parent space)
# There is a translation component here that will be ignored.
- source_transform: Transform = source_parent.composed_transform()
+ if cloned_node.tag == SVG_SYMBOL_TAG:
+ source_transform: Transform = parent.composed_transform()
+ else:
+ source_transform: Transform = source_parent.composed_transform()
clone_transform: Transform = self.node.composed_transform()
angle_transform = clone_transform @ -source_transform
self.apply_angles(cloned_node, angle_transform)
@@ -249,7 +260,8 @@ class Clone(EmbroideryElement):
return MultiLineString(path[0])
def center(self, source_node):
- transform = get_node_transform(self.node.getparent())
+ translate = Transform(f"translate({float(self.node.get('x', '0'))}, {float(self.node.get('y', '0'))})")
+ transform = get_node_transform(self.node.getparent()) @ translate
center = self.node.bounding_box(transform).center
return center
@@ -280,7 +292,8 @@ def clone_with_fixup(parent: BaseElement, node: BaseElement) -> BaseElement:
id_map[f"#{node.get_id()}"] = f"#{cloned.get_id()}"
for child in node:
- clone_children(cloned, child)
+ if not isinstance(child, _Comment) and not isinstance(child, Title):
+ clone_children(cloned, child)
return cloned
diff --git a/lib/extensions/unlink_clone.py b/lib/extensions/unlink_clone.py
index e94bf0ea..bebfbdb8 100644
--- a/lib/extensions/unlink_clone.py
+++ b/lib/extensions/unlink_clone.py
@@ -3,14 +3,14 @@
# Copyright (c) 2010 Authors
# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
-from inkex import Boolean, errormsg, BaseElement
+from typing import List, Tuple
+
+from inkex import BaseElement, Boolean, Group, errormsg
from ..elements import Clone, EmbroideryElement
from ..i18n import _
+from ..svg.tags import CONNECTION_END, CONNECTION_START, SVG_SYMBOL_TAG
from .base import InkstitchExtension
-from ..svg.tags import CONNECTION_END, CONNECTION_START
-
-from typing import List, Tuple
class UnlinkClone(InkstitchExtension):
@@ -35,6 +35,11 @@ class UnlinkClone(InkstitchExtension):
for element in self.elements:
if isinstance(element, Clone):
resolved = element.resolve_clone(recursive=recursive)
+ if resolved[0].tag in SVG_SYMBOL_TAG:
+ group = Group()
+ for child in resolved[0]:
+ group.append(child)
+ resolved[0].getparent().replace(resolved[0], group)
clones_resolved.append((element.node, resolved[0]))
for (clone, resolved) in clones_resolved: