From 3a5dd483b441b62cf844128691d8a4b23d05a9e7 Mon Sep 17 00:00:00 2001 From: bakedpotatolord Date: Thu, 1 May 2025 09:39:54 -0600 Subject: [PATCH 1/4] fixed hole detection, and added shadow detection --- src/kiri-mode/cam/client.js | 15 +++++-- src/kiri-mode/cam/driver.js | 1 + src/kiri-mode/cam/slice.js | 89 +++++++++++++++++++++++-------------- 3 files changed, 68 insertions(+), 37 deletions(-) diff --git a/src/kiri-mode/cam/client.js b/src/kiri-mode/cam/client.js index bf35233e..c0e876d0 100644 --- a/src/kiri-mode/cam/client.js +++ b/src/kiri-mode/cam/client.js @@ -1190,9 +1190,7 @@ CAM.init = function(kiri, api) { const {tool,mark} = poppedRec //TODO: display some visual difference if mark is selected let diam = new CAM.Tool(settings,tool).fluteDiameter() - api.hide.alert(alert); - alert = api.show.alert("[esc] cancels drill editing"); - kiri.api.widgets.opacity(0.8); + const widgets = kiri.api.widgets.all() /** * creates a mesh for a hole and adds it to a widget @@ -1242,10 +1240,17 @@ CAM.init = function(kiri, api) { }else{ // if no widget has cached holes await CAM.holes(individual?0:diam,(centers)=>{ + let shadow = centers.some(c=>c.shadowed) + if(shadow){ + alert = api.show.alert("Some holes are shadowed by part and are not shown."); + } + console.log("holes centers",centers) centers = centers ?? [] //flattened list of all hole centers and if they are selected kiri.api.widgets.for(widget => { const {holes} = centers.find(center=>center.id = widget.id) + + console.log(holes) if (!holes.length) unselectHoles(holes); holes.forEach(hole => { createHoleMesh(widget, hole) @@ -1260,6 +1265,10 @@ CAM.init = function(kiri, api) { }) }); } + //hide the alert once hole meshes are calculated on the worker, and then added to the scene + api.hide.alert(alert); + alert = api.show.alert("[esc] cancels drill editing"); + kiri.api.widgets.opacity(0.8); } func.selectHolesHover = function(data) { diff --git a/src/kiri-mode/cam/driver.js b/src/kiri-mode/cam/driver.js index e5e415b0..f10b3783 100644 --- a/src/kiri-mode/cam/driver.js +++ b/src/kiri-mode/cam/driver.js @@ -168,6 +168,7 @@ kiri.load(api => { send.done(kiri.codec.encode(fresh.map(widget => { return { id: widget.id, holes: widget.holes, + shadowed:widget.shadowedDrills } } ))); } } diff --git a/src/kiri-mode/cam/slice.js b/src/kiri-mode/cam/slice.js index ec38dfcb..9bfe6b03 100644 --- a/src/kiri-mode/cam/slice.js +++ b/src/kiri-mode/cam/slice.js @@ -460,14 +460,29 @@ CAM.holes = async function(settings, widget, diam) { // keeps the z bottom relative to the part when z align changes zBottom = isIndexed ? camZBottom : camZBottom - zbOff; - let slicer = new kiri.cam_slicer(widget); - let zees = Object.assign({}, slicer.zFlat); - let indices = [...new Set(Object.keys(zees) + let slicerOpts = { + flatoff: 0.01, + } + + let slicer = new kiri.cam_slicer(widget,slicerOpts); + + + // console.log("zFlats",slicer.zFlat) + + let zFlats = Object.keys(slicer.zFlat).map(Number).map(z=>[z]).flat() + + + + let intervals = slicer.interval(1,{ + fit: false, off: -0.01, flats: true + }) + + let zees = [...zFlats,...intervals] + let indices = [...new Set(zees .map(kv => parseFloat(kv).round(5)) .filter(z => z !== null) )] - let centerDiff = diam * 0.1, area = (diam/2) * (diam/2) * Math.PI, areaDelta = area * 0.05, @@ -478,45 +493,51 @@ CAM.holes = async function(settings, widget, diam) { function onEach(slice) { slices.push(slice); } - - let opts = { each: onEach, over: false, flatoff: 0, edges: true, openok: false, lines: false }; + let opts = { each: onEach }; await slicer.slice(indices, opts); - const tslices = slices.map(s=>s.tops).flat() - // console.log("tslices",tslices) - for (let slice of tslices) { - slice.shadow = CAM.shadowAt(widget,slice.z, 0) - let inner = slice.inner; - if (!inner) { //no holes - continue; - } - for (let poly of inner) { - let center = poly.calcCircleCenter(); - center.selected = (!individual && poly.circularity() >= 0.985 && Math.abs(poly.area() - area) <= areaDelta ); - if (center.isInPolygon(slice.shadow)) { - //TODO: this does not work yet. needs to be implemented + let shadowedDrills = false; + // console.log("slices",slices) + for (let slice of slices) { + for(let top of slice.tops){ + // console.log("slicing",slice.z,top) + slice.shadow = CAM.shadowAt(widget,slice.z, 0) + let inner = top.inner; + if (!inner) { //no holes continue; } - let overlap = false; - for (let [i,drill] of drills.entries()) { - let dist = drill.distTo2D(center) - if (dist <= centerDiff) { // too close - // console.log("overlap",center,drill); - if(center.z > drill.z) { //if current is higher than old - drills[i] = center; //replace with top point - drills[i].depth = center.z-drill.z - }else if(center.z <= drill.z-drill.depth){// if current is lower or same as old - drills[i].depth = drill.z-center.z - } - // if overlapping, don't add and continue - overlap = true; + for (let poly of inner) { + let center = poly.calcCircleCenter(); + // console.log("center",center) + center.selected = (!individual && poly.circularity() >= 0.985 && Math.abs(poly.area() - area) <= areaDelta ); + if (center.isInPolygon(slice.shadow)) { + // if shadowed, don't add, and inform client + shadowedDrills = true; continue; } + let overlap = false; + for (let [i,drill] of drills.entries()) { + let dist = drill.distTo2D(center) + if (dist <= centerDiff) { // too close + // console.log("overlap",center,drill); + if(center.z > drill.z) { //if current is higher than old + drills[i] = center; //replace with top point + drills[i].depth = center.z-drill.z + }else if(center.z <= drill.z-drill.depth){// if current is lower or same as old + drills[i].depth = drill.z-center.z + } + // if overlapping, don't add and continue + overlap = true; + continue; + } + } + center.depth = 0; + if(!overlap) drills.push(center); } - center.depth = 0; - if(!overlap) drills.push(center); } } + console.log("drills",drills) drills = drills.filter(drill => drill.depth > 0) + widget.shadowedDrills = shadowedDrills widget.holes = drills; return drills; } From 3c46f9bf351c0d0ddb4789f0f8f75831898acca6 Mon Sep 17 00:00:00 2001 From: bakedpotatolord Date: Thu, 1 May 2025 09:49:49 -0600 Subject: [PATCH 2/4] remove console.logs --- src/kiri-mode/cam/client.js | 1 - src/kiri-mode/cam/slice.js | 1 - 2 files changed, 2 deletions(-) diff --git a/src/kiri-mode/cam/client.js b/src/kiri-mode/cam/client.js index c0e876d0..a73732e6 100644 --- a/src/kiri-mode/cam/client.js +++ b/src/kiri-mode/cam/client.js @@ -1244,7 +1244,6 @@ CAM.init = function(kiri, api) { if(shadow){ alert = api.show.alert("Some holes are shadowed by part and are not shown."); } - console.log("holes centers",centers) centers = centers ?? [] //flattened list of all hole centers and if they are selected kiri.api.widgets.for(widget => { diff --git a/src/kiri-mode/cam/slice.js b/src/kiri-mode/cam/slice.js index 9bfe6b03..9a4cdc75 100644 --- a/src/kiri-mode/cam/slice.js +++ b/src/kiri-mode/cam/slice.js @@ -535,7 +535,6 @@ CAM.holes = async function(settings, widget, diam) { } } } - console.log("drills",drills) drills = drills.filter(drill => drill.depth > 0) widget.shadowedDrills = shadowedDrills widget.holes = drills; From 3692a532cf434ff2889d976bf41409d12978c445 Mon Sep 17 00:00:00 2001 From: bakedpotatolord Date: Thu, 1 May 2025 10:10:01 -0600 Subject: [PATCH 3/4] fix multi-diameter edge case --- src/kiri-mode/cam/slice.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/kiri-mode/cam/slice.js b/src/kiri-mode/cam/slice.js index 9a4cdc75..eac49a8c 100644 --- a/src/kiri-mode/cam/slice.js +++ b/src/kiri-mode/cam/slice.js @@ -507,8 +507,9 @@ CAM.holes = async function(settings, widget, diam) { } for (let poly of inner) { let center = poly.calcCircleCenter(); + center.area = poly.area(); // console.log("center",center) - center.selected = (!individual && poly.circularity() >= 0.985 && Math.abs(poly.area() - area) <= areaDelta ); + center.selected = (!individual && poly.circularity() >= 0.985 && Math.abs(center.area - area) <= areaDelta ); if (center.isInPolygon(slice.shadow)) { // if shadowed, don't add, and inform client shadowedDrills = true; @@ -517,7 +518,8 @@ CAM.holes = async function(settings, widget, diam) { let overlap = false; for (let [i,drill] of drills.entries()) { let dist = drill.distTo2D(center) - if (dist <= centerDiff) { // too close + //if on the same xy point, and both have the same selection value + if (dist <= centerDiff && drill.selected == center.selected) { // console.log("overlap",center,drill); if(center.z > drill.z) { //if current is higher than old drills[i] = center; //replace with top point From 5e725b057516390dfb2021cd59ffa071b0f14f2c Mon Sep 17 00:00:00 2001 From: bakedpotatolord Date: Thu, 1 May 2025 10:15:41 -0600 Subject: [PATCH 4/4] remove excess newlines --- src/kiri-mode/cam/slice.js | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/kiri-mode/cam/slice.js b/src/kiri-mode/cam/slice.js index eac49a8c..5624940f 100644 --- a/src/kiri-mode/cam/slice.js +++ b/src/kiri-mode/cam/slice.js @@ -461,19 +461,10 @@ CAM.holes = async function(settings, widget, diam) { zBottom = isIndexed ? camZBottom : camZBottom - zbOff; - let slicerOpts = { - flatoff: 0.01, - } - + let slicerOpts = {flatoff: 0.01} let slicer = new kiri.cam_slicer(widget,slicerOpts); - - - // console.log("zFlats",slicer.zFlat) - let zFlats = Object.keys(slicer.zFlat).map(Number).map(z=>[z]).flat() - - let intervals = slicer.interval(1,{ fit: false, off: -0.01, flats: true })