133{
134#ifdef DEBUG_FILES
135 FILE *debug_file = boost::nowide::fopen(
debug_out_path(
"object_malformations.obj").c_str(),
"w");
136 FILE *full_file = boost::nowide::fopen(
debug_out_path(
"object_full.obj").c_str(),
"w");
137#endif
138
139 LD prev_layer_lines{};
140
141 for (
Layer *l : layers) {
142 l->curled_lines.clear();
143 std::vector<Linef> boundary_lines = l->lower_layer !=
nullptr ?
to_unscaled_linesf(l->lower_layer->lslices) :
std::vector<
Linef>();
145 std::vector<ExtrusionLine> current_layer_lines;
146 for (const LayerRegion *layer_region : l->regions()) {
147 for (const ExtrusionEntity *extrusion : layer_region->perimeters.flatten().entities) {
148 if (extrusion->role() != Slic3r::erExternalPerimeter)
149 continue;
150
151 Points extrusion_pts;
152 extrusion->collect_points(extrusion_pts);
153 float flow_width = get_flow_width(layer_region, extrusion->role());
154 auto annotated_points = estimate_points_properties<true, true, false, false>(extrusion_pts,
155 prev_layer_lines,
156 flow_width,
157 params.bridge_distance);
158 for (size_t i = 0; i < annotated_points.size(); ++i) {
159 const ExtendedPoint<2>& a = i > 0 ? annotated_points[i - 1] : annotated_points[i];
160 const ExtendedPoint<2>& b = annotated_points[i];
161 ExtrusionLine line_out{a.position.cast<float>(), b.position.cast<float>(), float((a.position - b.position).norm()),
162 extrusion};
163
164 Vec2f middle = 0.5 * (line_out.a + line_out.b);
165 auto [middle_distance, bottom_line_idx, x] = prev_layer_lines.distance_from_lines_extra<false>(middle);
166 ExtrusionLine bottom_line = prev_layer_lines.get_lines().empty() ? ExtrusionLine{} :
167 prev_layer_lines.get_line(bottom_line_idx);
168
169
170 float sign = (prev_layer_boundary.distance_from_lines<true>(middle.cast<double>()) + 0.5f * flow_width) < 0.0f ? -1.0f :
171 1.0f;
172
173 line_out.curled_up_height = estimate_curled_up_height(middle_distance * sign * params.curled_distance_expansion, 0.5 * (a.curvature + b.curvature),
174 l->height, flow_width, bottom_line.curled_up_height, params);
175
176 current_layer_lines.push_back(line_out);
177 }
178 }
179 }
180
181 for (const ExtrusionLine &line : current_layer_lines) {
184 }
185 }
186
187#ifdef DEBUG_FILES
188 for (const ExtrusionLine &line : current_layer_lines) {
191 fprintf(debug_file, "v %f %f %f %f %f %f\n", line.b[0], line.b[1], l->print_z, color[0], color[1], color[2]);
192 }
193 }
194 for (const ExtrusionLine &line : current_layer_lines) {
196 fprintf(full_file, "v %f %f %f %f %f %f\n", line.b[0], line.b[1], l->print_z, color[0], color[1], color[2]);
197 }
198#endif
199
200 prev_layer_lines =
LD{current_layer_lines};
201 }
202
203#ifdef DEBUG_FILES
204 fclose(debug_file);
205 fclose(full_file);
206#endif
207}
#define EPSILON
Definition ColorUtils.cpp:64
Definition AABBTreeLines.hpp:307
static Point new_scale(coordf_t x, coordf_t y)
Definition Point.hpp:214
AABBTreeLines::LinesDistancer< ExtrusionLine > LD
Definition SupportSpotsGenerator.cpp:78
std::string debug_out_path(const char *name,...)
Definition utils.cpp:382
Eigen::Matrix< float, 3, 1, Eigen::DontAlign > Vec3f
Definition Point.hpp:65
Linesf to_unscaled_linesf(const ExPolygons &src)
Definition ExPolygon.hpp:182
const float curling_tolerance_limit
Definition SupportSpotsGenerator.hpp:51