From fc1cc15bfec851c1e4c37d741411512c999d9cc5 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 8 Jan 2022 22:06:50 -0500 Subject: [PATCH] add log toggle, 3mf model name restore --- src/load/file.js | 15 +++++++++++++-- src/main/mesh.js | 13 ++++++++++--- src/mesh/api.js | 8 ++++++-- src/mesh/build.js | 6 +++++- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/load/file.js b/src/load/file.js index 71301bd4..6c9ceeac 100644 --- a/src/load/file.js +++ b/src/load/file.js @@ -20,9 +20,18 @@ 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) { ext = ext || name.toLowerCase().split('.').pop(); return new Promise((resolve, reject) => { + let i = 1; switch (ext) { case "stl": resolve([{ @@ -30,12 +39,14 @@ function load_data(data, file, ext) { }]); break; 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; case "3mf": load.TMF.parseAsync(data).then((meshes) => { resolve(meshes.map(m => { - return { mesh: m.faces.toFloat32(), file } + return { mesh: m.faces.toFloat32(), file: nameOf(file, m.name, i++) } })); }); break; diff --git a/src/main/mesh.js b/src/main/mesh.js index 364b35e3..e32ac57e 100644 --- a/src/main/mesh.js +++ b/src/main/mesh.js @@ -70,7 +70,7 @@ function init() { // restore space layout and view from previous session function restore_space() { - mesh.api.log.emit(`restoring workspace`); + let count = 0; let space = moto.Space; mesh.db.admin.get("camera") .then(saved => { @@ -81,12 +81,17 @@ function restore_space() { }); mesh.db.space.iterate({ map: true }).then(cached => { for (let [id, data] of Object.entries(cached)) { + if (count++ === 0) { + mesh.api.log.emit(`restoring workspace...`); + } // restore group if (Array.isArray(data)) { let models = data.map(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) .centerModels() .centerXY() @@ -144,6 +149,8 @@ function space_init(data) { return api.wireframe(); case 'KeyG': return api.grid(); + case 'KeyL': + return api.log.toggle(); case 'KeyB': return selection.boundsBox({toggle:true}); case 'KeyH': diff --git a/src/mesh/api.js b/src/mesh/api.js index 4061d35d..00c98a1f 100644 --- a/src/mesh/api.js +++ b/src/mesh/api.js @@ -221,12 +221,16 @@ let file = { let recs = selection.models().map(m => { return { 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)`); moto.client.fn.file_export({ recs, format: "obj" }).then(data => { - console.log({work_export: data}); - util.download(data, "export.obj"); + if (data.length) { + util.download(data, "export.obj"); + } }); }, }; diff --git a/src/mesh/build.js b/src/mesh/build.js index 62b6008a..2ddaa6e4 100644 --- a/src/mesh/build.js +++ b/src/mesh/build.js @@ -21,7 +21,7 @@ broker.listeners({ let spin_timer; // 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"})); $('download').innerHTML = `x`; $('_data_export_').click(); @@ -104,6 +104,10 @@ let log = mesh.api.log = { return log; }, + toggle() { + return log.pinned ? log.unpin() && log.hide() : log.pin(); + }, + pin() { log.pinned = true; return log.show();