From e70aea8b30defa434bf475159b5329b374433695 Mon Sep 17 00:00:00 2001 From: PavelMikus Date: Thu, 16 Jun 2022 10:12:44 +0200 Subject: [PATCH] SeamPLacer: for extrusion loops, check all paths for ExternalPerimeter role small parameter tuning --- src/libslic3r/GCode/SeamPlacer.cpp | 13 +++++++++++-- src/libslic3r/GCode/SeamPlacer.hpp | 4 ++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/GCode/SeamPlacer.cpp b/src/libslic3r/GCode/SeamPlacer.cpp index 37e0c4b96..43c9f2e5e 100644 --- a/src/libslic3r/GCode/SeamPlacer.cpp +++ b/src/libslic3r/GCode/SeamPlacer.cpp @@ -411,8 +411,17 @@ Polygons extract_perimeter_polygons(const Layer *layer, const SeamPosition confi for (const ExtrusionEntity *ex_entity : layer_region->perimeters.entities) { if (ex_entity->is_collection()) { //collection of inner, outer, and overhang perimeters for (const ExtrusionEntity *perimeter : static_cast(ex_entity)->entities) { - if (perimeter->role() == ExtrusionRole::erExternalPerimeter - || (perimeter->role() == ExtrusionRole::erPerimeter + ExtrusionRole role = perimeter->role(); + if (perimeter->is_loop()){ + for (const ExtrusionPath& path : static_cast(perimeter)->paths){ + if (path.role() == ExtrusionRole::erExternalPerimeter){ + role = ExtrusionRole::erExternalPerimeter; + } + } + } + + if (role == ExtrusionRole::erExternalPerimeter + || (is_perimeter(role) && configured_seam_preference == spRandom)) { //for random seam alignment, extract all perimeters Points p; perimeter->collect_points(p); diff --git a/src/libslic3r/GCode/SeamPlacer.hpp b/src/libslic3r/GCode/SeamPlacer.hpp index 6b211b176..181dd5bb8 100644 --- a/src/libslic3r/GCode/SeamPlacer.hpp +++ b/src/libslic3r/GCode/SeamPlacer.hpp @@ -133,7 +133,7 @@ public: static constexpr float overhang_distance_tolerance_factor = 0.5f; // determines angle importance compared to visibility ( neutral value is 1.0f. ) - static constexpr float angle_importance_aligned = 0.5f; + static constexpr float angle_importance_aligned = 0.6f; static constexpr float angle_importance_nearest = 1.0f; // use much higher angle importance for nearest mode, to combat the visiblity info noise // If enforcer or blocker is closer to the seam candidate than this limit, the seam candidate is set to Blocker or Enforcer @@ -145,7 +145,7 @@ public: // following value describes, how much worse score can point have and still be picked into seam cluster instead of original seam point on the same layer static constexpr float seam_align_score_tolerance = 0.27f; // seam_align_tolerable_dist - if next layer closest point is too far away, skip layer - static constexpr float seam_align_tolerable_dist = 1.0f; + static constexpr float seam_align_tolerable_dist = 0.4f; // if the seam of the current layer is too far away, and the closest seam candidate is not very good, layer is skipped. // this param limits the number of allowed skips static constexpr size_t seam_align_tolerable_skips = 4;