From 56a7d295c74ada62e2ec3e368f8533440639c7f5 Mon Sep 17 00:00:00 2001 From: "xun.zhang" Date: Fri, 14 Feb 2025 15:28:53 +0800 Subject: [PATCH] ENH: enhance check for only one wall top jira: NONE Signed-off-by: xun.zhang Change-Id: Ia5f326416516a73111e37ba75bc673e69f0f99a5 --- src/libslic3r/PerimeterGenerator.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index ee4480af1..4ddb37771 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -2180,9 +2180,22 @@ bool PerimeterGenerator::should_enable_top_one_wall(const ExPolygons& original_e coord_t perimeter_width = this->perimeter_flow.scaled_width(); coord_t ext_perimeter_spacing = this->ext_perimeter_flow.scaled_spacing(); + auto get_expolygs_area = [](const ExPolygons& expolys)->double{ + return std::accumulate(expolys.begin(), expolys.end(), (double)(0), [](double val, const ExPolygon& expoly) { + return val + expoly.area(); + }); + }; + //BBS: filter small area and extend top surface a bit to hide the wall line double min_width_top_surface = (this->object_config->top_area_threshold / 100) * std::max(ext_perimeter_spacing / 2.0, perimeter_width / 2.0); - top = offset2_ex(top, -min_width_top_surface, min_width_top_surface + perimeter_width); + auto shrunk_top = offset_ex(top, - min_width_top_surface); + double shrunk_area = get_expolygs_area(shrunk_top); + double original_area = get_expolygs_area(original_expolys); + + if (shrunk_area / (original_area + EPSILON) < 0.1 || original_area < scale_(1)*scale_(1)) + top.clear(); + else + top = offset_ex(shrunk_top, min_width_top_surface + perimeter_width); return !top.empty(); }