chiark / gitweb /
Add proper copyright statements.
[cura.git] / Cura / util / meshLoaders / amf.py
1 __copyright__ = "Copyright (C) 2013 David Braam - Released under terms of the AGPLv3 License"
2 from __future__ import absolute_import
3
4 import cStringIO as StringIO
5 import zipfile
6 try:
7         from xml.etree import cElementTree as ElementTree
8 except:
9         from xml.etree import ElementTree
10
11 from Cura.util import mesh
12
13 def loadScene(filename):
14         try:
15                 zfile = zipfile.ZipFile(filename)
16                 xml = zfile.read(zfile.namelist()[0])
17                 zfile.close()
18         except zipfile.BadZipfile:
19                 f = open(filename, "r")
20                 xml = f.read()
21                 f.close()
22         amf = ElementTree.fromstring(xml)
23         if 'unit' in amf.attrib:
24                 unit = amf.attrib['unit'].lower()
25         else:
26                 unit = 'millimeter'
27         if unit == 'millimeter':
28                 scale = 1.0
29         elif unit == 'meter':
30                 scale = 1000.0
31         elif unit == 'inch':
32                 scale = 25.4
33         elif unit == 'feet':
34                 scale = 304.8
35         elif unit == 'micron':
36                 scale = 0.001
37         else:
38                 print "Unknown unit in amf: %s" % (unit)
39                 scale = 1.0
40
41         ret = []
42         for amfObj in amf.iter('object'):
43                 obj = mesh.printableObject()
44                 for amfMesh in amfObj.iter('mesh'):
45                         vertexList = []
46                         for vertices in amfMesh.iter('vertices'):
47                                 for vertex in vertices.iter('vertex'):
48                                         for coordinates in vertex.iter('coordinates'):
49                                                 v = [0.0,0.0,0.0]
50                                                 for t in coordinates:
51                                                         if t.tag == 'x':
52                                                                 v[0] = float(t.text)
53                                                         elif t.tag == 'y':
54                                                                 v[1] = float(t.text)
55                                                         elif t.tag == 'z':
56                                                                 v[2] = float(t.text)
57                                                 vertexList.append(v)
58
59                         for volume in amfMesh.iter('volume'):
60                                 m = obj._addMesh()
61                                 count = 0
62                                 for triangle in volume.iter('triangle'):
63                                         count += 1
64                                 m._prepareFaceCount(count)
65
66                                 for triangle in volume.iter('triangle'):
67                                         for t in triangle:
68                                                 if t.tag == 'v1':
69                                                         v1 = vertexList[int(t.text)]
70                                                 elif t.tag == 'v2':
71                                                         v2 = vertexList[int(t.text)]
72                                                 elif t.tag == 'v3':
73                                                         v3 = vertexList[int(t.text)]
74                                                         m._addFace(v1[0], v1[1], v1[2], v2[0], v2[1], v2[2], v3[0], v3[1], v3[2])
75                 obj._postProcessAfterLoad()
76                 ret.append(obj)
77
78         return ret
79
80 def saveScene(filename, objects):
81         xml = StringIO.StringIO()
82         xml.write('<?xml version="1.0" encoding="utf-8"?>\n')
83         xml.write('<amf unit="millimeter" version="1.1">\n')
84         n = 0
85         for obj in objects:
86                 n += 1
87                 xml.write('  <object id="%d">\n' % (n))
88                 xml.write('    <mesh>\n')
89                 xml.write('      <vertices>\n')
90                 for m in obj._meshList:
91                         for v in m.getTransformedVertexes(True):
92                                 xml.write('        <vertex>\n')
93                                 xml.write('          <coordinates>\n')
94                                 xml.write('            <x>%f</x>\n' % (v[0]))
95                                 xml.write('            <y>%f</y>\n' % (v[1]))
96                                 xml.write('            <z>%f</z>\n' % (v[2]))
97                                 xml.write('          </coordinates>\n')
98                                 xml.write('        </vertex>\n')
99                 xml.write('      </vertices>\n')
100
101                 idxOffset = 0
102                 for m in obj._meshList:
103                         xml.write('      <volume>\n')
104                         for idx in xrange(0, len(m.vertexes), 3):
105                                 xml.write('        <triangle>\n')
106                                 xml.write('          <v1>%i</v1>\n' % (idx + idxOffset))
107                                 xml.write('          <v2>%i</v2>\n' % (idx + idxOffset + 1))
108                                 xml.write('          <v3>%i</v3>\n' % (idx + idxOffset + 2))
109                                 xml.write('        </triangle>\n')
110                         xml.write('      </volume>\n')
111                         xml.write('    </mesh>\n')
112                         idxOffset += len(m.vertexes)
113                 xml.write('  </object>\n')
114
115         n += 1
116         xml.write('  <constellation id="%d">\n' % (n))
117         for idx in xrange(1, n):
118                 xml.write('    <instance objectid="%d">\n' % (idx))
119                 xml.write('      <deltax>0</deltax>\n')
120                 xml.write('      <deltay>0</deltay>\n')
121                 xml.write('      <deltaz>0</deltaz>\n')
122                 xml.write('      <rx>0</rx>\n')
123                 xml.write('      <ry>0</ry>\n')
124                 xml.write('      <rz>0</rz>\n')
125                 xml.write('    </instance>\n')
126         xml.write('  </constellation>\n')
127         xml.write('</amf>\n')
128
129         zfile = zipfile.ZipFile(filename, "w", zipfile.ZIP_DEFLATED)
130         zfile.writestr(filename, xml.getvalue())
131         zfile.close()
132         xml.close()