# HG changeset patch # User Matti Hamalainen # Date 1349802863 -10800 # Node ID 3520489320bc688ba4dd11779bd89299bb1fd77b # Parent 3b028785b843a65fb7ddb16d8fe492f196e636c3 Add simplistic SVG to Q3D converter written in Python. diff -r 3b028785b843 -r 3520489320bc svg2qd.py --- /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]+" " + sys.exit(1) + +tree = ET.parse(sys.argv[1]) +iterateDocument(tree.getroot(), 0)