jsketcher/web/app/cad/stl/stlAsciiReader.js
2022-08-15 00:22:42 -07:00

73 lines
No EOL
1.7 KiB
JavaScript

import {StlSolid, StlFace} from './stl-data-structure'
export function parse(buf) {
let solid = new StlSolid('');
let face = new StlFace(null);
let solids = [];
let reader = new LinesReader(buf);
let lineNumber = 0;
while (reader.hasNextLine()) {
let line = reader.nextLine();
lineNumber ++;
var parts = line
.trim()
.split(' ')
.filter(function(part) {
return part !== '';
});
switch(parts[0]) {
case 'solid':
solid = new StlSolid(parts.slice(1).join(' '));
break;
case 'endsolid':
solids.push(solid);
break;
case 'facet':
var noramlParts = parts.slice(2);
if (noramlParts.length == 3) {
face.normal = noramlParts.map(Number);
} else {
console.warn('bad normal definition at line ' + lineNumber);
}
break;
case 'vertex':
var position = parts.slice(1).map(Number);
face.vertices.push(position);
break;
case 'endfacet':
if (face.normal != null && face.vertices.length == 3) {
solid.faces.push(face);
} else {
console.warn('bad stl face at line ' + lineNumber);
}
face = new StlFace(null);
break;
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;
}
}