add functionality needed to complete outline

This commit is contained in:
Stewart Allen 2025-12-09 22:57:26 -05:00
commit adfede4960
3 changed files with 57 additions and 17 deletions

View file

@ -26,7 +26,7 @@ class OpArea extends CamOp {
async slice(progress) {
let { op, state } = this;
let { tool, mode, down, over, follow, edgeonly, expand, outline, smooth } = op;
let { tool, mode, down, drape, over, follow, edgeonly, expand, outline, smooth } = op;
let { ov_topz, ov_botz, direction, rename } = op;
let { settings, widget, tabs, color } = state;
let { addSlices, setToolDiam, cutTabs, shadowAt, workarea } = state;
@ -139,17 +139,7 @@ class OpArea extends CamOp {
let tool_shadow = POLY.offset(shadow, [ toolDiam / 2 - ts_off ], { count: 1, z });
// for roughing/outline backward compatability
if (op.omitthru) {
shadow = shadow.clone(true);
for (let poly of shadow.filter(p => p.inner)) {
poly.inner = poly.inner.filter(inner => {
for (let ho of thruHoles) {
if (inner.isEquivalent(ho)) {
return false;
}
}
return true;
});
}
shadow = omitMatching(shadow, thruHoles);
}
// progressive offset of polygons inside area clipped to the shadow
let outs = [];
@ -181,6 +171,11 @@ class OpArea extends CamOp {
if (op.leave_xy) {
outs = outs.map(poly => poly.offset(-op.leave_xy)).flat();
}
if (op.omitouter) {
outs = omitOuter(outs);
} else if (op.omitinner) {
outs = omitInner(outs);
}
// store travel boundary that triggers up and over moves
slice.tool_shadow = [ area, ...tool_shadow ];
slice.camLines = outs;
@ -213,14 +208,19 @@ class OpArea extends CamOp {
for (let z of zs) {
let slice = newLayer(z);
let layers = slice.output();
let shadow = await shadowAt(z);
let outs = [];
if (tr_type === 'none') {
// todo: move this out of the zs loop and only setZ when needed
area = area.clone(true);
outs = [ zs.length > 1 ? area.setZ(z) : clampZ(area, zTop, zBottom) ];
} else {
let offit = drape ? shadow : [ area ];
if (op.omitthru && drape) {
offit = omitMatching(offit, thruHoles);
}
// todo: move this out of the zs loop
POLY.offset([ area ], tr_type === 'inside' ? [ -toolDiam / 2 ] : [ toolDiam / 2 ], {
POLY.offset(offit, tr_type === 'inside' ? [ -toolDiam / 2 ] : [ toolDiam / 2 ], {
count: 1, outs, flat: true, z, minArea: 0, open: true
});
}
@ -232,9 +232,14 @@ class OpArea extends CamOp {
if (op.dogbones) outs.forEach(out => out.addDogbones(toolDiam / 5, op.revbones));
// cut tabs when present
if (tabs) outs = cutTabs(tabs, outs);
if (op.omitouter) {
outs = omitOuter(outs);
} else if (op.omitinner) {
outs = omitInner(outs);
}
slice.camLines = outs;
// store travel boundary that triggers up and over moves
slice.tool_shadow = [ area, ...POLY.offset(await shadowAt(z), [ toolDiam / 2 - ts_off ], { count: 1, z }) ];
slice.tool_shadow = [ area, ...POLY.offset(shadow, [ toolDiam / 2 - ts_off ], { count: 1, z }) ];
zroc += zinc;
progress(proc + (pinc * zroc), 'trace');
layers
@ -396,6 +401,36 @@ class OpArea extends CamOp {
}
}
function omitOuter(polys) {
let inner = [];
for (let poly of polys) {
if (poly.inner) inner.push(...poly.inner);
}
return inner;
}
function omitInner(polys) {
for (let poly of polys) {
poly.inner = undefined;
}
return polys;
}
function omitMatching(target, matches) {
target = target.clone(true);
for (let poly of target.filter(p => p.inner)) {
poly.inner = poly.inner.filter(inner => {
for (let ho of matches) {
if (inner.isEquivalent(ho)) {
return false;
}
}
return true;
});
}
return target;
}
function clampZ(poly, min, max) {
for (let p of poly.points) {
if (p.z < min) p.z = min;

View file

@ -52,9 +52,13 @@ class OpOutline extends CamOp {
areas: { [widget.id]: areas.map(p => p.toArray()) },
dogbones,
down,
edgeonly: true,
drape: true,
expand: 0,
mode: 'clear',
mode: 'trace',
// omitinner: true,
omitouter: inside,
outline: omitthru,
omitthru,
ov_botz,
ov_topz,
plunge,
@ -65,6 +69,7 @@ class OpOutline extends CamOp {
spindle,
surfaces: {},
tool,
tr_type: 'outside',
}));
if (!inside) {
// add outline

View file

@ -22,7 +22,7 @@
<link rel="stylesheet" type="text/css" href="index.css">
<link href="manifest.json" rel="manifest">
<link href="../font/css/all.min.css" rel="stylesheet">
<!-- <script type="module" src="/lib/kiri/run/worker.js"></script> -->
<script type="module" src="/lib/kiri/run/worker.js"></script>
<!-- <script type="module" src="/lib/kiri/run/minion.js"></script> -->
<script src="../lib/ext/tween.js"></script>
<script src="../font/js/all.min.js" crossorigin="anonymous" defer></script>