Arch: Simplified webgl exporter
This commit is contained in:
parent
e335a4348c
commit
970889a655
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user