add outside travel safeties to tool_shadow, disable depth-first pocket with drape (incompatible since no nesting), filter empty slices (also a drape artifact)
This commit is contained in:
parent
8fcfdd7499
commit
7b3f9b5581
1 changed files with 20 additions and 7 deletions
|
|
@ -17,7 +17,7 @@ const clib = self.ClipperLib;
|
||||||
const ctyp = clib.ClipType;
|
const ctyp = clib.ClipType;
|
||||||
const ptyp = clib.PolyType;
|
const ptyp = clib.PolyType;
|
||||||
const cfil = clib.PolyFillType;
|
const cfil = clib.PolyFillType;
|
||||||
const ts_off = 0.01;
|
const ts_eps = 0.01;
|
||||||
|
|
||||||
// todo: review tool_shadow. offset both directions for travel inside and outside / between?
|
// todo: review tool_shadow. offset both directions for travel inside and outside / between?
|
||||||
|
|
||||||
|
|
@ -116,6 +116,7 @@ class OpArea extends CamOp {
|
||||||
let pinc = 1 / polys.length;
|
let pinc = 1 / polys.length;
|
||||||
for (let area of polys) {
|
for (let area of polys) {
|
||||||
let bounds = area.getBounds3D();
|
let bounds = area.getBounds3D();
|
||||||
|
let ts_off = toolDiam / 2 - ts_eps;
|
||||||
|
|
||||||
if (outline) {
|
if (outline) {
|
||||||
// remove inner voids when processing outline only
|
// remove inner voids when processing outline only
|
||||||
|
|
@ -138,7 +139,10 @@ class OpArea extends CamOp {
|
||||||
let slice = newLayer(z);
|
let slice = newLayer(z);
|
||||||
let layers = slice.output();
|
let layers = slice.output();
|
||||||
let shadow = await shadowAt(z);
|
let shadow = await shadowAt(z);
|
||||||
let tool_shadow = POLY.offset(shadow, [ toolDiam / 2 - ts_off ], { count: 1, z });
|
let tool_shadow = [
|
||||||
|
...POLY.offset(shadow, [ ts_off ], { count: 1, z }),
|
||||||
|
...POLY.offset(shadow, [ -ts_off ], { count: 1, z }),
|
||||||
|
];
|
||||||
// for roughing/outline backward compatability
|
// for roughing/outline backward compatability
|
||||||
if (op.omitthru) {
|
if (op.omitthru) {
|
||||||
shadow = omitMatching(shadow, thruHoles);
|
shadow = omitMatching(shadow, thruHoles);
|
||||||
|
|
@ -247,7 +251,12 @@ class OpArea extends CamOp {
|
||||||
}
|
}
|
||||||
slice.camLines = outs;
|
slice.camLines = outs;
|
||||||
// store travel boundary that triggers up and over moves
|
// store travel boundary that triggers up and over moves
|
||||||
slice.tool_shadow = [ area, ...shadow, ...POLY.offset(shadow, [ toolDiam / 2 - ts_off ], { count: 1, z }) ];
|
slice.tool_shadow = [
|
||||||
|
area,
|
||||||
|
...shadow,
|
||||||
|
...POLY.offset(shadow, [ ts_off ], { count: 1, z }),
|
||||||
|
...POLY.offset(shadow, [ -ts_off ], { count: 1, z }),
|
||||||
|
];
|
||||||
zroc += zinc;
|
zroc += zinc;
|
||||||
progress(proc + (pinc * zroc), 'trace');
|
progress(proc + (pinc * zroc), 'trace');
|
||||||
layers
|
layers
|
||||||
|
|
@ -341,8 +350,11 @@ class OpArea extends CamOp {
|
||||||
surfaces.push(surface);
|
surfaces.push(surface);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// filter out empty slices
|
||||||
// return only slices containing ares to mill
|
this.areas = areas = areas.map(area => {
|
||||||
|
return area.filter(slice => slice.camLines && slice.camLines.length);
|
||||||
|
}).filter(a => a.length);
|
||||||
|
// only render slices containing ares to mill
|
||||||
addSlices(areas.flat().filter(s => s.camLines && s.camLines.length));
|
addSlices(areas.flat().filter(s => s.camLines && s.camLines.length));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -379,7 +391,7 @@ class OpArea extends CamOp {
|
||||||
dist: Infinity,
|
dist: Infinity,
|
||||||
area: undefined
|
area: undefined
|
||||||
};
|
};
|
||||||
for (let area of areas.filter(p => p.length && !p.used)) {
|
for (let area of areas.filter(p => !p.used)) {
|
||||||
// skip devel / debug only areas
|
// skip devel / debug only areas
|
||||||
let topPolys = area[0].camLines;
|
let topPolys = area[0].camLines;
|
||||||
if (!topPolys) continue;
|
if (!topPolys) continue;
|
||||||
|
|
@ -393,12 +405,13 @@ class OpArea extends CamOp {
|
||||||
min.dist = find.distance;
|
min.dist = find.distance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we have a next-closest top poly, pocket that
|
// if we have a next-closest top poly, pocket that
|
||||||
if (min.area) {
|
if (min.area) {
|
||||||
min.area.used = true;
|
min.area.used = true;
|
||||||
pocket({
|
pocket({
|
||||||
cutdir: op.ov_conv,
|
cutdir: op.ov_conv,
|
||||||
depthFirst: process.camDepthFirst,
|
depthFirst: process.camDepthFirst && !op.drape,
|
||||||
easeDown: op.down && process.easeDown ? op.down : 0,
|
easeDown: op.down && process.easeDown ? op.down : 0,
|
||||||
progress: (n,m) => progress(n/m, "area"),
|
progress: (n,m) => progress(n/m, "area"),
|
||||||
slices: min.area.filter(slice => slice.camLines)
|
slices: min.area.filter(slice => slice.camLines)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue