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;
}
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) {
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()) {
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()) {
return common;
}

View File

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

View File

@ -185,6 +185,19 @@ inline std::size_t get_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
#endif // libslic3r_SeamPerimeters_hpp_

View File

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