From 62dd49c6d2e9fd5d75be2f2596f4689444319260 Mon Sep 17 00:00:00 2001 From: Nicolas Predella Date: Mon, 20 Jul 2026 16:57:33 +0300 Subject: [PATCH] first layer extrusion --- core/nodeslicer/nodes/path.py | 7 +++++++ tests/test_slice.py | 6 ++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/core/nodeslicer/nodes/path.py b/core/nodeslicer/nodes/path.py index 3f3e3de..8a051a7 100644 --- a/core/nodeslicer/nodes/path.py +++ b/core/nodeslicer/nodes/path.py @@ -105,6 +105,13 @@ class SLICENODE_SliceShells(SliceNode): if fl_height is not None: slices.first_layer_height = fl_height + if len(z_values) > 0 and fl_height is not None and layer_height > 0: + mult = fl_height / layer_height + z_first = z_values[0] + for i, p in enumerate(slices): + if len(p) > 0 and abs(p[0, 2] - z_first) < 1e-4: + slices.extrusion_rate[i] = slices.extrusion_rate[i] * mult + if rotation and any(rotation): from mathutils import Euler mat_inv = np.array(Euler(rotation).to_matrix()) diff --git a/tests/test_slice.py b/tests/test_slice.py index 0459cce..266fbd1 100644 --- a/tests/test_slice.py +++ b/tests/test_slice.py @@ -528,9 +528,11 @@ class TestSlice(unittest.TestCase): node.resolve = lambda name: scoll if name == "Mesh" else (0.2 if name == "Layer Height" else (0.3 if name == "First Layer Height" else None)) slices = node.evaluate_output("Paths") self.assertTrue(len(slices) > 0) - # First slice Z should be 0.3 / 2 = 0.15 - self.assertAlmostEqual(slices[0][0, 2], 0.15) + # First slice Z should be min_z + fl_height = 0.0 + 0.3 = 0.3 + self.assertAlmostEqual(slices[0][0, 2], 0.3) self.assertEqual(getattr(slices, "first_layer_height", None), 0.3) + # First layer extrusion rates should be multiplied by 0.3 / 0.2 = 1.5 + np.testing.assert_allclose(slices.extrusion_rate[0], 1.5) if __name__ == '__main__': unittest.main()