1171{
1172
1173
1175 Point scaled_origin = use_external ? Point::new_scale(gcodegen.origin()(0), gcodegen.origin()(1)) :
Point(0, 0);
1176 const Point start = gcodegen.last_pos() + scaled_origin;
1177 const Point end = point + scaled_origin;
1178 const Line travel(start, end);
1179
1180 Polyline result_pl;
1181 size_t travel_intersection_count = 0;
1182 Vec2d startf = start.cast<
double>();
1184
1185 bool is_support_layer = dynamic_cast<const SupportLayer *>(gcodegen.layer()) != nullptr;
1187
1190
1191
1194 result_pl.points.front() = start;
1195 result_pl.points.back() =
end;
1196 }
1197 } else if(use_external) {
1198
1201
1202
1205 result_pl.points.front() = start;
1206 result_pl.points.back() =
end;
1207 }
1208 }
1209
1210 if(result_pl.empty()) {
1211
1212 result_pl = {start,
end};
1213 travel_intersection_count = 0;
1214 }
1215
1216 const ConfigOptionFloatOrPercent &opt_max_detour = gcodegen.config().avoid_crossing_perimeters_max_detour;
1217 bool max_detour_length_exceeded = false;
1218 if (opt_max_detour.value > 0) {
1219 double direct_length = travel.length();
1220 double detour = result_pl.length() - direct_length;
1221 double max_detour_length = opt_max_detour.percent ?
1222 direct_length * 0.01 * opt_max_detour.value :
1223 scale_(opt_max_detour.value);
1224 if (detour > max_detour_length) {
1225 result_pl = {start,
end};
1226 max_detour_length_exceeded = true;
1227 }
1228 }
1229
1230 if (use_external) {
1231 result_pl.translate(-scaled_origin);
1232 *could_be_wipe_disabled = false;
1233 } else if (max_detour_length_exceeded) {
1234 *could_be_wipe_disabled = false;
1235 } else
1237
1238 return result_pl;
1239}
bool m_use_external_mp
Definition AvoidCrossingPerimeters.hpp:54
bool liang_barsky_line_clipping(Eigen::Matrix< T, 2, 1, Eigen::DontAlign > &x0, Eigen::Matrix< T, 2, 1, Eigen::DontAlign > &x1, const BoundingBoxBase< Eigen::Matrix< T, 2, 1, Eigen::DontAlign > > &bbox)
Definition Geometry.hpp:250
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:733
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > Vec2d
Definition Point.hpp:51
static void init_boundary(AvoidCrossingPerimeters::Boundary *boundary, Polygons &&boundary_polygons)
Definition AvoidCrossingPerimeters.cpp:1155
Polygons to_polygons(const ExPolygon &src)
Definition ExPolygon.hpp:281
static size_t avoid_perimeters(const AvoidCrossingPerimeters::Boundary &boundary, const Point &start, const Point &end, const Layer &layer, Polyline &result_out)
Definition AvoidCrossingPerimeters.cpp:657
static ExPolygons get_boundary(const Layer &layer)
Definition AvoidCrossingPerimeters.cpp:1054
static bool any_expolygon_contains(const ExPolygons &lslices_offset, const std::vector< BoundingBox > &lslices_offset_bboxes, const EdgeGrid::Grid &grid_lslices_offset, const Line &travel)
Definition AvoidCrossingPerimeters.cpp:681
static Polygons get_boundary_external(const Layer &layer)
Definition AvoidCrossingPerimeters.cpp:1091
S::iterator end(S &sh, const PathTag &)
Definition geometry_traits.hpp:620
Kernel::Point_2 Point
Definition point_areas.cpp:20
Polygons boundaries
Definition AvoidCrossingPerimeters.hpp:38
BoundingBoxf bbox
Definition AvoidCrossingPerimeters.hpp:40