# Authors: see git history # # Copyright (c) 2021 Authors # Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details. import inkex from lxml import etree from ..elements import SatinColumn from ..i18n import _ from ..svg.tags import INKSTITCH_ATTRIBS, SVG_DEFS_TAG from .base import InkstitchExtension class ApplySatinPattern(InkstitchExtension): # Add inkstitch:pattern attribute to selected patterns. The patterns will be projected on a satin column, which must be in the selection too def effect(self): if not self.get_elements(): return if not self.svg.selected or not any(isinstance(item, SatinColumn) for item in self.elements) or len(self.svg.selected) < 2: inkex.errormsg(_("Please select at least one satin column and a pattern.")) return if sum(isinstance(item, SatinColumn) for item in self.elements) > 1: inkex.errormsg(_("Please select only one satin column.")) return satin_id = self.get_satin_column().node.get('id', None) patterns = self.get_patterns() for pattern in patterns: pattern.node.set(INKSTITCH_ATTRIBS['pattern'], satin_id) self.set_marker(pattern.node) def get_satin_column(self): return list(filter(lambda satin: isinstance(satin, SatinColumn), self.elements))[0] def get_patterns(self): return list(filter(lambda satin: not isinstance(satin, SatinColumn), self.elements)) def set_marker(self, node): document = node.getroottree().getroot() xpath = ".//marker[@id='inkstitch-pattern-marker']" pattern_marker = document.xpath(xpath) if not pattern_marker: # get or create def element defs = document.find(SVG_DEFS_TAG) if defs is None: defs = etree.SubElement(document, SVG_DEFS_TAG) # insert marker marker = """ """ # noqa: E501 defs.append(etree.fromstring(marker)) # attach marker to node style = node.get('style', '').split(";") import sys print(style, file=sys.stderr) style = [i for i in style if not i.startswith('marker-start')] style.append('marker-start:url(#inkstitch-pattern-marker)') node.set('style', ";".join(style))