From 552cb1f8c0ee78d527488d66a227c7d19be9bc7e Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 25 Dec 2020 20:35:12 -0500 Subject: [PATCH] recode trace=clear to allow nested polygons and distinct z layers --- src/mode/cam/ops.js | 55 +++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/src/mode/cam/ops.js b/src/mode/cam/ops.js index c672d1c4..cac6c931 100644 --- a/src/mode/cam/ops.js +++ b/src/mode/cam/ops.js @@ -668,28 +668,49 @@ let toolDiam = new CAM.Tool(settings, tool).fluteDiameter(); let toolOver = toolDiam * op.step; let cutdir = process.camConventional; + let polys = []; updateToolDiams(toolDiam); - areas.forEach(arr => { - let slice = newSlice(); + for (let arr of areas) { let poly = newPolygon().fromArray(arr); POLY.setWinding([ poly ], cutdir, false); - slice.camTrace = { tool, rate, plunge }; - slice.camLines = [ poly ]; - switch (op.mode) { - case "follow": - break; - case "clear": - POLY.offset([poly], -toolOver, { - count:999, outs: slice.camLines, flat:true, z: poly.getZ() - }); - break; - } + polys.push(poly); + } + function newSliceOut(z) { + let slice = newSlice(z); sliceAll.push(slice); sliceOut.push(slice); - if (true) slice.output() - .setLayer("trace", {line: 0xaa00aa}, false) - .addPolys(slice.camLines) - }); + return slice; + } + switch (op.mode) { + case "follow": + for (let poly of polys) { + let slice = newSliceOut(poly.getZ()); + slice.camTrace = { tool, rate, plunge }; + slice.camLines = [ poly ]; + slice.output() + .setLayer("follow", {line: 0xaa00aa}, false) + .addPolys(slice.camLines) + } + break; + case "clear": + let zmap = {}; + for (let poly of polys) { + let z = poly.getZ(); + (zmap[z] = zmap[z] || []).push(poly); + } + for (let [z, polys] of Object.entries(zmap)) { + let slice = newSliceOut(z = parseFloat(z)); + slice.camTrace = { tool, rate, plunge }; + POLY.offset(POLY.nest(polys), -toolOver, { + count:999, outs: slice.camLines = [], flat:true, z + }); + slice.camLines = POLY.flatten(slice.camLines, null, true); + POLY.setWinding(slice.camLines, cutdir, false); + slice.output() + .setLayer("clear", {line: 0xaa00aa}, false) + .addPolys(slice.camLines) + } + } } prepare(ops, progress) {