diff --git a/src/geo/polygons.js b/src/geo/polygons.js index 48d76c80..15195960 100644 --- a/src/geo/polygons.js +++ b/src/geo/polygons.js @@ -233,6 +233,7 @@ function setWinding(array, CW, recurse) { if (poly.isClockwise() !== CW) poly.reverse(); if (recurse && poly.inner) setWinding(poly.inner, !CW, false); } + return array; } /** diff --git a/src/kiri-mode/cam/client.js b/src/kiri-mode/cam/client.js index 6aaaf477..d170d72b 100644 --- a/src/kiri-mode/cam/client.js +++ b/src/kiri-mode/cam/client.js @@ -562,13 +562,10 @@ CAM.init = function(kiri, api) { // SURFACE FUNCS let surfaceOn = false, lastWidget; func.surfaceAdd = (ev) => { - func.unpop(); - func.tabDone(); - func.traceDone(); - func.surfaceDone(); + func.clearPops(); alert = api.show.alert("analyzing surfaces...", 1000); let surfaces = poppedRec.surfaces; - CAM.surfaces(() => { + CAM.surface_prep(() => { api.hide.alert(alert); alert = api.show.alert("[esc] cancels surface editing"); for (let [wid, arr] of Object.entries(surfaces)) { @@ -597,10 +594,13 @@ CAM.init = function(kiri, api) { if (!surfaceOn) { return; } - if (lastWidget) { - let surfaces = poppedRec.surfaces; - for (let wid of Object.keys(surfaces)) { - CAM.surface_clear(api.widgets.forid(wid)); + let surfaces = poppedRec.surfaces; + for (let wid of Object.keys(surfaces)) { + let widget = api.widgets.forid(wid); + if (widget) { + CAM.surface_clear(widget); + } else { + delete surfaces[wid]; } } api.hide.alert(alert); @@ -612,10 +612,7 @@ CAM.init = function(kiri, api) { // TRACE FUNCS let traceOn = false, lastTrace; func.traceAdd = (ev) => { - func.unpop(); - func.tabDone(); - func.traceDone(); - func.surfaceDone(); + func.clearPops(); alert = api.show.alert("analyzing parts...", 1000); traceOn = hoveredOp; traceOn.classList.add("editing"); @@ -693,6 +690,12 @@ CAM.init = function(kiri, api) { } }); }; + func.clearPops = () => { + if (func.unpop) func.unpop(); + func.tabDone(); + func.traceDone(); + func.surfaceDone(); + }; api.event.on("cam.trace.clear", func.traceClear = () => { func.traceDone(); API.widgets.all().forEach(widget => { @@ -781,22 +784,17 @@ CAM.init = function(kiri, api) { // COMMON TAB/TRACE EVENT HANDLERS api.event.on("slice.begin", () => { if (isCamMode) { - func.tabDone(); - func.traceDone(); - func.surfaceDone(); + func.clearPops(); } }); api.event.on("key.esc", () => { if (isCamMode) { - func.tabDone(); - func.traceDone(); - func.surfaceDone(); + func.clearPops(); } }); api.event.on("selection.scale", () => { if (isCamMode) { - func.tabClear(); - func.traceClear(); + func.clearPops(); } }); api.event.on("widget.duplicate", (widget, oldwidget) => { diff --git a/src/kiri-mode/cam/driver.js b/src/kiri-mode/cam/driver.js index 1078baa5..e59e50f1 100644 --- a/src/kiri-mode/cam/driver.js +++ b/src/kiri-mode/cam/driver.js @@ -25,7 +25,7 @@ CAM.process = { kiri.load(api => { if (kiri.client) { - CAM.surfaces = function(ondone) { + CAM.surface_prep = function(ondone) { kiri.client.sync(); const settings = api.conf.get(); kiri.client.send("cam_surfaces", { settings }, output => { @@ -33,7 +33,7 @@ kiri.load(api => { }); }; - function select_face_groups(widget) { + CAM.surface_show = function(widget) { widget.selectFaces(Object.values(widget._surfaces).flat()); }; @@ -43,14 +43,16 @@ kiri.load(api => { if (faces.contains(face)) { // delete this face group delete surfaces[root]; - select_face_groups(widget); + CAM.surface_show(widget); ondone(Object.keys(surfaces)); return; } } kiri.client.send("cam_surface_find", { id: widget.id, face }, faces => { - surfaces[face] = faces; - select_face_groups(widget); + if (faces.length) { + surfaces[face] = faces; + CAM.surface_show(widget); + } ondone(Object.keys(surfaces)); }); }; @@ -76,14 +78,23 @@ kiri.load(api => { } if (kiri.worker) { + CAM.surface_prep = function(widget) { + if (!widget.tool) { + let tool = widget.tool = new mesh.tool(); + tool.generateFaceMap(widget.getVertices().array); + } + }; + + CAM.surface_find = function(widget, faces) { + CAM.surface_prep(widget); + return widget.tool.findConnectedSurface(faces, 0.1, 0.001); + }; + kiri.worker.cam_surfaces = function(data, send) { const { settings } = data; const widgets = Object.values(kiri.worker.cache); for (let widget of widgets) { - if (!widget.tool) { - let tool = widget.tool = new mesh.tool(); - tool.generateFaceMap(widget.getVertices().array); - } + CAM.surface_prep(widget); } send.done({}); }; @@ -91,7 +102,7 @@ kiri.load(api => { kiri.worker.cam_surface_find = function(data, send) { const { id, face } = data; const widget = kiri.worker.cache[id]; - const faces = widget.tool.findConnectedSurface([face], 0.1, 0.001); + const faces = CAM.surface_find(widget, [face]); send.done(faces); } diff --git a/src/kiri-mode/cam/ops.js b/src/kiri-mode/cam/ops.js index a1e526eb..0ff93def 100644 --- a/src/kiri-mode/cam/ops.js +++ b/src/kiri-mode/cam/ops.js @@ -930,22 +930,29 @@ class OpPocket extends CamOp { let { process, stock } = settings; // generate tracing offsets from chosen features let sliceOut = this.sliceOut = []; - let areas = op.areas[widget.id] || []; + let surface = op.surfaces[widget.id] || []; + let faces = CAM.surface_find(widget, surface); let toolDiam = new CAM.Tool(settings, tool).fluteDiameter(); let toolOver = toolDiam * op.step; let cutdir = process.camConventional; - let polys = []; updateToolDiams(toolDiam); if (tabs) { tabs.forEach(tab => { tab.off = POLY.expand([tab.poly], toolDiam / 2).flat(); }); } - for (let arr of areas) { - let poly = newPolygon().fromArray(arr); - POLY.setWinding([ poly ], cutdir, false); - polys.push(poly); + let vert = widget.getVertices().array; + let polys = []; + for (let face of faces) { + let i = face * 9; + polys.push(newPolygon() + .add(vert[i++], vert[i++], vert[i++]) + .add(vert[i++], vert[i++], vert[i++]) + .add(vert[i++], vert[i++], vert[i++]) + ); } + polys = POLY.union(polys, undefined, true); + polys = POLY.setWinding(polys, cutdir, false); function newSliceOut(z) { let slice = newSlice(z); sliceAll.push(slice); @@ -1423,6 +1430,7 @@ CAM.OPS = CamOp.MAP = { "rough": OpRough, "outline": OpOutline, "contour": OpContour, + "pocket": OpPocket, "trace": OpTrace, "drill": OpDrill, "register": OpRegister, diff --git a/src/kiri/platform.js b/src/kiri/platform.js index f68adbb7..207e5251 100644 --- a/src/kiri/platform.js +++ b/src/kiri/platform.js @@ -413,7 +413,6 @@ function platformAdd(widget, shift, nolayout, defer) { } function platformAddDeferred() { - console.log('platform_add_deferred'); for (let rec of deferred) { let { widget, shift, nolayout } = rec; // platform.select(widget, shift);