Mercurial > hg > dmlib
view svg2qd.py @ 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 | |
children | 98483680ea0f |
line wrap: on
line source
#!/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)