From 58d8abb4697573a32ba4d6a82e5e531a09f1a7a9 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 6 Feb 2023 08:33:36 -0500 Subject: [PATCH] experimental approach to offsetting open polylines in trace --- src/geo/polygons.js | 15 ++++++++++++--- src/kiri-mode/cam/ops.js | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/geo/polygons.js b/src/geo/polygons.js index 61d0dffa..53debbe3 100644 --- a/src/geo/polygons.js +++ b/src/geo/polygons.js @@ -10,7 +10,7 @@ gapp.register("geo.polygons", [], (root, exports) => { const { base } = root; -const { util, config, newPoint } = base; +const { util, paths, config, newPoint } = base; const { sqr, numOrDefault } = util; const DEG2RAD = Math.PI / 180, @@ -543,7 +543,13 @@ function expand(polys, distance, z, out, count, distance2, collector, min) { * in FDM mode and uncleared areas in CAM mode. */ function offset(polys, dist, opts = {}) { - // do not offset open lines + let open = opts.open ? polys.filter(p => p.open) : []; + if (open.length) { + open = open.map(p => paths.pointsToPath(p.points, dist, true)); + open = open.map(p => base.newPolygon().setOpen().addPoints(p.right)); + } + + // do not use clipper to offset open lines polys = polys.filter(p => !p.open); // cause inner / outer polys to be reversed from each other @@ -570,6 +576,7 @@ function offset(polys, dist, opts = {}) { if (opts.wasm && geo.wasm) { try { polys = geo.wasm.js.offset(polys, offs, zed, clean ? config.clipperClean : 0, simple ? 1 : 0); + if (open.length) polys.appendAll(open); } catch (e) { console.log('wasm error', e.message || e); opts.wasm = false; @@ -629,7 +636,9 @@ function offset(polys, dist, opts = {}) { } } - return opts.flat ? opts.outs : polys; + let rez = opts.flat ? opts.outs : polys; + if (open.length) rez.appendAll(open); + return rez; } /** diff --git a/src/kiri-mode/cam/ops.js b/src/kiri-mode/cam/ops.js index fc620597..0eb31684 100644 --- a/src/kiri-mode/cam/ops.js +++ b/src/kiri-mode/cam/ops.js @@ -1051,7 +1051,7 @@ class OpTrace extends CamOp { case "inside": offdist = -traceOffset; break; } if (offdist) { - let pnew = POLY.offset([poly], offdist, { minArea: 0 }); + let pnew = POLY.offset([poly], offdist, { minArea: 0, open: true }); if (pnew) { poly = POLY.setZ(pnew, poly.getZ()); } else {