fix broken travel (update of last pos on wipe)

supermerill/SuperSlicer#2112
This commit is contained in:
supermerill 2021-12-28 23:49:06 +01:00
parent 5ac295a83f
commit d2c6929192

View File

@ -3090,7 +3090,7 @@ std::string GCode::extrude_loop_vase(const ExtrusionLoop &original_loop, const s
z_per_length * line_length / nb_sections }; z_per_length * line_length / nb_sections };
coordf_t current_height_internal = current_height + height_increment / 2; coordf_t current_height_internal = current_height + height_increment / 2;
//ensure you go to the good xyz //ensure you go to the good xyz
if( (last_point - previous).norm() > EPSILON) if ((last_point - previous).norm() > EPSILON)
gcode += m_writer.extrude_to_xyz(last_point, 0, description); gcode += m_writer.extrude_to_xyz(last_point, 0, description);
//extrusions //extrusions
for (int i = 0; i < nb_sections - 1; i++) { for (int i = 0; i < nb_sections - 1; i++) {
@ -4286,13 +4286,18 @@ Polyline GCode::travel_to(std::string &gcode, const Point &point, ExtrusionRole
Point last_post_before_retract = this->last_pos(); Point last_post_before_retract = this->last_pos();
gcode += this->retract(); gcode += this->retract();
// When "Wipe while retracting" is enabled, then extruder moves to another position, and travel from this position can cross perimeters. // When "Wipe while retracting" is enabled, then extruder moves to another position, and travel from this position can cross perimeters.
bool updated_first_pos = false;
if (last_post_before_retract != this->last_pos() && can_avoid_cross_peri) { if (last_post_before_retract != this->last_pos() && can_avoid_cross_peri) {
// Is the distance is short enough to just shortcut it? // Is the distance is short enough to just shortcut it?
if (last_post_before_retract.distance_to(this->last_pos()) > scale_d(EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0.4)) * 2) { if (last_post_before_retract.distance_to(this->last_pos()) > scale_d(EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0.4)) * 2) {
// Because of it, it is necessary to redo the thing // Because of it, it is necessary to redo the thing
travel = m_avoid_crossing_perimeters.travel_to(*this, point); travel = m_avoid_crossing_perimeters.travel_to(*this, point);
updated_first_pos = true;
} }
} }
if (!updated_first_pos) {
travel.points.front() = this->last_pos();
}
} else { } else {
// Reset the wipe path when traveling, so one would not wipe along an old path. // Reset the wipe path when traveling, so one would not wipe along an old path.
m_wipe.reset_path(); m_wipe.reset_path();