add log toggle, 3mf model name restore

This commit is contained in:
Stewart Allen 2022-01-08 22:06:50 -05:00
commit fc1cc15bfe
4 changed files with 34 additions and 8 deletions

View file

@ -20,9 +20,18 @@ load.File = {
load: load_file load: load_file
}; };
function nameOf(file, part, i) {
let lid = file.lastIndexOf('.');
if (!part && lid > 0) {
file = file.substring(0,lid);
}
return part ? part : `${file}_${i}`;
}
function load_data(data, file, ext) { function load_data(data, file, ext) {
ext = ext || name.toLowerCase().split('.').pop(); ext = ext || name.toLowerCase().split('.').pop();
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let i = 1;
switch (ext) { switch (ext) {
case "stl": case "stl":
resolve([{ resolve([{
@ -30,12 +39,14 @@ function load_data(data, file, ext) {
}]); }]);
break; break;
case "obj": case "obj":
resolve(load.OBJ.parse(data).map(m => { return {mesh: m.toFloat32(), file: m.name || file} })); resolve(load.OBJ.parse(data).map(m => {
return { mesh: m.toFloat32(), file: nameOf(file, m.name, i++) }
}));
break; break;
case "3mf": case "3mf":
load.TMF.parseAsync(data).then((meshes) => { load.TMF.parseAsync(data).then((meshes) => {
resolve(meshes.map(m => { resolve(meshes.map(m => {
return { mesh: m.faces.toFloat32(), file } return { mesh: m.faces.toFloat32(), file: nameOf(file, m.name, i++) }
})); }));
}); });
break; break;

View file

@ -70,7 +70,7 @@ function init() {
// restore space layout and view from previous session // restore space layout and view from previous session
function restore_space() { function restore_space() {
mesh.api.log.emit(`restoring workspace`); let count = 0;
let space = moto.Space; let space = moto.Space;
mesh.db.admin.get("camera") mesh.db.admin.get("camera")
.then(saved => { .then(saved => {
@ -81,12 +81,17 @@ function restore_space() {
}); });
mesh.db.space.iterate({ map: true }).then(cached => { mesh.db.space.iterate({ map: true }).then(cached => {
for (let [id, data] of Object.entries(cached)) { for (let [id, data] of Object.entries(cached)) {
if (count++ === 0) {
mesh.api.log.emit(`restoring workspace...`);
}
// restore group // restore group
if (Array.isArray(data)) { if (Array.isArray(data)) {
let models = data.map(id => { let models = data.map(id => {
let md = cached[id]; let md = cached[id];
return new mesh.model(md, id); let m = md ? new mesh.model(md, id) : undefined;
}); if (m) mesh.api.log.emit(`restored | ${m.file}`);
return m;
}).filter(m => m);
mesh.api.group.new(models, id) mesh.api.group.new(models, id)
.centerModels() .centerModels()
.centerXY() .centerXY()
@ -144,6 +149,8 @@ function space_init(data) {
return api.wireframe(); return api.wireframe();
case 'KeyG': case 'KeyG':
return api.grid(); return api.grid();
case 'KeyL':
return api.log.toggle();
case 'KeyB': case 'KeyB':
return selection.boundsBox({toggle:true}); return selection.boundsBox({toggle:true});
case 'KeyH': case 'KeyH':

View file

@ -221,12 +221,16 @@ let file = {
let recs = selection.models().map(m => { return { let recs = selection.models().map(m => { return {
id: m.id, matrix: m.matrix, file: m.file id: m.id, matrix: m.matrix, file: m.file
} }); } });
if (recs.length === 0) {
return api.log.emit(`no models to export`);
}
api.log.emit(`exporting ${recs.length} model(s)`); api.log.emit(`exporting ${recs.length} model(s)`);
moto.client.fn.file_export({ moto.client.fn.file_export({
recs, format: "obj" recs, format: "obj"
}).then(data => { }).then(data => {
console.log({work_export: data}); if (data.length) {
util.download(data, "export.obj"); util.download(data, "export.obj");
}
}); });
}, },
}; };

View file

@ -21,7 +21,7 @@ broker.listeners({
let spin_timer; let spin_timer;
// add download / blob export to util // add download / blob export to util
let download = mesh.util.download = (data, filename = "mesh-data") => { mesh.util.download = (data, filename = "mesh-data") => {
let url = window.URL.createObjectURL(new Blob([data], {type: "octet/stream"})); let url = window.URL.createObjectURL(new Blob([data], {type: "octet/stream"}));
$('download').innerHTML = `<a id="_data_export_" href="${url}" download="${filename}">x</a>`; $('download').innerHTML = `<a id="_data_export_" href="${url}" download="${filename}">x</a>`;
$('_data_export_').click(); $('_data_export_').click();
@ -104,6 +104,10 @@ let log = mesh.api.log = {
return log; return log;
}, },
toggle() {
return log.pinned ? log.unpin() && log.hide() : log.pin();
},
pin() { pin() {
log.pinned = true; log.pinned = true;
return log.show(); return log.show();