mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-15 09:06:02 +08:00
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:
parent
70d7911ee3
commit
258882ca5a
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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_
|
||||||
|
@ -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"
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user