534{
536 result.
path = travel;
537 if (travel.points.size() < 2)
538 return result;
539 if (extruder_id < 0 ||
size_t(extruder_id) >=
m_spaces.size()) {
542 return result;
543 }
544
546 if (space.regions.empty()) {
548 return result;
549 }
550
551 const double z_min = std::min(start_z, end_z);
552 const double z_max = std::max(start_z, end_z);
553
554
555
556 const BoundingBox travel_bbox(travel.points);
557 bool has_active_z = false;
558 bool may_intersect = false;
559 for (size_t region_id = 0; region_id < space.regions.size(); ++region_id) {
560 const BedExcludeRegion ®ion = space.regions[region_id];
562 continue;
563 has_active_z = true;
564 if (region_id < space.region_bboxes.size() && space.region_bboxes[region_id].overlap(travel_bbox)) {
565 may_intersect = true;
566 break;
567 }
568 }
569 if (!has_active_z) {
571 return result;
572 }
573 if (!may_intersect) {
575 return result;
576 }
577
579 if (active == nullptr || active->empty()) {
581 return result;
582 }
583 result.active_obstacles = active->size();
584
585 const Point &start = travel.points.front();
586 const Point &
end = travel.points.back();
587 const bool start_outside_bed = !space.valid_bed.empty() &&
589 const bool end_outside_bed = !space.valid_bed.empty() &&
597 return result;
598 }
599
600 bool needs_reroute = false;
601 for (size_t idx = 1; idx < travel.points.size(); ++idx) {
603 needs_reroute = true;
604 break;
605 }
606 }
607 if (!needs_reroute) {
609 return result;
610 }
611
612 Polyline path = travel;
613 bool rerouted = false;
615 result.iterations = iteration + 1;
616 bool changed = false;
617 for (size_t segment_idx = 0; segment_idx + 1 < path.points.size(); ++segment_idx) {
618 const Point &a = path.points[segment_idx];
619 const Point &b = path.points[segment_idx + 1];
620 const bool allow_a_outside = start_outside_bed && segment_idx == 0;
621 const bool allow_b_outside = end_outside_bed && segment_idx + 2 == path.points.size();
622 const Polyline
segment({a, b});
624 segment, space.valid_bed, allow_a_outside, allow_b_outside)) {
627 return result;
628 }
629
631 if (!obstacle_idx)
632 continue;
633
635 a, b, (*active)[*obstacle_idx], *active, space.valid_bed,
636 allow_a_outside, allow_b_outside);
637 if (!detour) {
640 return result;
641 }
643 continue;
644
646 changed = true;
647 rerouted = true;
648 break;
649 }
650
651 if (!changed) {
654 path, space.valid_bed, start_outside_bed, end_outside_bed) ||
658 return result;
659 }
660 result.path = std::move(path);
663 return result;
664 }
665 }
666
669 return result;
670}
@ NoActiveObstacles
Definition ExclusionVolumeTravelAvoidance.hpp:31
@ EndpointInside
Definition ExclusionVolumeTravelAvoidance.hpp:33
@ UnknownExtruder
Definition ExclusionVolumeTravelAvoidance.hpp:30
@ None
Definition ExclusionVolumeTravelAvoidance.hpp:29
@ DetourFailed
Definition ExclusionVolumeTravelAvoidance.hpp:35
@ FinalPathInvalid
Definition ExclusionVolumeTravelAvoidance.hpp:36
@ NoIntersection
Definition ExclusionVolumeTravelAvoidance.hpp:32
@ SegmentOutsideBed
Definition ExclusionVolumeTravelAvoidance.hpp:34
@ IterationLimit
Definition ExclusionVolumeTravelAvoidance.hpp:37
const ExPolygons * active_obstacles(RoutingSpace &space, double z_min, double z_max)
Definition ExclusionVolumeTravelAvoidance.cpp:498
@ EndpointInside
Definition ExclusionVolumeTravelAvoidance.hpp:23
@ Unchanged
Definition ExclusionVolumeTravelAvoidance.hpp:21
@ Rerouted
Definition ExclusionVolumeTravelAvoidance.hpp:22
@ Failed
Definition ExclusionVolumeTravelAvoidance.hpp:24
T * end(Slic3r::Mat< N, M, T > &mat)
Definition Point.hpp:841
void segment(CGALMesh &src, std::vector< CGALMesh > &dst, double smoothing_alpha=0.5, int segment_number=5)
Definition MeshBoolean.cpp:480
bool point_in_expolygons(const ExPolygons &expolygons, const Point &point, bool border_result)
Definition ExclusionVolumeTravelAvoidance.cpp:112
bool polyline_intersects_obstacles(const Polyline &polyline, const ExPolygons &obstacles)
Definition ExclusionVolumeTravelAvoidance.cpp:326
std::optional< size_t > first_intersected_obstacle(const Point &a, const Point &b, const ExPolygons &obstacles)
Definition ExclusionVolumeTravelAvoidance.cpp:334
bool replacement_matches_original_segment(const Polyline &replacement, const Point &a, const Point &b)
Definition ExclusionVolumeTravelAvoidance.cpp:241
constexpr size_t MAX_REROUTE_ITERATIONS
Definition ExclusionVolumeTravelAvoidance.cpp:25
Polyline simplify_path(const Polyline &path, const ExPolygons &obstacles, const ExPolygons &valid_bed)
Definition ExclusionVolumeTravelAvoidance.cpp:408
bool segment_enters_expolygons_interior(const Point &a, const Point &b, const ExPolygons &expolygons)
Definition ExclusionVolumeTravelAvoidance.cpp:163
bool point_in_expolygons_interior(const ExPolygons &expolygons, const Point &point)
Definition ExclusionVolumeTravelAvoidance.cpp:136
bool routed_polyline_inside_bed(const Polyline &polyline, const ExPolygons &valid_bed, const bool allow_start_outside, const bool allow_end_outside)
Definition ExclusionVolumeTravelAvoidance.cpp:297
std::optional< Polyline > detour_around_obstacle(const Point &a, const Point &b, const ExPolygon &obstacle, const ExPolygons &obstacles, const ExPolygons &valid_bed, const bool allow_start_outside, const bool allow_end_outside)
Definition ExclusionVolumeTravelAvoidance.cpp:351
void replace_segment(Polyline &path, size_t segment_idx, const Polyline &replacement)
Definition ExclusionVolumeTravelAvoidance.cpp:395
Definition ExclusionVolumeTravelAvoidance.hpp:41
Polyline path
Definition ExclusionVolumeTravelAvoidance.hpp:44