From 1b016c4469d8971cd978baf513d13b846bd82e12 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Fri, 8 Mar 2013 14:57:32 -0300 Subject: [PATCH] 0001047: Collada export --- src/Mod/Arch/importDAE.py | 54 +++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/src/Mod/Arch/importDAE.py b/src/Mod/Arch/importDAE.py index 408dccce0..4ffa2bde6 100644 --- a/src/Mod/Arch/importDAE.py +++ b/src/Mod/Arch/importDAE.py @@ -103,6 +103,7 @@ def export(exportList,filename): "called when freecad exports a file" if not checkCollada(): return colmesh = collada.Collada() + colmesh.assetInfo.upaxis = collada.asset.UP_AXIS.Z_UP effect = collada.material.Effect("effect0", [], "phong", diffuse=(.7,.7,.7), specular=(1,1,1)) mat = collada.material.Material("material0", "mymaterial", effect) colmesh.effects.append(effect) @@ -110,7 +111,25 @@ def export(exportList,filename): objind = 0 scenenodes = [] for obj in exportList: - if obj.isDerivedFrom("Mesh::Feature"): + if obj.isDerivedFrom("Part::Feature"): + print "exporting object ",obj.Name, obj.Shape + m = obj.Shape.tessellate(1) + vindex = [] + nindex = [] + findex = [] + # vertex indices + for v in m[0]: + vindex.extend([v.x,v.y,v.z]) + # normals + for f in obj.Shape.Faces: + n = f.normalAt(0,0) + for i in range(len(f.tessellate(1)[1])): + nindex.extend([n.x,n.y,n.z]) + # face indices + for i in range(len(m[1])): + f = m[1][i] + findex.extend([f[0],i,f[1],i,f[2],i]) + elif obj.isDerivedFrom("Mesh::Feature"): print "exporting object ",obj.Name, obj.Mesh m = obj.Mesh vindex = [] @@ -127,26 +146,23 @@ def export(exportList,filename): for i in range(len(m.Topology[1])): f = m.Topology[1][i] findex.extend([f[0],i,f[1],i,f[2],i]) - print len(vindex), " vert indices, ", len(nindex), " norm indices, ", len(findex), " face indices." - vert_src = collada.source.FloatSource("cubeverts-array"+str(objind), numpy.array(vindex), ('X', 'Y', 'Z')) - normal_src = collada.source.FloatSource("cubenormals-array"+str(objind), numpy.array(nindex), ('X', 'Y', 'Z')) - geom = collada.geometry.Geometry(colmesh, "geometry"+str(objind), obj.Name, [vert_src, normal_src]) - input_list = collada.source.InputList() - input_list.addInput(0, 'VERTEX', "#cubeverts-array"+str(objind)) - input_list.addInput(1, 'NORMAL', "#cubenormals-array"+str(objind)) - triset = geom.createTriangleSet(numpy.array(findex), input_list, "materialref") - geom.primitives.append(triset) - colmesh.geometries.append(geom) - matnode = collada.scene.MaterialNode("materialref", mat, inputs=[]) - geomnode = collada.scene.GeometryNode(geom, [matnode]) - node = collada.scene.Node("node"+str(objind), children=[geomnode]) - scenenodes.append(node) - objind += 1 + print len(vindex), " vert indices, ", len(nindex), " norm indices, ", len(findex), " face indices." + vert_src = collada.source.FloatSource("cubeverts-array"+str(objind), numpy.array(vindex), ('X', 'Y', 'Z')) + normal_src = collada.source.FloatSource("cubenormals-array"+str(objind), numpy.array(nindex), ('X', 'Y', 'Z')) + geom = collada.geometry.Geometry(colmesh, "geometry"+str(objind), obj.Name, [vert_src, normal_src]) + input_list = collada.source.InputList() + input_list.addInput(0, 'VERTEX', "#cubeverts-array"+str(objind)) + input_list.addInput(1, 'NORMAL', "#cubenormals-array"+str(objind)) + triset = geom.createTriangleSet(numpy.array(findex), input_list, "materialref") + geom.primitives.append(triset) + colmesh.geometries.append(geom) + matnode = collada.scene.MaterialNode("materialref", mat, inputs=[]) + geomnode = collada.scene.GeometryNode(geom, [matnode]) + node = collada.scene.Node("node"+str(objind), children=[geomnode]) + scenenodes.append(node) + objind += 1 myscene = collada.scene.Scene("myscene", scenenodes) colmesh.scenes.append(myscene) colmesh.scene = myscene - myscene = collada.scene.Scene("myscene", [node]) - colmesh.scenes.append(myscene) - colmesh.scene = myscene colmesh.write(filename) FreeCAD.Console.PrintMessage(str(translate("Arch","file %s successfully created.")) % filename)