diff --git a/src/libslic3r/GCode/SeamPlacer.cpp b/src/libslic3r/GCode/SeamPlacer.cpp index 088cfc674c..0e8adff308 100644 --- a/src/libslic3r/GCode/SeamPlacer.cpp +++ b/src/libslic3r/GCode/SeamPlacer.cpp @@ -275,6 +275,36 @@ Point finalize_seam_position( return scaled(loop_point); } +struct NearestCorner { + Vec2d prefered_position; + + std::optional operator()( + const Perimeters::Perimeter &perimeter, + const Perimeters::PointType point_type, + const Perimeters::PointClassification point_classification + ) const { + std::optional corner_candidate; + double min_distance{std::numeric_limits::infinity()}; + for (std::size_t i{0}; i < perimeter.positions.size(); ++i) { + if (perimeter.point_types[i] == point_type && + perimeter.point_classifications[i] == point_classification && + perimeter.angle_types[i] != Perimeters::AngleType::smooth) { + const Vec2d &point{perimeter.positions[i]}; + if (!corner_candidate) { + corner_candidate = {i, i, point}; + continue; + } + const double distance{(prefered_position - point).norm()}; + if (distance < min_distance) { + corner_candidate = {i, i, point}; + min_distance = distance; + } + } + } + return corner_candidate; + } +}; + std::pair place_seam_near( const std::vector &layer_perimeters, const ExtrusionLoop &loop, @@ -292,11 +322,19 @@ std::pair place_seam_near( const std::size_t choice_index{ Geometry::pick_closest_bounding_box(loop_polygon.bounding_box(), choose_from).first}; - Seams::Aligned::Impl::Nearest nearest{unscaled(position), max_detour}; + const NearestCorner nearest_corner{unscaled(position)}; + const std::optional corner_choice{ + Seams::maybe_choose_seam_point(layer_perimeters[choice_index].perimeter, nearest_corner)}; - const SeamChoice choice{Seams::choose_seam_point(layer_perimeters[choice_index].perimeter, nearest)}; + if (corner_choice) { + return {*corner_choice, choice_index}; + } - return {choice, choice_index}; + const Seams::Aligned::Impl::Nearest nearest{unscaled(position), max_detour}; + const SeamChoice nearest_choice{ + Seams::choose_seam_point(layer_perimeters[choice_index].perimeter, nearest)}; + + return {nearest_choice, choice_index}; } int get_perimeter_count(const Layer *layer){ diff --git a/src/slic3r/GUI/TopBarMenus.hpp b/src/slic3r/GUI/TopBarMenus.hpp index 20235cba2e..36eefe522f 100644 --- a/src/slic3r/GUI/TopBarMenus.hpp +++ b/src/slic3r/GUI/TopBarMenus.hpp @@ -2,6 +2,7 @@ #define slic3r_TopBarMenus_hpp_ #include +#include class TopBarItemsCtrl; class wxString;