2025-07-05 10:49:09 -04:00
|
|
|
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
|
|
|
|
|
|
|
|
|
|
import { CamOp } from './op.js';
|
2025-12-06 00:09:17 -05:00
|
|
|
import { OpArea } from './op-area.js';
|
2025-07-09 13:00:52 -04:00
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-06 00:09:17 -05:00
|
|
|
// 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
|
|
|
|
2025-12-06 00:09:17 -05:00
|
|
|
let cutOutside = !op.inside;
|
|
|
|
|
let shadowBase = shadow.base;
|
2025-07-05 10:49:09 -04:00
|
|
|
|
2025-12-06 00:09:17 -05:00
|
|
|
if (op.down <= 0) {
|
|
|
|
|
throw `invalid step down "${op.down}"`;
|
2025-07-05 10:49:09 -04:00
|
|
|
}
|
|
|
|
|
|
2025-12-06 00:09:17 -05:00
|
|
|
if (op.all) {
|
|
|
|
|
shadowBase = [ newPolygon().centerRectangle(stock.center, stock.x, stock.y) ];
|
2025-07-05 10:49:09 -04:00
|
|
|
}
|
|
|
|
|
|
2025-12-06 00:09:17 -05: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-06 00:09:17 -05:00
|
|
|
|
2025-12-09 21:35:45 -05:00
|
|
|
ops_list.push(new OpArea(state, {
|
2025-12-06 00:09:17 -05:00
|
|
|
rename: op.rename ?? "rough",
|
|
|
|
|
spindle: op.spindle,
|
2025-12-12 12:46:43 -05:00
|
|
|
direction: op.direction,
|
2025-12-06 00:09:17 -05:00
|
|
|
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-06 00:09:17 -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
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-15 21:16:06 -05:00
|
|
|
// 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",
|
2025-12-06 00:09:17 -05:00
|
|
|
spindle: op.spindle,
|
2025-12-12 12:46:43 -05:00
|
|
|
direction: op.direction === 'climb' ? 'conventional' : 'climb',
|
2025-12-06 00:09:17 -05:00
|
|
|
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()) },
|
2025-12-14 10:23:35 -05:00
|
|
|
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
|
|
|
}
|
|
|
|
|
|
2025-12-06 00:09:17 -05: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 };
|