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

117 lines
3.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 { OpArea } from './op-area.js';
import { newPolygon } from '../../../geo/polygon.js';
import { polygons as POLY } from '../../../geo/polygons.js';
2025-07-05 10:49:09 -04:00
class OpRough extends CamOp {
constructor(state, op) {
super(state, op);
}
// todo: cutThruBypass
2025-07-05 10:49:09 -04:00
async slice(progress) {
let { op, state } = this;
2025-12-12 18:10:06 -05:00
let { newSlicer, shadow, stock, tool, widget } = state;
2025-07-05 10:49:09 -04:00
let cutOutside = !op.inside;
let shadowBase = shadow.base;
2025-07-05 10:49:09 -04:00
if (op.down <= 0) {
throw `invalid step down "${op.down}"`;
2025-07-05 10:49:09 -04:00
}
if (op.all) {
shadowBase = [ newPolygon().centerRectangle(stock.center, stock.x, stock.y) ];
2025-07-05 10:49:09 -04:00
}
let areas = POLY.flatten(POLY.expand(shadowBase, tool.fluteDiameter() / 2 - 0.001));
2025-12-09 21:35:45 -05:00
let ops_list = this.ops_list = [ ];
2025-12-09 21:35:45 -05:00
ops_list.push(new OpArea(state, {
rename: op.rename ?? "rough",
spindle: op.spindle,
2025-12-12 12:46:43 -05:00
direction: op.direction,
tool: op.tool,
rate: op.rate,
plunge: op.plunge,
mode: 'clear',
over: op.step,
down: op.down,
expand: 0,
smooth: 0,
outline: true,
omitthru: op.omitthru,
leave_xy: op.leave,
leave_z: op.leavez,
ov_botz: op.ov_botz,
ov_topz: op.ov_topz,
areas: { [widget.id]: areas.map(p => p.toArray()) },
surfaces: {}
2025-12-09 21:35:45 -05:00
}));
2025-12-12 18:10:06 -05:00
if (op.flats) {
let slicer = newSlicer();
ops_list.push(new OpArea(state, {
rename: op.rename ?? "flats",
spindle: op.spindle,
direction: op.direction,
tool: op.tool,
rate: op.rate,
plunge: op.plunge,
mode: 'clear',
over: op.step,
down: op.down,
expand: 0,
smooth: 0,
outline: true,
omitthru: op.omitthru,
leave_xy: op.leave,
leave_z: op.leavez,
ov_botz: op.ov_botz,
ov_topz: op.ov_topz,
areas: { [widget.id]: areas.map(p => p.toArray()) },
surfaces: {},
flats: Object.keys(slicer.zFlat).map(v => parseFloat(v)).sort((a,b) => b-a),
flatOff: 0.01
}));
}
// outside only if we're not clearing all of stock
if (cutOutside && !op.all) {
2025-12-09 21:35:45 -05:00
ops_list.push(new OpArea(state, {
2025-12-12 18:10:06 -05:00
rename: op.rename ?? "cutout",
spindle: op.spindle,
2025-12-12 12:46:43 -05:00
direction: op.direction === 'climb' ? 'conventional' : 'climb',
tool: op.tool,
rate: op.rate,
plunge: op.plunge,
mode: 'trace',
tr_type: 'none',
down: op.down,
expand: 0,
smooth: 1,
outline: !op.omitthru,
ov_botz: op.ov_botz,
ov_topz: op.ov_topz,
areas: { [widget.id]: areas.map(p => p.toArray()) },
surfaces: {},
thru: true
2025-12-09 21:35:45 -05:00
}));
2025-07-05 10:49:09 -04:00
}
2025-12-09 21:35:45 -05:00
for (let op of this.ops_list) {
await op.slice(progress);
}
2025-07-05 10:49:09 -04:00
}
async prepare(ops, progress) {
2025-12-09 21:35:45 -05:00
for (let op of this.ops_list) {
await op.prepare(ops, progress);
}
2025-07-05 10:49:09 -04:00
}
}
export { OpRough };