add log toggle, 3mf model name restore
This commit is contained in:
parent
e3b31203c3
commit
fc1cc15bfe
4 changed files with 34 additions and 8 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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':
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
});
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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 = `<a id="_data_export_" href="${url}" download="${filename}">x</a>`;
|
||||
$('_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();
|
||||
|
|
|
|||
Loading…
Reference in a new issue