summaryrefslogtreecommitdiff
path: root/lib/marker.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/marker.py')
-rw-r--r--lib/marker.py41
1 files changed, 40 insertions, 1 deletions
diff --git a/lib/marker.py b/lib/marker.py
index 1d9145e7..3c145145 100644
--- a/lib/marker.py
+++ b/lib/marker.py
@@ -7,10 +7,12 @@ from copy import deepcopy
from os import path
import inkex
+from shapely import geometry as shgeo
+from .svg.tags import EMBROIDERABLE_TAGS
from .utils import cache, get_bundled_dir
-MARKER = ['pattern']
+MARKER = ['pattern', 'guide-line']
def ensure_marker(svg, marker):
@@ -35,3 +37,40 @@ def set_marker(node, position, marker):
style = [i for i in style if not i.startswith('marker-%s' % position)]
style.append('marker-%s:url(#inkstitch-%s-marker)' % (position, marker))
node.set('style', ";".join(style))
+
+
+def get_marker_elements(node, marker, get_fills=True, get_strokes=True):
+ from .elements import EmbroideryElement
+ from .elements.stroke import Stroke
+
+ fills = []
+ strokes = []
+ xpath = "./parent::svg:g/*[contains(@style, 'marker-start:url(#inkstitch-%s-marker)')]" % marker
+ markers = node.xpath(xpath, namespaces=inkex.NSS)
+ for marker in markers:
+ if marker.tag not in EMBROIDERABLE_TAGS:
+ continue
+
+ element = EmbroideryElement(marker)
+ fill = element.get_style('fill')
+ stroke = element.get_style('stroke')
+
+ if get_fills and fill is not None:
+ fill = Stroke(marker).paths
+ linear_rings = [shgeo.LinearRing(path) for path in fill]
+ for ring in linear_rings:
+ fills.append(shgeo.Polygon(ring))
+
+ if get_strokes and stroke is not None:
+ stroke = Stroke(marker).paths
+ line_strings = [shgeo.LineString(path) for path in stroke]
+ strokes.append(shgeo.MultiLineString(line_strings))
+
+ return {'fill': fills, 'stroke': strokes}
+
+
+def has_marker(node, marker):
+ if node.tag not in EMBROIDERABLE_TAGS:
+ return False
+ style = node.get('style') or ''
+ return "marker-start:url(#inkstitch-%s-marker)" % marker in style