OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::RetractWhenCrossingPerimeters Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/GCode/RetractWhenCrossingPerimeters.hpp>

Collaboration diagram for Slic3r::RetractWhenCrossingPerimeters:

Public Member Functions

bool travel_inside_internal_regions (const Layer &layer, const Polyline &travel)

Private Types

using AABBTree = AABBTreeIndirect::Tree<2, coord_t>

Private Attributes

const Layer * m_layer
std::vector< const ExPolygon * > m_internal_islands
AABBTree m_aabbtree_internal_islands

Detailed Description

Member Typedef Documentation

◆ AABBTree

Member Function Documentation

◆ travel_inside_internal_regions()

bool Slic3r::RetractWhenCrossingPerimeters::travel_inside_internal_regions ( const Layer & layer,
const Polyline & travel )
21{
22 if (m_layer != &layer) {
23 // Update cache.
24 m_layer = &layer;
25 m_internal_islands.clear();
27 // Collect expolygons of internal slices.
28 for (const LayerRegion *layerm : layer.regions())
29 for (const Surface &surface : layerm->get_slices().surfaces)
30 if (surface.is_internal())
31 m_internal_islands.emplace_back(&surface.expolygon);
32 // Calculate bounding boxes of internal slices.
33 std::vector<AABBTreeIndirect::BoundingBoxWrapper> bboxes;
34 bboxes.reserve(m_internal_islands.size());
35 for (size_t i = 0; i < m_internal_islands.size(); ++ i)
36 bboxes.emplace_back(i, get_extents(*m_internal_islands[i]));
37 // Build AABB tree over bounding boxes of internal slices.
38 m_aabbtree_internal_islands.build_modify_input(bboxes);
39 }
40
41 BoundingBox bbox_travel = get_extents(travel);
42 AABBTree::BoundingBox bbox_travel_eigen{ bbox_travel.min, bbox_travel.max };
43 int result = -1;
44 bbox_travel.offset(SCALED_EPSILON);
46 [&bbox_travel_eigen](const AABBTree::Node &node) {
47 return bbox_travel_eigen.intersects(node.bbox);
48 },
49 [&travel, &bbox_travel, &result, &islands = m_internal_islands](const AABBTree::Node &node) {
50 assert(node.is_leaf());
51 assert(node.is_valid());
52 Polygons clipped = ClipperUtils::clip_clipper_polygons_with_subject_bbox(*islands[node.idx], bbox_travel);
53 if (diff_pl(travel, clipped).empty()) {
54 // Travel path is completely inside an "internal" island. Don't retract.
55 result = int(node.idx);
56 // Stop traversal.
57 return false;
58 }
59 // Continue traversal.
60 return true;
61 });
62 return result != -1;
63}
Eigen::AlignedBox< CoordType, NumDimensions > BoundingBox
Definition AABBTreeIndirect.hpp:50
std::vector< const ExPolygon * > m_internal_islands
Definition RetractWhenCrossingPerimeters.hpp:25
AABBTree m_aabbtree_internal_islands
Definition RetractWhenCrossingPerimeters.hpp:28
const Layer * m_layer
Definition RetractWhenCrossingPerimeters.hpp:23
#define SCALED_EPSILON
Definition libslic3r.h:109
void traverse(const Tree< Dims, T > &tree, Predicate &&pred, Fn &&callback)
Definition AABBTreeIndirect.hpp:986
Polygons clip_clipper_polygons_with_subject_bbox(const Polygons &src, const BoundingBox &bbox)
Definition ClipperUtils.cpp:132
Slic3r::Polylines diff_pl(const Slic3r::Polyline &subject, const Slic3r::Polygons &clip)
Definition ClipperUtils.cpp:1099
BoundingBox get_extents(const ExPolygonsWithIds &e)
Definition Emboss.cpp:1374
std::vector< Polygon, PointsAllocator< Polygon > > Polygons
Definition Polygon.hpp:22
bool empty(const BoundingBoxBase< PointType, PointsType > &bb)
Definition BoundingBox.hpp:273

References Slic3r::ClipperUtils::clip_clipper_polygons_with_subject_bbox(), Slic3r::diff_pl(), Slic3r::empty(), Slic3r::get_extents(), m_aabbtree_internal_islands, m_internal_islands, m_layer, Slic3r::BoundingBoxBase< PointType, APointsType >::max, Slic3r::BoundingBoxBase< PointType, APointsType >::min, Slic3r::BoundingBoxBase< PointType, APointsType >::offset(), Slic3r::Layer::regions(), SCALED_EPSILON, and Slic3r::AABBTreeIndirect::traverse().

Here is the call graph for this function:

Member Data Documentation

◆ m_aabbtree_internal_islands

AABBTree Slic3r::RetractWhenCrossingPerimeters::m_aabbtree_internal_islands
private

◆ m_internal_islands

std::vector<const ExPolygon*> Slic3r::RetractWhenCrossingPerimeters::m_internal_islands
private

◆ m_layer

const Layer* Slic3r::RetractWhenCrossingPerimeters::m_layer
private

The documentation for this class was generated from the following files: