From b6fc1ab6a8704b51dda1c05942b20b339407200c Mon Sep 17 00:00:00 2001 From: Amanda Ghassaei <amandaghassaei@gmail.com> Date: Fri, 23 Oct 2015 18:23:32 -0400 Subject: [PATCH] writing bin stl file --- dependencies/loaders/binary_stl_writer.js | 60 +++++++++++++++++++++++ js/cells/DMACell.js | 3 +- js/main.js | 4 +- js/models/FileSaver.js | 7 +-- 4 files changed, 68 insertions(+), 6 deletions(-) create mode 100755 dependencies/loaders/binary_stl_writer.js diff --git a/dependencies/loaders/binary_stl_writer.js b/dependencies/loaders/binary_stl_writer.js new file mode 100755 index 00000000..047cf7ae --- /dev/null +++ b/dependencies/loaders/binary_stl_writer.js @@ -0,0 +1,60 @@ +// Written by Paul Kaplan + + +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); + bufferIndex = writeFloat(dataview, bufferIndex, vector.y, isLittleEndian); + return writeFloat(dataview, bufferIndex, vector.z, isLittleEndian); + }; + + var writeFloat = function(dataview, bufferIndex, float, isLittleEndian) { + dataview.setFloat32(bufferIndex, float, isLittleEndian); + return bufferIndex + 4; + }; + + + var isLittleEndian = true; // STL files assume little endian, see wikipedia page + var floatData = []; + + for (var index = 0;index<geometryArray.length;index++){ + + 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]); + } + } + + //write to DataView + var bufferSize = 84 + (50 * floatData.length); + var buffer = new ArrayBuffer(bufferSize); + var dv = new DataView(buffer); + var bufferIndex = 0; + + bufferIndex += 80; // Header is empty + + dv.setUint32(bufferIndex, floatData.length, isLittleEndian); + bufferIndex += 4; + + for (var i=0;i<floatData.length;i++){ + bufferIndex = writeVector(dv, bufferIndex, floatData[i][0], null, floatData[i][5], isLittleEndian); + for (var j=1;j<4;j++){ + bufferIndex = writeVector(dv, bufferIndex, floatData[i][j], floatData[i][4], floatData[i][5], isLittleEndian); + } + bufferIndex += 2; // unused 'attribute byte count' is a Uint16 + } + + + return dv; +}; + diff --git a/js/cells/DMACell.js b/js/cells/DMACell.js index 4fd8903e..3d1619ce 100644 --- a/js/cells/DMACell.js +++ b/js/cells/DMACell.js @@ -352,8 +352,9 @@ 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(mesh.geometry); + geometry.push({geo: mesh.geometry, offset:self.getAbsolutePosition(), orientation:self.getAbsoluteOrientation()}); }); return geometry; }; diff --git a/js/main.js b/js/main.js index 8708ab9c..a7ea11ae 100644 --- a/js/main.js +++ b/js/main.js @@ -23,7 +23,7 @@ require.config({ three: '../dependencies/three', orbitControls: '../dependencies/OrbitControls', stlLoader: '../dependencies/loaders/STLLoader', - stlExport: '../dependencies/THREE2STL', + stlExport: '../dependencies/loaders/binary_stl_writer', threeModel: 'three/ThreeModel', threeView: 'three/ThreeView', fillGeometry: 'three/FillGeometry', @@ -241,7 +241,7 @@ require.config({ exports: 'THREE' }, stlExport: { - exports: 'stlFromGeometry' + exports: 'geometryToSTLBin' }, threeProjector: { deps: ['three'], diff --git a/js/models/FileSaver.js b/js/models/FileSaver.js index 7ba3899c..7fcdb152 100644 --- a/js/models/FileSaver.js +++ b/js/models/FileSaver.js @@ -130,14 +130,15 @@ define(['underscore', 'fileSaverLib', 'lattice', 'materials', 'ribbon', 'menuWra } function saveSTL(){ - require(['stlExport'], function(stlFromGeometry){ + require(['stlExport'], function(geometryToSTLBin){ //merge geometry first var geoArray = []; lattice.loopCells(function(cell){ if (cell) geoArray = geoArray.concat(cell.getVisibleGeometry()); }); - var stlString = stlFromGeometry(geoArray); - saveData(stlString, "DMAssembly", "stl"); + var stlBin = geometryToSTLBin(geoArray); + var blob = new Blob([stlBin], {type: 'application/octet-binary'}); + saveAs(blob, "STL.stl"); }); } -- GitLab