# ODF 2010-08-05 import BBLuxMat reload(BBLuxMat) from BBLuxMat import MatConverter class Subgeometry(object): def __init__(self, geometry, name): self.geometry = geometry self.sets = self.geometry.Sets() self.name = name self.triangles = [] self.quadrangles = [] self.indexmap = [None] * len(self.sets) self.used_indices = [] self.empty = True def add_polygon(self, poly): self.empty = False start = poly.Start() nv = poly.NumVertices() verts = [] for i in xrange(start, start + nv): mapped = self.indexmap[i] if mapped is None: mapped = self.indexmap[i] = len(self.used_indices) self.used_indices.append(self.sets[i]) verts.append(mapped) if nv == 3: self.triangles.append(verts) elif nv == 4: self.quadrangles.append(verts) else: for v in xrange(1, nv - 1): self.triangles.append([verts(0), verts(v), verts(v + 1)]) def write(self, file): imap = self.indexmap print >>file, 'Shape "mesh"' if self.triangles: file.write(' "integer triindices" [\n') for tri in self.triangles: print >>file, tri[0], tri[1], tri[2] file.write("]\n") if self.quadrangles: file.write(' "integer quadindices" [\n') for quad in self.quadrangles: print >>file, quad[0], quad[1], quad[2], quad[3] file.write("]\n") verts = self.geometry.WorldVertices() if verts and self.used_indices: print >>file, ' "point P" [\n' for i in self.used_indices: vert = verts[i] print >>file, vert.X(), vert.Y(), vert.Z() print >>file, ']\n' else: print "no verts" normals = self.geometry.WorldNormals() if normals and self.used_indices: print >>file, ' "normal N" [\n' for i in self.used_indices: norm = normals[i] print >>file, norm.X(), norm.Y(), norm.Z() print >>file, ']\n' class LuxportActor(object): def __init__(self, actor): self.actor = actor def write(self, file): actor = self.actor geom = actor.Geometry() if geom is None: return figure = self.actor.ItsFigure() if figure: matKey = figure.Name() else: matKey = actor.Name() subgeometries = [] for mat in geom.Materials(): subgeometries.append(Subgeometry(geom, mat.Name())) for poly in geom.Polygons(): subgeometries[poly.MaterialIndex()].add_polygon(poly) for subgeom in subgeometries: if not subgeom.empty: mat = actor.Material(subgeom.name) mc = MatConverter(mat, matKey) print >>file, 'AttributeBegin' print >>file, mc.eval() subgeom.write(file) print >>file, 'AttributeEnd\n'