summaryrefslogtreecommitdiff
path: root/lib/elements/clone.py
diff options
context:
space:
mode:
authorKaalleen <36401965+kaalleen@users.noreply.github.com>2021-03-04 18:40:53 +0100
committerGitHub <noreply@github.com>2021-03-04 18:40:53 +0100
commite84a86d4ac0caf29d6074728376ff0a594243fec (patch)
tree888c79ed0094ba2916a1d329861a85515959913c /lib/elements/clone.py
parentb39575a50191307b3b56eab6455626398eec6397 (diff)
Update for Inkscape 1.0 (#880)
* update for inkscape 1.0 * add about extension * Build improvements for the inkscape1.0 branch (#985) * zip: export real svg not stitch plan * #411 and #726 * Tools for Font Creators (#1018) * ignore very small holes in fills * remove embroider (#1026) * auto_fill: ignore shrink_or_grow if result is empty (#589) * break apart: do not ignore small fills Co-authored-by: Hagen Fritsch <rumpeltux-github@irgendwo.org> Co-authored-by: Lex Neva <github.com@lexneva.name>
Diffstat (limited to 'lib/elements/clone.py')
-rw-r--r--lib/elements/clone.py75
1 files changed, 16 insertions, 59 deletions
diff --git a/lib/elements/clone.py b/lib/elements/clone.py
index b8046d2d..fd770bd7 100644
--- a/lib/elements/clone.py
+++ b/lib/elements/clone.py
@@ -1,16 +1,13 @@
-from copy import copy
from math import atan, degrees
-from simpletransform import (applyTransformToNode, applyTransformToPoint,
- computeBBox, parseTransform)
+import inkex
from ..commands import is_command, is_command_symbol
from ..i18n import _
from ..svg.path import get_node_transform
from ..svg.svg import find_elements
-from ..svg.tags import (EMBROIDERABLE_TAGS, INKSTITCH_ATTRIBS, SVG_GROUP_TAG,
- SVG_LINK_TAG, SVG_POLYLINE_TAG, SVG_USE_TAG,
- XLINK_HREF)
+from ..svg.tags import (EMBROIDERABLE_TAGS, INKSTITCH_ATTRIBS,
+ SVG_POLYLINE_TAG, SVG_USE_TAG, XLINK_HREF)
from ..utils import cache
from .auto_fill import AutoFill
from .element import EmbroideryElement, param
@@ -74,16 +71,16 @@ class Clone(EmbroideryElement):
if node.tag == SVG_POLYLINE_TAG:
return [Polyline(node)]
- elif element.get_boolean_param("satin_column") and element.get_style("stroke"):
+ elif element.get_boolean_param("satin_column") and self.get_clone_style("stroke", self.node):
return [SatinColumn(node)]
else:
elements = []
- if element.get_style("fill", "black") and not element.get_style("fill-opacity", 1) == "0":
+ if element.get_style("fill", "black") and not element.get_style("stroke", 1) == "0":
if element.get_boolean_param("auto_fill", True):
elements.append(AutoFill(node))
else:
elements.append(Fill(node))
- if element.get_style("stroke"):
+ if element.get_style("stroke", self.node) is not None:
if not is_command(element.node):
elements.append(Stroke(node))
if element.get_boolean_param("stroke_first", False):
@@ -98,32 +95,8 @@ class Clone(EmbroideryElement):
if source_node.tag not in EMBROIDERABLE_TAGS:
return []
- clone = copy(source_node)
-
- # set id
- clone_id = 'clone__%s__%s' % (self.node.get('id', ''), clone.get('id', ''))
- clone.set('id', clone_id)
-
- # apply transform
- transform = get_node_transform(self.node)
- applyTransformToNode(transform, clone)
-
- # apply style
- stroke_style = self.get_clone_style('stroke', self.node)
- if not stroke_style:
- stroke_style = self.get_clone_style('stroke', source_node)
- fill_style = self.node.get('fill')
- if not fill_style:
- fill_style = self.get_clone_style('fill', source_node, "#000000")
- fill_opacity = self.node.get('fill-opacity')
- if not fill_opacity:
- fill_opacity = self.get_clone_style('fill-opacity', source_node, "1")
- style = "fill:%s;fill-opacity:%s;" % (fill_style, fill_opacity)
- if stroke_style:
- style += "stroke:%s;" % stroke_style
- clone.set('style', style)
-
- # set fill angle. Use either
+ self.node.style = source_node.composed_style()
+
# a. a custom set fill angle
# b. calculated rotation for the cloned fill element to look exactly as it's source
param = INKSTITCH_ATTRIBS['angle']
@@ -131,48 +104,32 @@ class Clone(EmbroideryElement):
angle = self.clone_fill_angle
else:
# clone angle
- clone_mat = parseTransform(clone.get('transform', ''))
+ clone_mat = self.node.composed_transform()
clone_angle = degrees(atan(-clone_mat[1][0]/clone_mat[1][1]))
# source node angle
- source_mat = parseTransform(source_node.get('transform', ''))
+ source_mat = source_node.composed_transform()
source_angle = degrees(atan(-source_mat[1][0]/source_mat[1][1]))
# source node fill angle
source_fill_angle = source_node.get(param, 0)
angle = clone_angle + float(source_fill_angle) - source_angle
- clone.set(param, str(angle))
+ self.node.set(param, str(angle))
- elements = self.clone_to_element(clone)
+ elements = self.clone_to_element(self.node)
for element in elements:
patches.extend(element.to_patches(last_patch))
return patches
- def _get_clone_style_raw(self, style_name, node):
- style = self.parse_style()
- style = style.get(style_name) or self.node.get(style_name)
- parent = self.node.getparent()
- # style not found, get inherited style elements
- while not style and parent is not None:
- if parent.tag not in [SVG_GROUP_TAG, SVG_LINK_TAG]:
- parent = parent.getparent()
- continue
- style = self.parse_style(parent)
- style = style.get(style_name) or parent.get(style_name)
- parent = parent.getparent()
- return style
-
def get_clone_style(self, style_name, node, default=None):
- style = self._get_clone_style_raw(style_name, node) or default
+ style = inkex.styles.AttrFallbackStyle(node).get(style_name) or default
return style
def center(self, source_node):
- xmin, xmax, ymin, ymax = computeBBox([source_node])
- point = [(xmax-((xmax-xmin)/2)), (ymax-((ymax-ymin)/2))]
- transform = get_node_transform(self.node)
- applyTransformToPoint(transform, point)
- return point
+ transform = get_node_transform(self.node.getparent())
+ center = self.node.bounding_box(transform).center
+ return center
def validation_warnings(self):
source_node = get_clone_source(self.node)