From 970889a655a83fb081ad07e6cec6acd517b648d8 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Sat, 13 Apr 2013 00:29:05 -0300 Subject: [PATCH] Arch: Simplified webgl exporter --- src/Mod/Arch/importWebGL.py | 89 +++++++++++++++---------------------- 1 file changed, 36 insertions(+), 53 deletions(-) diff --git a/src/Mod/Arch/importWebGL.py b/src/Mod/Arch/importWebGL.py index 6a2830848..36bd3e332 100644 --- a/src/Mod/Arch/importWebGL.py +++ b/src/Mod/Arch/importWebGL.py @@ -21,9 +21,16 @@ #* * #*************************************************************************** -import FreeCAD,FreeCADGui,Arch,Draft +"FreeCAD webgl exporter" + +import FreeCAD,Draft from DraftTools import translate +if FreeCAD.GuiUp: + import FreeCADGui +else: + FreeCADGui = None + tab = " " addWireframe = False @@ -33,42 +40,38 @@ if open.__module__ == '__builtin__': def export(exportList,filename): "exports the given objects to a .html file" + html = getHTML(exportList) + outfile = pythonopen(filename,"wb") + outfile.write(html) + outfile.close() + FreeCAD.Console.PrintMessage(str(translate("Arch","successfully written "))+filename) + +def getHTML(objectsList): + "returns the complete HTML code of a viewer for the given objects" + # get objects data objectsData = '' - for obj in exportList: + for obj in objectsList: objectsData += getObjectData(obj) - - # build the final file template = getTemplate() template = template.replace("$CameraData",getCameraData()) template = template.replace("$ObjectsData",objectsData) - template = template.replace("$TestData",getTestData()) - outfile = pythonopen(filename,"wb") - outfile.write(template) - outfile.close() - FreeCAD.Console.PrintMessage(str(translate("Arch","successfully written "))+filename) + return template def getCameraData(): "returns the position and direction of the camera as three.js snippet" - # getting camera position - pos = FreeCADGui.ActiveDocument.ActiveView.viewPosition().Base - #result = "camera.position.set( -10,5,15" # test position - result = "camera.position.set( " - result += str(pos.x) + ", " - result += str(pos.y) + ", " - result += str(pos.z) - - # getting camera lookat vector - lookat = FreeCADGui.ActiveDocument.ActiveView.getViewDirection() - lookat = pos.add(lookat) - result += " );\n"+tab+"camera.lookAt( scene.position );\n"+tab - #result += " );\n"+tab+"camera.lookAt( " - #result += str(lookat.x) + ", " - #result += str(lookat.y) + ", " - #result += str(lookat.z) - #result += " );\n"+tab - + result = "" + if FreeCADGui: + # getting camera position + pos = FreeCADGui.ActiveDocument.ActiveView.viewPosition().Base + result += "camera.position.set( " + result += str(pos.x) + ", " + result += str(pos.y) + ", " + result += str(pos.z) + " );\n" + else: + result += "camera.position.set(0,0,1000);\n" + result += tab+"camera.lookAt( scene.position );\n"+tab # print result return result @@ -76,12 +79,9 @@ def getObjectData(obj): "returns the geometry data of an object as three.js snippet" result = "" - if obj.isDerivedFrom("Part::Feature"): - fcmesh = obj.Shape.tessellate(0.1) result = "var geom = new THREE.Geometry();\n" - # adding vertices data for i in range(len(fcmesh[0])): v = fcmesh[0][i] @@ -89,16 +89,13 @@ def getObjectData(obj): result += tab+"console.log(geom.vertices)\n" for i in range(len(fcmesh[0])): result += tab+"geom.vertices.push(v"+str(i)+");\n" - # adding facets data for f in fcmesh[1]: result += tab+"geom.faces.push( new THREE.Face3"+str(f)+" );\n" elif obj.isDerivedFrom("Mesh::Feature"): - mesh = obj.Mesh result = "var geom = new THREE.Geometry();\n" - # adding vertices data for p in mesh.Points: v = p.Vector @@ -107,41 +104,29 @@ def getObjectData(obj): result += tab+"console.log(geom.vertices)\n" for p in mesh.Points: result += tab+"geom.vertices.push(v"+str(p.Index)+");\n" - # adding facets data for f in mesh.Facets: result += tab+"geom.faces.push( new THREE.Face3"+str(f.PointIndices)+" );\n" if result: - # adding a base material - col = obj.ViewObject.ShapeColor - rgb = Draft.getrgb(col,testbw=False) - #rgb = "#888888" # test color + if FreeCADGui: + col = obj.ViewObject.ShapeColor + rgb = Draft.getrgb(col,testbw=False) + else: + rgb = "#888888" # test color result += tab+"var basematerial = new THREE.MeshBasicMaterial( { color: 0x"+str(rgb)[1:]+" } );\n" - # adding a wireframe material result += tab+"var wireframe = new THREE.MeshBasicMaterial( { color: " result += "0x000000, wireframe: true, transparent: true } );\n" result += tab+"var material = [ basematerial, wireframe ];\n" - # adding the mesh to the scene #result += tab+"var mesh = new THREE.Mesh( geom, basematerial );\n" result += tab+"var mesh = new THREE.SceneUtils.createMultiMaterialObject( geom, material );\n" result += tab+"scene.add( mesh );\n"+tab return result - -def getTestData(): - "returns a simple cube as three.js snippet" - - #return """var geometry = new THREE.CubeGeometry( .5, .5, .5 ); - # var material = new THREE.MeshLambertMaterial( { color: 0xFF0000 } ); - # var mesh = new THREE.Mesh( geometry, material ); - # scene.add( mesh );""" - - return "" - + def getTemplate(): "returns a html template" @@ -183,8 +168,6 @@ def getTemplate(): controls.staticMoving = true; controls.dynamicDampingFactor = 0.3; controls.keys = [ 65, 83, 68 ]; - - $TestData // placeholder for a test cube $ObjectsData // placeholder for the FreeCAD objects