From 4fc3d1183bdfcfbe8fd9257ee3f9006bf076429b Mon Sep 17 00:00:00 2001 From: Mike Smith Date: Tue, 13 Aug 2019 22:12:01 -0400 Subject: [PATCH] add support for svg (inkscape "clone") --- flatcamParsers/ParseSVG.py | 16 +++++- tests/svg/use.svg | 101 +++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 tests/svg/use.svg diff --git a/flatcamParsers/ParseSVG.py b/flatcamParsers/ParseSVG.py index 7aabdd85..e09c6729 100644 --- a/flatcamParsers/ParseSVG.py +++ b/flatcamParsers/ParseSVG.py @@ -284,7 +284,7 @@ def svgpolygon2shapely(polygon): # return LinearRing(points) -def getsvggeo(node, object_type): +def getsvggeo(node, object_type, root = None): """ Extracts and flattens all geometry from an SVG node into a list of Shapely geometry. @@ -293,13 +293,16 @@ def getsvggeo(node, object_type): :return: List of Shapely geometry :rtype: list """ + if root is None: + root = node + kind = re.search('(?:\{.*\})?(.*)$', node.tag).group(1) geo = [] # Recurse if len(node) > 0: for child in node: - subgeo = getsvggeo(child, object_type) + subgeo = getsvggeo(child, object_type, root) if subgeo is not None: geo += subgeo @@ -341,6 +344,15 @@ def getsvggeo(node, object_type): pline = svgpolyline2shapely(node) geo = [pline] + elif kind == 'use': + log.debug('***USE***') + # href= is the preferred name for this[1], but inkscape still generates xlink:href=. + # [1] https://developer.mozilla.org/en-US/docs/Web/SVG/Element/use#Attributes + href = node.attrib['href'] if 'href' in node.attrib else node.attrib['{http://www.w3.org/1999/xlink}href'] + ref = root.find(".//*[@id='%s']" % href.replace('#', '')) + if ref is not None: + geo = getsvggeo(ref, object_type, root) + else: log.warning("Unknown kind: " + kind) geo = None diff --git a/tests/svg/use.svg b/tests/svg/use.svg new file mode 100644 index 00000000..735c5954 --- /dev/null +++ b/tests/svg/use.svg @@ -0,0 +1,101 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + +