Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
Slic3r::RetractWhenCrossingPerimeters Class Reference

#include <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 Layerm_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 
)
10{
11 if (m_layer != &layer) {
12 // Update cache.
13 m_layer = &layer;
14 m_internal_islands.clear();
16 // Collect expolygons of internal slices.
17 for (const LayerRegion *layerm : layer.regions())
18 for (const Surface &surface : layerm->slices().surfaces)
19 if (surface.is_internal())
20 m_internal_islands.emplace_back(&surface.expolygon);
21 // Calculate bounding boxes of internal slices.
22 std::vector<AABBTreeIndirect::BoundingBoxWrapper> bboxes;
23 bboxes.reserve(m_internal_islands.size());
24 for (size_t i = 0; i < m_internal_islands.size(); ++ i)
25 bboxes.emplace_back(i, get_extents(*m_internal_islands[i]));
26 // Build AABB tree over bounding boxes of internal slices.
28 }
29
30 BoundingBox bbox_travel = get_extents(travel);
31 AABBTree::BoundingBox bbox_travel_eigen{ bbox_travel.min, bbox_travel.max };
32 int result = -1;
33 bbox_travel.offset(SCALED_EPSILON);
35 [&bbox_travel_eigen](const AABBTree::Node &node) {
36 return bbox_travel_eigen.intersects(node.bbox);
37 },
38 [&travel, &bbox_travel, &result, &islands = m_internal_islands](const AABBTree::Node &node) {
39 assert(node.is_leaf());
40 assert(node.is_valid());
41 Polygons clipped = ClipperUtils::clip_clipper_polygons_with_subject_bbox(*islands[node.idx], bbox_travel);
42 if (diff_pl(travel, clipped).empty()) {
43 // Travel path is completely inside an "internal" island. Don't retract.
44 result = int(node.idx);
45 // Stop traversal.
46 return false;
47 }
48 // Continue traversal.
49 return true;
50 });
51 return result != -1;
52}
void clear()
Definition AABBTreeIndirect.hpp:74
void build_modify_input(std::vector< SourceNode > &input)
Definition AABBTreeIndirect.hpp:93
Eigen::AlignedBox< CoordType, NumDimensions > BoundingBox
Definition AABBTreeIndirect.hpp:45
std::vector< const ExPolygon * > m_internal_islands
Definition RetractWhenCrossingPerimeters.hpp:24
AABBTree m_aabbtree_internal_islands
Definition RetractWhenCrossingPerimeters.hpp:27
const Layer * m_layer
Definition RetractWhenCrossingPerimeters.hpp:22
#define const
Definition getopt.c:38
EIGEN_DEVICE_FUNC const VectorType &() min() const
Definition AlignedBox.h:106
if(!(yy_init))
Definition lexer.c:1190
#define SCALED_EPSILON
Definition libslic3r.h:71
void traverse(const Tree< Dims, T > &tree, Predicate &&pred, Fn &&callback)
Definition AABBTreeIndirect.hpp:981
Polygons clip_clipper_polygons_with_subject_bbox(const Polygons &src, const BoundingBox &bbox)
Definition ClipperUtils.cpp:152
std::vector< Polygon, PointsAllocator< Polygon > > Polygons
Definition Polygon.hpp:15
Slic3r::Polylines diff_pl(const Slic3r::Polyline &subject, const Slic3r::Polygons &clip)
Definition ClipperUtils.cpp:852
BoundingBox get_extents(const ExPolygon &expolygon)
Definition ExPolygon.cpp:352
bool empty(const BoundingBoxBase< PointType, PointsType > &bb)
Definition BoundingBox.hpp:229

References Slic3r::AABBTreeIndirect::Tree< ANumDimensions, ACoordType >::build_modify_input(), Slic3r::AABBTreeIndirect::Tree< ANumDimensions, ACoordType >::clear(), 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().

Referenced by Slic3r::GCode::needs_retraction().

+ Here is the call graph for this function:
+ Here is the caller 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: