From e0233f1d98a0ace1537acdafd07bfffef149019c Mon Sep 17 00:00:00 2001 From: bakedpotatolord Date: Thu, 17 Jul 2025 14:19:09 -0600 Subject: [PATCH 1/2] add missing import --- src/kiri/mode/cam/client.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kiri/mode/cam/client.js b/src/kiri/mode/cam/client.js index 02011916..41c77757 100644 --- a/src/kiri/mode/cam/client.js +++ b/src/kiri/mode/cam/client.js @@ -10,7 +10,7 @@ import { Layers } from '../../core/layers.js'; import { Stack } from '../../core/stack.js'; import { updateStock } from './cl-stock.js'; import { createPopOps } from './cl-ops.js'; -import { tabAdd, tabDone, tabClear, restoreTabs, rotateTabs, updateTabs } from './cl-tab.js'; +import { tabAdd, tabDone, tabClear, restoreTabs, rotateTabs, updateTabs, clearTabs } from './cl-tab.js'; import { traceOn, traceDone, unselectTraces } from './cl-trace.js'; import { holeSelOn, selectHolesDone, clearHolesRec } from './cl-hole.js'; import { surfaceOn, surfaceDone } from './cl-surface.js'; From 727e61ad9c2ec14e1bb2b175f34e90f1ce2554c4 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 17 Jul 2025 16:48:14 -0400 Subject: [PATCH 2/2] add optional z step down to level op --- src/kiri/core/conf.js | 3 +- src/kiri/mode/cam/cl-ops.js | 6 ++-- src/kiri/mode/cam/op-level.js | 61 +++++++++++++++++++---------------- 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/kiri/core/conf.js b/src/kiri/core/conf.js index 8442e281..28c9f5ff 100644 --- a/src/kiri/core/conf.js +++ b/src/kiri/core/conf.js @@ -422,9 +422,10 @@ export const conf = { camLevelTool: 1000, camLevelSpindle: 1000, camLevelOver: 0.75, + camLevelStepZ: 0, camLevelSpeed: 1000, camLevelDown: 0, - camLevelOver: 0.5, + camLevelInset: 0.5, camLevelStock: true, camRoughTool: 1000, camRoughSpindle: 1000, diff --git a/src/kiri/mode/cam/cl-ops.js b/src/kiri/mode/cam/cl-ops.js index d4c63b6d..7b03b3da 100644 --- a/src/kiri/mode/cam/cl-ops.js +++ b/src/kiri/mode/cam/cl-ops.js @@ -195,18 +195,20 @@ export function createPopOps() { tool: 'camLevelTool', spindle: 'camLevelSpindle', step: 'camLevelOver', + stepz: 'camLevelStepZ', rate: 'camLevelSpeed', down: 'camLevelDown', - over: 'camLevelOver', + inset: 'camLevelInset', stock: 'camLevelStock' }).inputs = { tool: UC.newSelect(LANG.cc_tool, {}, "tools"), sep: UC.newBlank({ class: "pop-sep" }), spindle: UC.newInput(LANG.cc_spnd_s, { title: LANG.cc_spnd_l, convert: UC.toInt, show: hasSpindle }), step: UC.newInput(LANG.cc_sovr_s, { title: LANG.cc_sovr_l, convert: UC.toFloat, bound: UC.bound(0.01, 1.0) }), + stepz: UC.newInput(LANG.cc_sdwn_s, { title: LANG.cc_sdwn_l, convert: UC.toFloat, bound: UC.bound(0, 100.0) }), rate: UC.newInput(LANG.cc_feed_s, { title: LANG.cc_feed_l, convert: UC.toInt, units: true }), down: UC.newInput(LANG.cc_loff_s, { title: LANG.cc_loff_l, convert: UC.toFloat, units: true }), - over: UC.newInput(LANG.cc_lxyo_s, { title: LANG.cc_lxyo_l, convert: UC.toFloat, units: true }), + inset: UC.newInput(LANG.cc_lxyo_s, { title: LANG.cc_lxyo_l, convert: UC.toFloat, units: true, show: () => !env.popOp.level.rec.stock }), sep: UC.newBlank({ class: "pop-sep" }), stock: UC.newBoolean(LANG.cc_lsto_s, undefined, { title: LANG.cc_lsto_l }), }; diff --git a/src/kiri/mode/cam/op-level.js b/src/kiri/mode/cam/op-level.js index ccf58c9f..50d3ddcb 100644 --- a/src/kiri/mode/cam/op-level.js +++ b/src/kiri/mode/cam/op-level.js @@ -5,6 +5,7 @@ import { Tool } from './tool.js'; import { newPolygon } from '../../../geo/polygon.js'; import { polygons as POLY } from '../../../geo/polygons.js'; import { newSlice } from '../../core/slice.js'; +import { util } from '../../../geo/base.js'; class OpLevel extends CamOp { constructor(state, op) { @@ -13,55 +14,61 @@ class OpLevel extends CamOp { async slice(progress) { let { op, state } = this; - let { settings, widget, addSlices } = state; - let { updateToolDiams, tabs, cutTabs } = state; - let { bounds, zMax, ztOff, color, tshadow } = state; + let { settings, addSlices, updateToolDiams } = state; + let { zMax, ztOff, color, tshadow } = state; let { stock } = settings; let toolDiam = new Tool(settings, op.tool).fluteDiameter(); let stepOver = this.stepOver = toolDiam * op.step; - let z = zMax + ztOff - op.down; + let zTop = zMax + ztOff; + let zBot = zTop - op.down; + let zList = op.stepz ? util.lerp(zTop, zBot, op.stepz) : [ zBot ]; updateToolDiams(toolDiam); let points = []; let clear = op.stock ? [ newPolygon().centerRectangle({x:0,y:0,z:0}, stock.x, stock.y) ] : - POLY.outer(POLY.offset(tshadow, toolDiam * (op.over || 0))); + POLY.outer(POLY.offset(tshadow, toolDiam * (op.inset || 0))); POLY.fillArea(clear, 90, stepOver, points); - let lines = this.lines = []; - for (let i=0; i { return { first: p.first(), last: p.last(), poly: p } }); - printPoint = tip2tipEmit(lines, printPoint, (el, point, count) => { - let poly = el.poly; - if (poly.last() === point) { - poly.reverse(); - } - poly.forEachPoint((point, pidx) => { - camOut(point.clone(), true, stepOver); - }, false); - }); + for (let lines of layers) { + lines = lines.map(p => { return { first: p.first(), last: p.last(), poly: p } }); + printPoint = tip2tipEmit(lines, printPoint, (el, point, count) => { + let poly = el.poly; + if (poly.last() === point) { + poly.reverse(); + } + poly.forEachPoint((point, pidx) => { + camOut(point.clone(), true, stepOver); + }, false); + }); + newLayer(); + } setPrintPoint(printPoint); - - newLayer(); } }