From 095a539efa8c33fc0aa8833690760aac35875c6e Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 16 Jul 2025 01:44:22 -0400 Subject: [PATCH] fix slice state, drill zmax, contour tool diam, point.a clone in move --- src/kiri/core/function.js | 12 +++++++++--- src/kiri/mode/cam/cl-tab.js | 1 + src/kiri/mode/cam/client.js | 2 +- src/kiri/mode/cam/op-contour.js | 6 ++++-- src/kiri/mode/cam/prepare.js | 17 ++++++++--------- src/kiri/mode/cam/slice.js | 21 +++++++++++---------- 6 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/kiri/core/function.js b/src/kiri/core/function.js index 26e4620b..b17eb4dd 100644 --- a/src/kiri/core/function.js +++ b/src/kiri/core/function.js @@ -133,7 +133,7 @@ function prepareSlices(callback, scale = 1, offset = 0) { if (msg && msg !== lastMsg) { let mark = Date.now(); if (lastMsg) { - let key = widgets.length > 1 ? + let key = slicing.length > 1 ? `${widget.id}_${segNumber++}_${lastMsg}` : `${segNumber++}_${lastMsg}` segtimes[key] = mark - startTime; @@ -158,7 +158,10 @@ function prepareSlices(callback, scale = 1, offset = 0) { if (sliced) { // update segment time if (lastMsg) { - segtimes[`${widget.id}_${segNumber++}_${lastMsg}`] = mark - startTime; + let key = slicing.length > 1 ? + `${widget.id}_${segNumber++}_${lastMsg}` : + `${segNumber++}_${lastMsg}` + segtimes[`${key}`] = mark - startTime; } event.emit('slice', settings.mode); } @@ -237,7 +240,10 @@ function prepareSlices(callback, scale = 1, offset = 0) { }; for (let widget of slicing) { // on done - segtimes[`${widget.id}_${segNumber++}_draw`] = widget.render(widget.stack); + let key = slicing.length > 1 ? + `${widget.id}_${segNumber++}_draw` : + `${segNumber++}_draw` + segtimes[`${key}`] = widget.render(widget.stack); // rotate stack for belt beds if (widget.belt) { widget.stack.obj.rotate(widget.belt); diff --git a/src/kiri/mode/cam/cl-tab.js b/src/kiri/mode/cam/cl-tab.js index 6012ae0d..8237065e 100644 --- a/src/kiri/mode/cam/cl-tab.js +++ b/src/kiri/mode/cam/cl-tab.js @@ -4,6 +4,7 @@ import { api } from '../../core/api.js'; import { env, isDark } from './client.js'; import { addbox, delbox, clearboxes } from '../../core/boxes.js'; import { traceDone } from './cl-trace.js'; +import { space as SPACE } from '../../../moto/space.js'; let showTab, lastTab, tab, iw, ic; diff --git a/src/kiri/mode/cam/client.js b/src/kiri/mode/cam/client.js index 6e7b9cc8..02011916 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, updateTabs } from './cl-tab.js'; +import { tabAdd, tabDone, tabClear, restoreTabs, rotateTabs, updateTabs } 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'; diff --git a/src/kiri/mode/cam/op-contour.js b/src/kiri/mode/cam/op-contour.js index f066e99c..ae7e089a 100644 --- a/src/kiri/mode/cam/op-contour.js +++ b/src/kiri/mode/cam/op-contour.js @@ -38,8 +38,10 @@ class OpContour extends CamOp { async slice(progress) { let { op, state } = this; - let { addSlices } = state; + let { addSlices, settings, updateToolDiams } = state; let filter = createFilter(op); + let toolDiam = this.toolDiam = new Tool(settings, op.tool).fluteDiameter(); + updateToolDiams(toolDiam); // we need topo for safe travel moves when roughing and outlining // not generated when drilling-only. then all z moves use bounds max. // also generates x and y contouring when selected @@ -69,7 +71,7 @@ class OpContour extends CamOp { let { camOut, polyEmit, newLayer, printPoint, lastPoint } = ops; let { bounds, zmax } = ops; - let toolDiam = this.toolDiam = new Tool(settings, op.tool).fluteDiameter(); + let toolDiam = this.toolDiam; let stepover = toolDiam * op.step * 2; let depthFirst = process.camDepthFirst; let depthData = []; diff --git a/src/kiri/mode/cam/prepare.js b/src/kiri/mode/cam/prepare.js index 2355d688..b9f2da1e 100644 --- a/src/kiri/mode/cam/prepare.js +++ b/src/kiri/mode/cam/prepare.js @@ -243,7 +243,7 @@ export function prepEach(widget, settings, print, firstPoint, update) { break; } } - camOut(point.clone().setZ(zmax)); + camOut(point.clone().setZ(zmax_outer)); points.forEach(function (point, index) { camOut(point, 1); if (index > 0 && index < points.length - 1) { @@ -251,7 +251,7 @@ export function prepEach(widget, settings, print, firstPoint, update) { if (lift) camOut(point.clone().setZ(point.z + lift), 0); } }) - camOut(point.clone().setZ(zmax), 0); + camOut(point.clone().setZ(zmax_outer), 0); newLayer(); } @@ -319,7 +319,7 @@ export function prepEach(widget, settings, print, firstPoint, update) { p.x + wmx, p.y + wmy, p.z + zadd - ).setA(p.a); + ).setA(p.a ?? lastPoint?.a); } /** @@ -344,7 +344,8 @@ export function prepEach(widget, settings, print, firstPoint, update) { // console.log({radius}) const isArc = emit == 2 || emit == 3; - //apply widget movement pos + // apply widget movement pos + const pointA = point.a; point = applyWidgetMovement(point); // console.log(point.z); @@ -356,15 +357,13 @@ export function prepEach(widget, settings, print, firstPoint, update) { let rate = feedRate * factor; // carry rotation forward when not overridden - if (point.a === undefined && lastPoint) { - point.a = lastPoint.a; - } else if (lastPoint && point.a !== undefined && lastPoint.a !== undefined) { - let DA = lastPoint.a - point.a; + if (lastPoint && pointA !== undefined && lastPoint.a !== undefined) { + let DA = lastPoint.a - pointA; let MZ = Math.max(lastPoint.z, point.z) // find arc length let AL = (Math.abs(DA) / 360) * (2 * Math.PI * MZ); if (AL >= 1) { - let lerp = base.util.lerp(lastPoint.a, point.a, 1); + let lerp = base.util.lerp(lastPoint.a, pointA, 1); // create interpolated point set for rendering and animation // console.log({ DA, MZ, AL }, lerp.length); for (let a of lerp) { diff --git a/src/kiri/mode/cam/slice.js b/src/kiri/mode/cam/slice.js index 2aa0d93e..c1dd7c7a 100644 --- a/src/kiri/mode/cam/slice.js +++ b/src/kiri/mode/cam/slice.js @@ -33,6 +33,15 @@ export async function cam_slice(settings, widget, onupdate, ondone) { top_stock, top_part, top_gap, top_z, workarea; + axisRotation = axisIndex = undefined; + dark = settings.controller.dark; + color = dark ? 0xbbbbbb : 0; + minToolDiam = Infinity; + maxToolDiam = -Infinity; + tabs = widget.anno.tab; + unsafe = proc.camExpertFast; + units = settings.controller.units === 'in' ? 25.4 : 1; + // allow recomputing later if widget or settings changes const var_compute = () => { let { camStockX, camStockY, camStockZ, camStockOffset } = proc; @@ -45,9 +54,9 @@ export async function cam_slice(settings, widget, onupdate, ondone) { x: camStockX, y: camStockY, z: camStockZ - } - track = widget.track; + }; ({ camZTop, camZBottom, camZThru } = proc); + track = widget.track; wztop = track.top; ztOff = isIndexed ? (stock.z - bounds.dim.z) / 2 : (stock.z - wztop); zbOff = isIndexed ? (stock.z - bounds.dim.z) / 2 : (wztop - track.box.d); @@ -56,14 +65,6 @@ export async function cam_slice(settings, widget, onupdate, ondone) { zMax = bounds.max.z; zThru = camZThru; zTop = zMax + ztOff; - minToolDiam = Infinity; - maxToolDiam = -Infinity; - dark = !!settings.controller.dark; - color = dark ? 0xbbbbbb : 0; - tabs = widget.anno.tab; - unsafe = proc.camExpertFast; - units = settings.controller.units === 'in' ? 25.4 : 1; - axisRotation = axisIndex = undefined; part_size = bounds.dim; bottom_gap = zbOff; bottom_part = 0;