summaryrefslogtreecommitdiff
path: root/lib/extensions/apply_pattern.py
diff options
context:
space:
mode:
authorKaalleen <reni@allenka.de>2021-06-28 20:05:50 +0200
committerKaalleen <reni@allenka.de>2021-06-28 20:05:50 +0200
commitecacb9829e9c2b7050486707211f9d176aafdf75 (patch)
treef6f30f9707a9c3f603ce896b0b95dbe5c4b13dc1 /lib/extensions/apply_pattern.py
parent2f54ff2a436f2774bfdc730b6e95c43f18ed81ac (diff)
pattern markers
Diffstat (limited to 'lib/extensions/apply_pattern.py')
-rw-r--r--lib/extensions/apply_pattern.py62
1 files changed, 62 insertions, 0 deletions
diff --git a/lib/extensions/apply_pattern.py b/lib/extensions/apply_pattern.py
new file mode 100644
index 00000000..ad881604
--- /dev/null
+++ b/lib/extensions/apply_pattern.py
@@ -0,0 +1,62 @@
+# 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 ..i18n import _
+from ..svg.tags import SVG_DEFS_TAG
+from .base import InkstitchExtension
+
+
+class ApplyPattern(InkstitchExtension):
+ # This extension will mark selected
+
+ def effect(self):
+ if not self.get_elements():
+ return
+
+ if not self.svg.selected:
+ inkex.errormsg(_("Please select at least one object to be marked as a pattern."))
+ return
+
+ for pattern in self.svg.selected.values():
+ self.set_marker(pattern)
+
+ def set_marker(self, node):
+ xpath = ".//marker[@id='inkstitch-pattern-marker']"
+ pattern_marker = self.document.xpath(xpath)
+
+ if not pattern_marker:
+ # get or create def element
+ defs = self.document.find(SVG_DEFS_TAG)
+ if defs is None:
+ defs = etree.SubElement(self.document, SVG_DEFS_TAG)
+
+ # insert marker
+ marker = """<marker
+ refX="10"
+ refY="5"
+ orient="auto"
+ id="inkstitch-pattern-marker">
+ <g
+ id="inkstitch-pattern-group">
+ <path
+ style="fill:#fafafa;stroke:#ff5500;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 1;stroke-dashoffset:0;stroke-opacity:1;fill-opacity:0.8;"
+ d="M 10.12911,5.2916678 A 4.8374424,4.8374426 0 0 1 5.2916656,10.12911 4.8374424,4.8374426 0 0 1 0.45422399,5.2916678 4.8374424,4.8374426 0 0 1 5.2916656,0.45422399 4.8374424,4.8374426 0 0 1 10.12911,5.2916678 Z"
+ id="inkstitch-pattern-marker-circle" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-miterlimit:4;"
+ id="inkstitch-pattern-marker-spiral"
+ d="M 4.9673651,5.7245662 C 4.7549848,5.7646159 4.6247356,5.522384 4.6430021,5.3419847 4.6765851,5.0103151 5.036231,4.835347 5.3381858,4.8987426 5.7863901,4.9928495 6.0126802,5.4853625 5.9002872,5.9065088 5.7495249,6.4714237 5.1195537,6.7504036 4.5799191,6.5874894 3.898118,6.3816539 3.5659013,5.6122905 3.7800789,4.9545192 4.0402258,4.1556558 4.9498996,3.7699484 5.7256318,4.035839 6.6416744,4.3498087 7.0810483,5.4003986 6.7631909,6.2939744 6.395633,7.3272552 5.2038143,7.8204128 4.1924535,7.4503931 3.0418762,7.0294421 2.4948761,5.6961604 2.9171752,4.567073 3.3914021,3.2991406 4.8663228,2.6982592 6.1130974,3.1729158 7.4983851,3.7003207 8.1531869,5.3169977 7.6260947,6.6814205 7.0456093,8.1841025 5.2870784,8.8928844 3.8050073,8.3132966 2.1849115,7.6797506 1.4221671,5.7793073 2.0542715,4.1796074 2.7408201,2.4420977 4.7832541,1.6253548 6.5005435,2.310012 8.3554869,3.0495434 9.2262638,5.2339874 8.4890181,7.0688861 8.4256397,7.2266036 8.3515789,7.379984 8.2675333,7.5277183" />
+ </g>
+ </marker>""" # noqa: E501
+ defs.append(etree.fromstring(marker))
+
+ # attach marker to node
+ style = node.get('style', '').split(";")
+ 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))