Browse Source

Parse "viewBox" attribute and transform coordinates to this in helper.py.

tags/v2.6.0
Andrew Belt 8 months ago
parent
commit
5ede1ad897
1 changed files with 27 additions and 11 deletions
  1. +27
    -11
      helper.py

+ 27
- 11
helper.py View File

@@ -272,14 +272,30 @@ def panel_to_components(tree):
}

root = tree.getroot()
# Get SVG scale relative to mm
root_height = root.get('height')
if root_height.endswith("mm"):
scale = 1

# Get page size
re_unit = re.compile(r'(-?\d*\.?\d*)\s*([a-zA-Z]*)')
root_width_match = re_unit.match(root.get('width'))
root_height_match = re_unit.match(root.get('height'))
root_width = float(root_width_match[1])
root_height = float(root_height_match[1])
# Since we emit mm2px() below, convert pixels to mm
if root_width_match[2] == 'mm' and root_height_match[2] == 'mm':
root_scale = 1
else:
svg_dpi = 75
mm_per_in = 25.4
scale = mm_per_in / svg_dpi
root_scale = mm_per_in / svg_dpi
root_width *= root_scale
root_height *= root_scale

# Get view box
view = root.get('viewBox', f"0 0 {root_width} {root_height}")
view_ary = view.split(' ')
view_x = float(view_ary[0])
view_y = float(view_ary[1])
view_width = float(view_ary[2])
view_height = float(view_ary[3])

# Get components layer
group = root.find(".//svg:g[@inkscape:label='components']", ns)
@@ -321,10 +337,10 @@ def panel_to_components(tree):

# Get position
if el.tag == '{' + ns['svg'] + '}rect':
x = float(el.get('x')) * scale
y = float(el.get('y')) * scale
width = float(el.get('width')) * scale
height = float(el.get('height')) * scale
x = (float(el.get('x')) - view_x) / view_width * root_width
y = (float(el.get('y')) - view_y) / view_height * root_height
width = (float(el.get('width')) - view_x) / view_width * root_width
height = (float(el.get('height')) - view_y) / view_height * root_height
c['x'] = round(x, 3)
c['y'] = round(y, 3)
c['width'] = round(width, 3)
@@ -332,8 +348,8 @@ def panel_to_components(tree):
c['cx'] = round(x + width / 2, 3)
c['cy'] = round(y + height / 2, 3)
elif el.tag == '{' + ns['svg'] + '}circle' or el.tag == '{' + ns['svg'] + '}ellipse':
cx = float(el.get('cx')) * scale
cy = float(el.get('cy')) * scale
cx = (float(el.get('cx')) - view_x) / view_width * root_width
cy = (float(el.get('cy')) - view_y) / view_height * root_height
c['cx'] = round(cx, 3)
c['cy'] = round(cy, 3)
else:


Loading…
Cancel
Save