From ea21aa34eea7325641628c736f02a6da40cadd06 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 25 Dec 2020 12:03:47 -0500 Subject: [PATCH] visual indicator of trace editing. make multiple trace ops friendly with each other --- src/mode/cam/client.js | 44 +++++++++++++++++++++++++++++------------- web/kiri/index.css | 3 +++ 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/mode/cam/client.js b/src/mode/cam/client.js index 698ab075..b1e6df6e 100644 --- a/src/mode/cam/client.js +++ b/src/mode/cam/client.js @@ -17,6 +17,7 @@ camStock, current, poppedRec, + hoveredOp, API, FDM, SPACE, STACKS, MODES, VIEWS, UI, UC, LANG; let zaxis = { x: 0, y: 0, z: 1 }, @@ -278,6 +279,7 @@ poprec.use(rec); // pointer to current rec for trace editing poppedRec = rec; + hoveredOp = el; el.appendChild(poprec.div); // option click event appears latent // and overides the sticky settings @@ -296,6 +298,7 @@ }; el.rec = rec; el.onmousedown = (ev) => { + func.traceDone(); let target = ev.target, clist = target.classList; if (!clist.contains("draggable")) { return; @@ -430,20 +433,19 @@ // TRACE FUNCS let traceOn = false, lastTrace; - func.traceAdd = () => { - if (traceOn) { - return; - } + func.traceAdd = (ev) => { func.tabDone(); + func.traceDone(); alert = api.show.alert("analyzing parts...", 1000); - traceOn = true; + traceOn = hoveredOp; + traceOn.classList.add("editing"); CAM.traces((ids) => { api.hide.alert(alert); alert = api.show.alert("[esc] key cancels trace editing"); KIRI.api.widgets.opacity(0.5); KIRI.api.widgets.for(widget => { if (ids.indexOf(widget.id) >= 0) { - clearTraces(widget); + unselectTraces(widget); widget.trace_stack = null; } if (widget.trace_stack) { @@ -461,9 +463,9 @@ stack.addLayers(layers); stack.new_meshes.forEach(mesh => { mesh.trace = {widget, poly}; + // ensure trace poly singleton from matches if (match.length > 0) { poly._trace = match[0]; - func.traceToggle(mesh, true); } else { poly._trace = poly.toArray(); } @@ -471,6 +473,22 @@ widget.adds.appendAll(stack.new_meshes); }); }); + // ensure appropriate traces are toggled matching current record + KIRI.api.widgets.for(widget => { + let areas = (poppedRec.areas[widget.id] || []); + let stack = widget.trace_stack; + stack.meshes.forEach(mesh => { + let { poly } = mesh.trace; + let match = areas.filter(arr => poly.matches(arr)); + if (match.length > 0) { + if (!mesh.selected) { + func.traceToggle(mesh, true); + } + } else if (mesh.selected) { + func.traceToggle(mesh, true); + } + }); + }); }); api.feature.hover = true; api.feature.hoverAdds = true; @@ -481,6 +499,7 @@ if (!traceOn) { return; } + traceOn.classList.remove("editing"); traceOn = false; KIRI.api.widgets.opacity(1); api.hide.alert(alert); @@ -496,7 +515,7 @@ api.event.on("cam.trace.clear", func.traceClear = () => { func.traceDone(); API.widgets.all().forEach(widget => { - clearTraces(widget); + unselectTraces(widget); }); API.conf.save(); }); @@ -589,7 +608,7 @@ if (traceOn) { func.traceDone(); } - clearTraces(widget); + unselectTraces(widget); if (x || y) { clearTabs(widget); } else { @@ -876,10 +895,9 @@ delete API.widgets.annotate(widget.id).tab; } - function clearTraces(widget) { - let stack = widget.trace_stack; - if (stack) { - stack.meshes.forEach(mesh => { + function unselectTraces(widget) { + if (widget.trace_stack) { + widget.trace_stack.meshes.forEach(mesh => { if (mesh.selected) { func.traceToggle(mesh); } diff --git a/web/kiri/index.css b/web/kiri/index.css index 68877619..c74e63d8 100644 --- a/web/kiri/index.css +++ b/web/kiri/index.css @@ -585,6 +585,9 @@ th, tr, td, label { font-size: 12px; color: rgba(0,0,0,0); } +#oplist > div.editing { + background-color: rgba(220,230,220,0.8); +} #oplist div:hover .del { color: #aaa; z-index: 10000;