mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-10 02:13:58 +01:00
stl reader
This commit is contained in:
parent
6e7c76a16c
commit
fa9fa383c6
2 changed files with 92 additions and 0 deletions
75
web/app/3d/stl/stl-ascii-reader.js
Normal file
75
web/app/3d/stl/stl-ascii-reader.js
Normal 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;
|
||||
}
|
||||
}
|
||||
17
web/app/3d/stl/stl-reader.js
Normal file
17
web/app/3d/stl/stl-reader.js
Normal 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);
|
||||
}
|
||||
Loading…
Reference in a new issue