diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 064120fc26..dda1d0c5ed 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -769,7 +769,7 @@ static std::vector get_path_of_change_filament(const Print& print) gcodegen.m_wipe.reset_path(); // We don't want wiping on the ramming lines. 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"); + deretraction_str += gcodegen.writer().travel_to_z(z, "Force restore layer Z", true); Vec3d position{gcodegen.writer().get_position()}; position.z() = z; gcodegen.writer().set_position(position); @@ -5210,10 +5210,11 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, auto target_z = get_sloped_z(sloped->slope_begin.z_ratio); slope_need_z_travel = m_writer.will_move_z(target_z); } - // go to first point of extrusion path - //BBS: path.first_point is 2D point. But in lazy raise case, lift z is done in travel_to function. - //Add m_need_change_layer_lift_z when change_layer in case of no lift if m_last_pos is equal to path.first_point() by chance + // Move to first point of extrusion path + // path is 2D. But in slope lift case, lift z is done in travel_to function. + // Add m_need_change_layer_lift_z when change_layer in case of no lift if m_last_pos is equal to path.first_point() by chance if (!m_last_pos_defined || m_last_pos != path.first_point() || m_need_change_layer_lift_z || slope_need_z_travel) { + const bool _last_pos_undefined = !m_last_pos_defined; gcode += this->travel_to( path.first_point(), path.role(), @@ -5221,8 +5222,13 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, sloped == nullptr ? DBL_MAX : get_sloped_z(sloped->slope_begin.z_ratio) ); m_need_change_layer_lift_z = false; + // Orca: force restore Z after unknown last pos + if (_last_pos_undefined && !slope_need_z_travel) { + gcode += this->writer().travel_to_z(m_last_layer_z, "force restore Z after unknown last pos", true); + } } + // if needed, write the gcode_label_objects_end then gcode_label_objects_start // should be already done by travel_to, but just in case m_writer.add_object_change_labels(gcode); @@ -6612,6 +6618,8 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z, bool b if (m_config.enable_pressure_advance.get_at(extruder_id)) { gcode += m_writer.set_pressure_advance(m_config.pressure_advance.get_at(extruder_id)); } + //Orca: tool changer or IDEX's firmware may change Z position, so we set it to unknown/undefined + m_last_pos_defined = false; return gcode; } diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index 9decfc4c96..8d460af8f7 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -1350,7 +1350,7 @@ void WipeTower2::set_extruder(size_t idx, const PrintConfig& config) // We will use the same variables internally, but the correspondence to the configuration options will be different. float vol = config.filament_multitool_ramming_volume.get_at(idx); float flow = config.filament_multitool_ramming_flow.get_at(idx); - m_filpar[idx].multitool_ramming = config.filament_multitool_ramming.get_at(idx); + m_filpar[idx].multitool_ramming = config.filament_multitool_ramming.get_at(idx) && vol > 0.f && flow > 0.f; m_filpar[idx].ramming_line_width_multiplicator = 2.; m_filpar[idx].ramming_step_multiplicator = 1.; @@ -1360,7 +1360,7 @@ void WipeTower2::set_extruder(size_t idx, const PrintConfig& config) // ramming_speed vector that would respect both the volume and flow (because of // rounding issues with small volumes and high flow). m_filpar[idx].ramming_speed.push_back(flow); - m_filpar[idx].multitool_ramming_time = vol/flow; + m_filpar[idx].multitool_ramming_time = flow > 0.f ? vol/flow : 0.f; } m_used_filament_length.resize(std::max(m_used_filament_length.size(), idx + 1)); // makes sure that the vector is big enough so we don't have to check later diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index 8d79fe1f40..ba36c2b6d4 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -633,12 +633,12 @@ std::string GCodeWriter::travel_to_xyz(const Vec3d &point, const std::string &co return out_string; } -std::string GCodeWriter::travel_to_z(double z, const std::string &comment) +std::string GCodeWriter::travel_to_z(double z, const std::string &comment, bool force) { /* If target Z is lower than current Z but higher than nominal Z we don't perform the move but we only adjust the nominal Z by reducing the lift amount that will be used for unlift. */ - if (!this->will_move_z(z)) { + if (!force && !this->will_move_z(z)) { double nominal_z = m_pos(2) - m_lifted; m_lifted -= (z - nominal_z); if (std::abs(m_lifted) < EPSILON) diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index e4eacd22d6..103bfb27c2 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -72,7 +72,7 @@ public: 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(), bool force_z = false); - std::string travel_to_z(double z, const std::string &comment = std::string()); + std::string travel_to_z(double z, const std::string &comment = std::string(), bool force = false); 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); //BBS: generate G2 or G3 extrude which moves by arc diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 31994e1f04..33f441d2f9 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3809,6 +3809,10 @@ void TabFilament::toggle_options() "filament_unloading_speed_start", "filament_unloading_speed", "filament_toolchange_delay", "filament_cooling_moves", "filament_cooling_initial_speed", "filament_cooling_final_speed"}) toggle_option(el, !is_BBL_printer); + + bool multitool_ramming = m_config->opt_bool("filament_multitool_ramming", 0); + toggle_option("filament_multitool_ramming_volume", multitool_ramming); + toggle_option("filament_multitool_ramming_flow", multitool_ramming); } }