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

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

Collaboration diagram for Slic3r::AvoidCrossingPerimeters:

Classes

struct  Boundary

Public Member Functions

void use_external_mp (bool use=true)
bool used_external_mp ()
void use_external_mp_once ()
bool used_external_mp_once ()
void disable_once ()
bool disabled_once () const
void reset_once_modifiers ()
void init_layer (const Layer &layer)
Polyline travel_to (const GCode &gcodegen, const Point &point)
Polyline travel_to (const GCode &gcodegen, const Point &point, bool *could_be_wipe_disabled)

Private Attributes

bool m_use_external_mp { false }
bool m_use_external_mp_once { false }
bool m_disabled_once { true }
ExPolygons m_lslices_offset
std::vector< BoundingBox > m_lslices_offset_bboxes
EdgeGrid::Grid m_grid_lslice
Boundary m_internal
Boundary m_external

Detailed Description

Member Function Documentation

◆ disable_once()

void Slic3r::AvoidCrossingPerimeters::disable_once ( )
inline
27{ m_disabled_once = true; }
bool m_disabled_once
Definition AvoidCrossingPerimeters.hpp:64

References m_disabled_once.

◆ disabled_once()

bool Slic3r::AvoidCrossingPerimeters::disabled_once ( ) const
inline
28{ return m_disabled_once; }

References m_disabled_once.

◆ init_layer()

void Slic3r::AvoidCrossingPerimeters::init_layer ( const Layer & layer)
1341{
1342 m_internal.clear();
1343 m_external.clear();
1344
1345 m_lslices_offset.clear();
1347 for (auto coeff : {0.6f, 0.5f, 0.45f}) {
1348 m_lslices_offset = offset_ex(layer.lslices, -get_external_perimeter_width(layer) * coeff);
1349 if (!m_lslices_offset.empty()) break;
1350 }
1352 for (const auto &ex_polygon : m_lslices_offset) m_lslices_offset_bboxes.emplace_back(get_extents(ex_polygon));
1353
1354 BoundingBox bbox_slice(get_extents(layer.lslices));
1355 bbox_slice.offset(SCALED_EPSILON);
1356
1357 m_grid_lslice.set_bbox(bbox_slice);
1358 //FIXME 1mm grid?
1360}
Boundary m_external
Definition AvoidCrossingPerimeters.hpp:74
ExPolygons m_lslices_offset
Definition AvoidCrossingPerimeters.hpp:67
Boundary m_internal
Definition AvoidCrossingPerimeters.hpp:72
EdgeGrid::Grid m_grid_lslice
Definition AvoidCrossingPerimeters.hpp:70
std::vector< BoundingBox > m_lslices_offset_bboxes
Definition AvoidCrossingPerimeters.hpp:68
#define SCALED_EPSILON
Definition libslic3r.h:109
#define scale_(val)
Definition libslic3r.h:106
int64_t coord_t
Definition libslic3r.h:48
static float get_external_perimeter_width(const Layer &layer)
Definition AvoidCrossingPerimeters.cpp:553
BoundingBox get_extents(const ExPolygonsWithIds &e)
Definition Emboss.cpp:1374
Slic3r::ExPolygons offset_ex(const Slic3r::Polygons &polygons, const float delta, JoinType joinType, double miterLimit)
Definition ClipperUtils.cpp:605

References Slic3r::get_extents(), Slic3r::get_external_perimeter_width(), Slic3r::Layer::lslices, m_external, m_grid_lslice, m_internal, m_lslices_offset, m_lslices_offset_bboxes, Slic3r::BoundingBoxBase< PointType, APointsType >::offset(), Slic3r::offset_ex(), scale_, and SCALED_EPSILON.

Here is the call graph for this function:

◆ reset_once_modifiers()

void Slic3r::AvoidCrossingPerimeters::reset_once_modifiers ( )
inline
29{ m_use_external_mp_once = false; m_disabled_once = false; }
bool m_use_external_mp_once
Definition AvoidCrossingPerimeters.hpp:61

References m_disabled_once, and m_use_external_mp_once.

◆ travel_to() [1/2]

Polyline Slic3r::AvoidCrossingPerimeters::travel_to ( const GCode & gcodegen,
const Point & point )
inline
34 {
35 bool could_be_wipe_disabled;
36 return this->travel_to(gcodegen, point, &could_be_wipe_disabled);
37 }
Polyline travel_to(const GCode &gcodegen, const Point &point)
Definition AvoidCrossingPerimeters.hpp:33

References travel_to().

Referenced by travel_to().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ travel_to() [2/2]

Polyline Slic3r::AvoidCrossingPerimeters::travel_to ( const GCode & gcodegen,
const Point & point,
bool * could_be_wipe_disabled )
1256{
1257 // If use_external, then perform the path planning in the world coordinate system (correcting for the gcodegen offset).
1258 // Otherwise perform the path planning in the coordinate system of the active object.
1259 bool use_external = m_use_external_mp || m_use_external_mp_once;
1260 Point scaled_origin = use_external ? Point::new_scale(gcodegen.origin()(0), gcodegen.origin()(1)) : Point(0, 0);
1261 const Point start = gcodegen.last_pos() + scaled_origin;
1262 const Point end = point + scaled_origin;
1263 const Line travel(start, end);
1264 Polyline result_pl;
1265 size_t travel_intersection_count = 0;
1266 Vec2d startf = start.cast<double>();
1267 Vec2d endf = end .cast<double>();
1268
1269 const ExPolygons &lslices = gcodegen.layer()->lslices;
1270 const std::vector<BoundingBox> &lslices_bboxes = gcodegen.layer()->lslices_bboxes;
1271 bool is_support_layer = (dynamic_cast<const SupportLayer *>(gcodegen.layer()) != nullptr);
1272 if (!use_external && (is_support_layer || (!m_lslices_offset.empty() && !any_expolygon_contains(m_lslices_offset, m_lslices_offset_bboxes, m_grid_lslice, travel)))) {
1273 // Initialize m_internal only when it is necessary.
1274 if (m_internal.boundaries.empty()) {
1275 init_boundary(&m_internal, to_polygons(get_boundary(*gcodegen.layer(), get_perimeter_spacing(*gcodegen.layer()))), {start, end});
1276 } else if (!(m_internal.bbox.contains(startf) && m_internal.bbox.contains(endf))) {
1277 // check if start and end are in bbox, if not, merge start and end points to bbox
1278 m_internal.clear();
1279 init_boundary(&m_internal, to_polygons(get_boundary(*gcodegen.layer(), get_perimeter_spacing(*gcodegen.layer()))), {start, end});
1280 }
1281
1282 if (!m_internal.boundaries.empty()) {
1283 travel_intersection_count = avoid_perimeters(m_internal, start, end, *gcodegen.layer(), result_pl);
1284 result_pl.points.front() = start;
1285 result_pl.points.back() = end;
1286 }
1287 } else if (use_external) {
1288 // Initialize m_external only when exist any external travel for the current layer.
1289 if (m_external.boundaries.empty()) {
1290 init_boundary(&m_external, get_boundary_external(*gcodegen.layer()), {start, end});
1291 } else if (!(m_external.bbox.contains(startf) && m_external.bbox.contains(endf))) {
1292 // check if start and end are in bbox
1293 m_external.clear();
1294 init_boundary(&m_external, get_boundary_external(*gcodegen.layer()), {start, end});
1295 }
1296
1297 // Trim the travel line by the bounding box.
1298 if (!m_external.boundaries.empty())
1299 {
1300 travel_intersection_count = avoid_perimeters(m_external, start, end, *gcodegen.layer(), result_pl);
1301 result_pl.points.front() = start;
1302 result_pl.points.back() = end;
1303
1304 }
1305 }
1306
1307 if(result_pl.empty()) {
1308 // Travel line is completely outside the bounding box.
1309 result_pl = {start, end};
1310 travel_intersection_count = 0;
1311 }
1312
1313 const ConfigOptionFloatOrPercent &opt_max_detour = gcodegen.config().max_travel_detour_distance;
1314 bool max_detour_length_exceeded = false;
1315 if (opt_max_detour.value > 0) {
1316 double direct_length = travel.length();
1317 double detour = result_pl.length() - direct_length;
1318 double max_detour_length = opt_max_detour.percent ?
1319 direct_length * 0.01 * opt_max_detour.value :
1320 scale_(opt_max_detour.value);
1321 if (detour > max_detour_length) {
1322 result_pl = {start, end};
1323 max_detour_length_exceeded = true;
1324 }
1325 }
1326
1327 if (use_external) {
1328 result_pl.translate(-scaled_origin);
1329 *could_be_wipe_disabled = false;
1330 } else if (max_detour_length_exceeded) {
1331 *could_be_wipe_disabled = false;
1332 } else
1333 *could_be_wipe_disabled = !need_wipe(gcodegen, m_lslices_offset, m_lslices_offset_bboxes, m_grid_lslice, travel, result_pl, travel_intersection_count);
1334
1335 return result_pl;
1336}
bool m_use_external_mp
Definition AvoidCrossingPerimeters.hpp:59
static Point new_scale(coordf_t x, coordf_t y)
Definition Point.hpp:214
T * end(Slic3r::Mat< N, M, T > &mat)
Definition Point.hpp:841
Kernel::Point_3 Point
Definition MeshRepair.cpp:81
static bool any_expolygon_contains(const ExPolygons &ex_polygons, const std::vector< BoundingBox > &ex_polygons_bboxes, const EdgeGrid::Grid &grid_lslice, const Line &travel)
Definition AvoidCrossingPerimeters.cpp:738
std::vector< ExPolygon > ExPolygons
Definition ExPolygon.hpp:20
static bool need_wipe(const GCode &gcodegen, const ExPolygons &lslices_offset, const std::vector< BoundingBox > &lslices_offset_bboxes, const EdgeGrid::Grid &grid_lslices_offset, const Line &original_travel, const Polyline &result_travel, const size_t intersection_count)
Definition AvoidCrossingPerimeters.cpp:790
static ExPolygons get_boundary(const Layer &layer, float perimeter_spacing)
Definition AvoidCrossingPerimeters.cpp:1122
static float get_perimeter_spacing(const Layer &layer)
Definition AvoidCrossingPerimeters.cpp:514
Polygons to_polygons(const ExPolygon &src)
Definition ExPolygon.hpp:307
static size_t avoid_perimeters(const AvoidCrossingPerimeters::Boundary &boundary, const Point &start, const Point &end, const Layer &layer, Polyline &result_out)
Definition AvoidCrossingPerimeters.cpp:713
void init_boundary(AvoidCrossingPerimeters::Boundary *boundary, Polygons &&boundary_polygons)
Definition AvoidCrossingPerimeters.cpp:1223
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > Vec2d
Definition Point.hpp:67
static Polygons get_boundary_external(const Layer &layer)
Definition AvoidCrossingPerimeters.cpp:1159

