From 2e61d9eab2dcf2fef3511bb5606641cb9509eee1 Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Wed, 22 Apr 2026 00:08:55 +0300 Subject: [PATCH 1/3] Correct gap fill width bounds in outer-only and mixed-wall cases (#12057) --- src/libslic3r/PerimeterGenerator.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 1fa4d58bb0..f8827923f4 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -1562,9 +1562,9 @@ void PerimeterGenerator::process_classic() } // for each loop of an island // fill gaps - if (! gaps.empty()) { - // collapse - double min = 0.2 * perimeter_width * (1 - INSET_OVERLAP_TOLERANCE); + if (! gaps.empty()) { // collapse + // ORCA: Use the smaller width as the lower bound to avoid overestimating safe overlap + double min = 0.2 * std::min(perimeter_width, ext_perimeter_width) * (1 - INSET_OVERLAP_TOLERANCE); double max = 2. * perimeter_spacing; ExPolygons gaps_ex = diff_ex( //FIXME offset2 would be enough and cheaper. From a2cff48a469a7b50dca5c0095b942cfdef54faea Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Wed, 22 Apr 2026 02:40:17 +0300 Subject: [PATCH 2/3] Extend short-travel smoothing to external overhang walls (#11975) --- src/libslic3r/GCode.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 04a2df48db..b90d70fecd 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -7091,9 +7091,16 @@ std::string GCode::travel_to(const Point& point, ExtrusionRole role, std::string if (m_config.default_jerk.value > 0 && m_config.initial_layer_jerk.value > 0) { jerk_to_set = m_config.initial_layer_jerk.value; } - } else { + } else { // ORCA: Handle short-travel acceleration and jerk for outer perimeters (if applicable) + const bool is_short_travel = travel.length() < scale_(EXTRUDER_CONFIG(retraction_minimum_travel)); + if (m_config.default_acceleration.value > 0) { - if (role == erExternalPerimeter && travel.length() < scale_(EXTRUDER_CONFIG(retraction_minimum_travel))) { + if (role == erOverhangPerimeter && is_short_travel) { + const double bridge_acceleration = m_config.get_abs_value("bridge_acceleration"); + + if (bridge_acceleration > 0) + acceleration_to_set = (unsigned int) floor(bridge_acceleration + 0.5); + } else if (role == erExternalPerimeter && is_short_travel) { if (m_config.outer_wall_acceleration.value > 0) acceleration_to_set = (unsigned int) floor(m_config.outer_wall_acceleration.value + 0.5); } else { @@ -7103,7 +7110,7 @@ std::string GCode::travel_to(const Point& point, ExtrusionRole role, std::string } if (m_config.default_jerk.value > 0) { - if (role == erExternalPerimeter && travel.length() < scale_(EXTRUDER_CONFIG(retraction_minimum_travel))) { + if ((role == erExternalPerimeter || role == erOverhangPerimeter) && is_short_travel) { if (m_config.outer_wall_jerk.value > 0) jerk_to_set = m_config.outer_wall_jerk.value; } else { From 00704c368fedeac85f620af6f8ce29fe599525aa Mon Sep 17 00:00:00 2001 From: Richard Copra <137560494+rcopra@users.noreply.github.com> Date: Wed, 22 Apr 2026 03:55:24 +0200 Subject: [PATCH 3/3] make initial layer travel move acceleration and jerk configurable (#11674) * make initial layer travel move acceleration and jerk configurable * Update spelling to match UI pattern * Update min integer and re-order to match patterns --------- Co-authored-by: Thomas Scheiblauer Co-authored-by: Ioannis Giannakas <59056762+igiannakas@users.noreply.github.com> --- localization/i18n/OrcaSlicer.pot | 12 ++++++++++++ localization/i18n/de/OrcaSlicer_de.po | 12 ++++++++++++ localization/i18n/en/OrcaSlicer_en.po | 12 ++++++++++++ src/libslic3r/GCode.cpp | 12 +++++++----- src/libslic3r/Preset.cpp | 2 +- src/libslic3r/Print.cpp | 2 ++ src/libslic3r/PrintConfig.cpp | 18 ++++++++++++++++++ src/libslic3r/PrintConfig.hpp | 2 ++ src/slic3r/GUI/Tab.cpp | 2 ++ 9 files changed, 68 insertions(+), 6 deletions(-) diff --git a/localization/i18n/OrcaSlicer.pot b/localization/i18n/OrcaSlicer.pot index bd4afb8adc..86c732f29b 100644 --- a/localization/i18n/OrcaSlicer.pot +++ b/localization/i18n/OrcaSlicer.pot @@ -12999,6 +12999,18 @@ msgstr "" msgid "Travel speed of the first layer." msgstr "" +msgid "First layer travel acceleration" +msgstr "" + +msgid "Travel acceleration of first layer." +msgstr "" + +msgid "First layer travel jerk" +msgstr "" + +msgid "Travel jerk of first layer." +msgstr "" + msgid "Number of slow layers" msgstr "" diff --git a/localization/i18n/de/OrcaSlicer_de.po b/localization/i18n/de/OrcaSlicer_de.po index 2a338e7afe..f507299180 100644 --- a/localization/i18n/de/OrcaSlicer_de.po +++ b/localization/i18n/de/OrcaSlicer_de.po @@ -15193,6 +15193,18 @@ msgstr "Bewegung" msgid "Travel speed of the first layer." msgstr "Bewegungsgeschwindigkeit der ersten Schicht" +msgid "First layer travel acceleration" +msgstr "Eilgang Beschleunigung" + +msgid "Travel acceleration of first layer." +msgstr "Eilgang Beschleunigung der ersten Schicht." + +msgid "First layer travel jerk" +msgstr "Eilgang Ruck" + +msgid "Travel jerk of first layer." +msgstr "Eilgang Ruck der ersten Schicht." + msgid "Number of slow layers" msgstr "Anzahl der langsamen Schichten" diff --git a/localization/i18n/en/OrcaSlicer_en.po b/localization/i18n/en/OrcaSlicer_en.po index 3c6b7b9040..b1b8aad458 100644 --- a/localization/i18n/en/OrcaSlicer_en.po +++ b/localization/i18n/en/OrcaSlicer_en.po @@ -13280,6 +13280,18 @@ msgstr "" msgid "Travel speed of the first layer." msgstr "" +msgid "First layer travel acceleration" +msgstr "" + +msgid "Travel acceleration of first layer." +msgstr "" + +msgid "First layer travel jerk" +msgstr "" + +msgid "Travel jerk of first layer." +msgstr "" + #, fuzzy msgid "Number of slow layers" msgstr "This is the number of top interface layers." diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index b90d70fecd..3658070fdb 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -7084,12 +7084,14 @@ std::string GCode::travel_to(const Point& point, ExtrusionRole role, std::string 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); + unsigned int initial_layer_travel_acceleration = m_config.get_abs_value("initial_layer_travel_acceleration"); + double initial_layer_travel_jerk = m_config.get_abs_value("initial_layer_travel_jerk"); + + if (m_config.default_acceleration.value > 0 && initial_layer_travel_acceleration > 0) { + acceleration_to_set = (unsigned int) floor(initial_layer_travel_acceleration + 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; + if (m_config.default_jerk.value > 0 && initial_layer_travel_jerk > 0) { + jerk_to_set = initial_layer_travel_jerk; } } else { // ORCA: Handle short-travel acceleration and jerk for outer perimeters (if applicable) const bool is_short_travel = travel.length() < scale_(EXTRUDER_CONFIG(retraction_minimum_travel)); diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index f8001d2806..65397d11e1 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -944,7 +944,7 @@ static std::vector s_Preset_print_options { "bridge_density","internal_bridge_density", "precise_outer_wall", "bridge_acceleration", "sparse_infill_acceleration", "internal_solid_infill_acceleration", "tree_support_auto_brim", "tree_support_brim_width", "gcode_comments", "gcode_label_objects", - "initial_layer_travel_speed", "exclude_object", "slow_down_layers", "infill_anchor", "infill_anchor_max","initial_layer_min_bead_width", + "initial_layer_travel_speed", "initial_layer_travel_acceleration", "initial_layer_travel_jerk", "exclude_object", "slow_down_layers", "infill_anchor", "infill_anchor_max","initial_layer_min_bead_width", "make_overhang_printable", "make_overhang_printable_angle", "make_overhang_printable_hole_size" ,"notes", "wipe_tower_cone_angle", "wipe_tower_extra_spacing","wipe_tower_max_purge_speed", "wipe_tower_wall_type", "wipe_tower_extra_rib_length", "wipe_tower_rib_width", "wipe_tower_fillet_wall", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index a7f0f0a2b5..b9e8842b0b 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -343,6 +343,8 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n || opt_key == "travel_speed_z" || opt_key == "initial_layer_speed" || opt_key == "initial_layer_travel_speed" + || opt_key == "initial_layer_travel_acceleration" + || opt_key == "initial_layer_travel_jerk" || opt_key == "slow_down_layers" || opt_key == "idle_temperature" || opt_key == "wipe_tower_cone_angle" diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 9f8fa618f7..f8918cb7b8 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3031,6 +3031,15 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloat(300)); + def = this->add("initial_layer_travel_acceleration", coFloatOrPercent); + def->label = L("First layer travel"); + def->tooltip = L("Travel acceleration of first layer."); + def->sidetext = L("mm/s² or %"); + def->min = 0; + def->mode = comAdvanced; + def->ratio_over = "travel_acceleration"; + def->set_default_value(new ConfigOptionFloatOrPercent(100, true)); + def = this->add("accel_to_decel_enable", coBool); def->label = L("Enable accel_to_decel"); def->category = L("Speed"); @@ -3121,6 +3130,15 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloat(12)); + def = this->add("initial_layer_travel_jerk", coFloatOrPercent); + def->label = L("First layer travel"); + def->tooltip = L("Travel jerk of first layer."); + def->sidetext = L("mm/s or %"); + def->min = 0; + def->mode = comAdvanced; + def->ratio_over = "travel_jerk"; + def->set_default_value(new ConfigOptionFloatOrPercent(100, true)); + def = this->add("initial_layer_line_width", coFloatOrPercent); def->label = L("First layer"); def->category = L("Quality"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 7d40ef0706..0acd1747a6 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1361,6 +1361,8 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionBool, accel_to_decel_enable)) ((ConfigOptionPercent, accel_to_decel_factor)) ((ConfigOptionFloatOrPercent, initial_layer_travel_speed)) + ((ConfigOptionFloatOrPercent, initial_layer_travel_acceleration)) + ((ConfigOptionFloatOrPercent, initial_layer_travel_jerk)) ((ConfigOptionBool, bbl_calib_mark_logo)) ((ConfigOptionBool, disable_m73)) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 6141d96885..a38893d7bd 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2503,6 +2503,7 @@ void TabPrint::build() optgroup->append_single_option_line("sparse_infill_acceleration", "speed_settings_acceleration#sparse-infill"); optgroup->append_single_option_line("internal_solid_infill_acceleration", "speed_settings_acceleration#internal-solid-infill"); optgroup->append_single_option_line("initial_layer_acceleration", "speed_settings_acceleration#initial-layer"); + optgroup->append_single_option_line("initial_layer_travel_acceleration"); optgroup->append_single_option_line("top_surface_acceleration", "speed_settings_acceleration#top-surface"); optgroup->append_single_option_line("travel_acceleration", "speed_settings_acceleration#travel"); optgroup->append_single_option_line("accel_to_decel_enable", "speed_settings_acceleration"); @@ -2516,6 +2517,7 @@ void TabPrint::build() optgroup->append_single_option_line("infill_jerk", "speed_settings_jerk_xy#infill"); optgroup->append_single_option_line("top_surface_jerk", "speed_settings_jerk_xy#top-surface"); optgroup->append_single_option_line("initial_layer_jerk", "speed_settings_jerk_xy#initial-layer"); + optgroup->append_single_option_line("initial_layer_travel_jerk"); optgroup->append_single_option_line("travel_jerk", "speed_settings_jerk_xy#travel"); optgroup = page->new_optgroup(L("Advanced"), L"param_advanced", 15);