diff --git a/dependencies/THREE2STL.js b/dependencies/THREE2STL.js new file mode 100755 index 0000000000000000000000000000000000000000..3bb790948b8350ce896ccc0849d1dd93a95a904f --- /dev/null +++ b/dependencies/THREE2STL.js @@ -0,0 +1,86 @@ +function stlFromGeometry( geometry, options ) { + + // calculate the faces and normals if they are not yet present + geometry.computeFaceNormals() + + var addX = 0 + var addY = 0 + var addZ = 0 + var download = false + + if ( options ) { + if ( options.useObjectPosition ) { + addX = geometry.mesh.position.x + addY = geometry.mesh.position.y + addZ = geometry.mesh.position.z + } + + if ( options.download ) { + download = true + } + } + + + var facetToStl = function( verts, normal ) { + var faceStl = '' + faceStl += 'facet normal ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\n' + faceStl += 'outer loop\n' + + for ( var j = 0; j < 3; j++ ) { + var vert = verts[j] + faceStl += 'vertex ' + (vert.x+addX) + ' ' + (vert.y+addY) + ' ' + (vert.z+addZ) + '\n' + } + + faceStl += 'endloop\n' + faceStl += 'endfacet\n' + + return faceStl + } + + // start bulding the STL string + var stl = '' + stl += 'solid\n' + + for ( var i = 0; i < geometry.faces.length; i++ ) { + var face = geometry.faces[i] + + // if we have just a griangle, that's easy. just write them to the file + if ( face.d === undefined ) { + var verts = [ + geometry.vertices[ face.a ], + geometry.vertices[ face.b ], + geometry.vertices[ face.c ] + ] + + stl += facetToStl( verts, face.normal ) + + } else { + // if it's a quad, we need to triangulate it first + // split the quad into two triangles: abd and bcd + var verts = [] + verts[0] = [ + geometry.vertices[ face.a ], + geometry.vertices[ face.b ], + geometry.vertices[ face.d ] + ] + verts[1] = [ + geometry.vertices[ face.b ], + geometry.vertices[ face.c ], + geometry.vertices[ face.d ] + ] + + for ( var k = 0; k<2; k++ ) { + stl += facetToStl( verts[k], face.normal ) + } + + } + } + + stl += 'endsolid' + + if ( download ) { + document.location = 'data:Application/octet-stream, ' + encodeURIComponent( stl ) + } + + return stl +} diff --git a/js/exportMenu.js b/js/exportMenu.js new file mode 100644 index 0000000000000000000000000000000000000000..b538dbf3a3a00a3d4132605d6ebb4ce052597329 --- /dev/null +++ b/js/exportMenu.js @@ -0,0 +1,21 @@ +/** + * Created by aghassaei on 1/9/15. + */ + + +$(function(){ + + $("#exportSTL").click(function(e){ + e.preventDefault(); + + _.each(three.scene.children, function(object){ + if (object instanceof THREE.Mesh){ + console.log(object.geometry); + stlFromGeometry(object.geometry, {download:true}); + } + }); + + + }) + +}); \ No newline at end of file diff --git a/js/threeMain.js b/js/threeMain.js index a72319cf9b3c3e56ce2a7874601d606483afc2ef..ba18619803493545b55c2ca513abb6d27c6c5e99 100644 --- a/js/threeMain.js +++ b/js/threeMain.js @@ -94,6 +94,7 @@ function Three(){ return {//public properties scene:scene, + // camera:camera, // controls:controls, // renderer:renderer, diff --git a/main.html b/main.html index 2ea746f49a8d30c36bb9e68750196b7621cc7f27..e0e236dd93aa0e49296d08385e55b224e8c19ca3 100644 --- a/main.html +++ b/main.html @@ -27,6 +27,9 @@ <script src="dependencies/OrbitControls.js"></script> <script src="js/threeMain.js"></script> + <!--stl export--> + <script src="dependencies/THREE2STL.js"></script> + <!--multi-threading--> <script src="dependencies/parallel.js"></script> @@ -34,6 +37,7 @@ <script src="dependencies/loaders/STLLoader.js"></script> <script src="js/importMenu.js"></script> <script src="js/elementMenu.js"></script> + <script src="js/exportMenu.js"></script> <link rel="stylesheet" type="text/css" href="css/main.css"> </head> @@ -60,7 +64,7 @@ <a href="#" class="dropdown-toggle" data-toggle="dropdown">Export <b class="caret"></b></a> <span class="dropdown-arrow"></span> <ul class="dropdown-menu"> - <li><a href="#">Action</a></li> + <li><a id="exportSTL" href="#">Export STL</a></li> <li><a href="#">Another action</a></li> <li><a href="#">Something else here</a></li> <li class="divider"></li>