add 'smart' trace centerlines when open poly/lines are separated by selected tool diameter
This commit is contained in:
parent
42c6743aaa
commit
e1e5449476
1 changed files with 55 additions and 0 deletions
|
|
@ -787,8 +787,63 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function similar(v1, v2, epsilon = 0.01) {
|
||||||
|
return Math.abs(v1-v2) <= epsilon;
|
||||||
|
}
|
||||||
|
function centerPoly(p1, p2) {
|
||||||
|
// follow poly with most points
|
||||||
|
if (p2.length > p1.length) {
|
||||||
|
let t = p1;
|
||||||
|
p1 = p2;
|
||||||
|
p2 = t;
|
||||||
|
}
|
||||||
|
let np = newPolygon().setOpen(true);
|
||||||
|
for (let p of p1.points) {
|
||||||
|
let q = p2.findClosestPointTo(p);
|
||||||
|
np.push(p.midPointTo3D(q.point));
|
||||||
|
}
|
||||||
|
return np;
|
||||||
|
}
|
||||||
|
function centerPolys(polys) {
|
||||||
|
// select open polys and sort by length
|
||||||
|
let ptst = polys.filter(p => p.isOpen()).sort((a,b) => b.perimeter() - a.perimeter());
|
||||||
|
if (ptst.length < 2) {
|
||||||
|
return polys;
|
||||||
|
}
|
||||||
|
let pt = newPoint(0,0,0);
|
||||||
|
// ensure polys are ordered with start point closest to 0,0
|
||||||
|
ptst.forEach(p => {
|
||||||
|
if (p.last().distTo2D(pt) < p.first().distTo2D(pt)) {
|
||||||
|
p.reverse();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
let pout = polys.filter(p => p.isClosed());
|
||||||
|
outer: for (let i=0,l=ptst.length; i<l-1; i++) {
|
||||||
|
let p0 = ptst[i];
|
||||||
|
if (!p0) continue;
|
||||||
|
for (let j=i+1; j<l; j++) {
|
||||||
|
let p1 = ptst[j];
|
||||||
|
if (!p1) continue;
|
||||||
|
if (
|
||||||
|
similar(p0.perimeter(), p1.perimeter(), 0.1) &&
|
||||||
|
similar(p0.first().distTo2D(p1.first()), toolDiam) &&
|
||||||
|
similar(p0.last().distTo2D(p1.last()), toolDiam)
|
||||||
|
) {
|
||||||
|
console.log({candidates: [p0, p1]});
|
||||||
|
pout.push(centerPoly(p0, p1));
|
||||||
|
ptst[i] = undefined;
|
||||||
|
ptst[j] = undefined;
|
||||||
|
continue outer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pout.appendAll(ptst.filter(p => p));
|
||||||
|
return pout;
|
||||||
|
}
|
||||||
// connect selected segments if open and touching
|
// connect selected segments if open and touching
|
||||||
polys = healPolys(polys);
|
polys = healPolys(polys);
|
||||||
|
// find center line for open polys spaced by tool diameter
|
||||||
|
polys = centerPolys(polys);
|
||||||
switch (op.mode) {
|
switch (op.mode) {
|
||||||
case "follow":
|
case "follow":
|
||||||
let routed = [];
|
let routed = [];
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue