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

90 lines
2.6 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-06 00:21:31 -05:00
let { shadow, stock, tool, widget } = state;
2025-07-05 10:49:09 -04:00
let { workarea } = state;
let cutThruBypass = op.down > workarea.top_stock - workarea.bottom_part;
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
}));
if (cutOutside) {
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 === '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: {}
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 };