From 63222eb5299c8e69bfc600cc2bf2785e4aa1c18b Mon Sep 17 00:00:00 2001 From: PavelMikus Date: Mon, 12 Sep 2022 10:53:17 +0200 Subject: [PATCH] Reduce curling of Rear seams, improve its quality Relevant issue: 8841 Rear Seam Not Aligned, Not Rear of Model --- src/libslic3r/GCode/SeamPlacer.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/GCode/SeamPlacer.cpp b/src/libslic3r/GCode/SeamPlacer.cpp index a54e9f819e..0f4e43a076 100644 --- a/src/libslic3r/GCode/SeamPlacer.cpp +++ b/src/libslic3r/GCode/SeamPlacer.cpp @@ -1,5 +1,7 @@ #include "SeamPlacer.hpp" +#include "Point.hpp" +#include "libslic3r.h" #include "tbb/parallel_for.h" #include "tbb/blocked_range.h" #include "tbb/parallel_reduce.h" @@ -729,8 +731,9 @@ void gather_enforcers_blockers(GlobalModelInfo &result, const PrintObject *po) { struct SeamComparator { SeamPosition setup; float angle_importance; - explicit SeamComparator(SeamPosition setup) : - setup(setup) { + Vec2f rear_attractor; + explicit SeamComparator(SeamPosition setup, const Vec2f& rear_attractor = Vec2f::Zero()) : + setup(setup), rear_attractor(rear_attractor) { angle_importance = setup == spNearest ? SeamPlacer::angle_importance_nearest : SeamPlacer::angle_importance_aligned; } @@ -761,8 +764,9 @@ struct SeamComparator { return false; } - if (setup == SeamPosition::spRear && a.position.y() != b.position.y()) { - return a.position.y() > b.position.y(); + if (setup == SeamPosition::spRear) { + return (a.position.head<2>() - rear_attractor).squaredNorm() < + (b.position.head<2>() - rear_attractor).squaredNorm(); } float distance_penalty_a = 0.0f; @@ -824,7 +828,8 @@ struct SeamComparator { } if (setup == SeamPosition::spRear) { - return a.position.y() + SeamPlacer::seam_align_score_tolerance * 5.0f > b.position.y(); + return (a.position.head<2>() - rear_attractor).squaredNorm() - a.perimeter.flow_width < + (b.position.head<2>() - rear_attractor).squaredNorm(); } float penalty_a = a.overhang + a.visibility @@ -1452,7 +1457,9 @@ void SeamPlacer::init(const Print &print, std::function throw_if_can for (const PrintObject *po : print.objects()) { throw_if_canceled_func(); SeamPosition configured_seam_preference = po->config().seam_position.value; - SeamComparator comparator { configured_seam_preference }; + Vec2f rear_attractor = unscaled(po->bounding_box().center()).cast() + + 1.5f * Vec2f(0.0f, unscale(po->bounding_box().max.y())); + SeamComparator comparator{configured_seam_preference, rear_attractor}; { GlobalModelInfo global_model_info { };