diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp index 812e71f7140..ff36ce7e212 100644 --- a/src/libslic3r/GCode/CoolingBuffer.cpp +++ b/src/libslic3r/GCode/CoolingBuffer.cpp @@ -222,6 +222,9 @@ struct PerExtruderAdjustments float slow_down_layer_time = 0.f; // Minimum print speed allowed for this extruder. float slow_down_min_speed = 0.f; + + bool dont_slow_down_outer_wall = false; + // Parsed lines. std::vector lines; @@ -330,6 +333,8 @@ std::vector CoolingBuffer::parse_layer_gcode(const std:: adj.cooling_slow_down_enabled = m_config.slow_down_for_layer_cooling.get_at(extruder_id); adj.slow_down_layer_time = float(m_config.slow_down_layer_time.get_at(extruder_id)); adj.slow_down_min_speed = float(m_config.slow_down_min_speed.get_at(extruder_id)); + // ORCA: To enable dont slow down external perimeters feature per filament (extruder) + adj.dont_slow_down_outer_wall = m_config.dont_slow_down_outer_wall.get_at(extruder_id); map_extruder_to_per_extruder_adjustment[extruder_id] = i; } @@ -399,7 +404,15 @@ std::vector CoolingBuffer::parse_layer_gcode(const std:: line.type |= CoolingLine::TYPE_EXTERNAL_PERIMETER; if (wipe) line.type |= CoolingLine::TYPE_WIPE; - if (boost::contains(sline, ";_EXTRUDE_SET_SPEED") && ! wipe) { + + // ORCA: Dont slowdown external perimeters for layer time feature + // use the adjustment pointer to ensure the value for the current extruder (filament) is used. + bool adjust_external = true; + if(adjustment->dont_slow_down_outer_wall && external_perimeter) adjust_external = false; + + // ORCA: Dont slowdown external perimeters for layer time works by not marking the external perimeter as adjustable, + // hence the slowdown algorithm ignores it. + if (boost::contains(sline, ";_EXTRUDE_SET_SPEED") && ! wipe && adjust_external) { line.type |= CoolingLine::TYPE_ADJUSTABLE; active_speed_modifier = adjustment->lines.size(); } diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index f6c42e4909a..4a2db4c9907 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -825,7 +825,7 @@ static std::vector s_Preset_filament_options { "cool_plate_temp", "eng_plate_temp", "hot_plate_temp", "textured_plate_temp", "cool_plate_temp_initial_layer", "eng_plate_temp_initial_layer", "hot_plate_temp_initial_layer","textured_plate_temp_initial_layer", // "bed_type", //BBS:temperature_vitrification - "temperature_vitrification", "reduce_fan_stop_start_freq", "slow_down_for_layer_cooling", "fan_min_speed", + "temperature_vitrification", "reduce_fan_stop_start_freq","dont_slow_down_outer_wall", "slow_down_for_layer_cooling", "fan_min_speed", "fan_max_speed", "enable_overhang_bridge_fan", "overhang_fan_speed", "overhang_fan_threshold", "close_fan_the_first_x_layers", "full_fan_speed_layer", "fan_cooling_layer_time", "slow_down_layer_time", "slow_down_min_speed", "filament_start_gcode", "filament_end_gcode", //exhaust fan control diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 0bc1fa2cc31..fa884ead4bf 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -109,6 +109,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n "extruder_offset", "filament_flow_ratio", "reduce_fan_stop_start_freq", + "dont_slow_down_outer_wall", "fan_cooling_layer_time", "full_fan_speed_layer", "fan_kickstart", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 20f5310592a..d609725a6b7 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1700,6 +1700,15 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("If enable this setting, part cooling fan will never be stoped and will run at least " "at minimum speed to reduce the frequency of starting and stoping"); def->set_default_value(new ConfigOptionBools { false }); + + def = this->add("dont_slow_down_outer_wall", coBools); + def->label = L("Don't slow down outer walls"); + def->tooltip = L("If enabled, this setting will ensure external perimeters are not slowed down to meet the minimum layer time. " + "This is particularly helpful in the below scenarios:\n\n " + "1. To avoid changes in shine when printing glossy filaments \n" + "2. To avoid changes in external wall speed which may create slight wall artefacts that appear like z banding \n" + "3. To avoid printing at speeds which cause VFAs (fine artefacts) on the external walls\n\n"); + def->set_default_value(new ConfigOptionBools { false }); def = this->add("fan_cooling_layer_time", coFloats); def->label = L("Layer time"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index c7abf261809..ec2b9249962 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1174,6 +1174,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionStrings, extruder_colour)) ((ConfigOptionPoints, extruder_offset)) ((ConfigOptionBools, reduce_fan_stop_start_freq)) + ((ConfigOptionBools, dont_slow_down_outer_wall)) ((ConfigOptionFloats, fan_cooling_layer_time)) ((ConfigOptionStrings, filament_colour)) ((ConfigOptionBools, activate_air_filtration)) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 33d47d655cd..667e61a1e73 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3330,6 +3330,7 @@ void TabFilament::build() optgroup->append_line(line); optgroup->append_single_option_line("reduce_fan_stop_start_freq"); optgroup->append_single_option_line("slow_down_for_layer_cooling", "auto-cooling"); + optgroup->append_single_option_line("dont_slow_down_outer_wall"); optgroup->append_single_option_line("slow_down_min_speed"); optgroup->append_single_option_line("enable_overhang_bridge_fan", "auto-cooling"); @@ -3504,6 +3505,10 @@ void TabFilament::toggle_options() toggle_option(el, has_enable_overhang_bridge_fan); toggle_option("additional_cooling_fan_speed", cfg.opt_bool("auxiliary_fan")); + + // Orca: toggle dont slow down for external perimeters if + bool has_slow_down_for_layer_cooling = m_config->opt_bool("slow_down_for_layer_cooling", 0); + toggle_option("dont_slow_down_outer_wall", has_slow_down_for_layer_cooling); } if (m_active_page->title() == L("Filament")) {