Esempio n. 1
0
    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()
Esempio n. 2
0
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]
Esempio n. 3
0
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