226 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			226 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#######################
 | 
						|
# (c) Jan Walter 2000 #
 | 
						|
#######################
 | 
						|
 | 
						|
# CVS
 | 
						|
# $Author$
 | 
						|
# $Date$
 | 
						|
# $RCSfile$
 | 
						|
# $Revision$
 | 
						|
 | 
						|
import Blender
 | 
						|
 | 
						|
class InventorExport:
 | 
						|
    def __init__(self, filename):
 | 
						|
        self.file = open(filename, "w")
 | 
						|
 | 
						|
    def beginObject(self, object):
 | 
						|
        self.file.write("  Separator {\n")
 | 
						|
 | 
						|
    def endObject(self, object):
 | 
						|
        self.file.write("  }\n")
 | 
						|
 | 
						|
    def export(self, scene):
 | 
						|
        print "exporting ..."
 | 
						|
        self.writeHeader()
 | 
						|
        for name in scene.objects:
 | 
						|
            object = Blender.getObject(name)
 | 
						|
            self.beginObject(object)
 | 
						|
            self.writeObject(object)
 | 
						|
            self.endObject(object)
 | 
						|
        self.writeEnd()
 | 
						|
 | 
						|
    def writeEnd(self):
 | 
						|
        self.file.write("}\n")
 | 
						|
        self.file.close()
 | 
						|
        print "... finished"
 | 
						|
 | 
						|
    def writeFaces(self, faces, smooth, colors, materials, texture):
 | 
						|
        self.file.write("    IndexedFaceSet {\n")
 | 
						|
        # colors
 | 
						|
        if colors:
 | 
						|
            self.file.write("      vertexProperty VertexProperty {\n")
 | 
						|
            self.file.write("        orderedRGBA [\n")
 | 
						|
            for color in colors[:-1]:
 | 
						|
                r = hex(int(color[0] * 255))
 | 
						|
                if len(r) == 3:
 | 
						|
                    r = r + "0"
 | 
						|
                g = hex(int(color[1] * 255))
 | 
						|
                if len(g) == 3:
 | 
						|
                    g = g + "0"
 | 
						|
                b = hex(int(color[2] * 255))
 | 
						|
                if len(b) == 3:
 | 
						|
                    b = b + "0"
 | 
						|
                colstr = r + g[2:] + b[2:]
 | 
						|
                self.file.write("                      %sff,\n" % colstr)
 | 
						|
            color = colors[-1]
 | 
						|
            r = hex(int(color[0] * 255))
 | 
						|
            if len(r) == 3:
 | 
						|
                r = r + "0"
 | 
						|
            g = hex(int(color[1] * 255))
 | 
						|
            if len(g) == 3:
 | 
						|
                g = g + "0"
 | 
						|
            b = hex(int(color[2] * 255))
 | 
						|
            if len(b) == 3:
 | 
						|
                b = b + "0"
 | 
						|
            colstr = r + g[2:] + b[2:]
 | 
						|
            self.file.write("                      %sff\n" % colstr)
 | 
						|
            self.file.write("                    ]\n")
 | 
						|
            self.file.write("        materialBinding PER_VERTEX_INDEXED\n")
 | 
						|
            self.file.write("      }\n")
 | 
						|
        # coordinates
 | 
						|
        self.file.write("      coordIndex [\n")
 | 
						|
        for face in faces[:-1]:
 | 
						|
            if face[4] != smooth:
 | 
						|
                pass
 | 
						|
            elif face[2] == 0 and face[3] == 0:
 | 
						|
                print "can't export lines at the moment ..."
 | 
						|
            elif face[3] == 0:
 | 
						|
                self.file.write("                    %s, %s, %s, -1,\n" %
 | 
						|
                                (face[0], face[1], face[2]))
 | 
						|
            else:
 | 
						|
                self.file.write("                    %s, %s, %s, %s, -1,\n"%
 | 
						|
                                (face[0], face[1], face[2], face[3]))
 | 
						|
        face = faces[-1]
 | 
						|
        if face[4] != smooth:
 | 
						|
            pass
 | 
						|
        elif face[2] == 0 and face[3] == 0:
 | 
						|
            print "can't export lines at the moment ..."
 | 
						|
        elif face[3] == 0:
 | 
						|
            self.file.write("                    %s, %s, %s, -1,\n" %
 | 
						|
                            (face[0], face[1], face[2]))
 | 
						|
        else:
 | 
						|
            self.file.write("                    %s, %s, %s, %s, -1,\n"%
 | 
						|
                            (face[0], face[1], face[2], face[3]))
 | 
						|
        self.file.write("                 ]\n")
 | 
						|
        # materials
 | 
						|
        if not colors and materials:
 | 
						|
            self.file.write("      materialIndex [\n")
 | 
						|
            for face in faces[:-1]:
 | 
						|
                if face[4] != smooth:
 | 
						|
                    pass
 | 
						|
                else:
 | 
						|
                    self.file.write("                      %s,\n" % face[5])
 | 
						|
            face = faces[-1]
 | 
						|
            if face[4] != smooth:
 | 
						|
                pass
 | 
						|
            else:
 | 
						|
                self.file.write("                      %s\n" % face[5])
 | 
						|
            self.file.write("                    ]\n")
 | 
						|
        # texture coordinates
 | 
						|
        if texture:
 | 
						|
            self.file.write("      textureCoordIndex [\n")
 | 
						|
            index = 0
 | 
						|
            for face in faces:
 | 
						|
                if face[3] == 0:
 | 
						|
                    self.file.write("                          " +
 | 
						|
                                    "%s, %s, %s, -1,\n" %
 | 
						|
                                    (index, index+1, index+2))
 | 
						|
                else:
 | 
						|
                    self.file.write("                          " +
 | 
						|
                                    "%s, %s, %s, %s, -1,\n" %
 | 
						|
                                    (index, index+1, index+2, index+3))
 | 
						|
                index = index + 4
 | 
						|
            self.file.write("                        ]\n")
 | 
						|
        self.file.write("    }\n")
 | 
						|
 | 
						|
    def writeHeader(self):
 | 
						|
        self.file.write("#Inventor V2.1 ascii\n\n")
 | 
						|
        self.file.write("Separator {\n")
 | 
						|
        self.file.write("  ShapeHints {\n")
 | 
						|
        self.file.write("    vertexOrdering COUNTERCLOCKWISE\n")
 | 
						|
        self.file.write("  }\n")
 | 
						|
 | 
						|
    def writeMaterials(self, materials):
 | 
						|
        if materials:
 | 
						|
            self.file.write("    Material {\n")
 | 
						|
            self.file.write("               diffuseColor [\n")
 | 
						|
            for name in materials[:-1]:
 | 
						|
                material = Blender.getMaterial(name)
 | 
						|
                self.file.write("                              %s %s %s,\n" %
 | 
						|
                                (material.R, material.G, material.B))
 | 
						|
            name = materials[-1]
 | 
						|
            material = Blender.getMaterial(name)
 | 
						|
            self.file.write("                              %s %s %s\n" %
 | 
						|
                            (material.R, material.G, material.B))
 | 
						|
            self.file.write("                            ]\n")
 | 
						|
            self.file.write("             }\n")
 | 
						|
            self.file.write("    MaterialBinding {\n")
 | 
						|
            self.file.write("                      value PER_FACE_INDEXED\n")
 | 
						|
            self.file.write("                    }\n")
 | 
						|
 | 
						|
    def writeMatrix(self, matrix):
 | 
						|
        self.file.write("    MatrixTransform {\n")
 | 
						|
        self.file.write("      matrix %s %s %s %s\n" %
 | 
						|
                        (matrix[0][0], matrix[0][1],
 | 
						|
                         matrix[0][2], matrix[0][3]))
 | 
						|
        self.file.write("             %s %s %s %s\n" %
 | 
						|
                        (matrix[1][0], matrix[1][1],
 | 
						|
                         matrix[1][2], matrix[1][3]))
 | 
						|
        self.file.write("             %s %s %s %s\n" %
 | 
						|
                        (matrix[2][0], matrix[2][1],
 | 
						|
                         matrix[2][2], matrix[2][3]))
 | 
						|
        self.file.write("             %s %s %s %s\n" %
 | 
						|
                        (matrix[3][0], matrix[3][1],
 | 
						|
                         matrix[3][2], matrix[3][3]))
 | 
						|
        self.file.write("    }\n")
 | 
						|
 | 
						|
    def writeNormals(self, normals):
 | 
						|
        self.file.write("    Normal {\n")
 | 
						|
        self.file.write("      vector [\n")
 | 
						|
        for normal in normals[:-1]:
 | 
						|
            self.file.write("               %s %s %s,\n" %
 | 
						|
                            (normal[0], normal[1], normal[2]))
 | 
						|
        normal = normals[-1]
 | 
						|
        self.file.write("               %s %s %s\n" %
 | 
						|
                        (normal[0], normal[1], normal[2]))
 | 
						|
        self.file.write("             ]\n")
 | 
						|
        self.file.write("    }\n")
 | 
						|
 | 
						|
    def writeObject(self, object):
 | 
						|
        if object.type == "Mesh":
 | 
						|
            mesh = Blender.getMesh(object.data)
 | 
						|
            self.writeMatrix(object.matrix)
 | 
						|
            self.writeMaterials(object.materials)
 | 
						|
            self.writeTexture(mesh.texture, mesh.texcoords)
 | 
						|
            self.writeVertices(mesh.vertices)
 | 
						|
            self.writeFaces(mesh.faces, 0, mesh.colors, object.materials,
 | 
						|
                            mesh.texture)
 | 
						|
            self.writeNormals(mesh.normals)
 | 
						|
            self.writeFaces(mesh.faces, 1, mesh.colors, object.materials,
 | 
						|
                            mesh.texture)
 | 
						|
        else:
 | 
						|
            print "can't export %s at the moment ..." % object.type
 | 
						|
 | 
						|
    def writeTexture(self, texture, texcoords):
 | 
						|
        if texture:
 | 
						|
            self.file.write("    Texture2 {\n")
 | 
						|
            self.file.write('      filename "%s"\n' % texture)
 | 
						|
            self.file.write("    }\n")
 | 
						|
            self.file.write("    TextureCoordinate2 {\n")
 | 
						|
            self.file.write("      point [\n")
 | 
						|
            for texcoord in texcoords:
 | 
						|
                self.file.write("              %s %s,\n" %
 | 
						|
                                (texcoord[0], texcoord[1]))
 | 
						|
            self.file.write("            ]\n")
 | 
						|
            self.file.write("    }\n")
 | 
						|
            self.file.write("    TextureCoordinateBinding {\n")
 | 
						|
            self.file.write("      value PER_VERTEX_INDEXED\n")
 | 
						|
            self.file.write("    }\n")
 | 
						|
 | 
						|
    def writeVertices(self, vertices):
 | 
						|
        self.file.write("    Coordinate3 {\n")
 | 
						|
        self.file.write("      point [\n")
 | 
						|
        for vertex in vertices[:-1]:
 | 
						|
            self.file.write("              %s %s %s,\n" %
 | 
						|
                            (vertex[0], vertex[1], vertex[2]))
 | 
						|
        vertex = vertices[-1]
 | 
						|
        self.file.write("              %s %s %s\n" %
 | 
						|
                        (vertex[0], vertex[1], vertex[2]))
 | 
						|
        self.file.write("            ]\n")
 | 
						|
        self.file.write("    }\n")
 | 
						|
 | 
						|
ivexport = InventorExport("test.iv")
 | 
						|
scene = Blender.getCurrentScene()
 | 
						|
ivexport.export(scene)
 |