1 from __future__ import absolute_import
2 #Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module.
5 from fabmetheus_utilities.geometry.geometry_tools import face
6 from fabmetheus_utilities.geometry.solids import triangle_mesh
7 from fabmetheus_utilities.vector3 import Vector3
9 from xml.parsers.expat import ParserCreate
11 def getCarving(fileName=''):
12 "Get the triangle mesh for the dae file."
13 return daeModel().load(fileName)
15 class daeModel(triangle_mesh.TriangleMesh):
17 triangle_mesh.TriangleMesh.__init__(self)
19 def load(self, filename):
21 r.StartElementHandler = self._StartElementHandler
22 r.EndElementHandler = self._EndElementHandler
23 r.CharacterDataHandler = self._CharacterDataHandler
26 self._cur = self._base
28 self._geometryList = []
29 r.ParseFile(open(filename, "r"))
30 for geo in self._geometryList:
31 self._ParseGeometry(self._idMap[geo['_url']])
37 def _StartElementHandler(self, name, attributes):
38 while name in self._cur:
40 self._cur[name] = {'_parent': self._cur}
41 self._cur = self._cur[name]
42 for k in attributes.keys():
43 self._cur['_' + k] = attributes[k]
45 if 'id' in attributes:
46 self._idMap['#' + attributes['id']] = self._cur
48 if name == 'instance_geometry':
49 self._geometryList.append(self._cur)
51 def _EndElementHandler(self, name):
52 self._cur = self._cur['_parent']
54 def _CharacterDataHandler(self, data):
55 if len(data.strip()) < 1:
57 if '_data' in self._cur:
58 self._cur['_data'] += data
60 self._cur['_data'] = data
62 def _GetWithKey(self, item, basename, key, value):
65 if item[basename]['_'+key] == value:
66 return self._idMap[item[input]['_source']]
69 def _ParseGeometry(self, geo):
70 indexList = map(int, geo['mesh']['triangles']['p']['_data'].split())
71 vertex = self._GetWithKey(geo['mesh']['triangles'], 'input', 'semantic', 'VERTEX')
72 positionList = map(float, self._GetWithKey(vertex, 'input', 'semantic', 'POSITION')['float_array']['_data'].split())
74 for idx in xrange(0, len(positionList), 3):
75 self.vertexes.append(Vector3(positionList[idx], positionList[idx+1], positionList[idx+2]))
76 for idx in xrange(0, len(indexList), 3):
78 f.index = len(self.faces)
79 f.vertexIndexes.append(indexList[idx])
80 f.vertexIndexes.append(indexList[idx+1])
81 f.vertexIndexes.append(indexList[idx+2])