stl reader

This commit is contained in:
Val Erastov 2016-11-10 22:09:50 -08:00
parent 6e7c76a16c
commit fa9fa383c6
2 changed files with 92 additions and 0 deletions

View file

@ -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;
}
}

View file

@ -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);
}