From fa9fa383c6e23c2b5b8f58bd6ffba3f52d52b44a Mon Sep 17 00:00:00 2001 From: Val Erastov Date: Thu, 10 Nov 2016 22:09:50 -0800 Subject: [PATCH] stl reader --- web/app/3d/stl/stl-ascii-reader.js | 75 ++++++++++++++++++++++++++++++ web/app/3d/stl/stl-reader.js | 17 +++++++ 2 files changed, 92 insertions(+) create mode 100644 web/app/3d/stl/stl-ascii-reader.js create mode 100644 web/app/3d/stl/stl-reader.js diff --git a/web/app/3d/stl/stl-ascii-reader.js b/web/app/3d/stl/stl-ascii-reader.js new file mode 100644 index 00000000..c040b1a1 --- /dev/null +++ b/web/app/3d/stl/stl-ascii-reader.js @@ -0,0 +1,75 @@ +export function parse(buf) { + + var solid = { + name: null, + faces: [] + }; + var solids = []; + var triangle = []; + var normal = null; + var reader = new LinesReader(buf); + while (reader.hasNextLine()) { + let line = reader.nextLine(); + var parts = line + .trim() + .split(' ') + .filter(function(part) { + return part !== ''; + }); + switch(parts[0]) { + case 'solid': + solid = { + name: parts.slice(1).join(' '), + faces: [] + }; + break; + case 'endsolid': + solids.push(solid); + break; + case 'facet': + var noramlParts = parts.slice(2); + if (noramlParts.length == 3) { + normal = noramlParts.map(Number); + } + break; + case 'vertex': + var position = parts.slice(1).map(Number); + triangle.push(position); + break; + case 'endfacet': + if (triangle.length == 3) { + solid.faces.push({ + vertices: triangle, + normal: normal + }); + } + triangle = []; + normal = null; + default: + // skip + } + } + return solids; +} + +function LinesReader(buf) { + let mark = 0; + let pos = 0; + let arr = new Uint8Array(buf); + this.nextLine = function() { + let str = ""; + for (var i = mark; i < pos; i++) { + str += String.fromCharCode(arr[i]); + } + mark = pos; + return str; + }; + this.hasNextLine = function() { + while (pos < arr.length) { + if (arr[pos ++] == 10) { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/web/app/3d/stl/stl-reader.js b/web/app/3d/stl/stl-reader.js new file mode 100644 index 00000000..5ba78543 --- /dev/null +++ b/web/app/3d/stl/stl-reader.js @@ -0,0 +1,17 @@ +import {parse as ParseASCII} from './stl-ascii-reader' +import {parse as ParseBinary} from './stl-binary-reader' + +export function ParseStl(buf) { + if(typeof buf === 'string') { + return ParseASCII(buf); + } + + //var triangleCount = buf.readUInt32LE(80); + //var expectedSize = 80 + 4 + triangleCount * ((4 * 3) * 4 + 2); + // + //if(expectedSize === buf.length) { + // return parseBinary(buf); + //} + + return ParseASCII(buf); +}