150 {
152 const Extruder &extruder = *gcodegen.writer().extruder();
153
154
155 if (double retract_length = extruder.retract_to_go(toolchange ? extruder.retract_length_toolchange() : extruder.retract_length());
156 retract_length > 0 && this->
path.
size() >= 2) {
157
158
159 const double wipe_speed = gcodegen.writer().config.travel_speed.value * 0.8;
160
161
162 const double xy_to_e = 0.95 * extruder.retract_speed() / wipe_speed;
163
164 Vec2d prev = gcodegen.point_to_gcode_quantized(gcodegen.last_pos());
166 Vec2d p = gcodegen.point_to_gcode_quantized(*(++ it));
167 if (p != prev) {
171 for (; it !=
end && !
done; ++ it) {
172 p = gcodegen.point_to_gcode_quantized(*it);
175 if (dE > retract_length -
EPSILON) {
176 if (dE > retract_length +
EPSILON)
177
178 p = prev + (p - prev) * (retract_length / dE);
179 dE = retract_length;
181 }
182
183
184 gcode += gcodegen.writer().set_speed(wipe_speed * 60, {}, gcodegen.enable_cooling_markers() ?
";_WIPE" :
"");
185 gcode += gcodegen.writer().extrude_to_xy(p, -dE,
"wipe and retract");
186 prev = p;
187 retract_length -= dE;
188 }
189
191 gcodegen.set_last_pos(gcodegen.gcode_to_point(prev));
192 }
193 }
194
195
197 return gcode;
198 }
static volatile int done
Definition bitbang.c:50
static const std::string & reserved_tag(ETags tag)
Definition GCodeProcessor.hpp:186
Points points
Definition MultiPoint.hpp:18
size_t size() const
Definition MultiPoint.hpp:39
void reset_path()
Definition GCode.hpp:58
static constexpr double EPSILON
Definition libslic3r.h:51
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > Vec2d
Definition Point.hpp:51
static coordf_t segment_length(const Polygon &poly, size_t seg1, const Point &p1, size_t seg2, const Point &p2)
Definition FillRectilinear.cpp:44
S::iterator end(S &sh, const PathTag &)
Definition geometry_traits.hpp:620