From b2fb552e325694ab6c27bef383fc2ce6157edc05 Mon Sep 17 00:00:00 2001 From: harrierpigeon Date: Wed, 7 Oct 2026 16:09:25 -0500 Subject: [PATCH] PrintObject: a re-slice invalidates posDetectOverhangsForLift posSlice's invalidation list did not include posDetectOverhangsForLift. A re-slice starts the layers over with empty overhang regions while the step stayed done, so GCode::needs_retraction() had no overhangs to test against until something else invalidated it. Co-Authored-By: Claude Fable 5.1 --- src/libslic3r/PrintObject.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 4f46921c3f..8b5e115be3 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -1767,7 +1767,11 @@ bool PrintObject::invalidate_step(PrintObjectStep step) // posSimplifySupportPath is listed with posSupportMaterial: invalidate_steps() does not // propagate, so without it a re-slice regenerated the supports but kept the step done, // and the new support paths were exported unsimplified, unlike a fresh slice. - invalidated |= this->invalidate_steps({ posPerimeters, posPrepareInfill, posInfill, posIroning, posContouring, posSupportMaterial, posSimplifyPath, posSimplifyInfill, posSimplifySupportPath }); + // posDetectOverhangsForLift reads the layers' overhang regions, which a re-slice + // starts over empty: without it here the step stayed done and the lift logic in + // GCode::needs_retraction() had no overhangs to test against until something else + // invalidated it. + invalidated |= this->invalidate_steps({ posPerimeters, posPrepareInfill, posInfill, posIroning, posContouring, posSupportMaterial, posSimplifyPath, posSimplifyInfill, posSimplifySupportPath, posDetectOverhangsForLift }); invalidated |= m_print->invalidate_steps({ psSkirtBrim }); m_slicing_params.valid = false; // The exact belt_floor_z_shift is recomputed when slice() runs again.