Fix SPE-2304. Rear seam not respecting paiting.

If a rear seam was projected it was not respecting seam paiting,
because it continued to search the points even if they had
'worse' point_type (e.g. common/blocker). Now the search
is aborted if there is an enforcer and it is not picked.
This commit is contained in:
Martin Šach 2024-05-15 11:05:37 +02:00 committed by Lukas Matena
parent 70d7911ee3
commit 258882ca5a
4 changed files with 19 additions and 14 deletions

View File

@ -236,26 +236,14 @@ double VisibilityCalculator::get_angle_visibility_modifier(
return -angle_smooth_weight; return -angle_smooth_weight;
} }
std::vector<Vec2d> extract_points(
const Perimeters::Perimeter &perimeter, const Perimeters::PointType point_type
) {
std::vector<Vec2d> result;
for (std::size_t i{0}; i < perimeter.positions.size(); ++i) {
if (perimeter.point_types[i] == point_type) {
result.push_back(perimeter.positions[i]);
}
}
return result;
}
std::vector<Vec2d> get_starting_positions(const Shells::Shell<> &shell) { std::vector<Vec2d> get_starting_positions(const Shells::Shell<> &shell) {
const Perimeters::Perimeter &perimeter{shell.front().boundary}; const Perimeters::Perimeter &perimeter{shell.front().boundary};
std::vector<Vec2d> enforcers{extract_points(perimeter, Perimeters::PointType::enforcer)}; std::vector<Vec2d> enforcers{Perimeters::extract_points(perimeter, Perimeters::PointType::enforcer)};
if (!enforcers.empty()) { if (!enforcers.empty()) {
return enforcers; return enforcers;
} }
std::vector<Vec2d> common{extract_points(perimeter, Perimeters::PointType::common)}; std::vector<Vec2d> common{Perimeters::extract_points(perimeter, Perimeters::PointType::common)};
if (!common.empty()) { if (!common.empty()) {
return common; return common;
} }

View File

@ -18,6 +18,9 @@ std::optional<SeamChoice> maybe_choose_seam_point(
return seam_choice; return seam_choice;
} }
} }
if (!Perimeters::extract_points(perimeter, point_type).empty()) {
return std::nullopt;
}
} }
return std::nullopt; return std::nullopt;

View File

@ -185,6 +185,19 @@ inline std::size_t get_layer_count(
} }
return layer_count; return layer_count;
} }
inline std::vector<Vec2d> extract_points(
const Perimeters::Perimeter &perimeter, const Perimeters::PointType point_type
) {
std::vector<Vec2d> result;
for (std::size_t i{0}; i < perimeter.positions.size(); ++i) {
if (perimeter.point_types[i] == point_type) {
result.push_back(perimeter.positions[i]);
}
}
return result;
}
} // namespace Slic3r::Seams::Perimeters } // namespace Slic3r::Seams::Perimeters
#endif // libslic3r_SeamPerimeters_hpp_ #endif // libslic3r_SeamPerimeters_hpp_

View File

@ -13,6 +13,7 @@
#include <type_traits> #include <type_traits>
#include <vector> #include <vector>
#include "Point.hpp"
#include "libslic3r.h" #include "libslic3r.h"
#include "Utils.hpp" #include "Utils.hpp"