158 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			158 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | #! /usr/bin/env python | ||
|  | 
 | ||
|  | ####################### | ||
|  | # (c) Jan Walter 2000 # | ||
|  | ####################### | ||
|  | 
 | ||
|  | # CVS | ||
|  | # $Author$ | ||
|  | # $Date$ | ||
|  | # $RCSfile$ | ||
|  | # $Revision$ | ||
|  | 
 | ||
|  | TAB = "  " | ||
|  | 
 | ||
|  | vertices        = [] | ||
|  | vertexNormals   = [] | ||
|  | faces           = [] | ||
|  | materials       = [] | ||
|  | switchMaterial  = [] | ||
|  | currentMaterial = [] | ||
|  | materialIndex = 0 | ||
|  | 
 | ||
|  | def addVertex(x, y, z): | ||
|  |     global vertices | ||
|  |     vertices.append([x, y, z]) | ||
|  |     return len(vertices) | ||
|  | 
 | ||
|  | def addVertexNormal(i, j, k): | ||
|  |     global vertexNormals | ||
|  |     vertexNormals.append([i, j, k]) | ||
|  |     return len(vertexNormals) | ||
|  | 
 | ||
|  | def addFace(vi, ti, ni): | ||
|  |     global faces | ||
|  |     faces.append([vi, ti, ni]) | ||
|  |     return len(faces) | ||
|  | 
 | ||
|  | def addMaterial(name, Kd, Ks, Ka): | ||
|  |     global materials | ||
|  |     materials.append([name, Kd, Ks, Ka]) | ||
|  |     return len(materials) | ||
|  | 
 | ||
|  | def findMaterial(name): | ||
|  |     global materials | ||
|  |     for material in materials: | ||
|  |         if material[0] == name: | ||
|  |             return material | ||
|  | 
 | ||
|  | def setCurrentMaterial(name): | ||
|  |     global switchMaterial, faces, currentMaterial | ||
|  |     switchMaterial.append(len(faces)) | ||
|  |     currentMaterial.append(name) | ||
|  | 
 | ||
