mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-15 01:55:56 +08:00
SPE-2639: Fix invalid scarf seam direction leading to whole perimeter scarfs
This commit is contained in:
parent
ceb9950e35
commit
6176dcc540
@ -235,6 +235,24 @@ SeamChoice to_seam_choice(
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Geometry::Direction1D get_direction(
|
||||||
|
const bool flipped,
|
||||||
|
const ExPolygon &perimeter_polygon,
|
||||||
|
const ExtrusionLoop &loop
|
||||||
|
) {
|
||||||
|
using Dir = Geometry::Direction1D;
|
||||||
|
|
||||||
|
Dir result{flipped ? Dir::forward : Dir::backward};
|
||||||
|
|
||||||
|
// In rare cases it may happen that the original geometry perimeter
|
||||||
|
// polygon has different direction to the actual extrusion loop.
|
||||||
|
// In that case the logic is exactly opposite.
|
||||||
|
if (perimeter_polygon.contour.is_clockwise() != loop.is_clockwise()) {
|
||||||
|
result = result == Dir::forward ? Dir::backward : Dir::forward;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
boost::variant<Point, Scarf::Scarf> finalize_seam_position(
|
boost::variant<Point, Scarf::Scarf> finalize_seam_position(
|
||||||
const ExtrusionLoop &loop,
|
const ExtrusionLoop &loop,
|
||||||
const PrintRegion *region,
|
const PrintRegion *region,
|
||||||
@ -255,8 +273,7 @@ boost::variant<Point, Scarf::Scarf> finalize_seam_position(
|
|||||||
auto [loop_line_index, loop_point]{
|
auto [loop_line_index, loop_point]{
|
||||||
project_to_extrusion_loop(seam_choice, perimeter, distancer)};
|
project_to_extrusion_loop(seam_choice, perimeter, distancer)};
|
||||||
|
|
||||||
const Geometry::Direction1D offset_direction{
|
const Geometry::Direction1D offset_direction{get_direction(flipped, perimeter_polygon, loop)};
|
||||||
flipped ? Geometry::Direction1D::forward : Geometry::Direction1D::backward};
|
|
||||||
|
|
||||||
// ExtrusionRole::Perimeter is inner perimeter.
|
// ExtrusionRole::Perimeter is inner perimeter.
|
||||||
if (do_staggering) {
|
if (do_staggering) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user