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';
|
2025-07-12 19:11:39 -04:00
|
|
|
import { generate as topo4_generate } from './topo4.js';
|
2025-07-09 13:00:52 -04:00
|
|
|
import { newPoint } from '../../../geo/point.js';
|
2025-07-05 10:49:09 -04:00
|
|
|
|
|
|
|
|
function createFilter(op) {
|
2025-10-12 16:01:38 -04:00
|
|
|
let ok = () => true;
|
2025-07-05 10:49:09 -04:00
|
|
|
let filter = slices => slices;
|
2025-10-12 16:01:38 -04:00
|
|
|
let filterString = op.filter?.map(l => l.trim()).join('\n');
|
|
|
|
|
if (filterString) {
|
2025-07-05 10:49:09 -04:00
|
|
|
try {
|
2025-10-12 16:01:38 -04:00
|
|
|
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
|
|
|
}
|
2025-10-12 16:01:38 -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);
|
2025-07-12 19:11:39 -04:00
|
|
|
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, state, slices, topo } = this;
|
|
|
|
|
let { settings } = state;
|
|
|
|
|
|
2025-11-30 18:03:18 -05:00
|
|
|
let { setTool, setSpindle } = ops;
|
2025-07-05 10:49:09 -04:00
|
|
|
let { camOut, newLayer, printPoint } = ops;
|
|
|
|
|
let { zmax } = ops;
|
|
|
|
|
|
|
|
|
|
let toolDiam = new Tool(settings, op.tool).fluteDiameter();
|
|
|
|
|
let stepover = toolDiam * op.step * 2;
|
|
|
|
|
let rez = topo.resolution;
|
|
|
|
|
|
|
|
|
|
setTool(op.tool, op.rate, op.plunge);
|
|
|
|
|
setSpindle(op.spindle);
|
|
|
|
|
|
|
|
|
|
// start top center, X = 0, Y = 0 closest to 4th axis chuck
|
|
|
|
|
printPoint = newPoint(0, 0, zmax);
|
|
|
|
|
|
|
|
|
|
for (let slice of slices) {
|
|
|
|
|
// ignore debug slices
|
|
|
|
|
if (!slice.camLines) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let last;
|
|
|
|
|
for (let path of slice.camLines) {
|
|
|
|
|
let latent;
|
|
|
|
|
path.forEachPoint((point, pidx) => {
|
|
|
|
|
if (last) {
|
|
|
|
|
const dz = Math.abs(last.z - point.z);
|
|
|
|
|
if (dz < rez) {
|
|
|
|
|
// latent point should still be included in
|
|
|
|
|
// preview b/c arcs would look like straight lines
|
|
|
|
|
latent = point.clone();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (latent) {
|
|
|
|
|
camOut(latent, true, stepover);
|
|
|
|
|
latent = undefined;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
camOut(last = point.clone(), pidx > 0, stepover);
|
|
|
|
|
}, false);
|
|
|
|
|
if (latent) {
|
|
|
|
|
camOut(latent, true, stepover);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
newLayer();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// move to safe height and reset A axis
|
|
|
|
|
let last = ops.lastPoint();
|
|
|
|
|
let amax = (Math.round(last.a / 360) * 360).round(2);
|
|
|
|
|
// camOut(last = last.clone().setZ(zmax), 0);
|
|
|
|
|
// camOut(last = last.clone().setA(amax), 0);
|
|
|
|
|
newLayer();
|
2025-07-15 18:36:35 -04:00
|
|
|
ops.addGCode([`G0 Z${zmax.round(2)}`, `G0 A${amax}`, "G92 A0"]);
|
2025-07-05 10:49:09 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export { OpLathe };
|