fix stl export size (kiri). add stl export (mesh)
This commit is contained in:
parent
b8877f1225
commit
66ca161ccd
4 changed files with 56 additions and 16 deletions
|
|
@ -100,22 +100,56 @@ let object = {
|
|||
let file = {
|
||||
export(data, send) {
|
||||
let { format, recs } = data;
|
||||
let vtot = 0;
|
||||
for (let rec of recs) {
|
||||
let { id, matrix, file } = rec;
|
||||
let vs = rec.varr = Array.from(translate_encode(id, matrix)).map(v => v.round(5));
|
||||
vtot += (vs.length / 3);
|
||||
}
|
||||
switch (format) {
|
||||
case "obj":
|
||||
let p = 1;
|
||||
let obj = [`# Generated By Kiri:Moto (units = millimeters)`];
|
||||
let obj = [`# Generated By Mesh:Tool @ https://grid.space/mesh (units = millimeters)`];
|
||||
for (let rec of recs) {
|
||||
let { id, matrix, file } = rec;
|
||||
let verts = Array.from(translate_encode(id, matrix)).map(v => v.round(5));
|
||||
let { id, matrix, file, varr } = rec;
|
||||
obj.push(`g ${file}`);
|
||||
for (let i=0; i<verts.length; p += 3) {
|
||||
obj.push(`v ${verts[i++]} ${verts[i++]} ${verts[i++]}`);
|
||||
obj.push(`v ${verts[i++]} ${verts[i++]} ${verts[i++]}`);
|
||||
obj.push(`v ${verts[i++]} ${verts[i++]} ${verts[i++]}`);
|
||||
for (let i=0; i<varr.length; p += 3) {
|
||||
obj.push(`v ${varr[i++]} ${varr[i++]} ${varr[i++]}`);
|
||||
obj.push(`v ${varr[i++]} ${varr[i++]} ${varr[i++]}`);
|
||||
obj.push(`v ${varr[i++]} ${varr[i++]} ${varr[i++]}`);
|
||||
obj.push(`f ${p} ${p+1} ${p+2}`);
|
||||
}
|
||||
}
|
||||
return obj.join('\n');
|
||||
case "stl":
|
||||
let stl = new Uint8Array(80 + 4 + vtot/3 * 50);
|
||||
let dat = new DataView(stl.buffer);
|
||||
let pos = 84;
|
||||
// todo put Kiri:Moto info in header
|
||||
dat.setInt32(80, vtot/3, true);
|
||||
for (let rec of recs) {
|
||||
let { id, matrix, file, varr } = rec;
|
||||
for (let i=0, l=varr.length; i<l;) {
|
||||
let p0 = new THREE.Vector3(varr[i++], varr[i++], varr[i++]);
|
||||
let p1 = new THREE.Vector3(varr[i++], varr[i++], varr[i++]);
|
||||
let p2 = new THREE.Vector3(varr[i++], varr[i++], varr[i++]);
|
||||
let norm = THREE.computeFaceNormal(p0, p1, p2);
|
||||
dat.setFloat32(pos + 0, norm.x, true);
|
||||
dat.setFloat32(pos + 4, norm.y, true);
|
||||
dat.setFloat32(pos + 8, norm.z, true);
|
||||
dat.setFloat32(pos + 12, p0.x, true);
|
||||
dat.setFloat32(pos + 16, p0.y, true);
|
||||
dat.setFloat32(pos + 20, p0.z, true);
|
||||
dat.setFloat32(pos + 24, p1.x, true);
|
||||
dat.setFloat32(pos + 28, p1.y, true);
|
||||
dat.setFloat32(pos + 32, p1.z, true);
|
||||
dat.setFloat32(pos + 36, p2.x, true);
|
||||
dat.setFloat32(pos + 40, p2.y, true);
|
||||
dat.setFloat32(pos + 44, p2.z, true);
|
||||
pos += 50;
|
||||
}
|
||||
}
|
||||
return stl;
|
||||
default:
|
||||
throw `invalid format "${format}"`;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue