chiark / gitweb /
3c01046fd2da5a8b30278e14d726a8a53ca0cbc8
[cura.git] / Cura / util / dae.py
1 import sys, math, re, os, struct, time
2 from  xml.parsers.expat import ParserCreate
3
4 import mesh
5
6 class daeModel(mesh.mesh):
7         def __init__(self):
8                 super(daeModel, self).__init__()
9
10         def load(self, filename):
11                 r = ParserCreate()
12                 r.StartElementHandler = self._StartElementHandler
13                 r.EndElementHandler = self._EndElementHandler
14                 r.CharacterDataHandler = self._CharacterDataHandler
15
16                 self._base = {}
17                 self._cur = self._base
18                 self._idMap = {}
19                 self._geometryList = []
20                 r.ParseFile(open(filename, "r"))
21                 for geo in self._geometryList:
22                         self._ParseGeometry(self._idMap[geo['_url']])
23                 self._base = None
24                 self._cur = None
25                 self._idMap = None
26                 
27                 self._postProcessAfterLoad()
28                 return self
29         
30         def _StartElementHandler(self, name, attributes):
31                 while name in self._cur:
32                         name += "!"
33                 self._cur[name] = {'_parent': self._cur}
34                 self._cur = self._cur[name]
35                 for k in attributes.keys():
36                         self._cur['_' + k] = attributes[k]
37                 
38                 if 'id' in attributes:
39                         self._idMap['#' + attributes['id']] = self._cur
40                 
41                 if name == 'instance_geometry':
42                         self._geometryList.append(self._cur)
43                 
44         def _EndElementHandler(self, name):
45                 self._cur = self._cur['_parent']
46
47         def _CharacterDataHandler(self, data):
48                 if len(data.strip()) < 1:
49                         return
50                 if '_data' in self._cur:
51                         self._cur['_data'] += data
52                 else:
53                         self._cur['_data'] = data
54         
55         def _GetWithKey(self, item, basename, key, value):
56                 input = basename
57                 while input in item:
58                         if item[basename]['_'+key] == value:
59                                 return self._idMap[item[input]['_source']]
60                         basename += "!"
61         
62         def _ParseGeometry(self, geo):
63                 indexList = map(int, geo['mesh']['triangles']['p']['_data'].split())
64                 vertex = self._GetWithKey(geo['mesh']['triangles'], 'input', 'semantic', 'VERTEX')
65                 positionList = map(float, self._GetWithKey(vertex, 'input', 'semantic', 'POSITION')['float_array']['_data'].split())
66                 
67                 self._prepareVertexCount(len(indexList))
68                 for idx in indexList:
69                         self.addVertex(positionList[idx*3], positionList[idx*3+1], positionList[idx*3+2])