diff --git a/src/kiri/mode/cam/op-area.js b/src/kiri/mode/cam/op-area.js index 940e1764..71e40301 100644 --- a/src/kiri/mode/cam/op-area.js +++ b/src/kiri/mode/cam/op-area.js @@ -26,7 +26,7 @@ class OpArea extends CamOp { async slice(progress) { let { op, state } = this; - let { tool, mode, down, over, follow, edgeonly, expand, outline, smooth } = op; + let { tool, mode, down, drape, over, follow, edgeonly, expand, outline, smooth } = op; let { ov_topz, ov_botz, direction, rename } = op; let { settings, widget, tabs, color } = state; let { addSlices, setToolDiam, cutTabs, shadowAt, workarea } = state; @@ -139,17 +139,7 @@ class OpArea extends CamOp { let tool_shadow = POLY.offset(shadow, [ toolDiam / 2 - ts_off ], { count: 1, z }); // for roughing/outline backward compatability if (op.omitthru) { - shadow = shadow.clone(true); - for (let poly of shadow.filter(p => p.inner)) { - poly.inner = poly.inner.filter(inner => { - for (let ho of thruHoles) { - if (inner.isEquivalent(ho)) { - return false; - } - } - return true; - }); - } + shadow = omitMatching(shadow, thruHoles); } // progressive offset of polygons inside area clipped to the shadow let outs = []; @@ -181,6 +171,11 @@ class OpArea extends CamOp { if (op.leave_xy) { outs = outs.map(poly => poly.offset(-op.leave_xy)).flat(); } + if (op.omitouter) { + outs = omitOuter(outs); + } else if (op.omitinner) { + outs = omitInner(outs); + } // store travel boundary that triggers up and over moves slice.tool_shadow = [ area, ...tool_shadow ]; slice.camLines = outs; @@ -213,14 +208,19 @@ class OpArea extends CamOp { for (let z of zs) { let slice = newLayer(z); let layers = slice.output(); + let shadow = await shadowAt(z); let outs = []; if (tr_type === 'none') { // todo: move this out of the zs loop and only setZ when needed area = area.clone(true); outs = [ zs.length > 1 ? area.setZ(z) : clampZ(area, zTop, zBottom) ]; } else { + let offit = drape ? shadow : [ area ]; + if (op.omitthru && drape) { + offit = omitMatching(offit, thruHoles); + } // todo: move this out of the zs loop - POLY.offset([ area ], tr_type === 'inside' ? [ -toolDiam / 2 ] : [ toolDiam / 2 ], { + POLY.offset(offit, tr_type === 'inside' ? [ -toolDiam / 2 ] : [ toolDiam / 2 ], { count: 1, outs, flat: true, z, minArea: 0, open: true }); } @@ -232,9 +232,14 @@ class OpArea extends CamOp { if (op.dogbones) outs.forEach(out => out.addDogbones(toolDiam / 5, op.revbones)); // cut tabs when present if (tabs) outs = cutTabs(tabs, outs); + if (op.omitouter) { + outs = omitOuter(outs); + } else if (op.omitinner) { + outs = omitInner(outs); + } slice.camLines = outs; // store travel boundary that triggers up and over moves - slice.tool_shadow = [ area, ...POLY.offset(await shadowAt(z), [ toolDiam / 2 - ts_off ], { count: 1, z }) ]; + slice.tool_shadow = [ area, ...POLY.offset(shadow, [ toolDiam / 2 - ts_off ], { count: 1, z }) ]; zroc += zinc; progress(proc + (pinc * zroc), 'trace'); layers @@ -396,6 +401,36 @@ class OpArea extends CamOp { } } +function omitOuter(polys) { + let inner = []; + for (let poly of polys) { + if (poly.inner) inner.push(...poly.inner); + } + return inner; +} + +function omitInner(polys) { + for (let poly of polys) { + poly.inner = undefined; + } + return polys; +} + +function omitMatching(target, matches) { + target = target.clone(true); + for (let poly of target.filter(p => p.inner)) { + poly.inner = poly.inner.filter(inner => { + for (let ho of matches) { + if (inner.isEquivalent(ho)) { + return false; + } + } + return true; + }); + } + return target; +} + function clampZ(poly, min, max) { for (let p of poly.points) { if (p.z < min) p.z = min; diff --git a/src/kiri/mode/cam/op-outline.js b/src/kiri/mode/cam/op-outline.js index 80db9b11..e320dfef 100644 --- a/src/kiri/mode/cam/op-outline.js +++ b/src/kiri/mode/cam/op-outline.js @@ -52,9 +52,13 @@ class OpOutline extends CamOp { areas: { [widget.id]: areas.map(p => p.toArray()) }, dogbones, down, - edgeonly: true, + drape: true, expand: 0, - mode: 'clear', + mode: 'trace', + // omitinner: true, + omitouter: inside, + outline: omitthru, + omitthru, ov_botz, ov_topz, plunge, @@ -65,6 +69,7 @@ class OpOutline extends CamOp { spindle, surfaces: {}, tool, + tr_type: 'outside', })); if (!inside) { // add outline diff --git a/web/kiri/index.html b/web/kiri/index.html index 5de0fcfb..fb9f812e 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -22,7 +22,7 @@ - +