add diameter detection

This commit is contained in:
bakedpotatolord 2025-04-24 11:41:27 -06:00
commit f77eb0e989
2 changed files with 33 additions and 30 deletions

View file

@ -1158,20 +1158,26 @@ CAM.init = function(kiri, api) {
}; };
func.selectIndividualHoles = function(){ func.selectIndividualHoles = function(ev){
console.log("func.selectIndividualHoles not implemented"); console.log("func.selectIndividualHoles not implemented");
let holes = CAM.holes((centers)=>{ //cam holes takes <=0 diameter to mean select all holes
console.log("all centers",centers)
},0);
} }
func.selectAllHoles= function(data, getRec){ func.selectAllHoles= function(ev, getRec){
let settings = API.conf.get(); let settings = API.conf.get();
const {tool,mark} = getRec(); const {tool,mark} = getRec();
const diam = new CAM.Tool(settings,tool).fluteDiameter() const diam = new CAM.Tool(settings,tool).fluteDiameter()
console.log("func.selectAllHoles not implemented");
let holes = CAM.holes((centers)=>{ //cam holes takes <=0 diameter to mean select all holes let holes = CAM.holes((centers)=>{ //cam holes takes <=0 diameter to mean select all holes
console.log("client received centers",centers) console.log("tool specified centers",centers)
},diam); },diam);
} }

View file

@ -460,13 +460,12 @@ CAM.holes = async function(settings, widget, diam) {
.filter(z => z !== null) .filter(z => z !== null)
)] )]
let centerDiff = diam * 0.1, let centerDiff = diam * 0.1,
area = (diam/2) * (diam/2) * Math.PI, area = (diam/2) * (diam/2) * Math.PI,
areaDelta = area * 0.05, areaDelta = area * 0.05,
drills = []; drills = [],
slices = [],
let slices = []; selectall = diam <= 0;
function onEach(slice) { function onEach(slice) {
slices.push(slice); slices.push(slice);
@ -474,39 +473,37 @@ CAM.holes = async function(settings, widget, diam) {
let opts = { each: onEach, over: false, flatoff: 0, edges: true, openok: false, lines: false }; let opts = { each: onEach, over: false, flatoff: 0, edges: true, openok: false, lines: false };
await slicer.slice(indices, opts); await slicer.slice(indices, opts);
const tslices = slices.map(s=>s.tops).flat() const tslices = slices.map(s=>s.tops).flat()
for (let slice of tslices) { for (let slice of tslices) {
slice.shadow = CAM.shadowAt(widget,slice.z, 0) slice.shadow = CAM.shadowAt(widget,slice.z, 0)
console.log("looking at slice",slice) // console.log("looking at slice",slice)
let inner = slice.inner; let inner = slice.inner;
for (let poly of inner) { for (let poly of inner) {
if (poly.circularity() >= 0.985 && Math.abs(poly.area() - area) <= areaDelta) { let center = poly.calcCircleCenter();
let center = poly.calcCircleCenter();
center.isSelected = (selectall || (poly.circularity() >= 0.985 && Math.abs(poly.area() - area) <= areaDelta ));
if (center.isInPolygon(slice.shadow)) { if (center.isInPolygon(slice.shadow)) {
//TODO: test if this is working
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;
}
// otherwise, don't add and continue
overlap = true;
continue; 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;
}
// otherwise, don't add and continue
overlap = true;
continue;
}
}
if(!overlap) drills.push(center);
} }
if(!overlap) drills.push(center);
} }
} }