From d84ff93f901c6773c246926f6fd34f22e14b7131 Mon Sep 17 00:00:00 2001 From: igiannakas Date: Thu, 25 Apr 2024 10:56:06 +0100 Subject: [PATCH 1/7] POC - Do not slow down external perimeters to meet minimum layer time --- src/libslic3r/GCode/CoolingBuffer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp index 812e71f7140..af0cf0eae87 100644 --- a/src/libslic3r/GCode/CoolingBuffer.cpp +++ b/src/libslic3r/GCode/CoolingBuffer.cpp @@ -857,7 +857,9 @@ std::string CoolingBuffer::apply_layer_cooldown( } else if (line->type & CoolingLine::TYPE_EXTRUDE_END) { // Just remove this comment. - } else if (line->type & (CoolingLine::TYPE_ADJUSTABLE | CoolingLine::TYPE_EXTERNAL_PERIMETER | CoolingLine::TYPE_WIPE | CoolingLine::TYPE_HAS_F)) { + } else if(line->type & (CoolingLine::TYPE_EXTERNAL_PERIMETER )){ + + } else if (line->type & (CoolingLine::TYPE_ADJUSTABLE | CoolingLine::TYPE_WIPE | CoolingLine::TYPE_HAS_F)) { // Find the start of a comment, or roll to the end of line. const char *end = line_start; for (; end < line_end && *end != ';'; ++ end); From db14b13b2c2b40dcd3adcf64cc29abaf69cdabfd Mon Sep 17 00:00:00 2001 From: igiannakas Date: Thu, 25 Apr 2024 13:06:47 +0100 Subject: [PATCH 2/7] POC - Do not slow down external perimeters to meet minimum layer time - rework --- src/libslic3r/GCode/CoolingBuffer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp index af0cf0eae87..9ef8f8997f1 100644 --- a/src/libslic3r/GCode/CoolingBuffer.cpp +++ b/src/libslic3r/GCode/CoolingBuffer.cpp @@ -880,7 +880,7 @@ std::string CoolingBuffer::apply_layer_cooldown( else // Remove the feedrate from the G0/G1 line. The G-code line may become empty! remove = true; - } else if (line->slowdown) { + } else if (line->slowdown && (!(line->type & CoolingLine::TYPE_EXTERNAL_PERIMETER))) { // The F value will be overwritten. modify = true; } else { From 20d45abe2fede2fa1e6ff8a54adef80ad450d4b3 Mon Sep 17 00:00:00 2001 From: igiannakas Date: Thu, 25 Apr 2024 13:09:26 +0100 Subject: [PATCH 3/7] Revert "POC - Do not slow down external perimeters to meet minimum layer time" This reverts commit d84ff93f901c6773c246926f6fd34f22e14b7131. --- src/libslic3r/GCode/CoolingBuffer.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp index 9ef8f8997f1..b41be9a64c8 100644 --- a/src/libslic3r/GCode/CoolingBuffer.cpp +++ b/src/libslic3r/GCode/CoolingBuffer.cpp @@ -857,9 +857,7 @@ std::string CoolingBuffer::apply_layer_cooldown( } else if (line->type & CoolingLine::TYPE_EXTRUDE_END) { // Just remove this comment. - } else if(line->type & (CoolingLine::TYPE_EXTERNAL_PERIMETER )){ - - } else if (line->type & (CoolingLine::TYPE_ADJUSTABLE | CoolingLine::TYPE_WIPE | CoolingLine::TYPE_HAS_F)) { + } else if (line->type & (CoolingLine::TYPE_ADJUSTABLE | CoolingLine::TYPE_EXTERNAL_PERIMETER | CoolingLine::TYPE_WIPE | CoolingLine::TYPE_HAS_F)) { // Find the start of a comment, or roll to the end of line. const char *end = line_start; for (; end < line_end && *end != ';'; ++ end); From 88e32a6d3eebbee06dd7310fa9053457d3d93bd6 Mon Sep 17 00:00:00 2001 From: igiannakas Date: Wed, 5 Jun 2024 14:02:55 +0100 Subject: [PATCH 4/7] Dont slow down external perimeters to meet layer time target v2 --- src/libslic3r/GCode/CoolingBuffer.cpp | 15 ++++++++++++++- src/libslic3r/Preset.cpp | 2 +- src/libslic3r/Print.cpp | 1 + src/libslic3r/PrintConfig.cpp | 9 +++++++++ src/libslic3r/PrintConfig.hpp | 1 + src/slic3r/GUI/Tab.cpp | 1 + 6 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp index b41be9a64c8..0b257d94492 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_external_perimeters = 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_external_perimeters = m_config.dont_slow_down_external_perimeters.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_external_perimeters && 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 69217ad6048..a858ca869d9 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -833,7 +833,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_external_perimeters", "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 2b1492a2f55..0369c1d30cd 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -131,6 +131,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n "extruder_offset", "filament_flow_ratio", "reduce_fan_stop_start_freq", + "dont_slow_down_external_perimeters", "fan_cooling_layer_time", "full_fan_speed_layer", "fan_kickstart", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index f31b1269f34..2bb36e985c5 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1721,6 +1721,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_external_perimeters", coBools); + def->label = L("Don't slow down external perimeters to meet minumum layer time"); + 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 5dde9c6056b..007502b7a30 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1191,6 +1191,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionStrings, extruder_colour)) ((ConfigOptionPoints, extruder_offset)) ((ConfigOptionBools, reduce_fan_stop_start_freq)) + ((ConfigOptionBools, dont_slow_down_external_perimeters)) ((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 2cafe207816..a18b8e1eebf 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3349,6 +3349,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_external_perimeters"); optgroup->append_single_option_line("slow_down_min_speed"); optgroup->append_single_option_line("enable_overhang_bridge_fan", "auto-cooling"); From f2f051f406a1307d22c780dd5963eb1270db64ac Mon Sep 17 00:00:00 2001 From: igiannakas Date: Wed, 5 Jun 2024 14:32:06 +0100 Subject: [PATCH 5/7] Reverted previous implementation --- src/libslic3r/GCode/CoolingBuffer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp index 0b257d94492..1c13b59919e 100644 --- a/src/libslic3r/GCode/CoolingBuffer.cpp +++ b/src/libslic3r/GCode/CoolingBuffer.cpp @@ -891,7 +891,7 @@ std::string CoolingBuffer::apply_layer_cooldown( else // Remove the feedrate from the G0/G1 line. The G-code line may become empty! remove = true; - } else if (line->slowdown && (!(line->type & CoolingLine::TYPE_EXTERNAL_PERIMETER))) { + } else if (line->slowdown) { // The F value will be overwritten. modify = true; } else { From b6e868af8c5ba72b6cde124190ad6ede6e4a5611 Mon Sep 17 00:00:00 2001 From: igiannakas Date: Mon, 10 Jun 2024 17:16:58 +0100 Subject: [PATCH 6/7] UI fixes for dont slow down for layer cooling --- src/libslic3r/PrintConfig.cpp | 2 +- src/slic3r/GUI/Tab.cpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index c212ac977b6..8ae849c4797 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1723,7 +1723,7 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionBools { false }); def = this->add("dont_slow_down_external_perimeters", coBools); - def->label = L("Don't slow down external perimeters to meet minumum layer time"); + def->label = L("Don't slow down external perimeters to meet minimum layer time"); 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" diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index a18b8e1eebf..47881e2ea03 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3524,6 +3524,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_external_perimeters", has_slow_down_for_layer_cooling); } if (m_active_page->title() == L("Filament")) { From 35eeca1fb8f6f28d4ccffe0186f57c1b0708b438 Mon Sep 17 00:00:00 2001 From: igiannakas Date: Sun, 16 Jun 2024 14:31:51 +0100 Subject: [PATCH 7/7] Update dont slow down outer walls naming convention --- src/libslic3r/GCode/CoolingBuffer.cpp | 6 +++--- src/libslic3r/Preset.cpp | 2 +- src/libslic3r/Print.cpp | 2 +- src/libslic3r/PrintConfig.cpp | 4 ++-- src/libslic3r/PrintConfig.hpp | 2 +- src/slic3r/GUI/Tab.cpp | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp index 1c13b59919e..ff36ce7e212 100644 --- a/src/libslic3r/GCode/CoolingBuffer.cpp +++ b/src/libslic3r/GCode/CoolingBuffer.cpp @@ -223,7 +223,7 @@ struct PerExtruderAdjustments // Minimum print speed allowed for this extruder. float slow_down_min_speed = 0.f; - bool dont_slow_down_external_perimeters = false; + bool dont_slow_down_outer_wall = false; // Parsed lines. @@ -334,7 +334,7 @@ std::vector CoolingBuffer::parse_layer_gcode(const std:: 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_external_perimeters = m_config.dont_slow_down_external_perimeters.get_at(extruder_id); + 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; } @@ -408,7 +408,7 @@ std::vector CoolingBuffer::parse_layer_gcode(const std:: // 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_external_perimeters && external_perimeter) adjust_external = false; + 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. diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 5bde3b1b290..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","dont_slow_down_external_perimeters", "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 1544a75b01d..fa884ead4bf 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -109,7 +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_external_perimeters", + "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 f52f042c80b..d609725a6b7 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1701,8 +1701,8 @@ void PrintConfigDef::init_fff_params() "at minimum speed to reduce the frequency of starting and stoping"); def->set_default_value(new ConfigOptionBools { false }); - def = this->add("dont_slow_down_external_perimeters", coBools); - def->label = L("Don't slow down external perimeters to meet minimum layer time"); + 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" diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 88722376c33..ec2b9249962 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1174,7 +1174,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionStrings, extruder_colour)) ((ConfigOptionPoints, extruder_offset)) ((ConfigOptionBools, reduce_fan_stop_start_freq)) - ((ConfigOptionBools, dont_slow_down_external_perimeters)) + ((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 ad4aa304d65..667e61a1e73 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3330,7 +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_external_perimeters"); + 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"); @@ -3508,7 +3508,7 @@ void TabFilament::toggle_options() // 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_external_perimeters", has_slow_down_for_layer_cooling); + toggle_option("dont_slow_down_outer_wall", has_slow_down_for_layer_cooling); } if (m_active_page->title() == L("Filament")) {