From 08463f02c41364bf1abc6215ea31b31913b9b45a Mon Sep 17 00:00:00 2001 From: Rodrigo Faselli <162915171+RF47@users.noreply.github.com> Date: Sun, 26 Apr 2026 09:31:56 -0300 Subject: [PATCH] WIP fix sacrificial layer.cpp (#13018) * fix sacrificial layer.cpp Fix sacrificial layer edgecase , with 2 perimeters only * copilot suggsetions * one perimeter left Update PerimeterGenerator.cpp * Update offset calculation in PerimeterGenerator Adjust the offset calculation for unsupported filtered polygons. --- src/libslic3r/PerimeterGenerator.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 26b2660b87..4ce8e7a71f 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -1729,8 +1729,12 @@ void PerimeterGenerator::process_no_bridge(Surfaces& all_surfaces, coord_t perim //compute our unsupported surface ExPolygons unsupported = diff_ex(last, *this->lower_slices, ApplySafetyOffset::Yes); if (!unsupported.empty()) { - //remove small overhangs - ExPolygons unsupported_filtered = offset2_ex(unsupported, double(-perimeter_spacing), double(perimeter_spacing)); + // remove small overhangs (when using chbFilled we need to be less aggressive in removing small overhangs, + // to avoid affecting bridging detection.) + const int outset_divisor = this->config->counterbore_hole_bridging.value == chbFilled ? 2 : 1; + ExPolygons unsupported_filtered = offset2_ex(unsupported, double(-perimeter_spacing), + double(perimeter_spacing) / outset_divisor); + if (!unsupported_filtered.empty()) { //to_draw.insert(to_draw.end(), last.begin(), last.end()); //extract only the useful part of the lower layer. The safety offset is really needed here. @@ -1773,7 +1777,7 @@ void PerimeterGenerator::process_no_bridge(Surfaces& all_surfaces, coord_t perim } } unsupported_filtered = intersection_ex(last, - offset2_ex(unsupported_filtered, double(-perimeter_spacing / 2), double(bridged_infill_margin + perimeter_spacing / 2))); + offset_ex(unsupported_filtered, 0.5 * double(bridged_infill_margin))); if (this->config->counterbore_hole_bridging.value == chbFilled) { for (ExPolygon& expol : unsupported_filtered) { //check if the holes won't be covered by the upper layer