add roughing flat passes option

This commit is contained in:
Stewart Allen 2025-12-12 18:10:06 -05:00
commit 367bf32b0a
6 changed files with 48 additions and 9 deletions

View file

@ -565,6 +565,7 @@ export const conf = {
camRegisterThru: 5, camRegisterThru: 5,
camRoughAll: true, camRoughAll: true,
camRoughDown: 2, camRoughDown: 2,
camRoughFlat: false,
camRoughIn: true, camRoughIn: true,
camRoughOmitThru: false, camRoughOmitThru: false,
camRoughOmitVoid: false, camRoughOmitVoid: false,

View file

@ -227,6 +227,7 @@ export function createPopOps() {
leave: 'camRoughStock', leave: 'camRoughStock',
leavez: 'camRoughStockZ', leavez: 'camRoughStockZ',
all: 'camRoughAll', all: 'camRoughAll',
flats: 'camRoughFlat',
inside: 'camRoughIn', inside: 'camRoughIn',
omitthru: 'camRoughOmitThru', omitthru: 'camRoughOmitThru',
ov_topz: 0, ov_topz: 0,
@ -246,6 +247,7 @@ export function createPopOps() {
sep: UC.newBlank({ class: "pop-sep" }), sep: UC.newBlank({ class: "pop-sep" }),
all: UC.newBoolean(LANG.cr_clst_s, undefined, { title: LANG.cr_clst_l, show: () => !env.poppedRec.inside || env.poppedRec.all }), all: UC.newBoolean(LANG.cr_clst_s, undefined, { title: LANG.cr_clst_l, show: () => !env.poppedRec.inside || env.poppedRec.all }),
inside: UC.newBoolean(LANG.cr_olin_s, undefined, { title: LANG.cr_olin_l, show: () => !env.poppedRec.all || env.poppedRec.inside }), inside: UC.newBoolean(LANG.cr_olin_s, undefined, { title: LANG.cr_olin_l, show: () => !env.poppedRec.all || env.poppedRec.inside }),
flats: UC.newBoolean(LANG.cr_clrf_s, undefined, { title: LANG.cr_clrf_l }),
omitthru: UC.newBoolean(LANG.co_omit_s, undefined, { title: LANG.co_omit_l }), omitthru: UC.newBoolean(LANG.co_omit_s, undefined, { title: LANG.co_omit_l }),
sep: UC.newBlank({ class: "pop-sep" }), sep: UC.newBlank({ class: "pop-sep" }),
exp: UC.newExpand("overrides"), exp: UC.newExpand("overrides"),

View file

@ -28,7 +28,8 @@ class OpArea extends CamOp {
async slice(progress) { async slice(progress) {
let { op, state } = this; let { op, state } = this;
let { direction, down, expand, follow, mode, outline, over, rename, smooth, tool } = op; let { direction, down, expand, flats, flatOff, follow } = op;
let { mode, outline, over, rename, smooth, tool } = op;
let { addSlices, color, cutTabs, settings } = state; let { addSlices, color, cutTabs, settings } = state;
let { shadowAt, setToolDiam, tabs, widget, workarea } = state; let { shadowAt, setToolDiam, tabs, widget, workarea } = state;
@ -129,7 +130,10 @@ class OpArea extends CamOp {
newArea(); newArea();
if (mode === 'clear') { if (mode === 'clear') {
let zs = down ? base_util.lerp(zTop, zBottom, down) : [ bounds.min.z ]; let zMov = flatOff ?? 0;
let zs = flats ?
flats.filter(z => z <= zTop && z >= zBottom).map(v => v + zMov ?? 0) :
down ? base_util.lerp(zTop, zBottom, down) : [ bounds.min.z ];
let zroc = 0; let zroc = 0;
let zinc = 1 / zs.length; let zinc = 1 / zs.length;
let lzo; let lzo;
@ -152,7 +156,7 @@ class OpArea extends CamOp {
let firstOff = -(toolDiam / 2 + (op.leave_xy ?? 0)); let firstOff = -(toolDiam / 2 + (op.leave_xy ?? 0));
POLY.subtract([ area ], shadow, clip, undefined, undefined, 0); POLY.subtract([ area ], shadow, clip, undefined, undefined, 0);
POLY.offset(clip, [ firstOff, -toolOver ], { POLY.offset(clip, [ firstOff, -toolOver ], {
count: op.steps ?? 999, outs, flat: true, z, minArea: 0 count: op.steps ?? 999, outs, flat: true, z: z - zMov, minArea: 0
}); });
// if we see no offsets, re-check the mesh bottom Z then exit // if we see no offsets, re-check the mesh bottom Z then exit
if (outs.length === 0) { if (outs.length === 0) {

View file

@ -14,10 +14,8 @@ class OpRough extends CamOp {
async slice(progress) { async slice(progress) {
let { op, state } = this; let { op, state } = this;
let { shadow, stock, tool, widget } = state; let { newSlicer, shadow, stock, tool, widget } = state;
let { workarea } = state;
let cutThruBypass = op.down > workarea.top_stock - workarea.bottom_part;
let cutOutside = !op.inside; let cutOutside = !op.inside;
let shadowBase = shadow.base; let shadowBase = shadow.base;
@ -54,9 +52,36 @@ class OpRough extends CamOp {
surfaces: {} surfaces: {}
})); }));
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
}));
}
if (cutOutside) { if (cutOutside) {
ops_list.push(new OpArea(state, { ops_list.push(new OpArea(state, {
rename: op.rename ?? "rough", rename: op.rename ?? "cutout",
spindle: op.spindle, spindle: op.spindle,
direction: op.direction === 'climb' ? 'conventional' : 'climb', direction: op.direction === 'climb' ? 'conventional' : 'climb',
tool: op.tool, tool: op.tool,

View file

@ -173,6 +173,7 @@ export async function cam_slice(settings, widget, onupdate, ondone) {
cutTabs, cutTabs,
dark, dark,
isIndexed, isIndexed,
newSlicer,
ops: opList, ops: opList,
setAxisIndex, setAxisIndex,
setToolDiam, setToolDiam,
@ -218,8 +219,12 @@ export async function cam_slice(settings, widget, onupdate, ondone) {
} }
} }
function updateSlicer() { function newSlicer(opts) {
slicer = state.slicer = new cam_slicer(widget); return new cam_slicer(widget, opts);
}
function updateSlicer(opts) {
return slicer = state.slicer = new cam_slicer(widget, opts);
} }
async function computeShadows() { async function computeShadows() {

View file

@ -544,6 +544,8 @@ self.lang['en-us'] = {
cr_clrt_l: ["run a clearing pass over","the bounding area of the part","at z = 0"], cr_clrt_l: ["run a clearing pass over","the bounding area of the part","at z = 0"],
cr_olin_s: "inside only", cr_olin_s: "inside only",
cr_olin_l: ["limit cutting to","inside part boundaries"], cr_olin_l: ["limit cutting to","inside part boundaries"],
cr_clrf_s: "clear faces",
cr_clrf_l: ["add additional clearing passes","for detected z planar flat areas"],
// CNC OUTLINE // CNC OUTLINE
co_menu: "outline", co_menu: "outline",