From 02b900a8f0ff9131f9d187579f36f0e2b8b4d9c5 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 9 Jan 2026 16:37:39 -0500 Subject: [PATCH] fix nested top fill offsets --- src/geo/polygons.js | 10 ++++++++++ src/kiri/mode/fdm/work/post.js | 5 ++++- src/kiri/mode/fdm/work/slice.js | 6 +++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/geo/polygons.js b/src/geo/polygons.js index 8a5d7947..5f06696f 100644 --- a/src/geo/polygons.js +++ b/src/geo/polygons.js @@ -61,6 +61,7 @@ const POLYS = { offset, outer, points, + print, rayIntersect, reconnect, renest, @@ -212,6 +213,15 @@ export function renest(polygons, deep) { return nest(flatten(polygons, [], true), deep); } +export function print(polys, pad = ' ', buf) { + buf = buf || []; + for (let poly of polys) { + buf.push(`${pad} - ${poly.points.length}`); + if (poly.inner) print(poly.inner, pad + pad, buf); + } + return buf; +} + /** * todo use clipper polytree? * diff --git a/src/kiri/mode/fdm/work/post.js b/src/kiri/mode/fdm/work/post.js index 4cdd6110..5271b5ac 100644 --- a/src/kiri/mode/fdm/work/post.js +++ b/src/kiri/mode/fdm/work/post.js @@ -758,6 +758,9 @@ export function layerProcessTop(z, top, count, offset1, offsetN, fillOffset, opt last = [top.poly]; } + // renest deep because last[] could be nested + last = POLY.renest(last, true); + // generate fill offset poly set from last offset to top.fill_off if (fillOffset && last.length > 0) { // if gaps present, remove that area from fill inset @@ -766,7 +769,7 @@ export function layerProcessTop(z, top, count, offset1, offsetN, fillOffset, opt POLY.subtract(last, gaps, nulast, null, z); last = nulast; } - last.forEach(function(inner) { + last.forEach((inner) => { POLY.offset([inner], -fillOffset, {outs: top.fill_off, flat: true, z}); }); } diff --git a/src/kiri/mode/fdm/work/slice.js b/src/kiri/mode/fdm/work/slice.js index 0e11d587..76c56e71 100644 --- a/src/kiri/mode/fdm/work/slice.js +++ b/src/kiri/mode/fdm/work/slice.js @@ -983,9 +983,9 @@ function layerRender(slice, params, opt = {}) { if (isThin && devel && top.fill_off?.length) { slice.output() .setLayer('fill inset', Color.inset) - .addPolys(top.fill_off); - // .setLayer('last', { face: 0, line: 0x008888, check: 0x008888 }) - // .addPolys(top.last); + .addPolys(top.fill_off) + .setLayer('last', { face: 0, line: 0x008888, check: 0x008888 }) + .addPolys(top.last); } }