From d5062880e64daccaecf559a4d2e967b03d62d217 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 30 Dec 2025 13:38:39 -0500 Subject: [PATCH] add lathe step down line reversal --- src/kiri/core/slice.js | 2 +- src/kiri/mode/cam/topo4.js | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/kiri/core/slice.js b/src/kiri/core/slice.js index 01cd5cd5..606692a4 100644 --- a/src/kiri/core/slice.js +++ b/src/kiri/core/slice.js @@ -134,7 +134,7 @@ class Slice { * @param {Object | Polygon} data * @returns Slice.Top */ - addTop(data, opt) { + addTop(data, opt = {}) { let minArea = opt.minArea ?? 0; if (data.length) { // standard legacy polygon diff --git a/src/kiri/mode/cam/topo4.js b/src/kiri/mode/cam/topo4.js index 5b7a925f..9d8d4468 100644 --- a/src/kiri/mode/cam/topo4.js +++ b/src/kiri/mode/cam/topo4.js @@ -228,7 +228,7 @@ export class Topo { let slice = newSlice(i); slice.index = i; slice.camLines = [ newPolygon(rows[i]).setOpen() ]; - if (i % 2 === 1) slice.camLines[0].reverse(); + if (!down && i % 2 === 1) slice.camLines[0].reverse(); slices.push(slice); } } else { @@ -237,7 +237,7 @@ export class Topo { let slice = newSlice(i); let points = rows.map(row => row[i]); points.push(points[0].clone().setA(-360)); - if (i % 2 === 1) points.reverse(); + if (!down && i % 2 === 1) points.reverse(); slice.index = i; slice.camLines = [ newPolygon(points).setOpen() ]; slices.push(slice); @@ -249,10 +249,12 @@ export class Topo { for (let p of r) { maxZ = Math.max(maxZ, p.z); } - console.log({ maxZ, down, expand }); maxZ += expand; } if (down) { + // step "up" points on trace until they max out + // then reverse the stack to cut top down + let reverse = 0; for (let slice of slices) { let z = slice.z; let poly = slice.camLines[0].clone(); @@ -267,12 +269,17 @@ export class Topo { } stack.reverse(); slice.stack = stack.map(poly => { + if (reverse++ % 2 === 1) poly.reverse(); let slice = newSlice(z); slice.camLines = [ poly ]; return slice; }); - // todo: add line to line reversals - // todo: add move to maxZ after stack is run + // first move of new stack is to maxZ (problematic) + // let first = stack[0].points; + // first.splice(0,0,first[0].clone().setZ(maxZ)); + // last move of stack is to maxZ + let last = stack.peek(); + last.push(last.last().clone().setZ(maxZ)); } slices = this.gpu_slices = slices.map(slice => slice.stack).flat(); slices.forEach((slice,index) => slice.index = index);