fix stl export size (kiri). add stl export (mesh)

This commit is contained in:
Stewart Allen 2022-01-10 21:06:38 -05:00
commit 66ca161ccd
4 changed files with 56 additions and 16 deletions

View file

@ -1740,10 +1740,10 @@
}
return obj.join('\n');
}
let stl = new Uint8Array(80 + 4 + facets * 50);
let stl = new Uint8Array(80 + 4 + facets/3 * 50);
let dat = new DataView(stl.buffer);
let pos = 84;
dat.setInt32(80, facets, true);
dat.setInt32(80, facets/3, true);
for (let out of outs) {
let { position } = out.geo.attributes;
let pvals = position.array;

View file

@ -225,14 +225,14 @@ let file = {
if (recs.length === 0) {
return api.log.emit(`no models to export`);
}
function doit() {
function doit(ext = 'obj') {
api.log.emit(`exporting ${recs.length} model(s)`);
let file = api.modal.bound.filename.value || "export.obj";
if (file.toLowerCase().indexOf(".obj") < 0) {
file = file + ".obj";
if (file.toLowerCase().indexOf(`.${ext}`) < 0) {
file = `${file}.${ext}`;
}
worker.file_export({
recs, format: "obj"
recs, format: ext
}).then(data => {
if (data.length) {
util.download(data, file);
@ -247,7 +247,8 @@ let file = {
h.input({ id: "filename", value: "mesh_export" })
]),
h.div([
h.button({ _: "download", onclick: doit })
h.button({ _: "download OBJ", onclick() { doit('obj') } }),
h.button({ _: "download STL", onclick() { doit('stl') } })
])
]) ]
});

View file

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

View file

@ -171,15 +171,20 @@ button:hover {
color: #888;
}
.export {
flex-direction: column;
font-family: monospace;
}
.export, .export div {
gap: 4px;
align-items: center;
justify-content: center;
}
.export input {
padding: 3px;
.export input, .export button {
font-family: monospace;
padding: 3px;
}
.export button {