From ace98580189ce4ec8ed4188839760618bc3ed3d1 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 22 Nov 2020 17:01:36 -0500 Subject: [PATCH] checkpoint manual support work --- src/kiri/init.js | 8 ++--- src/kiri/main.js | 9 ++++-- src/kiri/widget.js | 1 + src/mode/fdm/client.js | 69 +++++++++++++++++++++++++++++++++++------ src/mode/fdm/prepare.js | 1 + web/kiri/lang/en.js | 4 +-- 6 files changed, 74 insertions(+), 18 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index c18d9f59..35c69d04 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -663,7 +663,7 @@ d.setAttribute('class', 'col j-center'); d.onclick = function() { API.selection.for_widgets(w => { - current.widget[w.id] = {extruder: i}; + API.widgets.annotate(w.id).extruder = i; }); API.platform.update_selected(); }; @@ -1472,11 +1472,11 @@ sliceSupportOffset: UC.newInput(LANG.sp_offs_s, {title:LANG.sp_offs_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM}), sliceSupportGap: UC.newInput(LANG.sp_gaps_s, {title:LANG.sp_gaps_l, bound:UC.bound(0,5), convert:UC.toInt, modes:FDM, expert:true}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), - sliceSupportSpan: UC.newInput(LANG.sp_span_s, {title:LANG.sp_span_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM, show: () => UI.sliceSupportEnable.checked}), sliceSupportArea: UC.newInput(LANG.sp_area_s, {title:LANG.sp_area_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM}), sliceSupportExtra: UC.newInput(LANG.sp_xpnd_s, {title:LANG.sp_xpnd_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM, expert:true}), - fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), sliceSupportNozzle: UC.newSelect(LANG.sp_nozl_s, {title:LANG.sp_nozl_l, modes:FDM, expert:true}, "extruders"), + fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), + sliceSupportSpan: UC.newInput(LANG.sp_span_s, {title:LANG.sp_span_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM, show: () => UI.sliceSupportEnable.checked}), sliceSupportEnable: UC.newBoolean(LANG.sp_auto_s, onBooleanClick, {title: LANG.sp_auto_l, modes:FDM, trigger:true}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), @@ -1926,7 +1926,7 @@ if (int && (event.ctrlKey || event.metaKey || API.feature.on_face_select)) { let q = new THREE.Quaternion(); // find intersecting point, look "up" on Z and rotate to face that - q.setFromUnitVectors(int.face.normal, new THREE.Vector3(0,-1,0)); + q.setFromUnitVectors(int.face.normal, new THREE.Vector3(0,0,-1)); API.selection.rotate(q); } if (API.view.get() !== VIEWS.ARRANGE) { diff --git a/src/kiri/main.js b/src/kiri/main.js index b8b474d3..ece51d18 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -311,7 +311,12 @@ for: forAllWidgets, load: Widget.loadFromCatalog, meshes: meshArray, - opacity: setOpacity + opacity: setOpacity, + annotate: (id) => { + // add per widget annotation + // for things like extruder and supports + return settings.widget[id] = ( settings.widget[id] || {} ); + } }, work: KIRI.work }; @@ -1158,7 +1163,7 @@ } forSelectedWidgets(w => { w.setColor(color.selected, settings); - let ext = (settings.widget[w.id] || {}).extruder || 0; + let ext = API.widgets.annotate(w.id).extruder || 0; let b = $(`sel-ext-${ext}`); if (b) b.classList.add('pop-sel'); }, true); diff --git a/src/kiri/widget.js b/src/kiri/widget.js index 77d73bb4..56b31ecc 100644 --- a/src/kiri/widget.js +++ b/src/kiri/widget.js @@ -111,6 +111,7 @@ if (groups.indexOf(this.group) < 0) { groups.push(this.group); } + // rotation stack (for undo) this.roto = []; this.mesh = null; this.points = null; diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index fd6a0ad2..415dede9 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -8,16 +8,23 @@ BASE = self.base, UTIL = BASE.util, FDM = KIRI.driver.FDM, - SPACE, + SPACE, API, p1, p2, iw, alert = [], func = {}; FDM.init = function(kiri, api) { + API = api; SPACE = api.const.SPACE; + api.event.on("mode.set", mode => { + if (mode !== 'FDM') { + clearAllWidgetSupports(); + } + }); api.event.on("settings.load", (settings) => { if (settings.mode !== 'FDM') return; settings.process.outputOriginCenter = (settings.device.originCenter || false); + restoreSupports(api.widgets.all()); }); api.event.on("settings.saved", (settings) => { let proc = settings.process; @@ -48,32 +55,41 @@ }); api.event.on("fdm.supports.clear", func.sclear = () => { func.sdone(); + clearAllWidgetSupports(); + API.conf.save(); }); api.event.on("key.esc", () => { func.sdone() }); - // api.event.on("mouse.hover.down", data => { - // console.log({hover_down: data.point}); + // api.event.on("selection.rotate", (x,y,z) => { + // console.log('rotate', x,y,z); // }); api.event.on("mouse.hover.up", int => { - console.log({hover_up: int, p1, p2, iw}); delbox('supp'); + if (!iw) return; let hy = (p1.y + p2.y) / 2; - let dy = Math.abs(p1.y - p2.y); + let dh = Math.abs(p1.y - p2.y); let dw = api.conf.get().process.sliceSupportSize / 2; - addbox({x:p1.x, z:hy, y:-p1.z}, 0x0000dd, 'supp', { - x:dw, y:dw, z:dy - }, iw.mesh); + let ip = iw.track.pos; + let wa = api.widgets.annotate(iw.id); + let ws = (wa.support = wa.support || []); + let x = p1.x - ip.x, y = -p1.z - ip.y, z = hy; + let id = Date.now(); + ws.push({x, y, z, dw, dh, id}); + addWidgetSupport(iw, {x, y, z, dw, dh, id}); + API.conf.save(); }); api.event.on("mouse.hover", data => { const { int, type, point } = data; - if (int) { + if (int && type === 'widget') { iw = int.object.widget || iw; + } else { + iw = null; } // delbox('intZ'); // delbox('intW'); - delbox('supp'); // addbox(point, 0xff0000, 'intZ'); + delbox('supp'); p1 = point; let dir = new THREE.Vector3(0,1,0) let ray = new THREE.Raycaster(point, dir); @@ -102,6 +118,38 @@ }); } + function restoreSupports(widgets) { + widgets.forEach(widget => { + const supports = API.widgets.annotate(widget.id).support || []; + supports.forEach(pos => { + addWidgetSupport(widget, pos); + }); + }); + } + + function addWidgetSupport(widget, pos) { + const { x, y, z, dw, dh, id } = pos; + const sups = widget.sups = (widget.sups || {}); + // prevent duplicate restore from repeated settings load calls + if (!sups[id]) { + pos.box = addbox({x, y, z}, 0x0000dd, 'supp', { x:dw, y:dw, z:dh }, widget.mesh); + sups[id] = pos; + } + } + + function clearAllWidgetSupports() { + API.widgets.all().forEach(widget => { + clearWidgetSupports(widget); + }); + } + + function clearWidgetSupports(widget) { + Object.values(widget.sups || {}).forEach(support => { + widget.mesh.remove(support.box); + }); + delete API.widgets.annotate(widget.id).support; + } + function delbox(name, group) { const old = SPACE[`__${name}`]; if (old) { @@ -124,6 +172,7 @@ box.position.y = point.y; box.position.z = point.z; (group || SPACE.scene).add(box); + return box; } })(); diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 2fa080f1..de0f29b3 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -407,6 +407,7 @@ }; FDM.prepareRender = function(levels, update, options) { + levels = levels.filter(level => level.length); if (levels.length === 0) { self.worker.print.maxSpeed = 0; return []; diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 60bc4838..75f0ae7a 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -245,8 +245,8 @@ kiri.lang['en-us'] = { sp_offs_l: "offset from part\nin millimeters", sp_gaps_s: "gap layers", sp_gaps_l: "number of layers\noffset from part", - sp_span_s: "max bridge", - sp_span_l: "span length that\ntriggers support\nin millimeters", + sp_span_s: "max span", + sp_span_l: "unsupported span that causes\na new support to be generated\nin millimeters", sp_area_s: "min area", sp_area_l: "minimum area for\na support column\nin millimeters", sp_xpnd_s: "expand",