diff --git a/dependencies/loaders/binary_stl_writer.js b/dependencies/loaders/binary_stl_writer.js index 047cf7aef07437af8ddc26761c637a1dd5201f3d..2d8a55eb0042c55233e0f15582573366657d274c 100755 --- a/dependencies/loaders/binary_stl_writer.js +++ b/dependencies/loaders/binary_stl_writer.js @@ -5,7 +5,6 @@ var geometryToSTLBin = function(geometryArray) { var writeVector = function(dataview, bufferIndex, vector, offset, orientation, isLittleEndian) { vector = vector.clone(); - console.log(orientation); if (orientation) vector.applyQuaternion(orientation); if (offset) vector.add(offset); bufferIndex = writeFloat(dataview, bufferIndex, vector.x, isLittleEndian); @@ -27,14 +26,35 @@ var geometryToSTLBin = function(geometryArray) { var geometry = geometryArray[index].geo; var orientation = geometryArray[index].orientation; var offset = geometryArray[index].offset; - var tris = geometry.faces; - var verts = geometry.vertices; - for(var n = 0; n < tris.length; n++) { - floatData.push([tris[n].normal, verts[tris[n].a], verts[tris[n].b], verts[tris[n].c], offset, orientation]); + if (geometry instanceof THREE.BufferGeometry){ + + var normals = geometry.attributes.normal.array; + var vertices = geometry.attributes.position.array; + for (var n=0;n<vertices.length;n+=9){ + var normal = new THREE.Vector3(normals[n], normals[n+1], normals[n+2]); + var verta = new THREE.Vector3(vertices[n], vertices[n+1], vertices[n+2]); + var vertb = new THREE.Vector3(vertices[n+3], vertices[n+4], vertices[n+5]); + var vertc = new THREE.Vector3(vertices[n+6], vertices[n+7], vertices[n+8]); + floatData.push([normal, verta, vertb, vertc, offset, orientation]); + } + + } else { + + var tris = geometry.faces; + var verts = geometry.vertices; + + for(var n = 0; n < tris.length; n++) { + floatData.push([tris[n].normal, verts[tris[n].a], verts[tris[n].b], verts[tris[n].c], offset, orientation]); + } } } + if (floatData.length == 0){ + console.warn("no data to write to stl"); + return null; + } + //write to DataView var bufferSize = 84 + (50 * floatData.length); var buffer = new ArrayBuffer(bufferSize); diff --git a/js/cells/DMACell.js b/js/cells/DMACell.js index 3d1619ce0b61ca8f6b0466c46236a6cf89f94f59..b73ae8e2149ef7d72b1388133f28ab7466fa3b9d 100644 --- a/js/cells/DMACell.js +++ b/js/cells/DMACell.js @@ -350,26 +350,23 @@ define(['underscore', 'three', 'threeModel', 'lattice', 'appState', 'globals', ' }; DMACell.prototype.getVisibleGeometry = function(){//for save stl - var meshes = this.getVisibleMeshes(); var geometry = []; - var self = this; - _.each(meshes, function(mesh){ - geometry.push({geo: mesh.geometry, offset:self.getAbsolutePosition(), orientation:self.getAbsoluteOrientation()}); - }); - return geometry; - }; - - DMACell.prototype.getVisibleMeshes = function(){ - if (!this.object3D.visible) return []; + if (!this.object3D.visible) return geometry; var meshes = _.filter(this.object3D.children, function(child){ return child.visible && child instanceof THREE.Mesh }); - if (meshes.length > 0) return meshes; - if (!this.cells) return []; + if (meshes.length > 0) { + var self = this; + _.each(meshes, function(mesh){ + geometry.push({geo: mesh.geometry, offset:self.getAbsolutePosition(), orientation:mesh.quaternion.clone().multiply(self.getAbsoluteOrientation())}); + }); + return geometry; + } + if (!this.cells) return geometry; this._loopCells(function(cell){ - if (cell) meshes = meshes.concat(cell.getVisibleMeshes()); + if (cell) geometry = geometry.concat(cell.getVisibleGeometry()); }); - return meshes; + return geometry; }; diff --git a/js/models/FileSaver.js b/js/models/FileSaver.js index 7fcdb152177dcc9f45e6615a068c050b53f3d948..497eb414511fa32b880fde5d5843a3c7bacb72ee 100644 --- a/js/models/FileSaver.js +++ b/js/models/FileSaver.js @@ -137,6 +137,7 @@ define(['underscore', 'fileSaverLib', 'lattice', 'materials', 'ribbon', 'menuWra if (cell) geoArray = geoArray.concat(cell.getVisibleGeometry()); }); var stlBin = geometryToSTLBin(geoArray); + if (!stlBin) return; var blob = new Blob([stlBin], {type: 'application/octet-binary'}); saveAs(blob, "STL.stl"); });