From c5e4bac1cb2fd54dff15649d1723a7f270dd3779 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 10 Jan 2026 15:53:46 -0500 Subject: [PATCH] add support point compensation for belt anchors --- src/kiri/mode/fdm/work/belt.js | 9 ++++++++- src/kiri/mode/fdm/work/slice.js | 14 +++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/kiri/mode/fdm/work/belt.js b/src/kiri/mode/fdm/work/belt.js index 0d3bbef6..b3979a6a 100644 --- a/src/kiri/mode/fdm/work/belt.js +++ b/src/kiri/mode/fdm/work/belt.js @@ -48,7 +48,8 @@ const BELT = { * @returns {void} Modifies slices array in place */ export function generateBeltAnchor({ slices, widget, process, lineWidth, sliceHeight, sliceHeightBase, extruder }) { - let { cosf, slope } = widget.belt; + let { belt } = widget; + let { cosf, slope } = belt; // find adjusted zero point from slices let smin = Infinity; @@ -100,6 +101,12 @@ export function generateBeltAnchor({ slices, widget, process, lineWidth, sliceHe let step = sliceHeight; let anchorlen = (process.beltAnchor || process.firstLayerBeltLead) * cosf; + // offset used in support generation + belt.anchor = { + added: adds, + len: anchorlen + }; + while (anchorlen && start && anchorlen >= sliceHeight) { let addto = start.down; if (!addto) { diff --git a/src/kiri/mode/fdm/work/slice.js b/src/kiri/mode/fdm/work/slice.js index aa2b99d8..b52ba4a8 100644 --- a/src/kiri/mode/fdm/work/slice.js +++ b/src/kiri/mode/fdm/work/slice.js @@ -481,7 +481,7 @@ export function sliceOne(settings, widget, onupdate, ondone) { let { belt } = widget; // apply belt transformations, if needed if (belt && paint) { - let { dy, angle } = belt; + let { anchor, angle, dy, slope } = belt; // make a copy we can modify paint = structuredClone(paint); for (let rec of paint) { @@ -490,6 +490,10 @@ export function sliceOne(settings, widget, onupdate, ondone) { let np = newPoint(point.y + dy, point.z, 0).rotate(angle * (Math.PI/180)); point.y = np.x; point.z = np.y; + if (anchor) { + point.y += anchor.len; + point.z += anchor.len; + } } } // convert paint points to circles on matching slices @@ -837,10 +841,6 @@ export function sliceOne(settings, widget, onupdate, ondone) { slice.widget = widget; } - // support generation using either - // enclosed shadow or manual painted supports - await processSupports(); - // process solid layers (top/bottom) await processSolidLayers(); @@ -875,6 +875,10 @@ export function sliceOne(settings, widget, onupdate, ondone) { }); } + // support generation using either + // enclosed shadow or manual painted supports + await processSupports(); + // calculations only relevant when solid layers are used // layer boolean diffs need to be computed to find flat areas to fill // and overhangs that need to be supported. these are stored in flats