|  | class OpenInventor: | ||
|  |     def export(self, filename, useNormals = 1, useMaterials = 1): | ||
|  |         global vertices, vertexNormals, faces, materials, switchMaterial | ||
|  |         global currentMaterial, materialIndex | ||
|  |         file = open(filename, "w") | ||
|  |         file.write("#Inventor V2.1 ascii\n\n") | ||
|  |         file.write("Separator {\n") | ||
|  |         ############ | ||
|  |         # vertices # | ||
|  |         ############ | ||
|  |         file.write("%sCoordinate3 {\n" % (TAB, )) | ||
|  |         file.write("%spoint [ \n" % (TAB*2, )) | ||
|  |         for i in xrange(len(vertices)-1): | ||
|  |             x, y, z = vertices[i] | ||
|  |             file.write("%s        %s %s %s,\n" % (TAB*2, x, y, z)) | ||
|  |         x, y, z = vertices[i+1] | ||
|  |         file.write("%s        %s %s %s\n" % (TAB*2, x, y, z)) | ||
|  |         file.write("%s      ] \n" % (TAB*2, )) | ||
|  |         file.write("%s}\n" % (TAB, )) | ||
|  |         ########### | ||
|  |         # normals # | ||
|  |         ########### | ||
|  |         if useNormals: | ||
|  |             file.write("%sNormal {\n" % (TAB, )) | ||
|  |             file.write("%svector [ \n" % (TAB*2, )) | ||
|  |             for i in xrange(len(vertexNormals)-1): | ||
|  |                 x, y, z = vertexNormals[i] | ||
|  |                 file.write("%s         %s %s %s,\n" % (TAB*2, x, y, z)) | ||
|  |             x, y, z = vertexNormals[i-1] | ||
|  |             file.write("%s         %s %s %s\n" % (TAB*2, x, y, z)) | ||
|  |             file.write("%s       ] \n" % (TAB*2, )) | ||
|  |             file.write("%s}\n" % (TAB, )) | ||
|  |         ######### | ||
|  |         # faces # | ||
|  |         ######### | ||
|  |         switchMaterial.append(len(faces)) | ||
|  |         for si in xrange(len(switchMaterial) - 1): | ||
|  |             i1, i2 = switchMaterial[si], switchMaterial[si+1] | ||
|  |             # -------------- | ||
|  |             # write material | ||
|  |             # -------------- | ||
|  |             if materials: | ||
|  |                 name = currentMaterial[materialIndex] | ||
|  |                 material = findMaterial(name) | ||
|  |                 if useMaterials: | ||
|  |                     file.write("%sMaterial {\n" % (TAB, )) | ||
|  |                     file.write("%sambientColor  %s %s %s\n" % | ||
|  |                                (TAB*2, | ||
|  |                                 material[3][0], | ||
|  |                                 material[3][1], | ||
|  |                                 material[3][2])) | ||
|  |                     file.write("%sdiffuseColor  %s %s %s\n" % | ||
|  |                                (TAB*2, | ||
|  |                                 material[1][0], | ||
|  |                                 material[1][1], | ||
|  |                                 material[1][2])) | ||
|  |                     file.write("%sspecularColor %s %s %s\n" % | ||
|  |                                (TAB*2, | ||
|  |                                 material[2][0], | ||
|  |                                 material[2][1], | ||
|  |                                 material[2][2])) | ||
|  |                     file.write("%s}\n" % (TAB, )) | ||
|  |             # ----------- | ||
|  |             # write faces | ||
|  |             # ----------- | ||
|  |             file.write("%sIndexedFaceSet {\n" % (TAB, )) | ||
|  |             # indices for vertices | ||
|  |             file.write("%scoordIndex [ \n" % (TAB*2, )) | ||
|  |             for i in xrange(i1, i2-1): | ||
|  |                 indices = faces[i][0] | ||
|  |                 istring = "" | ||
|  |                 for index in indices: | ||
|  |                     # indices begin with 0 in OpenInventor | ||
|  |                     istring = istring + "%s, " % (index - 1, ) | ||
|  |                 file.write("%s             %s-1, \n" % (TAB*2, istring)) | ||
|  |             indices = faces[i+1][0] | ||
|  |             istring = "" | ||
|  |             for index in indices: | ||
|  |                 # indices begin with 0 in OpenInventor | ||
|  |                 istring = istring + "%s, " % (index - 1, ) | ||
|  |             file.write("%s             %s-1\n" % (TAB*2, istring)) | ||
|  |             file.write("%s           ] \n" % (TAB*2, )) | ||
|  |             # update materialIndex | ||
|  |             materialIndex = materialIndex + 1 | ||
|  |             if useNormals: | ||
|  |                 # indices for normals | ||
|  |                 file.write("%snormalIndex [ \n" % (TAB*2, )) | ||
|  |                 for i in xrange(i1, i2-1): | ||
|  |                     indices = faces[i][2] | ||
|  |                     istring = "" | ||
|  |                     for index in indices: | ||
|  |                         # indices begin with 0 in OpenInventor | ||
|  |                         istring = istring + "%s, " % (index - 1, ) | ||
|  |                     file.write("%s              %s-1, \n" % (TAB*2, istring)) | ||
|  |                 indices = faces[i+1][2] | ||
|  |                 istring = "" | ||
|  |                 for index in indices: | ||
|  |                     # indices begin with 0 in OpenInventor | ||
|  |                     istring = istring + "%s, " % (index - 1, ) | ||
|  |                 file.write("%s              %s-1\n" % (TAB*2, istring)) | ||
|  |                 file.write("%s            ] \n" % (TAB*2, )) | ||
|  |             file.write("%s}\n" % (TAB, )) | ||
|  |         file.write("}\n") | ||
|  |         file.close() |