diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 572bbcc55b..a5c1a66b08 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -729,6 +729,8 @@ static std::vector get_path_of_change_filament(const Print& print) gcode += gcodegen.writer().unlift(); // Make sure there is no z-hop (in most cases, there isn't). double current_z = gcodegen.writer().get_position().z(); + + if (z == -1.) // in case no specific z was provided, print at current_z pos z = current_z; @@ -741,7 +743,7 @@ static std::vector get_path_of_change_filament(const Print& print) || !needs_toolchange // this is just finishing the tower with no toolchange || is_ramming); - if (should_travel_to_tower) { + if (should_travel_to_tower || gcodegen.m_need_change_layer_lift_z) { // FIXME: It would be better if the wipe tower set the force_travel flag for all toolchanges, // then we could simplify the condition and make it more readable. gcode += gcodegen.retract(); @@ -767,10 +769,10 @@ static std::vector get_path_of_change_filament(const Print& print) toolchange_gcode_str = gcodegen.set_extruder(new_extruder_id, tcr.print_z); // TODO: toolchange_z vs print_z if (gcodegen.config().enable_prime_tower) { deretraction_str += gcodegen.writer().travel_to_z(z, "restore layer Z"); - Vec3d position{gcodegen.writer().get_position()}; - position.z() = z; - gcodegen.writer().set_position(position); - deretraction_str += gcodegen.unretract(); + Vec3d position{gcodegen.writer().get_position()}; + position.z() = z; + gcodegen.writer().set_position(position); + deretraction_str += gcodegen.unretract(); } } @@ -4516,12 +4518,11 @@ std::string GCode::change_layer(coordf_t print_z) comment << "move to next layer (" << m_layer_index << ")"; gcode += m_writer.travel_to_z(z, comment.str()); } - else { - //BBS: set m_need_change_layer_lift_z to be true so that z lift can be done in travel_to() function - m_need_change_layer_lift_z = true; - } + + m_need_change_layer_lift_z = true; m_nominal_z = z; + m_writer.get_position().z() = z; // forget last wiping path as wiping after raising Z is pointless // BBS. Dont forget wiping path to reduce stringing. @@ -6005,14 +6006,15 @@ std::string GCode::travel_to(const Point& point, ExtrusionRole role, std::string if (m_spiral_vase) { // No lazy z lift for spiral vase mode for (size_t i = 1; i < travel.size(); ++i) { - gcode += m_writer.travel_to_xy(this->point_to_gcode(travel.points[i]), comment + " travel_to_xy"); + gcode += m_writer.travel_to_xy(this->point_to_gcode(travel.points[i]), comment); } } else { if (travel.size() == 2) { // No extra movements emitted by avoid_crossing_perimeters, simply move to the end point with z change const auto& dest2d = this->point_to_gcode(travel.points.back()); Vec3d dest3d(dest2d(0), dest2d(1), z == DBL_MAX ? m_nominal_z : z); - gcode += m_writer.travel_to_xyz(dest3d, comment + " travel_to_xyz"); + gcode += m_writer.travel_to_xyz(dest3d, comment, m_need_change_layer_lift_z); + m_need_change_layer_lift_z = false; } else { // Extra movements emitted by avoid_crossing_perimeters, lift the z to normal height at the beginning, then apply the z // ratio at the last point @@ -6021,21 +6023,23 @@ std::string GCode::travel_to(const Point& point, ExtrusionRole role, std::string // Lift to normal z at beginning Vec2d dest2d = this->point_to_gcode(travel.points[i]); Vec3d dest3d(dest2d(0), dest2d(1), m_nominal_z); - gcode += m_writer.travel_to_xyz(dest3d, comment + " travel_to_xyz"); + gcode += m_writer.travel_to_xyz(dest3d, comment, m_need_change_layer_lift_z); + m_need_change_layer_lift_z = false; } else if (z != DBL_MAX && i == travel.size() - 1) { // Apply z_ratio for the very last point Vec2d dest2d = this->point_to_gcode(travel.points[i]); Vec3d dest3d(dest2d(0), dest2d(1), z); - gcode += m_writer.travel_to_xyz(dest3d, comment + " travel_to_xyz"); + gcode += m_writer.travel_to_xyz(dest3d, comment); } else { // For all points in between, no z change - gcode += m_writer.travel_to_xy(this->point_to_gcode(travel.points[i]), comment + " travel_to_xy"); + gcode += m_writer.travel_to_xy(this->point_to_gcode(travel.points[i]), comment); } } } } this->set_last_pos(travel.points.back()); } + return gcode; } diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index 67ffb9eb51..9e9e8ea22e 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -1127,7 +1127,7 @@ void WipeTower2::toolchange_Load( WipeTowerWriter2 &writer, const WipeTower::box_coordinates &cleaning_box) { - if (m_semm && (m_parking_pos_retraction != 0 || m_extra_loading_move != 0)) { + if (m_semm && m_enable_filament_ramming && (m_parking_pos_retraction != 0 || m_extra_loading_move != 0)) { float xl = cleaning_box.ld.x() + m_perimeter_width * 0.75f; float xr = cleaning_box.rd.x() - m_perimeter_width * 0.75f; float oldx = writer.x(); // the nozzle is in place to do the first wiping moves, we will remember the position diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index ad3ad640c0..d17527d115 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -440,7 +440,7 @@ std::string GCodeWriter::travel_to_xy(const Vec2d &point, const std::string &com return w.string(); } -std::string GCodeWriter::travel_to_xyz(const Vec3d &point, const std::string &comment) +std::string GCodeWriter::travel_to_xyz(const Vec3d &point, const std::string &comment, bool force_z) { // FIXME: This function was not being used when travel_speed_z was separated (bd6badf). // Calculation of feedrate was not updated accordingly. If you want to use @@ -526,7 +526,7 @@ std::string GCodeWriter::travel_to_xyz(const Vec3d &point, const std::string &co this->set_current_position_clear(true); return slop_move + xy_z_move; } - else if (!this->will_move_z(point(2))) { + else if (!force_z && !this->will_move_z(point(2))) { double nominal_z = m_pos(2) - m_lifted; m_lifted -= (point(2) - nominal_z); // In case that z_hop == layer_height we could end up with almost zero in_m_lifted diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index 28569e909d..038325b446 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -69,7 +69,7 @@ public: // SoftFever NOTE: the returned speed is mm/minute double get_current_speed() const { return m_current_speed;} std::string travel_to_xy(const Vec2d &point, const std::string &comment = std::string()); - std::string travel_to_xyz(const Vec3d &point, const std::string &comment = std::string()); + std::string travel_to_xyz(const Vec3d &point, const std::string &comment = std::string(), bool force_z = false); std::string travel_to_z(double z, const std::string &comment = std::string()); bool will_move_z(double z) const; std::string extrude_to_xy(const Vec2d &point, double dE, const std::string &comment = std::string(), bool force_no_extrusion = false); @@ -81,7 +81,8 @@ public: std::string unretract(); std::string lift(LiftType lift_type = LiftType::NormalLift, bool spiral_vase = false); std::string unlift(); - Vec3d get_position() const { return m_pos; } + const Vec3d& get_position() const { return m_pos; } + Vec3d& get_position() { return m_pos; } void set_position(const Vec3d& in) { m_pos = in; } double get_zhop() const { return m_lifted; }