1256{
1257
1258
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>();
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);
1273
1277
1280 }
1281
1284 result_pl.points.front() = start;
1285 result_pl.points.back() =
end;
1286 }
1287 } else if (use_external) {
1288
1292
1295 }
1296
1297
1299 {
1301 result_pl.points.front() = start;
1302 result_pl.points.back() =
end;
1303
1304 }
1305 }
1306
1307 if(result_pl.empty()) {
1308
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
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