diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 5c6dc30dc..1a2fa9c96 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -3876,6 +3876,9 @@ std::string GCode::_after_extrude(const ExtrusionPath &path) { else gcode += ";_EXTRUDE_END\n"; + if (path.role() != ExtrusionRole::erGapFill ) { + m_last_notgapfill_extrusion_role = path.role(); + } this->set_last_pos(path.last_point()); return gcode; @@ -4003,11 +4006,14 @@ std::string GCode::retract(bool toolchange) length is honored in case wipe path was too short. */ gcode += toolchange ? m_writer.retract_for_toolchange() : m_writer.retract(); bool need_lift = !m_writer.tool_is_extruder() || toolchange || (BOOL_EXTRUDER_CONFIG(retract_lift_first_layer) && m_config.print_retract_lift.value != 0 && this->m_layer_index == 0); + bool last_fill_extusion_role_top_infill = (this->m_last_extrusion_role == ExtrusionRole::erTopSolidInfill); + if(this->m_last_extrusion_role == ExtrusionRole::erGapFill) + last_fill_extusion_role_top_infill = (this->m_last_notgapfill_extrusion_role == ExtrusionRole::erTopSolidInfill); if (!need_lift && m_config.print_retract_lift.value != 0) { if (EXTRUDER_CONFIG_WITH_DEFAULT(retract_lift_top, "") == "Not on top") - need_lift = (this->m_last_extrusion_role != ExtrusionRole::erTopSolidInfill); + need_lift = !last_fill_extusion_role_top_infill; else if (EXTRUDER_CONFIG_WITH_DEFAULT(retract_lift_top, "") == "Only on top") - need_lift = (this->m_last_extrusion_role == ExtrusionRole::erTopSolidInfill); + need_lift = last_fill_extusion_role_top_infill; else need_lift = true; } diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 3c92322fc..e9df3df2a 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -359,6 +359,8 @@ private: double m_volumetric_speed; // Support for the extrusion role markers. Which marker is active? ExtrusionRole m_last_extrusion_role; + // Not know the gapfill role for retract_lift_top + ExtrusionRole m_last_notgapfill_extrusion_role; // Support for G-Code Processor float m_last_height{ 0.0f }; float m_last_layer_z{ 0.0f };