From: daid303 Date: Mon, 28 Jan 2013 12:29:12 +0000 (+0100) Subject: Add very basic AMF support. X-Git-Tag: 13.03~72 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=2d8e593cc45c11ca8ccd3808a892aef7ad5a67af;p=cura.git Add very basic AMF support. --- diff --git a/Cura/gui/projectPlanner.py b/Cura/gui/projectPlanner.py index 134123fa..377bd997 100644 --- a/Cura/gui/projectPlanner.py +++ b/Cura/gui/projectPlanner.py @@ -26,7 +26,7 @@ from Cura.util import validators from Cura.util import profile from Cura.util import util3d from Cura.util import meshLoader -from Cura.util import stl +from Cura.util.meshLoaders import stl from Cura.util import mesh from Cura.util import sliceRun from Cura.util import gcodeInterpreter diff --git a/Cura/gui/tools/minecraftImport.py b/Cura/gui/tools/minecraftImport.py index 9765c2b0..35eda8c1 100644 --- a/Cura/gui/tools/minecraftImport.py +++ b/Cura/gui/tools/minecraftImport.py @@ -6,7 +6,7 @@ import os import numpy from Cura.util import mesh -from Cura.util import stl +from Cura.util.meshLoaders import stl from Cura.util.pymclevel import mclevel def hasMinecraft(): diff --git a/Cura/util/meshLoader.py b/Cura/util/meshLoader.py index db0f3dbf..6bf2767d 100644 --- a/Cura/util/meshLoader.py +++ b/Cura/util/meshLoader.py @@ -1,11 +1,12 @@ from __future__ import absolute_import -from Cura.util import stl -from Cura.util import obj -from Cura.util import dae +from Cura.util.meshLoaders import stl +from Cura.util.meshLoaders import obj +from Cura.util.meshLoaders import dae +from Cura.util.meshLoaders import amf def supportedExtensions(): - return ['.stl', '.obj', '.dae'] + return ['.stl', '.obj', '.dae', '.amf'] def wildcardFilter(): wildcardList = ';'.join(map(lambda s: '*' + s, supportedExtensions())) @@ -19,6 +20,8 @@ def loadMesh(filename): return obj.objModel().load(filename) if ext == '.dae': return dae.daeModel().load(filename) + if ext == '.amf': + return amf.amfModel().load(filename) print 'Error: Unknown model extension: %s' % (ext) return None diff --git a/Cura/util/meshLoaders/__init__.py b/Cura/util/meshLoaders/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Cura/util/meshLoaders/amf.py b/Cura/util/meshLoaders/amf.py new file mode 100644 index 00000000..30a950c3 --- /dev/null +++ b/Cura/util/meshLoaders/amf.py @@ -0,0 +1,75 @@ +from __future__ import absolute_import + +import zipfile +try: + from xml.etree import cElementTree as ElementTree +except: + from xml.etree import ElementTree + +from Cura.util import mesh + +class amfModel(mesh.mesh): + 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 + + count = 0 + for obj in amf.iter('object'): + for mesh in obj.iter('mesh'): + for volume in mesh.iter('volume'): + for triangle in volume.iter('triangle'): + count += 3 + + self._prepareVertexCount(count) + + for obj in amf.iter('object'): + for mesh in obj.iter('mesh'): + vertexList = [] + 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) + vertexList.append(v) + for volume in mesh.iter('volume'): + for triangle in volume.iter('triangle'): + for t in triangle: + v = vertexList[int(t.text)] + self.addVertex(v[0], v[1], v[2]) + + self.vertexes *= scale + self._postProcessAfterLoad() + return self diff --git a/Cura/util/dae.py b/Cura/util/meshLoaders/dae.py similarity index 100% rename from Cura/util/dae.py rename to Cura/util/meshLoaders/dae.py diff --git a/Cura/util/obj.py b/Cura/util/meshLoaders/obj.py similarity index 100% rename from Cura/util/obj.py rename to Cura/util/meshLoaders/obj.py diff --git a/Cura/util/stl.py b/Cura/util/meshLoaders/stl.py similarity index 100% rename from Cura/util/stl.py rename to Cura/util/meshLoaders/stl.py diff --git a/Cura/util/version.py b/Cura/util/version.py index 8ffceb4e..f153c345 100644 --- a/Cura/util/version.py +++ b/Cura/util/version.py @@ -4,7 +4,10 @@ import os import sys import urllib2 import platform -from xml.etree import ElementTree +try: + from xml.etree import cElementTree as ElementTree +except: + from xml.etree import ElementTree from Cura.util import resources