References Slic3r::any_expolygon_contains(), Slic3r::avoid_perimeters(), Slic3r::GCode::config(), Slic3r::MultiPoint::empty(), Slic3r::get_boundary(), Slic3r::get_boundary_external(), Slic3r::get_perimeter_spacing(), Slic3r::init_boundary(), Slic3r::GCode::last_pos(), Slic3r::GCode::layer(), Slic3r::Line::length(), Slic3r::MultiPoint::length(), Slic3r::Layer::lslices, Slic3r::Layer::lslices_bboxes, m_external, m_grid_lslice, m_internal, m_lslices_offset, m_lslices_offset_bboxes, m_use_external_mp, m_use_external_mp_once, Slic3r::need_wipe(), Slic3r::Point::new_scale(), Slic3r::GCode::origin(), Slic3r::ConfigOptionFloatOrPercent::percent, Slic3r::MultiPoint::points, scale_, Slic3r::to_polygons(), Slic3r::MultiPoint::translate(), and Slic3r::ConfigOptionSingle< T >::value.

Here is the call graph for this function:

◆ use_external_mp()

void Slic3r::AvoidCrossingPerimeters::use_external_mp ( bool use = true)
inline
23{ m_use_external_mp = use; };

References m_use_external_mp.

◆ use_external_mp_once()

void Slic3r::AvoidCrossingPerimeters::use_external_mp_once ( )
inline
25{ m_use_external_mp_once = true; }

References m_use_external_mp_once.

Referenced by Slic3r::WipeTowerIntegration::append_tcr(), and Slic3r::WipeTowerIntegration::append_tcr2().

Here is the caller graph for this function:

◆ used_external_mp()

bool Slic3r::AvoidCrossingPerimeters::used_external_mp ( )
inline
24{ return m_use_external_mp; }

References m_use_external_mp.

◆ used_external_mp_once()

bool Slic3r::AvoidCrossingPerimeters::used_external_mp_once ( )
inline

Member Data Documentation

◆ m_disabled_once

bool Slic3r::AvoidCrossingPerimeters::m_disabled_once { true }
private
64{ true };

Referenced by disable_once(), disabled_once(), and reset_once_modifiers().

◆ m_external

Boundary Slic3r::AvoidCrossingPerimeters::m_external
private

Referenced by init_layer(), and travel_to().

◆ m_grid_lslice

EdgeGrid::Grid Slic3r::AvoidCrossingPerimeters::m_grid_lslice
private

Referenced by init_layer(), and travel_to().

◆ m_internal

Boundary Slic3r::AvoidCrossingPerimeters::m_internal
private

Referenced by init_layer(), and travel_to().

◆ m_lslices_offset

ExPolygons Slic3r::AvoidCrossingPerimeters::m_lslices_offset
private

Referenced by init_layer(), and travel_to().

◆ m_lslices_offset_bboxes

std::vector<BoundingBox> Slic3r::AvoidCrossingPerimeters::m_lslices_offset_bboxes
private

Referenced by init_layer(), and travel_to().

◆ m_use_external_mp

bool Slic3r::AvoidCrossingPerimeters::m_use_external_mp { false }
private
59{ false };

Referenced by travel_to(), use_external_mp(), and used_external_mp().

◆ m_use_external_mp_once

bool Slic3r::AvoidCrossingPerimeters::m_use_external_mp_once { false }
private

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