From 36fcf173580956ad7912e784e57f3ee06ab4768d Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Thu, 20 Nov 2025 16:11:12 +0200 Subject: [PATCH] Reduce artifacts from short travel moves before external perimeters (#10722) Accel to extloop Co-authored-by: SoftFever --- src/libslic3r/GCode.cpp | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 58281f7ef7..a5af72f4c9 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -6851,21 +6851,37 @@ std::string GCode::travel_to(const Point& point, ExtrusionRole role, std::string // Orca: we don't need to optimize the Klipper as only set once double jerk_to_set = 0.0; unsigned int acceleration_to_set = 0; + if (this->on_first_layer()) { if (m_config.default_acceleration.value > 0 && m_config.initial_layer_acceleration.value > 0) { acceleration_to_set = (unsigned int) floor(m_config.initial_layer_acceleration.value + 0.5); } + if (m_config.default_jerk.value > 0 && m_config.initial_layer_jerk.value > 0) { jerk_to_set = m_config.initial_layer_jerk.value; } } else { - if (m_config.default_acceleration.value > 0 && m_config.travel_acceleration.value > 0) { - acceleration_to_set = (unsigned int) floor(m_config.travel_acceleration.value + 0.5); + if (m_config.default_acceleration.value > 0) { + if (role == erExternalPerimeter && travel.length() < scale_(EXTRUDER_CONFIG(retraction_minimum_travel))) { + if (m_config.outer_wall_acceleration.value > 0) + acceleration_to_set = (unsigned int) floor(m_config.outer_wall_acceleration.value + 0.5); + } else { + if (m_config.travel_acceleration.value > 0) + acceleration_to_set = (unsigned int) floor(m_config.travel_acceleration.value + 0.5); + } } - if (m_config.default_jerk.value > 0 && m_config.travel_jerk.value > 0) { - jerk_to_set = m_config.travel_jerk.value; + + if (m_config.default_jerk.value > 0) { + if (role == erExternalPerimeter && travel.length() < scale_(EXTRUDER_CONFIG(retraction_minimum_travel))) { + if (m_config.outer_wall_jerk.value > 0) + jerk_to_set = m_config.outer_wall_jerk.value; + } else { + if (m_config.travel_jerk.value > 0) + jerk_to_set = m_config.travel_jerk.value; + } } } + if (m_writer.get_gcode_flavor() == gcfKlipper) { gcode += m_writer.set_accel_and_jerk(acceleration_to_set, jerk_to_set); } else {