Mercurial > hg > dmlib
comparison 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 |
comparison
equal
deleted
inserted
replaced
249:3b028785b843 | 250:3520489320bc |
---|---|
1 #!/usr/bin/python | |
2 import sys | |
3 import re | |
4 import xml.etree.ElementTree as ET | |
5 | |
6 | |
7 def bf(x) : | |
8 return int(round(float(x))) | |
9 | |
10 | |
11 def printVertex(v) : | |
12 return "{:.2f},{:.2f},{:.2f}".format(v[0], v[1], v[2]) | |
13 | |
14 | |
15 def getTransform(elem) : | |
16 if "transform" in elem.attrib : | |
17 ntrans = elem.attrib["transform"] | |
18 tmatch = re.compile(r"translate\((.*?)\)", re.IGNORECASE) | |
19 for trns in tmatch.finditer(ntrans) : | |
20 coord = trns.group(1).split(",") | |
21 return [float(coord[0]), float(coord[1]), 0] | |
22 return None | |
23 | |
24 | |
25 def getStyle(elem) : | |
26 style = {} | |
27 if "style" in elem.attrib : | |
28 for elem in elem.attrib["style"].split(";") : | |
29 kv = elem.split(":") | |
30 style[kv[0]] = kv[1] | |
31 return style | |
32 | |
33 | |
34 def printVertices(type, vertices, width) : | |
35 if len(vertices) > 0 : | |
36 list = map(lambda v:printVertex(v), vertices) | |
37 str = "# " | |
38 if type == "m" : | |
39 str = "R" | |
40 elif type == "M" : | |
41 str = "L" | |
42 return str + "{} {} {}".format(len(vertices)-1, " ".join(list), width) | |
43 else : | |
44 return "" | |
45 | |
46 | |
47 def printPath(path, level) : | |
48 style = getStyle(path) | |
49 width = bf(style["stroke-width"]) | |
50 | |
51 trans = getTransform(path) | |
52 if trans : | |
53 print "{}G{}".format(" "*level, printVertex(trans)) | |
54 | |
55 out = "" | |
56 vertices = [] | |
57 type = "" | |
58 for elem in path.attrib["d"].split(" ") : | |
59 if elem == "m" or elem == "M": | |
60 out += printVertices(type, vertices, width) | |
61 pos = [0,0,0] | |
62 type = elem | |
63 elif elem == "z" : | |
64 v = vertices[0] | |
65 vertices.append([v[0] - pos[0], v[1] - pos[1], v[2] - pos[2]]) | |
66 else : | |
67 tmp = elem.split(",") | |
68 px = float(tmp[0]) | |
69 py = float(tmp[1]) | |
70 pos[0] += px | |
71 pos[1] += py | |
72 vertices.append([px, py, 0]) | |
73 | |
74 out += printVertices(type, vertices, width) | |
75 print "{}{}".format(" "*level, out) | |
76 if trans : | |
77 print "{}E\n".format(" "*level) | |
78 | |
79 | |
80 def iterateDocument(elems, level) : | |
81 for elem in elems: | |
82 if elem.tag == "{http://www.w3.org/2000/svg}g" : | |
83 print "\n{}# GROUP".format(" "*level) | |
84 tmp = getTransform(elem) | |
85 if tmp : | |
86 print "{}G{}".format(" "*level, printVertex(getTransform(elem))) | |
87 iterateDocument(elem, level + 1) | |
88 print "{}E\n".format(" "*level) | |
89 else : | |
90 iterateDocument(elem, level) | |
91 elif elem.tag == "{http://www.w3.org/2000/svg}path" : | |
92 printPath(elem, level) | |
93 | |
94 | |
95 # Ns. paaohjelma | |
96 if len(sys.argv) != 2 : | |
97 print "Usage: "+sys.argv[0]+" <input.svg>" | |
98 sys.exit(1) | |
99 | |
100 tree = ET.parse(sys.argv[1]) | |
101 iterateDocument(tree.getroot(), 0) |