diff options
Diffstat (limited to 'lib/elements/clone.py')
| -rw-r--r-- | lib/elements/clone.py | 75 |
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) |
