From 7ca6641dcb97e2275cce7a766c377dfd5630dc91 Mon Sep 17 00:00:00 2001 From: supermerill Date: Thu, 7 Oct 2021 12:31:56 +0200 Subject: [PATCH] Polyholes now don't recognize rectangle as badly made circle. supermerill/SuperSlicer#1561 --- src/libslic3r/PrintObject.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index d320b0c5d..ef3ea78cd 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -210,10 +210,21 @@ namespace Slic3r { diameter_max = std::max(diameter_max, dist); diameter_sum += dist; } + //also use center of lines to check it's not a rectangle + double diameter_line_min = std::numeric_limits::max(), diameter_line_max = 0; + Lines hole_lines = hole.lines(); + for (Line l : hole_lines) { + Point midline = (l.a + l.b) / 2; + double dist = center.distance_to(midline); + diameter_line_min = std::min(diameter_line_min, dist); + diameter_line_max = std::max(diameter_line_max, dist); + } + + // SCALED_EPSILON was a bit too harsh. Now using a config, as some may want some harsh setting and some don't. coord_t max_variation = std::max(SCALED_EPSILON, scale_(this->m_layers[layer_idx]->m_regions[region_idx]->region()->config().hole_to_polyhole_threshold.get_abs_value(unscaled(diameter_sum / hole.points.size())))); bool twist = this->m_layers[layer_idx]->m_regions[region_idx]->region()->config().hole_to_polyhole_twisted.value; - if (diameter_max - diameter_min < max_variation * 2) { + if (diameter_max - diameter_min < max_variation * 2 && diameter_line_max - diameter_line_min < max_variation * 2) { layerid2center[layer_idx].emplace_back( std::tuple{center, diameter_max, layer->m_regions[region_idx]->region()->config().perimeter_extruder.value, max_variation, twist}, & hole); }