1 __copyright__ = "Copyright (C) 2013 David Braam - Released under terms of the AGPLv3 License"
2 from __future__ import absolute_import
4 import cStringIO as StringIO
7 from xml.etree import cElementTree as ElementTree
9 from xml.etree import ElementTree
11 from Cura.util import mesh
13 def loadScene(filename):
15 zfile = zipfile.ZipFile(filename)
16 xml = zfile.read(zfile.namelist()[0])
18 except zipfile.BadZipfile:
19 f = open(filename, "r")
22 amf = ElementTree.fromstring(xml)
23 if 'unit' in amf.attrib:
24 unit = amf.attrib['unit'].lower()
27 if unit == 'millimeter':
35 elif unit == 'micron':
38 print "Unknown unit in amf: %s" % (unit)
42 for amfObj in amf.iter('object'):
43 obj = mesh.printableObject()
44 for amfMesh in amfObj.iter('mesh'):
46 for vertices in amfMesh.iter('vertices'):
47 for vertex in vertices.iter('vertex'):
48 for coordinates in vertex.iter('coordinates'):
59 for volume in amfMesh.iter('volume'):
62 for triangle in volume.iter('triangle'):
64 m._prepareFaceCount(count)
66 for triangle in volume.iter('triangle'):
69 v1 = vertexList[int(t.text)]
71 v2 = vertexList[int(t.text)]
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()
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')
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')
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')
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')
129 zfile = zipfile.ZipFile(filename, "w", zipfile.ZIP_DEFLATED)
130 zfile.writestr(filename, xml.getvalue())