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)