chiark / gitweb /
Added dae support which can be exported from google sketchup.
[cura.git] / Cura / cura_sf / fabmetheus_utilities / fabmetheus_tools / interpret_plugins / dae.py
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.
3 import __init__
4
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
8
9 from  xml.parsers.expat import ParserCreate
10
11 def getCarving(fileName=''):
12         "Get the triangle mesh for the dae file."
13         return daeModel().load(fileName)
14
15 class daeModel(triangle_mesh.TriangleMesh):
16         def __init__(self):
17                 triangle_mesh.TriangleMesh.__init__(self)
18
19         def load(self, filename):
20                 r = ParserCreate()
21                 r.StartElementHandler = self._StartElementHandler
22                 r.EndElementHandler = self._EndElementHandler
23                 r.CharacterDataHandler = self._CharacterDataHandler
24
25                 self._base = {}
26                 self._cur = self._base
27                 self._idMap = {}
28                 self._geometryList = []
29                 r.ParseFile(open(filename, "r"))
30                 for geo in self._geometryList:
31                         self._ParseGeometry(self._idMap[geo['_url']])
32                 self._base = None
33                 self._cur = None
34                 self._idMap = None
35                 return self
36         
37         def _StartElementHandler(self, name, attributes):
38                 while name in self._cur:
39                         name += "!"
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]
44                 
45                 if 'id' in attributes:
46                         self._idMap['#' + attributes['id']] = self._cur
47                 
48                 if name == 'instance_geometry':
49                         self._geometryList.append(self._cur)
50                 
51         def _EndElementHandler(self, name):
52                 self._cur = self._cur['_parent']
53
54         def _CharacterDataHandler(self, data):
55                 if len(data.strip()) < 1:
56                         return
57                 if '_data' in self._cur:
58                         self._cur['_data'] += data
59                 else:
60                         self._cur['_data'] = data
61         
62         def _GetWithKey(self, item, basename, key, value):
63                 input = basename
64                 while input in item:
65                         if item[basename]['_'+key] == value:
66                                 return self._idMap[item[input]['_source']]
67                         basename += "!"
68         
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())
73                 
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):
77                         f = face.Face()
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])
82                         self.faces.append(f)