From 6cc7ff754c1f013e5b1b8f5bc923160439a874d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20=C5=A0ach?= Date: Fri, 25 Oct 2024 11:28:13 +0200 Subject: [PATCH] Add fallback to rear seam picker chosing the point with biggest y --- src/libslic3r/GCode/SeamPlacer.cpp | 2 +- src/libslic3r/GCode/SeamRear.cpp | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/GCode/SeamPlacer.cpp b/src/libslic3r/GCode/SeamPlacer.cpp index 960b7bfb3e..257716769b 100644 --- a/src/libslic3r/GCode/SeamPlacer.cpp +++ b/src/libslic3r/GCode/SeamPlacer.cpp @@ -131,7 +131,7 @@ Params Placer::get_params(const DynamicPrintConfig &config) { params.staggered_inner_seams = config.opt_bool("staggered_inner_seams"); params.max_nearest_detour = 1.0; - params.rear_tolerance = 0.2; + params.rear_tolerance = 1.0; params.rear_y_offset = 20; params.aligned.jump_visibility_threshold = 0.6; params.max_distance = 5.0; diff --git a/src/libslic3r/GCode/SeamRear.cpp b/src/libslic3r/GCode/SeamRear.cpp index f17dd79997..727315fa27 100644 --- a/src/libslic3r/GCode/SeamRear.cpp +++ b/src/libslic3r/GCode/SeamRear.cpp @@ -59,16 +59,28 @@ struct RearestPointCalculator { const Vec2d prefered_position{center_x, bounding_box.max.y() + rear_y_offset}; auto [_, line_index, point] = possible_distancer.distance_from_lines_extra(prefered_position); const Vec2d location_at_bb{center_x, bounding_box.max.y()}; - auto [_d, line_index_at_bb, point_at_bb] = possible_distancer.distance_from_lines_extra(location_at_bb); - const double y_distance{point.y() - point_at_bb.y()}; + auto [_d, line_index_at_bb, point_bb] = possible_distancer.distance_from_lines_extra(location_at_bb); + const double y_distance{point.y() - point_bb.y()}; Vec2d result{point}; if (y_distance < 0) { - result = point_at_bb; + result = point_bb; } else if (y_distance <= rear_tolerance) { const double factor{y_distance / rear_tolerance}; - result = factor * point + (1 - factor) * point_at_bb; + result = factor * point + (1 - factor) * point_bb; } + + if (bounding_box.max.y() - result.y() > rear_tolerance) { + for (const PerimeterLine &line : possible_lines) { + if (line.a.y() > result.y()) { + result = line.a; + } + if (line.b.y() > result.y()) { + result = line.b; + } + } + } + return SeamChoice{possible_lines[line_index].previous_index, possible_lines[line_index].next_index, result}; } };