From 02779e211f7a7b299a117b20df4fce3f892f61ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20=C5=A0ach?= Date: Mon, 13 Jan 2025 17:34:14 +0100 Subject: [PATCH] SPE-2639: Ensure no scarf seam is generated when a point fail to project to the perimeter --- src/libslic3r/GCode/SeamPlacer.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/GCode/SeamPlacer.cpp b/src/libslic3r/GCode/SeamPlacer.cpp index 257716769b..da4d7ea292 100644 --- a/src/libslic3r/GCode/SeamPlacer.cpp +++ b/src/libslic3r/GCode/SeamPlacer.cpp @@ -312,11 +312,15 @@ boost::variant finalize_seam_position( } if (loop.role() != ExtrusionRole::Perimeter) { // Outter perimeter - scarf.start_point = scaled(project_to_extrusion_loop( + const Vec2d start_point_candidate{project_to_extrusion_loop( to_seam_choice(*outter_scarf_start_point, perimeter), perimeter, distancer - ).second); + ).second}; + if ((start_point_candidate - outter_scarf_start_point->point).norm() > 5.0) { + return scaled(loop_point); + } + scarf.start_point = scaled(start_point_candidate); scarf.end_point = scaled(loop_point); scarf.end_point_previous_index = loop_line_index; return scarf; @@ -359,18 +363,25 @@ boost::variant finalize_seam_position( if (!inner_scarf_start_point) { return scaled(inner_scarf_end_point.point); } - - scarf.start_point = scaled(project_to_extrusion_loop( + const Vec2d start_point_candidate{project_to_extrusion_loop( to_seam_choice(*inner_scarf_start_point, perimeter), perimeter, distancer - ).second); + ).second}; + if ((start_point_candidate - inner_scarf_start_point->point).norm() > 5.0) { + return scaled(loop_point); + } + scarf.start_point = scaled(start_point_candidate); const auto [end_point_previous_index, end_point]{project_to_extrusion_loop( to_seam_choice(inner_scarf_end_point, perimeter), perimeter, distancer )}; + if ((end_point - inner_scarf_end_point.point).norm() > 5.0) { + return scaled(loop_point); + } + scarf.end_point = scaled(end_point); scarf.end_point_previous_index = end_point_previous_index; return scarf;