From 586b38f0b211e42ccd9d8b2110b70061c9b772ae Mon Sep 17 00:00:00 2001 From: supermerill Date: Fri, 6 Jul 2018 16:52:46 +0200 Subject: [PATCH] extra_perimeters : seems unsused, now used to add more perimeters on overhangs if needed. TODO: change the tooltip & description --- xs/src/libslic3r/PerimeterGenerator.cpp | 35 ++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/xs/src/libslic3r/PerimeterGenerator.cpp b/xs/src/libslic3r/PerimeterGenerator.cpp index 750d97ff5..1df6d3f19 100644 --- a/xs/src/libslic3r/PerimeterGenerator.cpp +++ b/xs/src/libslic3r/PerimeterGenerator.cpp @@ -68,6 +68,29 @@ void PerimeterGenerator::process() ThickPolylines thin_walls; // we loop one time more than needed in order to find gaps after the last perimeter was applied for (int i = 0;; ++ i) { // outer loop is 0 + // We can add more perimeters if there are uncovered overhangs + // improvement for future: find a way to add perimeters only where it's needed. + // It's hard to do, so here is a simple version. + bool may_add_more_perimeters = false; + if (this->config->extra_perimeters && i > loop_number && !last.empty() + && this->lower_slices != NULL && !this->lower_slices->expolygons.empty()){ + //split the polygons with bottom/notbottom + ExPolygons support(this->lower_slices->expolygons); + ExPolygons unsupported = diff_ex(last, support, true); + if (!unsupported.empty()) { + //only consider overhangs and let bridges alone + // it's more reliable than the BridgeDetector + ExPolygonCollection coll_last(support); + ExPolygon hull; + hull.contour = coll_last.convex_hull(); + unsupported = diff_ex(unsupported, ExPolygons() = { hull }); + if (!unsupported.empty()) { + //add fake perimeters here + may_add_more_perimeters = true; + } + } + } + // Calculate next onion shell of perimeters. ExPolygons offsets; if (i == 0) { @@ -138,8 +161,14 @@ void PerimeterGenerator::process() last.clear(); break; } else if (i > loop_number) { - // If i > loop_number, we were looking just for gaps. - break; + if (may_add_more_perimeters) { + loop_number++; + contours.emplace_back(); + holes.emplace_back(); + } else { + // If i > loop_number, we were looking just for gaps. + break; + } } for (const ExPolygon &expolygon : offsets) { contours[i].emplace_back(PerimeterGeneratorLoop(expolygon.contour, i, true)); @@ -151,7 +180,7 @@ void PerimeterGenerator::process() } last = std::move(offsets); - if(i==0 && config->only_one_perimeter_top && this->upper_slices != NULL){ + if(i==0 && config->only_one_perimeter_top && this->upper_slices != NULL) { //split the polygons with top/not_top ExPolygons upper_polygons(this->upper_slices->expolygons); ExPolygons inner_polygons = diff_ex(last, (upper_polygons), true);