changeset 250:3520489320bc

Add simplistic SVG to Q3D converter written in Python.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 09 Oct 2012 20:14:23 +0300
parents 3b028785b843
children 98483680ea0f
files svg2qd.py
diffstat 1 files changed, 101 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svg2qd.py	Tue Oct 09 20:14:23 2012 +0300
@@ -0,0 +1,101 @@
+#!/usr/bin/python
+import sys
+import re
+import xml.etree.ElementTree as ET
+
+
+def bf(x) :
+   return int(round(float(x)))
+
+
+def printVertex(v) :
+   return "{:.2f},{:.2f},{:.2f}".format(v[0], v[1], v[2])
+
+
+def getTransform(elem) :
+   if "transform" in elem.attrib :
+      ntrans = elem.attrib["transform"]
+      tmatch = re.compile(r"translate\((.*?)\)", re.IGNORECASE)
+      for trns in tmatch.finditer(ntrans) :
+         coord = trns.group(1).split(",")
+         return [float(coord[0]), float(coord[1]), 0]
+   return None
+
+
+def getStyle(elem) :
+   style = {}
+   if "style" in elem.attrib :
+      for elem in elem.attrib["style"].split(";") :
+         kv = elem.split(":")
+         style[kv[0]] = kv[1]
+   return style
+
+
+def printVertices(type, vertices, width) :
+   if len(vertices) > 0 :
+      list = map(lambda v:printVertex(v), vertices)
+      str = "# "
+      if type == "m" :
+         str = "R"
+      elif type == "M" :
+         str = "L"
+      return str + "{} {} {}".format(len(vertices)-1, " ".join(list), width)
+   else :
+      return ""
+
+
+def printPath(path, level) :
+   style = getStyle(path)
+   width = bf(style["stroke-width"])
+
+   trans = getTransform(path)
+   if trans :
+      print "{}G{}".format("  "*level, printVertex(trans))
+
+   out = ""
+   vertices = []
+   type = ""
+   for elem in path.attrib["d"].split(" ") :
+      if elem == "m" or elem == "M":
+         out += printVertices(type, vertices, width)
+         pos = [0,0,0]
+         type = elem
+      elif elem == "z" :
+         v = vertices[0]
+         vertices.append([v[0] - pos[0], v[1] - pos[1], v[2] - pos[2]])
+      else :
+         tmp = elem.split(",")
+         px = float(tmp[0])
+         py = float(tmp[1])
+         pos[0] += px
+         pos[1] += py
+         vertices.append([px, py, 0])
+
+   out += printVertices(type, vertices, width)
+   print "{}{}".format("  "*level, out)
+   if trans :
+      print "{}E\n".format("  "*level)
+
+
+def iterateDocument(elems, level) :
+   for elem in elems:
+      if elem.tag == "{http://www.w3.org/2000/svg}g" :
+         print "\n{}# GROUP".format("  "*level)
+         tmp = getTransform(elem)
+         if tmp :
+            print "{}G{}".format("  "*level, printVertex(getTransform(elem)))
+            iterateDocument(elem, level + 1)
+            print "{}E\n".format("  "*level)
+         else :
+            iterateDocument(elem, level)
+      elif elem.tag == "{http://www.w3.org/2000/svg}path" :
+         printPath(elem, level)
+
+
+# Ns. paaohjelma
+if len(sys.argv) != 2 :
+   print "Usage: "+sys.argv[0]+" <input.svg>"
+   sys.exit(1)
+   
+tree = ET.parse(sys.argv[1])
+iterateDocument(tree.getroot(), 0)