1 import sys, math, re, os, struct, time
2 from xml.parsers.expat import ParserCreate
6 class daeModel(mesh.mesh):
8 super(daeModel, self).__init__()
10 def load(self, filename):
12 r.StartElementHandler = self._StartElementHandler
13 r.EndElementHandler = self._EndElementHandler
14 r.CharacterDataHandler = self._CharacterDataHandler
17 self._cur = self._base
19 self._geometryList = []
20 r.ParseFile(open(filename, "r"))
21 for geo in self._geometryList:
22 self._ParseGeometry(self._idMap[geo['_url']])
27 self._postProcessAfterLoad()
30 def _StartElementHandler(self, name, attributes):
31 while name in self._cur:
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]
38 if 'id' in attributes:
39 self._idMap['#' + attributes['id']] = self._cur
41 if name == 'instance_geometry':
42 self._geometryList.append(self._cur)
44 def _EndElementHandler(self, name):
45 self._cur = self._cur['_parent']
47 def _CharacterDataHandler(self, data):
48 if len(data.strip()) < 1:
50 if '_data' in self._cur:
51 self._cur['_data'] += data
53 self._cur['_data'] = data
55 def _GetWithKey(self, item, basename, key, value):
58 if item[basename]['_'+key] == value:
59 return self._idMap[item[input]['_source']]
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())
67 self._prepareVertexCount(len(indexList))
69 self.addVertex(positionList[idx*3], positionList[idx*3+1], positionList[idx*3+2])