mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-06 08:25:19 +01:00
73 lines
No EOL
1.7 KiB
JavaScript
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;
|
|
}
|
|
} |