997{
999 return;
1000
1001 Flow flow = interface_flow_src.with_height(top_contact_layer.layer->height);
1002
1004 if (top_contact_layer.layer->overhang_polygons != nullptr)
1005 overhang_polygons = std::move(*top_contact_layer.layer->overhang_polygons);
1006
1007
1008
1010
1011
1012 coord_t circle_grid_resolution = 1;
1013 coord_t circle_grid_powerof2 = 0;
1014 {
1015
1017 while (circle_grid_resolution < circle_grid_resolution_non_powerof2) {
1018 circle_grid_resolution <<= 1;
1019 ++ circle_grid_powerof2;
1020 }
1021 }
1022
1023 struct PointAccessor {
1024 const Point* operator()(
const Point &pt)
const {
return &pt; }
1025 };
1026 typedef ClosestPointInRadiusLookup<Point, PointAccessor> ClosestPointLookupType;
1027
1029 {
1030
1031
1033
1036 for (ExPolygons::iterator it_contact_expoly = top_contact_expolygons.begin(); it_contact_expoly != top_contact_expolygons.end(); ++ it_contact_expoly) {
1037
1041
1042 for (size_t i_contour = 0; i_contour <= it_contact_expoly->holes.size(); ++ i_contour) {
1043 Polygon &
contour = (i_contour == 0) ? it_contact_expoly->contour : it_contact_expoly->
holes[i_contour - 1];
1044 const Point *seg_current_pt =
nullptr;
1047
1048
1049
1050 if (circle_centers.empty()) {
1051
1053 seg_current_t = 0.;
1054 center_last = *seg_current_pt;
1055 circle_centers_lookup.insert(center_last);
1056 circle_centers.push_back(center_last);
1057 }
1059
1060 const Point &p1 = *(it-1);
1061 const Point &p2 = *it;
1062
1066 coordf_t b = 2. * v_seg.dot(v_cntr);
1068 coordf_t disc = b * b - 4. * a * c;
1069 if (disc > 0.) {
1070
1071 coordf_t t1 = (-b - sqrt(disc)) / (2. * a);
1072 coordf_t t2 = (-b + sqrt(disc)) / (2. * a);
1073 coordf_t t0 = (seg_current_pt == &p1) ? seg_current_t : 0.;
1074
1076 if (t0 <= t1)
1077 t = t0;
1078 else if (t2 <= 1.)
1079 t = t2;
1080 else {
1081
1082 seg_current_pt = nullptr;
1083 continue;
1084 }
1085 seg_current_pt = &p1;
1086 seg_current_t = t;
1088
1089
1090 std::pair<const Point*, coordf_t> circle_closest = circle_centers_lookup.find(center_last);
1091 if (circle_closest.first != nullptr) {
1092 -- it;
1093 continue;
1094 }
1095 } else {
1096
1097 seg_current_pt = &p1;
1098 seg_current_t = 0.;
1099 center_last = p1;
1100 }
1101
1102 circle_centers_lookup.insert(center_last);
1103 circle_centers.push_back(center_last);
1104 }
1105 external_loops.push_back(std::move(
contour));
1106 for (
const Point &
center : circle_centers) {
1107 circles.push_back(
circle);
1108 circles.back().translate(
center);
1109 }
1110 }
1111 }
1112 }
1113
1114 loops0 =
diff(external_loops, circles);
1115 }
1116
1118 {
1119
1124 loops0,
1125 i * flow.scaled_spacing() + 0.5f * flow.scaled_spacing(),
1126 0.5f * flow.scaled_spacing()));
1127
1128
1129
1130 loop_lines.reserve(loop_polygons.size());
1131 std::unordered_map<Point, int, PointHash> map_split_points;
1132 for (Polygons::const_iterator it = loop_polygons.begin(); it != loop_polygons.end(); ++ it) {
1133 assert(map_split_points.find(it->first_point()) == map_split_points.end());
1134 map_split_points[it->first_point()] = -1;
1135 loop_lines.push_back(it->split_at_first_point());
1136 }
1138
1139
1140 for (int i_line = 0; i_line < int(loop_lines.size()); ++ i_line) {
1141 Polyline &polyline = loop_lines[i_line];
1142 auto it = map_split_points.find(polyline.first_point());
1143 if (it != map_split_points.end()) {
1144
1145
1146 assert(it->second != -2);
1147 if (it->second < 0) {
1148
1149 it->second = i_line;
1150 } else {
1151
1152 Polyline &polyline_1st = loop_lines[it->second];
1153 assert(polyline_1st.first_point() == it->first || polyline_1st.last_point() == it->first);
1154 if (polyline_1st.first_point() == it->first)
1155 polyline_1st.reverse();
1156 polyline_1st.append(std::move(polyline));
1157 it->second = -2;
1158 }
1159 continue;
1160 }
1161 it = map_split_points.find(polyline.last_point());
1162 if (it != map_split_points.end()) {
1163
1164
1165 assert(it->second != -2);
1166 if (it->second < 0) {
1167
1168 it->second = i_line;
1169 } else {
1170
1171 Polyline &polyline_1st = loop_lines[it->second];
1172 assert(polyline_1st.first_point() == it->first || polyline_1st.last_point() == it->first);
1173 if (polyline_1st.first_point() == it->first)
1174 polyline_1st.reverse();
1175 polyline.reverse();
1176 polyline_1st.append(std::move(polyline));
1177 it->second = -2;
1178 }
1179 }
1180 }
1181
1183 }
1184
1185
1186
1187
1188
1189
1190
1191
1192 top_contact_layer.set_polygons_to_extrude(
diff(top_contact_layer.layer->polygons,
offset(loop_lines,
float(
circle_radius * 1.1))));
1193
1194
1196 top_contact_layer.extrusions,
1197 std::move(loop_lines),
1199}
#define SUPPORT_MATERIAL_MARGIN
Definition PrintObject.cpp:5149
Points points
Definition MultiPoint.hpp:22
Polyline split_at_first_point() const
Definition Polygon.hpp:60
#define SCALED_EPSILON
Definition libslic3r.h:109
#define scale_(val)
Definition libslic3r.h:106
int64_t coord_t
Definition libslic3r.h:48
double coordf_t
Definition GUI_ObjectList.hpp:46
std::vector< ExPolygon > ExPolygons
Definition ExPolygon.hpp:20
Slic3r::Polygons expand(const Slic3r::Polygon &polygon, const float delta, JoinType joinType=DefaultJoinType, double miterLimit=DefaultMiterLimit)
Definition ClipperUtils.hpp:397
void extrusion_entities_append_paths(ExtrusionEntitiesPtr &dst, Polylines &polylines, ExtrusionRole role, double mm3_per_mm, float width, float height, bool can_reverse=true)
Definition ExtrusionEntity.hpp:608
std::vector< Polyline > Polylines
Definition Polyline.hpp:22
void center(ExPolygonsWithIds &e)
Definition Emboss.cpp:1382
@ erSupportMaterialInterface
Definition ExtrusionEntity.hpp:42
std::vector< Polygon, PointsAllocator< Polygon > > Polygons
Definition Polygon.hpp:22
Slic3r::Polygons offset(const Slic3r::Polygon &polygon, const float delta, JoinType joinType, double miterLimit)
Definition ClipperUtils.cpp:582
bool remove_degenerate(Polygons &polys)
Definition Polygon.cpp:610
Slic3r::ExPolygons offset_ex(const Slic3r::Polygons &polygons, const float delta, JoinType joinType, double miterLimit)
Definition ClipperUtils.cpp:605
Slic3r::Polygons opening(const Slic3r::Polygons &polygons, const float delta1, const float delta2, JoinType joinType, double miterLimit)
Definition ClipperUtils.cpp:696
std::vector< Point, PointsAllocator< Point > > Points
Definition Point.hpp:73
void polygons_append(Polygons &dst, const ExPolygon &src)
Definition ExPolygon.hpp:411
Slic3r::ExPolygons union_ex(const Slic3r::Polygons &subject, PolyFillType fill_type)
Definition ClipperUtils.cpp:1011
Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::Polygon &clip)
Definition ClipperUtils.cpp:1111
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > Vec2d
Definition Point.hpp:67
Slic3r::Polygons diff(const Slic3r::Polygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset)
Definition ClipperUtils.cpp:731
const Polygon & contour(const ExPolygon &p)
Definition AGGRaster.hpp:30
const Polygons & holes(const ExPolygon &p)
Definition AGGRaster.hpp:31
Slic3r::Polygon Polygon
Definition Emboss.cpp:101