def __init__(self, filename): self.mesh = Mesh() self.mesh.metaData['filename'] = filename self.volume = self.mesh.newVolume() r = ParserCreate() r.StartElementHandler = self._StartElementHandler r.EndElementHandler = self._EndElementHandler r.CharacterDataHandler = self._CharacterDataHandler self._base = {} self._cur = self._base self._idMap = {} self._geometryList = [] self._faceCount = 0 r.ParseFile(open(filename, "r")) self.vertexCount = 0 for instance_visual_scene in self._base['collada'][0]['scene'][0]['instance_visual_scene']: for node in self._idMap[instance_visual_scene['_url']]['node']: self._ProcessNode1(node) self.volume._prepareFaceCount(self._faceCount) for instance_visual_scene in self._base['collada'][0]['scene'][0]['instance_visual_scene']: for node in self._idMap[instance_visual_scene['_url']]['node']: self._ProcessNode2(node) scale = float(self._base['collada'][0]['asset'][0]['unit'][0]['_meter']) * 1000 self.volume.vertexData *= scale self._base = None self._cur = None self._idMap = None self.volume.calculateNormals()
def loadMeshes(filename): mesh = Mesh() mesh.metaData['filename'] = filename volume = mesh.newVolume() vertexList = [] normalList = [] faceList = [] f = open(filename, "r") for line in f: parts = line.split() if len(parts) < 1: continue if parts[0] == 'v': vertexList.append( [float(parts[1]), -float(parts[3]), float(parts[2])]) if parts[0] == 'vn': normalList.append( [float(parts[1]), -float(parts[3]), float(parts[2])]) if parts[0] == 'f': parts = map(lambda p: p.split('/'), parts) for idx in xrange(1, len(parts) - 2): data = [ int(parts[1][0]), int(parts[idx + 1][0]), int(parts[idx + 2][0]) ] if len(parts[1]) > 2: data += [ int(parts[1][2]), int(parts[idx + 1][2]), int(parts[idx + 2][2]) ] faceList.append(data) f.close() volume._prepareFaceCount(len(faceList)) for f in faceList: i = f[0] - 1 j = f[1] - 1 k = f[2] - 1 if i < 0 or i >= len(vertexList): i = 0 if j < 0 or j >= len(vertexList): j = 0 if k < 0 or k >= len(vertexList): k = 0 volume._addFace(vertexList[i][0], vertexList[i][1], vertexList[i][2], vertexList[j][0], vertexList[j][1], vertexList[j][2], vertexList[k][0], vertexList[k][1], vertexList[k][2]) volume.calculateNormals() if len(normalList) > 0: n = 0 for f in faceList: if len(f) > 3: i = f[3] - 1 j = f[4] - 1 k = f[5] - 1 if i < 0 or i >= len(normalList): i = 0 if j < 0 or j >= len(normalList): j = 0 if k < 0 or k >= len(normalList): k = 0 volume.vertexData[n][3] = normalList[i][0] volume.vertexData[n][4] = normalList[i][1] volume.vertexData[n][5] = normalList[i][2] volume.vertexData[n + 1][3] = normalList[j][0] volume.vertexData[n + 1][4] = normalList[j][1] volume.vertexData[n + 1][5] = normalList[j][2] volume.vertexData[n + 2][3] = normalList[k][0] volume.vertexData[n + 2][4] = normalList[k][1] volume.vertexData[n + 2][5] = normalList[k][2] n += 3 return [mesh]
def loadMeshes(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 ret = [] for amfObj in amf.iter('object'): mesh = Mesh() mesh.metaData['filename'] = filename for amfMesh in amfObj.iter('mesh'): vertexList = [] for vertices in amfMesh.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 amfMesh.iter('volume'): v = mesh.newVolume() count = 0 for triangle in volume.iter('triangle'): count += 1 v._prepareFaceCount(count) for triangle in volume.iter('triangle'): for t in triangle: if t.tag == 'v1': v1 = vertexList[int(t.text)] elif t.tag == 'v2': v2 = vertexList[int(t.text)] elif t.tag == 'v3': v3 = vertexList[int(t.text)] v._addFace(v1[0], v1[1], v1[2], v2[0], v2[1], v2[2], v3[0], v3[1], v3[2]) v.calculateNormals() ret.append(mesh) return ret