From 3d796032c04c665458a61d2cb31b0110e8426224 Mon Sep 17 00:00:00 2001 From: Andrew Belt Date: Sat, 31 Jul 2021 12:08:56 -0400 Subject: [PATCH] Clean up helper.py SVG parser. Allow SVG ellipses to be used as circles. --- helper.py | 55 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/helper.py b/helper.py index 909cb6a5..e4c1dfeb 100755 --- a/helper.py +++ b/helper.py @@ -267,18 +267,14 @@ def panel_to_components(tree): # Get components layer root = tree.getroot() - groups = root.findall(".//svg:g[@inkscape:label='components']", ns) + group = root.find(".//svg:g[@inkscape:label='components']", ns) # Illustrator uses `id` for the group name. - if len(groups) < 1: - groups = root.findall(".//svg:g[@id='components']", ns) - if len(groups) < 1: + # Don't test with `not group` since Elements with no subelements are falsy. + if group is None: + group = root.find(".//svg:g[@id='components']", ns) + if group is None: raise UserException("Could not find \"components\" layer on panel") - # Get circles and rects - components_group = groups[0] - circles = components_group.findall(".//svg:circle", ns) - rects = components_group.findall(".//svg:rect", ns) - components = {} components['params'] = [] components['inputs'] = [] @@ -286,29 +282,20 @@ def panel_to_components(tree): components['lights'] = [] components['widgets'] = [] - for el in circles + rects: + for el in group: c = {} + # Get name - name = el.get('{http://www.inkscape.org/namespaces/inkscape}label') - if name is None: + name = el.get('{' + ns['inkscape'] + '}label') + if not name: name = el.get('id') + if not name: + name = "" name = str_to_identifier(name).upper() c['name'] = name - # Get color - fill = el.get('fill') - style = el.get('style') - if fill: - color_match = re.search(r'#(.{6})', fill) - color = color_match.group(1).lower() - elif style: - color_match = re.search(r'fill:\S*#(.{6});', style) - color = color_match.group(1).lower() - else: - raise UserException("Cannot get color of component") - # Get position - if el.tag == "{http://www.w3.org/2000/svg}rect": + if el.tag == '{' + ns['svg'] + '}rect': x = float(el.get('x')) y = float(el.get('y')) width = float(el.get('width')) @@ -319,11 +306,27 @@ def panel_to_components(tree): c['height'] = round(height, 3) c['cx'] = round(x + width / 2, 3) c['cy'] = round(y + height / 2, 3) - elif el.tag == "{http://www.w3.org/2000/svg}circle": + elif el.tag == '{' + ns['svg'] + '}circle' or el.tag == '{' + ns['svg'] + '}ellipse': cx = float(el.get('cx')) cy = float(el.get('cy')) c['cx'] = round(cx, 3) c['cy'] = round(cy, 3) + else: + print(f"Element in components layer is not rect, circle, or ellipse: {el}") + continue + + # Get color + fill = el.get('fill') + style = el.get('style') + if fill: + color_match = re.search(r'#(.{6})', fill) + color = color_match.group(1).lower() + elif style: + color_match = re.search(r'fill:\S*#(.{6});', style) + color = color_match.group(1).lower() + else: + print(f"Cannot get color of component: {el}") + continue if color == 'ff0000': components['params'].append(c)