chiark / gitweb /
Add basic AMF support to skeinforge.
authordaid303 <daid303@gmail.com>
Mon, 28 Jan 2013 12:46:12 +0000 (13:46 +0100)
committerdaid303 <daid303@gmail.com>
Mon, 28 Jan 2013 12:46:12 +0000 (13:46 +0100)
Cura/slice/cura_sf/fabmetheus_utilities/fabmetheus_tools/interpret_plugins/amf.py [new file with mode: 0644]

diff --git a/Cura/slice/cura_sf/fabmetheus_utilities/fabmetheus_tools/interpret_plugins/amf.py b/Cura/slice/cura_sf/fabmetheus_utilities/fabmetheus_tools/interpret_plugins/amf.py
new file mode 100644 (file)
index 0000000..b5ddfc4
--- /dev/null
@@ -0,0 +1,72 @@
+from __future__ import absolute_import
+
+import zipfile
+try:
+       from xml.etree import cElementTree as ElementTree
+except:
+       from xml.etree import ElementTree
+
+from fabmetheus_utilities.geometry.geometry_tools import face
+from fabmetheus_utilities.geometry.solids import triangle_mesh
+from fabmetheus_utilities.vector3 import Vector3
+
+def getCarving(fileName=''):
+       "Get the triangle mesh for the dae file."
+       return amfModel().load(fileName)
+
+class amfModel(triangle_mesh.TriangleMesh):
+       def __init__(self):
+               super(amfModel, self).__init__()
+
+       def load(self, filename):
+               try:
+                       zfile = zipfile.ZipFile(filename)
+                       xml = zfile.read(zfile.namelist()[0])
+                       zfile.close()
+               except zipfile.BadZipfile:
+                       f = open(filename, "r")
+                       xml = f.read()
+                       f.close()
+               amf = ElementTree.fromstring(xml)
+               if 'unit' in amf.attrib:
+                       unit = amf.attrib['unit'].lower()
+               else:
+                       unit = 'millimeter'
+               if unit == 'millimeter':
+                       scale = 1.0
+               elif unit == 'meter':
+                       scale = 1000.0
+               elif unit == 'inch':
+                       scale = 25.4
+               elif unit == 'feet':
+                       scale = 304.8
+               elif unit == 'micron':
+                       scale = 0.001
+               else:
+                       print "Unknown unit in amf: %s" % (unit)
+                       scale = 1.0
+
+               for obj in amf.iter('object'):
+                       for mesh in obj.iter('mesh'):
+                               startIndex = len(self.vertexes)
+                               for vertices in mesh.iter('vertices'):
+                                       for vertex in vertices.iter('vertex'):
+                                               for coordinates in vertex.iter('coordinates'):
+                                                       v = [0.0,0.0,0.0]
+                                                       for t in coordinates:
+                                                               if t.tag == 'x':
+                                                                       v[0] = float(t.text)
+                                                               elif t.tag == 'y':
+                                                                       v[1] = float(t.text)
+                                                               elif t.tag == 'z':
+                                                                       v[2] = float(t.text)
+                                                       self.vertexes.append(Vector3(v[0], v[1], v[2]))
+                               for volume in mesh.iter('volume'):
+                                       for triangle in volume.iter('triangle'):
+                                               f = face.Face()
+                                               f.index = len(self.faces)
+                                               for t in triangle:
+                                                       if t.tag == 'v1' or t.tag == 'v2' or t.tag == 'v3':
+                                                               f.vertexIndexes.append(startIndex + int(t.text))
+                                               self.faces.append(f)
+               return self