Skip to content

Instantly share code, notes, and snippets.

@nikolajbaer
Last active April 24, 2024 13:43
Show Gist options
  • Save nikolajbaer/1bb60fac09e4c92605b866f58c004ef5 to your computer and use it in GitHub Desktop.
Save nikolajbaer/1bb60fac09e4c92605b866f58c004ef5 to your computer and use it in GitHub Desktop.
STL from python server to Three.js viewer example
bin
.Python
lib
include
pip-selfcheck.json
<!DOCTYPE html>
<html lang="en">
<head>
<title>three.js webgl - STL</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r78/three.min.js"></script>
<script src="http://threejs.org/examples/js/loaders/STLLoader.js"></script>
<script>
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
camera.position.z = 5;
camera.position.y = 5
var mesh = null;
var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );
directionalLight.position.set( 1, 1, 0 );
scene.add( directionalLight );
var light = new THREE.AmbientLight( 0x404040 ); // soft white light
scene.add( light );
var loader = new THREE.STLLoader();
loader.load( '/object.stl', function ( geometry ) {
var material = new THREE.MeshPhongMaterial( { color: 0xff0000 } );
mesh = new THREE.Mesh( geometry, material );
mesh.position.set( 0, 0,0);
scene.add( mesh );
camera.lookAt(mesh.position);
});
function render() {
if(mesh!=null){
mesh.rotation.y += 0.01;
}
requestAnimationFrame( render );
renderer.render( scene, camera );
}
render();
</script>
</body>
</html>
from flask import Flask,render_template,make_response
import numpy
from stl import mesh
from io import BytesIO
app = Flask(__name__)
@app.route('/object.stl')
def stl_gen(n=1):
# tetrahedron mesh
data = numpy.zeros(4, dtype=mesh.Mesh.dtype)
b1,b2,b3,t = (1,0,1),(0,0,-0.75),(-1,0,1),(0,1,0)
data['vectors'][0] = numpy.array([b1,b2,b3])
data['vectors'][1] = numpy.array([b1,b2,t])
data['vectors'][2] = numpy.array([b2,b3,t])
data['vectors'][3] = numpy.array([b3,b1,t])
object_mesh = mesh.Mesh(data, remove_empty_areas=False)
# numpy-stl does a poor job of being "API" ready..
# needs a generic string-ready .write method
# (great opportunity for an open source contribution!)
# for now we use a file-like object, BytesIO, to fake it out
output = BytesIO()
object_mesh._write_ascii(output,"object.stl")
response = make_response(output.getvalue())
return response
@app.route("/")
def index():
return render_template("index.html")
if __name__ == "__main__":
import os,sys
if not os.path.exists("templates/index.html"):
print("You need to make a 'templates' folder and move index.html there")
sys.exit(1)
app.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment