more efficient shortest-distance pocket routing

This commit is contained in:
Stewart Allen 2024-08-17 17:57:03 -04:00
commit f08319efe7
3 changed files with 40 additions and 9 deletions

View file

@ -1383,7 +1383,7 @@ class OpPocket extends CamOp {
prepare(ops, progress) {
let { op, state, pockets } = this;
let { setTool, setSpindle, setTolerance, sliceOutput } = ops;
let { setTool, setSpindle, setTolerance, sliceOutput, getPrintPoint } = ops;
let { process } = state.settings;
setTool(op.tool, op.rate);
@ -1393,13 +1393,37 @@ class OpPocket extends CamOp {
setTolerance(this.topo.tolerance);
}
for (let sliceOut of pockets) {
sliceOutput(sliceOut, {
cutdir: process.camConventional,
depthFirst: process.camDepthFirst && !state.isIndexed,
easeDown: op.down && process.easeDown ? op.down : 0,
progress: (n,m) => progress(n/m, "pocket")
});
// eliminate empty pockets
pockets = pockets.filter(p => p.length);
// pockets is an [ array of an [ array of slices ] ]
// each top level array is a pocket containing a [ z layer array of slices ]
// follow each pocket to the next closest one from previous exit
for (;;) {
let printPoint = getPrintPoint();
let min = {
dist: Infinity,
pocket: undefined
};
for (let pocket of pockets.filter(p => !p.used)) {
let poly = pocket[0].camLines.slice().sort((a,b) => b.area() - a.area())[0];
let find = poly.findClosestPointTo(printPoint);
if (find.distance < min.dist) {
min.pocket = pocket;
min.dist = find.distance;
}
}
if (min.pocket) {
min.pocket.used = true;
sliceOutput(min.pocket, {
cutdir: process.camConventional,
depthFirst: process.camDepthFirst && !state.isIndexed,
easeDown: op.down && process.easeDown ? op.down : 0,
progress: (n,m) => progress(n/m, "pocket")
});
} else {
break;
}
}
}
}