From 05a9bca48544ac430ed2e31b7b4f7dadf097a2f6 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 21 Jun 2025 22:22:37 -0400 Subject: [PATCH] fix ctrl click to select planar matching lines --- src/geo/polygon.js | 13 +++++++++++++ src/kiri-mode/cam/client.js | 3 ++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/geo/polygon.js b/src/geo/polygon.js index 2bd7580f..5d5fa478 100644 --- a/src/geo/polygon.js +++ b/src/geo/polygon.js @@ -1006,6 +1006,19 @@ class Polygon { return Math.min(...this.points.map(p => p.z)); } + avgZ() { + return [...this.points.map(p => p.z)].reduce((a,v) => a+v) / this.points.length; + } + + /** + * @param {*} z value target + * @param {*} epsilon allowed Z variance + * @returns {boolean} true if all points Z within epsilon of value + */ + onZ(z, epsilon = 10e-4) { + return Math.max(...this.points.map(p => Math.abs(z - p.z))) < epsilon; + } + /** */ render(layer, color, recursive, open) { diff --git a/src/kiri-mode/cam/client.js b/src/kiri-mode/cam/client.js index 53993015..e2ff19f0 100644 --- a/src/kiri-mode/cam/client.js +++ b/src/kiri-mode/cam/client.js @@ -1128,8 +1128,9 @@ CAM.init = function(kiri, api) { if (ev.metaKey || ev.ctrlKey) { let { selected } = object; let { widget, poly } = object.trace; + let avgZ = poly.avgZ(); for (let add of widget.adds) { - if (add.trace && add.selected !== selected && add.trace.poly.getZ() === poly.getZ()) { + if (add.trace && add.selected !== selected && add.trace.poly.onZ(avgZ)) { func.traceToggle(add); } }