Arch: Simplified webgl exporter

This commit is contained in:
Yorik van Havre 2013-04-13 00:29:05 -03:00
parent e335a4348c
commit 970889a655

View File

@ -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