Merge branch 'rel-4.2' of https://github.com/GridSpace/grid-apps into rel-4.2

This commit is contained in:
bakedpotatolord 2025-06-24 12:23:31 -06:00
commit 4695406d8d
85 changed files with 987 additions and 298 deletions

View file

@ -18,6 +18,7 @@ const { poly2polyEmit, tip2tipEmit, segmentNormal, vertexNormal } = paths;
const { driver, newSlice } = kiri;
const { CAM } = driver;
const DEG2RAG = Math.PI / 180;
const POLY = polygons;
class CamOp {
@ -44,12 +45,17 @@ class OpIndex extends CamOp {
super(state, op);
}
slice() {
async slice() {
let { op, state } = this;
if (!state.isIndexed) {
throw 'index op requires indexed stock';
}
this.degrees = state.setAxisIndex(op.degrees, op.absolute);
let { widget, updateSlicer, computeShadows, setAxisIndex } = state;
this.degrees = setAxisIndex(op.degrees, op.absolute);
// force recompute of topo
widget.topo = undefined;
updateSlicer();
await computeShadows();
}
prepare(ops, progress) {
@ -199,9 +205,6 @@ class OpRough extends CamOp {
POLY.offset([ newPolygon().centerRectangle(stock.center, stock.x, stock.y) ], step) :
POLY.offset(shadow, roughIn ? step : step + roughLeave + toolDiam / 2);
let facing = POLY.offset(inset, -step, { count: 999, flat: true });
if (isIndexed) {
ztOff = (stock.z / 2) - zMax;
}
let zdiv = ztOff / roughDown;
let zstep = (zdiv % 1 > 0) ? ztOff / (Math.floor(zdiv) + 1) : roughDown;
if (ztOff === 0) {
@ -482,8 +485,7 @@ class OpOutline extends CamOp {
async slice(progress) {
let { op, state } = this;
let { settings, widget, slicer, addSlices, tshadow, thruHoles, unsafe, color } = state;
let { updateToolDiams, tabs, cutTabs, cutPolys, workarea } = state;
let { zMax } = state;
let { updateToolDiams, tabs, cutTabs, cutPolys, workarea, zMax } = state;
let { process, stock } = settings;
if (op.down <= 0) {
@ -975,11 +977,12 @@ class OpTrace extends CamOp {
}
async slice(progress) {
const debug = false;
let { op, state } = this;
let { tool, rate, down, plunge, offset, offover, thru } = op;
let { ov_conv } = op;
let { settings, widget, addSlices, zThru, tabs, workarea } = state;
let { updateToolDiams, cutTabs, cutPolys, healPolys, color } = state;
let { updateToolDiams, cutTabs, cutPolys, healPolys, color, shadowAt } = state;
let { process, stock } = settings;
let { camStockClipTo } = process;
if (state.isIndexed) {
@ -1041,17 +1044,39 @@ class OpTrace extends CamOp {
.setLayer("trace follow", {line: color}, false)
.addPolys(slice.camLines)
}
function clearZ(polys, z, down) {
function clearZnew(polys, z, down) {
if (down) {
// adjust step down to a value <= down that
// ends on the lowest z specified
let diff = zTop - z;
down = diff / Math.ceil(diff / down);
}
let zs = down ? base.util.lerp(zTop, z, down) : [ z ];
let nested = POLY.nest(polys);
for (let poly of nested) {
let zpro = 0, zinc = 1 / (polys.length * zs.length);
for (let poly of polys) {
// newPocket();
for (let z of zs) {
let clip = [], shadow;
shadow = shadowAt(z);
POLY.subtract([ poly ], shadow, clip, undefined, undefined, 0);
if (op.outline) {
POLY.clearInner(clip);
}
if (clip.length === 0) {
continue;
}
let slice = newSliceOut(z);
let count = 999;
slice.camTrace = { tool, rate, plunge };
POLY.offset([ poly ], [ -toolDiam/2, -toolOver ], {
count:999, outs: slice.camLines = [], flat:true, z,
minArea: 0
});
if (toolDiam) {
const offs = [ -toolDiam / 2, -toolOver ];
POLY.offset(clip, offs, {
count, outs: slice.camLines = [], flat:true, z, minArea: 0
});
} else {
// when engraving with a 0 width tip
slice.camLines = clip;
}
if (tabs) {
slice.camLines = cutTabs(tabs, POLY.flatten(slice.camLines, null, true), z);
} else {
@ -1059,8 +1084,14 @@ class OpTrace extends CamOp {
}
POLY.setWinding(slice.camLines, cutdir, false);
slice.output()
.setLayer("trace clear", {line: color}, false)
.setLayer("trace", {line: color}, false)
.addPolys(slice.camLines)
if (debug && shadow) slice.output()
.setLayer("trace shadow", {line: 0xff8811}, false)
.addPolys(shadow)
progress(zpro, "trace");
zpro += zinc;
addSlices(slice);
}
}
}
@ -1175,7 +1206,7 @@ class OpTrace extends CamOp {
const zbo = widget.track.top - widget.track.box.d;
let zmap = {};
for (let poly of polys) {
let z = minZ(poly.getZ());
let z = minZ(poly.minZ());
if (offover) {
let pnew = POLY.offset([poly], -offover, { minArea: 0, open: true });
if (pnew) {
@ -1189,7 +1220,7 @@ class OpTrace extends CamOp {
(zmap[z] = zmap[z] || []).appendAll(poly);
}
for (let [zv, polys] of Object.entries(zmap)) {
clearZ(polys, parseFloat(zv), down);
clearZnew(polys, parseFloat(zv), down);
}
}
}
@ -1347,7 +1378,7 @@ class OpPocket extends CamOp {
let vert = widget.getGeoVertices({ unroll: true, translate: true }).map(v => v.round(4));
// let vert = widget.getVertices().array.map(v => v.round(4));
let outline = [];
let faces = CAM.surface_find(widget, surfaces, 0.1);
let faces = CAM.surface_find(widget, surfaces, (op.follow || 5) * DEG2RAG);
let zmin = Infinity;
let j=0, k=faces.length;
for (let face of faces) {