From bf51d56bb5b90fe1b26f0f2d9919368054f74523 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 18 Oct 2021 23:36:19 -0400 Subject: [PATCH] move tab/support annotations into widget meta data / idb. fix support/lay flat conflict. fix support nozzle in slice. --- src/kiri/client.js | 1 + src/kiri/main.js | 32 +++++++++++++++++++++++--------- src/kiri/tools.js | 8 +++++++- src/kiri/widget.js | 35 +++++++++++++++++++++++++++++------ src/kiri/worker.js | 2 ++ src/mode/cam/client.js | 9 ++++++--- src/mode/cam/slice.js | 2 +- src/mode/fdm/client.js | 15 +++++++++++++++ src/mode/fdm/driver.js | 14 +------------- src/mode/fdm/export.js | 2 +- src/mode/fdm/prepare.js | 5 ++--- src/mode/fdm/slice.js | 7 +++---- 12 files changed, 91 insertions(+), 41 deletions(-) diff --git a/src/kiri/client.js b/src/kiri/client.js index 74fa3e33..15bbaf44 100644 --- a/src/kiri/client.js +++ b/src/kiri/client.js @@ -197,6 +197,7 @@ KIRI.work = { slice: function(settings, widget, callback) { send("slice", { id: widget.id, + anno: widget.annotations(), settings: settings }, function(reply) { callback(reply); diff --git a/src/kiri/main.js b/src/kiri/main.js index 0728b7eb..35a2d751 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -401,7 +401,7 @@ annotate: (id) => { // add per widget annotation // for things like extruder and supports - return settings.widget[id] = ( settings.widget[id] || {} ); + return WIDGETS.filter(w => w.id === id)[0].anno; } }, work: KIRI.work @@ -1838,7 +1838,7 @@ if (!shift) platform.deselect(); selectedMeshes.push(mesh); API.event.emit('widget.select', widget); - widget.setColor(color.selected, settings); + widget.setColor(color.selected); updateSelectedInfo(); } platformUpdateSelected(); @@ -1892,10 +1892,11 @@ if (b) b.classList.remove('pop-sel'); } forSelectedWidgets(w => { - w.setColor(color.selected, settings); + w.setColor(color.selected); let ext = API.widgets.annotate(w.id).extruder || 0; let b = $(`sel-ext-${ext}`); if (b) b.classList.add('pop-sel'); + w.saveState(); }, true); } } @@ -1926,7 +1927,7 @@ selectedMeshes.splice(si,1); API.event.emit('widget.deselect', widget); } - widget.setColor(color.deselected, settings); + widget.setColor(color.deselected); platformUpdateSelected(); SPACE.update(); updateSelectedInfo(); @@ -1999,9 +2000,7 @@ } function platformAdd(widget, shift, nolayout) { - if (!settings.widget[widget.id]) { - settings.widget[widget.id] = {extruder: 0}; - } + widget.anno.extruder = widget.anno.extruder || 0; WIDGETS.push(widget); SPACE.platform.add(widget.mesh); platform.select(widget, shift); @@ -2066,7 +2065,6 @@ return; } KIRI.work.clear(widget); - delete settings.widget[widget.id]; WIDGETS.remove(widget); Widget.Groups.remove(widget); SPACE.platform.remove(widget.mesh); @@ -2744,6 +2742,21 @@ function restoreSettings(save) { let newset = ls2o('ws-settings') || settings; + // extract legacy widget annotations into widgets + if (newset.widget) { + for (let id of Object.keys(newset.widget)) { + let anno = newset.widget[id]; + let wid = WIDGETS.filter(w => w.id === id)[0]; + if (wid && anno) { + wid.anno = anno; + console.log('transfer settings annotations to widget', id); + delete newset.widget[id]; + wid.saveState(); + } else { + console.log('missing widget for annotations', id); + } + } + } settings = CONF.normalize(newset); // override camera from settings if (settings.controller.view) { @@ -2791,7 +2804,8 @@ platform.delete(widget); }); - // remove widget keys if they are not going to be restored + // remove widget keys if they are not going to be restored (TODO: remove in 3.1) + if (settings.widget) Object.keys(settings.widget).filter(k => toload.indexOf(k) < 0).forEach(k => { delete settings.widget[k]; }); diff --git a/src/kiri/tools.js b/src/kiri/tools.js index c7faa159..bfe7fb79 100644 --- a/src/kiri/tools.js +++ b/src/kiri/tools.js @@ -62,6 +62,9 @@ kiri.load(function(API) { alert = API.show.alert('[ESC] to end lay-flat operation', 600000); }); API.event.on('mouse.hover', (ev) => { + if (!enabled) { + return; + } cleanup(); let { int, ints, event, point, type } = ev; if (type === 'widget') { @@ -81,6 +84,9 @@ kiri.load(function(API) { } }); API.event.on('mouse.hover.up', (ev) => { + if (!enabled) { + return; + } let { int, point, object } = ev; if (!object) { return; @@ -89,4 +95,4 @@ kiri.load(function(API) { API.selection.rotate(q); endit(); }); -}); \ No newline at end of file +}); diff --git a/src/kiri/widget.js b/src/kiri/widget.js index a9c2f12d..c635bd83 100644 --- a/src/kiri/widget.js +++ b/src/kiri/widget.js @@ -151,6 +151,8 @@ console.log/** Copyright Stewart Allen -- All Rights Reserved */ this.roto = []; // added meshes (supports, tabs, etc) this.adds = []; + // persisted client annotations (cam tabs, fdm supports) + this.anno = {}; // THREE Mesh and points this.mesh = null; this.points = null; @@ -220,10 +222,12 @@ console.log/** Copyright Stewart Allen -- All Rights Reserved */ indices = data.ind || undefined, track = data.track || undefined, group = data.group || id, + anno = data.anno || undefined, widget = newWidget(id, Group.forid(group)), meta = data.meta || widget.meta, ptr = widget.loadVertices({vertices, indices}); widget.meta = meta; + widget.anno = anno || widget.anno; // restore widget position if specified if (move && track && track.pos) { widget.track = track; @@ -265,13 +269,25 @@ console.log/** Copyright Stewart Allen -- All Rights Reserved */ ind: widget.getGeoIndices(), track: widget.track, group: this.group.id, - meta: this.meta + meta: this.meta, + anno: this.annotations() }, function(result) { widget.meta.saved = time(); if (ondone) ondone(); }); }; + PRO.annotations = function() { + let o = Object.clone(this.anno); + if (o.support) { + // clear out THREE.Box temps + for (let s of o.support) { + delete s.box; + } + } + return o; + }; + /** * * @param {Float32Array} vertices @@ -474,8 +490,11 @@ console.log/** Copyright Stewart Allen -- All Rights Reserved */ * @param {number} color */ PRO.setColor = function(color,settings) { + if (settings) { + console.trace('legacy call with settings'); + } if (Array.isArray(color)) { - color = color[this.getExtruder(settings) % color.length]; + color = color[this.getExtruder() % color.length]; } this.color = color; let material = this.mesh.material; @@ -789,11 +808,15 @@ console.log/** Copyright Stewart Allen -- All Rights Reserved */ }; PRO.getExtruder = function(settings) { - if (settings && settings.widget) { - let rec = settings.widget[this.id]; - return rec && rec.extruder >= 0 ? rec.extruder : 0; + if (settings) { + console.trace('legacy call with settings'); } - return 0; + return this.anno.extruder || 0; + // if (settings && settings.widget) { + // let rec = settings.widget[this.id]; + // return rec && rec.extruder >= 0 ? rec.extruder : 0; + // } + // return 0; }; // allow worker code to run in same memspace as client diff --git a/src/kiri/worker.js b/src/kiri/worker.js index 1096f50c..7b9617ee 100644 --- a/src/kiri/worker.js +++ b/src/kiri/worker.js @@ -346,6 +346,8 @@ KIRI.worker = { last = time(), now; + widget.anno = data.anno || widget.anno; + widget.slice(settings, function(error) { if (error) { send.data({error: error}); diff --git a/src/mode/cam/client.js b/src/mode/cam/client.js index 766e741d..6febf216 100644 --- a/src/mode/cam/client.js +++ b/src/mode/cam/client.js @@ -100,11 +100,11 @@ proc.ops = proc.ops.filter(v => v); } // for any tabs or traces to set markers - Object.keys(settings.widget).forEach(wid => { - let wannot = settings.widget[wid]; + for (let widget of API.widgets.all()) { + let wannot = widget.anno; if (wannot.tab && wannot.tab.length) hasTabs = true; if (wannot.trace && wannot.trace.length) hasTraces = true; - }); + } // show/hide dots in enabled process pop buttons api.ui.camTabs.marker.style.display = hasTabs ? 'flex' : 'none'; api.ui.camStock.marker.style.display = proc.camStockOn ? 'flex' : 'none'; @@ -478,6 +478,7 @@ func.tabDone(); API.widgets.all().forEach(widget => { clearTabs(widget); + widget.saveState(); }); API.conf.save(); }); @@ -524,6 +525,7 @@ }); ta.splice(ix,1); API.conf.save(); + widget.saveState(); return; } if (!iw) return; @@ -541,6 +543,7 @@ wt.push(Object.clone(rec)); addWidgetTab(iw, rec); API.conf.save(); + iw.saveState(); }; // TRACE FUNCS diff --git a/src/mode/cam/slice.js b/src/mode/cam/slice.js index 2dd5f31e..0456ad31 100644 --- a/src/mode/cam/slice.js +++ b/src/mode/cam/slice.js @@ -40,7 +40,7 @@ minToolDiam = Infinity, maxToolDiam = -Infinity, thruHoles, - tabs = settings.widget[widget.id].tab, + tabs = widget.anno.tab, unsafe = proc.camExpertFast, units = settings.controller.units === 'in' ? 25.4 : 1; diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 95d52270..338b0d36 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -521,6 +521,18 @@ } let xpdebug; + let supsave = {}; + let suptimer; + + function scheduleSupportSave(widget) { + clearTimeout(suptimer); + supsave[widget.id] = widget; + suptimer = setTimeout(() => { + for (let w of Object.values(supsave)) { + w.saveState(); + } + }, 50); + } function activeSupports() { const active = []; @@ -554,6 +566,7 @@ pos.box.pillar = Object.assign({widget}, pos); sups[id] = pos; widget.adds.push(pos.box); + scheduleSupportSave(widget); } return sups[id]; } @@ -572,6 +585,7 @@ }); sa.splice(ix,1); API.conf.save(); + scheduleSupportSave(widget); fromPillar = undefined; } @@ -604,6 +618,7 @@ }); widget.sups = {}; delete API.widgets.annotate(widget.id).support; + scheduleSupportSave(widget); return cleared; } diff --git a/src/mode/fdm/driver.js b/src/mode/fdm/driver.js index 9940a80b..b48a8565 100644 --- a/src/mode/fdm/driver.js +++ b/src/mode/fdm/driver.js @@ -13,21 +13,9 @@ // slice, // src/mode/fdm/slice.js // prepare, // src/mode/fdm/prepare.js // export, // src/mode/fdm/export.js - getRangeParameters, - fixExtruders + getRangeParameters }; - function fixExtruders(settings) { - Object.entries(settings.widget).forEach(arr => { - let [wid,val] = arr; - let dext = settings.device.extruders[val.extruder]; - if (!dext) { - settings.widget[wid].extruder = 0; - } - }); - return settings; - } - function getRangeParameters(process, index) { if (index === undefined || index === null || index < 0) { return process; diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index 7638f155..27d8fedd 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -15,7 +15,7 @@ */ FDM.export = function(print, online, ondone, ondebug) { let layers = print.output, - settings = FDM.fixExtruders(print.settings), + settings = print.settings, controller = settings.controller, thumbnails = controller.exportThumb, getRangeParameters = FDM.getRangeParameters, diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 0debd311..36fdef63 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -24,7 +24,6 @@ // filter ignored widgets widgets = widgets.filter(w => !w.track.ignore); - settings = FDM.fixExtruders(settings); let render = settings.render !== false, { device, process, controller, bounds, mode } = settings, { bedWidth, bedDepth } = device, @@ -222,7 +221,7 @@ swidget.belt = widget.belt; swidget.track = Object.clone(widget.track); swidget.mesh = { widget: swidget, position: swidget.track.pos }; - settings.widget[swidget.id] = { extruder: process.sliceSupportNozzle }; + widget.anno.extruder = process.sliceSupportNozzle; widgets.push(swidget); } } @@ -235,7 +234,7 @@ // find max layers (for updates) // generate list of used extruders for purge blocks for (let widget of widgets) { - let extruder = (settings.widget[widget.id] || {}).extruder || 0; + let extruder = widget.anno.extruder || 0; if (!extruders[extruder]) { extruders[extruder] = {}; extcount++; diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 908296a0..31af7568 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -114,7 +114,6 @@ * @param {Function} ondone (called when complete with an array of Slice objects) */ FDM.slice = function(settings, widget, onupdate, ondone) { - FDM.fixExtruders(settings); let render = settings.render !== false, { process, device, controller } = settings, isBelt = device.bedBelt, @@ -125,8 +124,8 @@ solidMinArea = process.sliceSolidMinArea, solidLayers = process.sliceSolidLayers || 0, vaseMode = process.sliceFillType === 'vase' && !isSynth, - metadata = settings.widget[widget.id] || {}, - extruder = metadata.extruder || 0, + metadata = widget.anno, + extruder = parseInt(isSynth ? process.sliceSupportNozzle : metadata.extruder || 0), sliceHeight = process.sliceHeight, sliceHeightBase = (isBelt ? sliceHeight : process.firstSliceHeight) || sliceHeight, nozzleSize = device.extruders[extruder].extNozzle, @@ -171,7 +170,7 @@ const sliceMinHeight = process.sliceAdaptive && process.sliceMinHeight > 0 ? Math.min(process.sliceMinHeight, sliceHeight) : 0; - if (sliceHeightBase < sliceHeight) { + if (sliceHeightBase <= 0) { console.log("invalid first layer height < slice height"); console.log("reverting to min valid slice height"); sliceHeightBase = sliceMinHeight || sliceHeight;