grid-apps-cmms/src/kiri/mode/cam/op-lathe.js

90 lines
2.5 KiB
JavaScript
Raw Normal View History

2025-07-05 10:49:09 -04:00
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
import { CamOp } from './op.js';
import { Tool } from './tool.js';
import { generate as topo4_generate } from './topo4.js';
import { newPoint } from '../../../geo/point.js';
2025-07-05 10:49:09 -04:00
function createFilter(op) {
let ok = () => true;
2025-07-05 10:49:09 -04:00
let filter = slices => slices;
let filterString = op.filter?.map(l => l.trim()).join('\n');
if (filterString) {
2025-07-05 10:49:09 -04:00
try {
const obj = eval(`( ${filterString} )`);
const accept = [];
let index = 0;
let sl_fn = obj?.slices ?? ok;
filter = function (slices) {
for (let slice of slices) {
if (sl_fn(slice, index++)) {
accept.push(slice);
2025-07-05 10:49:09 -04:00
}
}
return accept;
};
2025-07-05 10:49:09 -04:00
} catch (e) {
console.log('filter parse error', e, op.filter);
}
}
return filter;
}
class OpLathe extends CamOp {
constructor(state, op) {
super(state, op);
}
async slice(progress) {
let { op, state } = this;
2025-11-07 00:06:40 -05:00
let { addSlices, color } = state;
2025-07-05 10:49:09 -04:00
let filter = createFilter(op);
this.topo = await topo4_generate({
2025-07-05 10:49:09 -04:00
op,
state,
onupdate: (pct, msg) => {
progress(pct, msg);
},
ondone: (slices) => {
slices = filter(slices);
this.slices = slices;
addSlices(slices, false);
}
});
}
prepare(ops, progress) {
let { op, slices, topo } = this;
let { camOut, getLastPoint, newLayer, setContouring, setNextIsMove, zSafe } = ops;
2025-07-05 10:49:09 -04:00
let rez = topo.resolution;
// start top center, X = 0, Y = 0 closest to 4th axis chuck
camOut(newPoint(0, 0, zSafe).setA(0), 0);
setContouring(true);
setNextIsMove();
2025-07-05 10:49:09 -04:00
for (let slice of slices) {
// ignore debug slices
if (!slice.camLines) {
continue;
}
for (let path of slice.camLines) {
for (let point of path.points) {
camOut(point);
2025-07-05 10:49:09 -04:00
}
}
newLayer();
}
// move to safe height and reset A axis
let last = getLastPoint();
2025-07-05 10:49:09 -04:00
let amax = (Math.round(last.a / 360) * 360).round(2);
newLayer();
ops.addGCode([`G0 Z${zSafe.round(2)}`, `G0 A${amax}`, "G92 A0"]);
2025-07-05 10:49:09 -04:00
}
}
export { OpLathe };