From ffb2094551f65086e3ee965fbd51e1c56e849ac7 Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Fri, 12 Jul 2024 16:04:24 +0200 Subject: [PATCH 01/20] POC#1: Check & modify speed against user config input --- src/libslic3r/GCode.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 840fcd16c38..f17128cd990 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5674,8 +5674,23 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &descri return gcode; } -double_t GCode::_compute_speed_mm_per_sec(const ExtrusionPath& path, double speed) { +double_t adjust_speed_if_in_forbidden_range(double speed) +{ + constexpr std::pair FORBIDDEN_RANGE = {50.0f, 70.0f}; + constexpr bool MOVE_TO_LOWEST_ALLOWED_SPEED = true; + + if (speed > FORBIDDEN_RANGE.first && speed < FORBIDDEN_RANGE.second) { + std::cout << "chka46: speed " << speed << " is in forbidden range!" << std::endl; + speed = (MOVE_TO_LOWEST_ALLOWED_SPEED) ? FORBIDDEN_RANGE.first : FORBIDDEN_RANGE.second; + std::cout << "speed has been " << ((MOVE_TO_LOWEST_ALLOWED_SPEED) ? "lowered" : "increased") << " to " + << speed << std::endl; + } + return speed; +} + +double_t GCode::_compute_speed_mm_per_sec(const ExtrusionPath& path, double speed) +{ float factor = 1; // set speed if (speed < 0) { @@ -5688,6 +5703,7 @@ double_t GCode::_compute_speed_mm_per_sec(const ExtrusionPath& path, double spee speed = m_config.get_computed_value("perimeter_speed"); } else if (path.role() == erExternalPerimeter) { speed = m_config.get_computed_value("external_perimeter_speed"); + speed = adjust_speed_if_in_forbidden_range(speed); } else if (path.role() == erBridgeInfill) { speed = m_config.get_computed_value("bridge_speed"); } else if (path.role() == erInternalBridgeInfill) { From a8fd3c586fc180ab93cba4d88c30e051e36ff8ad Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Sat, 13 Jul 2024 14:02:28 +0300 Subject: [PATCH 02/20] POC#2: Exclude a single range, set by the user By default, the speed is modified to the low end of the excluded range. --- resources/ui_layout/default/print.ui | 4 ++++ resources/ui_layout/example/print.ui | 4 ++++ src/libslic3r/GCode.cpp | 18 +++++++++++++----- src/libslic3r/GCode.hpp | 1 + src/libslic3r/Preset.cpp | 2 ++ src/libslic3r/PrintConfig.cpp | 23 +++++++++++++++++++++++ src/libslic3r/PrintConfig.hpp | 2 ++ src/slic3r/GUI/ConfigManipulation.cpp | 2 +- 8 files changed, 50 insertions(+), 6 deletions(-) diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui index 8db71216cd6..0db1a689edc 100644 --- a/resources/ui_layout/default/print.ui +++ b/resources/ui_layout/default/print.ui @@ -345,6 +345,10 @@ group:label_width$8:sidetext_width$7:Speed for print moves line:Wipe tower setting:width$4:label$Main speed:wipe_tower_speed setting:width$4:label$Wipe starting speed:wipe_tower_wipe_starting_speed +group:Exclude print speeds + line:Exclude print speeds (beta) + setting:label_width$8:width$4:exclude_print_speed_low + setting:label_width$8:width$4:exclude_print_speed_high group:Speed for non-print moves line:Travel speed setting:label$xy:travel_speed diff --git a/resources/ui_layout/example/print.ui b/resources/ui_layout/example/print.ui index 5d90c54bdaf..6e34c8c5395 100644 --- a/resources/ui_layout/example/print.ui +++ b/resources/ui_layout/example/print.ui @@ -335,6 +335,10 @@ group:Speed for non-print moves setting:label$xy:travel_speed setting:label$z:travel_speed_z end_line +group:Exclude print speeds + line:Exclude print speeds (beta) + setting:label_width$8:width$4:exclude_print_speed_low + setting:label_width$8:width$4:exclude_print_speed_high group:sidetext_width$7:Modifiers line:First layer speed setting:label_width$8:width$4:first_layer_min_speed diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index f17128cd990..4617ca2b9da 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5674,14 +5674,22 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &descri return gcode; } -double_t adjust_speed_if_in_forbidden_range(double speed) +double_t GCode::adjust_speed_if_in_forbidden_range(double speed) const { - constexpr std::pair FORBIDDEN_RANGE = {50.0f, 70.0f}; + double range_lower_bound = m_config.get_computed_value("exclude_print_speed_low"); + double range_upper_bound = m_config.get_computed_value("exclude_print_speed_high"); + std::pair forbidden_range = {range_lower_bound, range_upper_bound}; constexpr bool MOVE_TO_LOWEST_ALLOWED_SPEED = true; - if (speed > FORBIDDEN_RANGE.first && speed < FORBIDDEN_RANGE.second) { - std::cout << "chka46: speed " << speed << " is in forbidden range!" << std::endl; - speed = (MOVE_TO_LOWEST_ALLOWED_SPEED) ? FORBIDDEN_RANGE.first : FORBIDDEN_RANGE.second; + if (range_lower_bound != 0.0 && range_upper_bound != 0.0 && range_upper_bound < range_lower_bound) { + std::cout << "feature not activated or misconfigures, following are set values:" << std::endl; + std::cout << range_lower_bound << ", " << range_upper_bound << std::endl; + return speed; + } + + if (speed > forbidden_range.first && speed < forbidden_range.second) { + std::cout << "chka: Set perimeter speed " << speed << " is in forbidden range!" << std::endl; + speed = (MOVE_TO_LOWEST_ALLOWED_SPEED) ? forbidden_range.first : forbidden_range.second; std::cout << "speed has been " << ((MOVE_TO_LOWEST_ALLOWED_SPEED) ? "lowered" : "increased") << " to " << speed << std::endl; } diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 607f6470db3..ae1232ca38b 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -517,6 +517,7 @@ class GCode : ExtrusionVisitorConst { std::string _extrude(const ExtrusionPath &path, const std::string &description, double speed = -1); void _extrude_line(std::string& gcode_str, const Line& line, const double e_per_mm, const std::string& comment); void _extrude_line_cut_corner(std::string& gcode_str, const Line& line, const double e_per_mm, const std::string& comment, Point& last_pos, const double path_width); + double_t adjust_speed_if_in_forbidden_range(double speed) const; std::string _before_extrude(const ExtrusionPath &path, const std::string &description, double speed = -1); double_t _compute_speed_mm_per_sec(const ExtrusionPath& path, double speed = -1); std::string _after_extrude(const ExtrusionPath &path); diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index ca667080cfa..41d83db8201 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -542,6 +542,8 @@ static std::vector s_Preset_print_options { "travel_speed", "travel_speed_z", "max_print_speed", "max_volumetric_speed", + "exclude_print_speed_low", + "exclude_print_speed_high", // gapfill "gap_fill_enabled", "gap_fill_extension", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 058bbb0a2fa..a11d83f6454 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1941,6 +1941,27 @@ void PrintConfigDef::init_fff_params() def->is_vector_extruder = true; def->set_default_value(new ConfigOptionFloats{ 0. }); + // TODO - chka: Show better feature description on mouse hover (also show "set to 0 to disable") + def = this->add("exclude_print_speed_low", coFloat); + def->label = L("Lower bound"); + def->category = OptionCategory::speed; + def->tooltip = L("Start of excluded speed range"); + def->sidetext = L("mm/s"); + def->min = 0; + def->mode = comAdvancedE | comPrusa; + // def->is_vector_extruder = true; + def->set_default_value(new ConfigOptionFloat{ 0. }); + + def = this->add("exclude_print_speed_high", coFloat); + def->label = L("Higher bound"); + def->category = OptionCategory::speed; + def->tooltip = L("End of excluded speed range"); + def->sidetext = L("mm/s"); + def->min = 0; + def->mode = comAdvancedE | comPrusa; + // def->is_vector_extruder = true; + def->set_default_value(new ConfigOptionFloat{ 0. }); + def = this->add("filament_max_wipe_tower_speed", coFloats); def->label = L("Max speed on the wipe tower"); def->tooltip = L("This setting is used to set the maximum speed when extruding inside the wipe tower (use M220)." @@ -8096,6 +8117,8 @@ std::unordered_set prusa_export_to_remove_keys = { "default_speed", "enforce_full_fill_volume", // "exact_last_layer_height", +"exclude_print_speed_low" +"exclude_print_speed_high" "external_infill_margin", "external_perimeter_acceleration", "external_perimeter_cut_corners", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index d08278c77e1..6c190d643b6 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1287,6 +1287,8 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloats, wiping_volumes_extruders)) ((ConfigOptionFloat, z_offset)) ((ConfigOptionFloat, init_z_rotate)) + ((ConfigOptionFloat, exclude_print_speed_low)) + ((ConfigOptionFloat, exclude_print_speed_high)) ) diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 741a97146d9..ea3c8b3f881 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -340,7 +340,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) "external_perimeters_first", "external_perimeter_extrusion_width", "external_perimeter_extrusion_spacing","external_perimeter_extrusion_change_odd_layers", "overhangs", "perimeter_speed", "perimeter_reverse", "seam_position", "small_perimeter_speed", "small_perimeter_min_length", " small_perimeter_max_length", "spiral_vase", - "perimeter_generator", "seam_notch_all", "seam_notch_inner", "seam_notch_outer"}) + "perimeter_generator", "seam_notch_all", "seam_notch_inner", "seam_notch_outer", "exclude_print_speed_low", "exclude_print_speed_high"}) toggle_field(el, have_perimeters); bool has_spiral_vase = have_perimeters && config->opt_bool("spiral_vase"); From d9bafcc67a8b36a4691e256dabaf6a953b587452 Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Sun, 14 Jul 2024 22:48:34 +0300 Subject: [PATCH 03/20] Add option to adjust speed to lowest or highest allowed value --- resources/ui_layout/default/print.ui | 1 + resources/ui_layout/example/print.ui | 1 + src/libslic3r/GCode.cpp | 6 +++--- src/libslic3r/Preset.cpp | 1 + src/libslic3r/PrintConfig.cpp | 13 +++++++++++-- src/libslic3r/PrintConfig.hpp | 1 + src/slic3r/GUI/ConfigManipulation.cpp | 3 ++- 7 files changed, 20 insertions(+), 6 deletions(-) diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui index 0db1a689edc..727404f1421 100644 --- a/resources/ui_layout/default/print.ui +++ b/resources/ui_layout/default/print.ui @@ -349,6 +349,7 @@ group:Exclude print speeds line:Exclude print speeds (beta) setting:label_width$8:width$4:exclude_print_speed_low setting:label_width$8:width$4:exclude_print_speed_high + setting:exclude_print_speed_move_to_lowest_available_range group:Speed for non-print moves line:Travel speed setting:label$xy:travel_speed diff --git a/resources/ui_layout/example/print.ui b/resources/ui_layout/example/print.ui index 6e34c8c5395..1acc6c2a4c2 100644 --- a/resources/ui_layout/example/print.ui +++ b/resources/ui_layout/example/print.ui @@ -339,6 +339,7 @@ group:Exclude print speeds line:Exclude print speeds (beta) setting:label_width$8:width$4:exclude_print_speed_low setting:label_width$8:width$4:exclude_print_speed_high + setting:exclude_print_speed_move_to_lowest_available_range group:sidetext_width$7:Modifiers line:First layer speed setting:label_width$8:width$4:first_layer_min_speed diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 4617ca2b9da..ef688f76284 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5679,7 +5679,7 @@ double_t GCode::adjust_speed_if_in_forbidden_range(double speed) const double range_lower_bound = m_config.get_computed_value("exclude_print_speed_low"); double range_upper_bound = m_config.get_computed_value("exclude_print_speed_high"); std::pair forbidden_range = {range_lower_bound, range_upper_bound}; - constexpr bool MOVE_TO_LOWEST_ALLOWED_SPEED = true; + bool move_to_lowest_allowed_speed = m_config.exclude_print_speed_move_to_lowest_available_range.value; if (range_lower_bound != 0.0 && range_upper_bound != 0.0 && range_upper_bound < range_lower_bound) { std::cout << "feature not activated or misconfigures, following are set values:" << std::endl; @@ -5689,8 +5689,8 @@ double_t GCode::adjust_speed_if_in_forbidden_range(double speed) const if (speed > forbidden_range.first && speed < forbidden_range.second) { std::cout << "chka: Set perimeter speed " << speed << " is in forbidden range!" << std::endl; - speed = (MOVE_TO_LOWEST_ALLOWED_SPEED) ? forbidden_range.first : forbidden_range.second; - std::cout << "speed has been " << ((MOVE_TO_LOWEST_ALLOWED_SPEED) ? "lowered" : "increased") << " to " + speed = (move_to_lowest_allowed_speed) ? forbidden_range.first : forbidden_range.second; + std::cout << "speed has been " << ((move_to_lowest_allowed_speed) ? "lowered" : "increased") << " to " << speed << std::endl; } diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 41d83db8201..f3eb7826dea 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -544,6 +544,7 @@ static std::vector s_Preset_print_options { "max_volumetric_speed", "exclude_print_speed_low", "exclude_print_speed_high", + "exclude_print_speed_move_to_lowest_available_range", // gapfill "gap_fill_enabled", "gap_fill_extension", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index a11d83f6454..adfd89eb922 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1960,7 +1960,15 @@ void PrintConfigDef::init_fff_params() def->min = 0; def->mode = comAdvancedE | comPrusa; // def->is_vector_extruder = true; - def->set_default_value(new ConfigOptionFloat{ 0. }); + def->set_default_value(new ConfigOptionFloat{0.}); + + def = this->add("exclude_print_speed_move_to_lowest_available_range", coBool); + def->label = L("Adjust speed to lowest range"); + def->category = OptionCategory::speed; + def->tooltip = L("If set to true, the speed is dropped to the lowest value of the forbidden range." + "Otherwise, the highest value of the range is chosen."); + def->mode = comAdvancedE | comSuSi; + def->set_default_value(new ConfigOptionBool(true)); def = this->add("filament_max_wipe_tower_speed", coFloats); def->label = L("Max speed on the wipe tower"); @@ -8118,7 +8126,8 @@ std::unordered_set prusa_export_to_remove_keys = { "enforce_full_fill_volume", // "exact_last_layer_height", "exclude_print_speed_low" -"exclude_print_speed_high" +"exclude_print_speed_high", +"exclude_print_speed_move_to_lowest_available_range", "external_infill_margin", "external_perimeter_acceleration", "external_perimeter_cut_corners", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 6c190d643b6..211acca5d4f 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1289,6 +1289,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloat, init_z_rotate)) ((ConfigOptionFloat, exclude_print_speed_low)) ((ConfigOptionFloat, exclude_print_speed_high)) + ((ConfigOptionBool, exclude_print_speed_move_to_lowest_available_range)) ) diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index ea3c8b3f881..6cfddd29f3c 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -340,7 +340,8 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) "external_perimeters_first", "external_perimeter_extrusion_width", "external_perimeter_extrusion_spacing","external_perimeter_extrusion_change_odd_layers", "overhangs", "perimeter_speed", "perimeter_reverse", "seam_position", "small_perimeter_speed", "small_perimeter_min_length", " small_perimeter_max_length", "spiral_vase", - "perimeter_generator", "seam_notch_all", "seam_notch_inner", "seam_notch_outer", "exclude_print_speed_low", "exclude_print_speed_high"}) + "perimeter_generator", "seam_notch_all", "seam_notch_inner", "seam_notch_outer", + "exclude_print_speed_low", "exclude_print_speed_high", "exclude_print_speed_move_to_lowest_available_range"}) toggle_field(el, have_perimeters); bool has_spiral_vase = have_perimeters && config->opt_bool("spiral_vase"); From 3613890c0826466dd5ffe331370da567c5da5c34 Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Sun, 14 Jul 2024 23:16:55 +0300 Subject: [PATCH 04/20] Apply forbidden speed range filter on overhangs --- src/libslic3r/GCode.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index ef688f76284..715236f43a2 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5718,6 +5718,7 @@ double_t GCode::_compute_speed_mm_per_sec(const ExtrusionPath& path, double spee speed = m_config.get_computed_value("bridge_speed_internal"); } else if (path.role() == erOverhangPerimeter) { speed = m_config.get_computed_value("overhangs_speed"); + speed = adjust_speed_if_in_forbidden_range(speed); } else if (path.role() == erInternalInfill) { speed = m_config.get_computed_value("infill_speed"); } else if (path.role() == erSolidInfill) { From 581200a888a53316e2c9d47195f86a66e9136250 Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Mon, 15 Jul 2024 12:21:07 +0300 Subject: [PATCH 05/20] Add TODO for broken small perimeter speed feature --- src/libslic3r/GCode.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 715236f43a2..e569e09cdec 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5795,6 +5795,7 @@ double_t GCode::_compute_speed_mm_per_sec(const ExtrusionPath& path, double spee // Apply small perimeter 'modifier // don't modify bridge speed if (factor < 1 && !(is_bridge(path.role()))) { + // TODO - This does not work as expected. Needs to be fixed. float small_speed = (float)m_config.small_perimeter_speed.get_abs_value(m_config.get_computed_value("perimeter_speed")); if (small_speed > 0) //apply factor between feature speed and small speed From 7663bb7fe5648d5cdbb0e70ccf88929ba78d6933 Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Tue, 16 Jul 2024 10:39:28 +0300 Subject: [PATCH 06/20] Allow for multiple forbidden speed ranges. Multiple ranges are allowed, with no overlaps between them. --- resources/ui_layout/default/print.ui | 3 +- resources/ui_layout/example/print.ui | 3 +- src/libslic3r/GCode.cpp | 80 ++++++++++++++++++++++----- src/libslic3r/Preset.cpp | 3 +- src/libslic3r/PrintConfig.cpp | 30 +++------- src/libslic3r/PrintConfig.hpp | 3 +- src/slic3r/GUI/ConfigManipulation.cpp | 2 +- 7 files changed, 81 insertions(+), 43 deletions(-) diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui index 727404f1421..cb3ea87e592 100644 --- a/resources/ui_layout/default/print.ui +++ b/resources/ui_layout/default/print.ui @@ -347,8 +347,7 @@ group:label_width$8:sidetext_width$7:Speed for print moves setting:width$4:label$Wipe starting speed:wipe_tower_wipe_starting_speed group:Exclude print speeds line:Exclude print speeds (beta) - setting:label_width$8:width$4:exclude_print_speed_low - setting:label_width$8:width$4:exclude_print_speed_high + setting:label_width$8:width$4:exclude_print_speed_ranges setting:exclude_print_speed_move_to_lowest_available_range group:Speed for non-print moves line:Travel speed diff --git a/resources/ui_layout/example/print.ui b/resources/ui_layout/example/print.ui index 1acc6c2a4c2..15663b21934 100644 --- a/resources/ui_layout/example/print.ui +++ b/resources/ui_layout/example/print.ui @@ -337,8 +337,7 @@ group:Speed for non-print moves end_line group:Exclude print speeds line:Exclude print speeds (beta) - setting:label_width$8:width$4:exclude_print_speed_low - setting:label_width$8:width$4:exclude_print_speed_high + setting:label_width$8:width$4:exclude_print_speed_ranges setting:exclude_print_speed_move_to_lowest_available_range group:sidetext_width$7:Modifiers line:First layer speed diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index e569e09cdec..38060a4bbe8 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -17,6 +17,7 @@ #include "libslic3r/format.hpp" #include +#include #include #include #include @@ -5676,27 +5677,80 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &descri double_t GCode::adjust_speed_if_in_forbidden_range(double speed) const { - double range_lower_bound = m_config.get_computed_value("exclude_print_speed_low"); - double range_upper_bound = m_config.get_computed_value("exclude_print_speed_high"); - std::pair forbidden_range = {range_lower_bound, range_upper_bound}; - bool move_to_lowest_allowed_speed = m_config.exclude_print_speed_move_to_lowest_available_range.value; - - if (range_lower_bound != 0.0 && range_upper_bound != 0.0 && range_upper_bound < range_lower_bound) { - std::cout << "feature not activated or misconfigures, following are set values:" << std::endl; - std::cout << range_lower_bound << ", " << range_upper_bound << std::endl; + std::string forbidden_ranges_user_input = m_config.exclude_print_speed_ranges; + if (forbidden_ranges_user_input.empty()) { return speed; } - if (speed > forbidden_range.first && speed < forbidden_range.second) { - std::cout << "chka: Set perimeter speed " << speed << " is in forbidden range!" << std::endl; - speed = (move_to_lowest_allowed_speed) ? forbidden_range.first : forbidden_range.second; - std::cout << "speed has been " << ((move_to_lowest_allowed_speed) ? "lowered" : "increased") << " to " - << speed << std::endl; + forbidden_ranges_user_input.erase(std::remove_if(forbidden_ranges_user_input.begin(), forbidden_ranges_user_input.end(), ::isspace), + forbidden_ranges_user_input.end()); + + std::vector forbidden_ranges_strings; + boost::split(forbidden_ranges_strings, forbidden_ranges_user_input, boost::is_any_of(",")); + + for (size_t i = 0; i < forbidden_ranges_strings.size(); i++) { + std::cout << forbidden_ranges_strings[i] << std::endl; + } + + // Parse input (check string regex and convert to numeric) + std::vector> numeric_ranges; + auto numeric_range_regex = std::regex("^(\\d+)-(\\d+)$"); + for (auto elem : forbidden_ranges_strings) { + constexpr size_t LOWER_BOUND_MATCH_INDEX = 1; + constexpr size_t UPPER_BOUND_MATCH_INDEX = 2; + if (!std::regex_match(elem, numeric_range_regex)) { + std::cout << "Range element " << elem << " does not match {int-int} format" << std::endl; + break; + } + + std::smatch regex_match; + std::regex_match(elem, regex_match, numeric_range_regex); + + auto lower_bound = std::stoi(regex_match[LOWER_BOUND_MATCH_INDEX]); + auto higher_bound = std::stoi(regex_match[UPPER_BOUND_MATCH_INDEX]); + if (lower_bound >= higher_bound) { + std::cout << "Invalid range: " << elem << ". Upper bound must be greater than lower bound." << std::endl; + return speed; + } + numeric_ranges.emplace_back(std::pair(lower_bound, higher_bound)); + } + + // Check range consistency (Simply check for overlap. User can enter them in non-ascending lower bound order) + + std::sort(numeric_ranges.begin(), numeric_ranges.end(), + [](auto &left, auto &right) { return left.first < right.first; }); + + for (size_t i = 1; i < numeric_ranges.size(); i++) { + int range_start_front = numeric_ranges[i].first; + int range_end_back = numeric_ranges[i - 1].second; + if (range_start_front < range_end_back) { + return speed; + /* + auto first_range = std::to_string(numeric_ranges[i].first) + "-" + + std::to_string(numeric_ranges[i].second); + auto second_range = std::to_string(numeric_ranges[i - 1].first) + "-" + + std::to_string(numeric_ranges[i - 1].second); + std::cout << "Ranges " << first_range << " and " << second_range << " overlap." << std::endl; + */ + } + } + + bool move_to_lowest_allowed_speed = m_config.exclude_print_speed_move_to_lowest_available_range.value; + for (auto range : numeric_ranges) { + if (speed > range.first && speed < range.second) { + // std::string range_str = std::to_string(range.first) + "-" + std::to_string(range.second); + // std::cout << "We have an overlap with range " << range_str << std::endl; + speed = (move_to_lowest_allowed_speed) ? range.first : range.second; + break; + // std::cout << "speed has been " << ((move_to_lowest_allowed_speed) ? "lowered" : "increased") << " to " + // << speed << std::endl; + } } return speed; } + double_t GCode::_compute_speed_mm_per_sec(const ExtrusionPath& path, double speed) { float factor = 1; diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index f3eb7826dea..1b11bd6d0bc 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -542,8 +542,7 @@ static std::vector s_Preset_print_options { "travel_speed", "travel_speed_z", "max_print_speed", "max_volumetric_speed", - "exclude_print_speed_low", - "exclude_print_speed_high", + "exclude_print_speed_ranges", "exclude_print_speed_move_to_lowest_available_range", // gapfill "gap_fill_enabled", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index adfd89eb922..64573208e4a 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1941,26 +1941,15 @@ void PrintConfigDef::init_fff_params() def->is_vector_extruder = true; def->set_default_value(new ConfigOptionFloats{ 0. }); - // TODO - chka: Show better feature description on mouse hover (also show "set to 0 to disable") - def = this->add("exclude_print_speed_low", coFloat); - def->label = L("Lower bound"); - def->category = OptionCategory::speed; - def->tooltip = L("Start of excluded speed range"); - def->sidetext = L("mm/s"); - def->min = 0; - def->mode = comAdvancedE | comPrusa; - // def->is_vector_extruder = true; - def->set_default_value(new ConfigOptionFloat{ 0. }); - - def = this->add("exclude_print_speed_high", coFloat); - def->label = L("Higher bound"); - def->category = OptionCategory::speed; - def->tooltip = L("End of excluded speed range"); - def->sidetext = L("mm/s"); - def->min = 0; - def->mode = comAdvancedE | comPrusa; + // TODO - chka: Show better feature description on mouse hover. Describe use cases and interaction with + // other features. + def = this->add("exclude_print_speed_ranges", coString); + def->label = L("Excluded speed ranges (in mm/s)"); + def->tooltip = L("Speed ranges to be excluded. One use case is to avoid CoreXY kinematic resonances. " + "Leave empty to disable"); + def->mode = comExpert | comPrusa; // def->is_vector_extruder = true; - def->set_default_value(new ConfigOptionFloat{0.}); + def->set_default_value(new ConfigOptionString{""}); def = this->add("exclude_print_speed_move_to_lowest_available_range", coBool); def->label = L("Adjust speed to lowest range"); @@ -8125,8 +8114,7 @@ std::unordered_set prusa_export_to_remove_keys = { "default_speed", "enforce_full_fill_volume", // "exact_last_layer_height", -"exclude_print_speed_low" -"exclude_print_speed_high", +"exclude_print_speed_ranges" "exclude_print_speed_move_to_lowest_available_range", "external_infill_margin", "external_perimeter_acceleration", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 211acca5d4f..fa1a442a834 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1287,8 +1287,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloats, wiping_volumes_extruders)) ((ConfigOptionFloat, z_offset)) ((ConfigOptionFloat, init_z_rotate)) - ((ConfigOptionFloat, exclude_print_speed_low)) - ((ConfigOptionFloat, exclude_print_speed_high)) + ((ConfigOptionString, exclude_print_speed_ranges)) ((ConfigOptionBool, exclude_print_speed_move_to_lowest_available_range)) ) diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 6cfddd29f3c..3ebb827e5a0 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -341,7 +341,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) "overhangs", "perimeter_speed", "perimeter_reverse", "seam_position", "small_perimeter_speed", "small_perimeter_min_length", " small_perimeter_max_length", "spiral_vase", "perimeter_generator", "seam_notch_all", "seam_notch_inner", "seam_notch_outer", - "exclude_print_speed_low", "exclude_print_speed_high", "exclude_print_speed_move_to_lowest_available_range"}) + "exclude_print_speed_ranges", "exclude_print_speed_move_to_lowest_available_range"}) toggle_field(el, have_perimeters); bool has_spiral_vase = have_perimeters && config->opt_bool("spiral_vase"); From 82d2b05ceba865c2aa821b67073590f735f84808 Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Tue, 16 Jul 2024 14:23:54 +0300 Subject: [PATCH 07/20] Remove redundant regex check, refactor loop --- src/libslic3r/GCode.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 38060a4bbe8..667db2d3202 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5696,16 +5696,14 @@ double_t GCode::adjust_speed_if_in_forbidden_range(double speed) const std::vector> numeric_ranges; auto numeric_range_regex = std::regex("^(\\d+)-(\\d+)$"); for (auto elem : forbidden_ranges_strings) { - constexpr size_t LOWER_BOUND_MATCH_INDEX = 1; - constexpr size_t UPPER_BOUND_MATCH_INDEX = 2; - if (!std::regex_match(elem, numeric_range_regex)) { - std::cout << "Range element " << elem << " does not match {int-int} format" << std::endl; - break; - } - std::smatch regex_match; - std::regex_match(elem, regex_match, numeric_range_regex); + if (!std::regex_match(elem, regex_match, numeric_range_regex)) { + std::cout << "Range element " << elem << " does not match int-int format" << std::endl; + return speed; + } + constexpr size_t LOWER_BOUND_MATCH_INDEX = 1; + constexpr size_t UPPER_BOUND_MATCH_INDEX = 2; auto lower_bound = std::stoi(regex_match[LOWER_BOUND_MATCH_INDEX]); auto higher_bound = std::stoi(regex_match[UPPER_BOUND_MATCH_INDEX]); if (lower_bound >= higher_bound) { From d846cd881faae5fbb938ec2776e9e837c7fb1f54 Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Tue, 16 Jul 2024 14:24:29 +0300 Subject: [PATCH 08/20] Remove printout --- src/libslic3r/GCode.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 667db2d3202..7a29db57b99 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5688,10 +5688,6 @@ double_t GCode::adjust_speed_if_in_forbidden_range(double speed) const std::vector forbidden_ranges_strings; boost::split(forbidden_ranges_strings, forbidden_ranges_user_input, boost::is_any_of(",")); - for (size_t i = 0; i < forbidden_ranges_strings.size(); i++) { - std::cout << forbidden_ranges_strings[i] << std::endl; - } - // Parse input (check string regex and convert to numeric) std::vector> numeric_ranges; auto numeric_range_regex = std::regex("^(\\d+)-(\\d+)$"); From 6d1386c0bd1e91bc38e9bcd23ae2e20300cbf636 Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Tue, 16 Jul 2024 14:26:32 +0300 Subject: [PATCH 09/20] Remove dev printouts --- src/libslic3r/GCode.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 7a29db57b99..10eea6f7789 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5719,25 +5719,14 @@ double_t GCode::adjust_speed_if_in_forbidden_range(double speed) const int range_end_back = numeric_ranges[i - 1].second; if (range_start_front < range_end_back) { return speed; - /* - auto first_range = std::to_string(numeric_ranges[i].first) + "-" + - std::to_string(numeric_ranges[i].second); - auto second_range = std::to_string(numeric_ranges[i - 1].first) + "-" + - std::to_string(numeric_ranges[i - 1].second); - std::cout << "Ranges " << first_range << " and " << second_range << " overlap." << std::endl; - */ } } bool move_to_lowest_allowed_speed = m_config.exclude_print_speed_move_to_lowest_available_range.value; for (auto range : numeric_ranges) { if (speed > range.first && speed < range.second) { - // std::string range_str = std::to_string(range.first) + "-" + std::to_string(range.second); - // std::cout << "We have an overlap with range " << range_str << std::endl; speed = (move_to_lowest_allowed_speed) ? range.first : range.second; break; - // std::cout << "speed has been " << ((move_to_lowest_allowed_speed) ? "lowered" : "increased") << " to " - // << speed << std::endl; } } From b0a4d7142761d6aa2c9cec1b7c2277748715b4d7 Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Tue, 16 Jul 2024 14:26:56 +0300 Subject: [PATCH 10/20] Add early exit strategy --- src/libslic3r/GCode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 10eea6f7789..35b2f6bffde 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5726,7 +5726,7 @@ double_t GCode::adjust_speed_if_in_forbidden_range(double speed) const for (auto range : numeric_ranges) { if (speed > range.first && speed < range.second) { speed = (move_to_lowest_allowed_speed) ? range.first : range.second; - break; + return speed; } } From 858c8edeea7a4714b55d513384ccbf059574d33a Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Tue, 16 Jul 2024 15:54:14 +0300 Subject: [PATCH 11/20] Refactoring: move exclude print speed logic to its own class --- src/libslic3r/CMakeLists.txt | 2 + src/libslic3r/GCode.cpp | 76 ++++------------------ src/libslic3r/GCode.hpp | 3 +- src/libslic3r/GCode/ExcludePrintSpeeds.cpp | 71 ++++++++++++++++++++ src/libslic3r/GCode/ExcludePrintSpeeds.hpp | 30 +++++++++ 5 files changed, 119 insertions(+), 63 deletions(-) create mode 100644 src/libslic3r/GCode/ExcludePrintSpeeds.cpp create mode 100644 src/libslic3r/GCode/ExcludePrintSpeeds.hpp diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 84be9c12e5c..5ce1aa38921 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -141,6 +141,8 @@ add_library(libslic3r STATIC GCode/GCodeProcessor.hpp GCode/AvoidCrossingPerimeters.cpp GCode/AvoidCrossingPerimeters.hpp + GCode/ExcludePrintSpeeds.cpp + GCode/ExcludePrintSpeeds.hpp GCode.cpp GCode.hpp GCodeReader.cpp diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 35b2f6bffde..287d38eb1b5 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -17,7 +17,6 @@ #include "libslic3r/format.hpp" #include -#include #include #include #include @@ -1474,6 +1473,14 @@ void GCode::_do_export(Print& print_mod, GCodeOutputStream &file, ThumbnailsGene m_pressure_equalizer = make_unique(print.config()); m_enable_extrusion_role_markers = (bool)m_pressure_equalizer; + if (!print.config().exclude_print_speed_ranges.empty()) { + m_exclude_print_speeds = + make_unique(print.config().exclude_print_speed_ranges, + print.config().exclude_print_speed_move_to_lowest_available_range); + } else { + std::cout << "chka46: No ranges set! Not proceeding with ExcludePrintSpeeds initialization" << std::endl; + } + std::string preamble_to_put_start_layer = ""; @@ -5675,65 +5682,6 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &descri return gcode; } -double_t GCode::adjust_speed_if_in_forbidden_range(double speed) const -{ - std::string forbidden_ranges_user_input = m_config.exclude_print_speed_ranges; - if (forbidden_ranges_user_input.empty()) { - return speed; - } - - forbidden_ranges_user_input.erase(std::remove_if(forbidden_ranges_user_input.begin(), forbidden_ranges_user_input.end(), ::isspace), - forbidden_ranges_user_input.end()); - - std::vector forbidden_ranges_strings; - boost::split(forbidden_ranges_strings, forbidden_ranges_user_input, boost::is_any_of(",")); - - // Parse input (check string regex and convert to numeric) - std::vector> numeric_ranges; - auto numeric_range_regex = std::regex("^(\\d+)-(\\d+)$"); - for (auto elem : forbidden_ranges_strings) { - std::smatch regex_match; - if (!std::regex_match(elem, regex_match, numeric_range_regex)) { - std::cout << "Range element " << elem << " does not match int-int format" << std::endl; - return speed; - } - - constexpr size_t LOWER_BOUND_MATCH_INDEX = 1; - constexpr size_t UPPER_BOUND_MATCH_INDEX = 2; - auto lower_bound = std::stoi(regex_match[LOWER_BOUND_MATCH_INDEX]); - auto higher_bound = std::stoi(regex_match[UPPER_BOUND_MATCH_INDEX]); - if (lower_bound >= higher_bound) { - std::cout << "Invalid range: " << elem << ". Upper bound must be greater than lower bound." << std::endl; - return speed; - } - numeric_ranges.emplace_back(std::pair(lower_bound, higher_bound)); - } - - // Check range consistency (Simply check for overlap. User can enter them in non-ascending lower bound order) - - std::sort(numeric_ranges.begin(), numeric_ranges.end(), - [](auto &left, auto &right) { return left.first < right.first; }); - - for (size_t i = 1; i < numeric_ranges.size(); i++) { - int range_start_front = numeric_ranges[i].first; - int range_end_back = numeric_ranges[i - 1].second; - if (range_start_front < range_end_back) { - return speed; - } - } - - bool move_to_lowest_allowed_speed = m_config.exclude_print_speed_move_to_lowest_available_range.value; - for (auto range : numeric_ranges) { - if (speed > range.first && speed < range.second) { - speed = (move_to_lowest_allowed_speed) ? range.first : range.second; - return speed; - } - } - - return speed; -} - - double_t GCode::_compute_speed_mm_per_sec(const ExtrusionPath& path, double speed) { float factor = 1; @@ -5748,14 +5696,18 @@ double_t GCode::_compute_speed_mm_per_sec(const ExtrusionPath& path, double spee speed = m_config.get_computed_value("perimeter_speed"); } else if (path.role() == erExternalPerimeter) { speed = m_config.get_computed_value("external_perimeter_speed"); - speed = adjust_speed_if_in_forbidden_range(speed); + if (m_exclude_print_speeds) { + speed = m_exclude_print_speeds->adjust_speed_if_in_forbidden_range(speed); + } } else if (path.role() == erBridgeInfill) { speed = m_config.get_computed_value("bridge_speed"); } else if (path.role() == erInternalBridgeInfill) { speed = m_config.get_computed_value("bridge_speed_internal"); } else if (path.role() == erOverhangPerimeter) { speed = m_config.get_computed_value("overhangs_speed"); - speed = adjust_speed_if_in_forbidden_range(speed); + if (m_exclude_print_speeds) { + speed = m_exclude_print_speeds->adjust_speed_if_in_forbidden_range(speed); + } } else if (path.role() == erInternalInfill) { speed = m_config.get_computed_value("infill_speed"); } else if (path.role() == erSolidInfill) { diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index ae1232ca38b..9e8919c3e4b 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -11,6 +11,7 @@ #include "PlaceholderParser.hpp" #include "PrintConfig.hpp" #include "GCode/AvoidCrossingPerimeters.hpp" +#include "GCode/ExcludePrintSpeeds.hpp" #include "GCode/CoolingBuffer.hpp" #include "GCode/FanMover.hpp" #include "GCode/FindReplace.hpp" @@ -485,6 +486,7 @@ class GCode : ExtrusionVisitorConst { std::unique_ptr m_find_replace; std::unique_ptr m_pressure_equalizer; std::unique_ptr m_wipe_tower; + std::unique_ptr m_exclude_print_speeds; // Heights (print_z) at which the skirt has already been extruded. std::vector m_skirt_done; @@ -517,7 +519,6 @@ class GCode : ExtrusionVisitorConst { std::string _extrude(const ExtrusionPath &path, const std::string &description, double speed = -1); void _extrude_line(std::string& gcode_str, const Line& line, const double e_per_mm, const std::string& comment); void _extrude_line_cut_corner(std::string& gcode_str, const Line& line, const double e_per_mm, const std::string& comment, Point& last_pos, const double path_width); - double_t adjust_speed_if_in_forbidden_range(double speed) const; std::string _before_extrude(const ExtrusionPath &path, const std::string &description, double speed = -1); double_t _compute_speed_mm_per_sec(const ExtrusionPath& path, double speed = -1); std::string _after_extrude(const ExtrusionPath &path); diff --git a/src/libslic3r/GCode/ExcludePrintSpeeds.cpp b/src/libslic3r/GCode/ExcludePrintSpeeds.cpp new file mode 100644 index 00000000000..417b0dbc5e9 --- /dev/null +++ b/src/libslic3r/GCode/ExcludePrintSpeeds.cpp @@ -0,0 +1,71 @@ +#include "ExcludePrintSpeeds.hpp" + +#include +#include +#include + +namespace Slic3r { + +ExcludePrintSpeeds::ExcludePrintSpeeds(const std::string &_forbidden_ranges_user_input, + bool _move_to_lowest_available_speed) +{ + std::cout << "chka46: initializing ExcludePrintSpeeds" << std::endl; + move_to_lowest_allowed_speed = _move_to_lowest_available_speed; + std::string forbidden_ranges_user_input = _forbidden_ranges_user_input; + + forbidden_ranges_user_input.erase(std::remove_if(forbidden_ranges_user_input.begin(), + forbidden_ranges_user_input.end(), ::isspace), + forbidden_ranges_user_input.end()); + + std::vector forbidden_ranges_strings; + boost::split(forbidden_ranges_strings, forbidden_ranges_user_input, boost::is_any_of(",")); + + // Parse input (check string regex and convert to numeric) + auto numeric_range_regex = std::regex("^(\\d+)-(\\d+)$"); + for (const auto &elem : forbidden_ranges_strings) { + std::smatch regex_match; + if (!std::regex_match(elem, regex_match, numeric_range_regex)) { + std::cout << "Range element " << elem << " does not match int-int format" << std::endl; + // return speed; + return; // TODO + } + + constexpr size_t LOWER_BOUND_MATCH_INDEX = 1; + constexpr size_t UPPER_BOUND_MATCH_INDEX = 2; + auto lower_bound = std::stoi(regex_match[LOWER_BOUND_MATCH_INDEX]); + auto higher_bound = std::stoi(regex_match[UPPER_BOUND_MATCH_INDEX]); + if (lower_bound >= higher_bound) { + std::cout << "Invalid range: " << elem << ". Upper bound must be greater than lower bound." << std::endl; + return; // TODO + } + forbidden_ranges.emplace_back(lower_bound, higher_bound); + } + + // Check range consistency (Simply check for overlap. User can enter them in non-ascending lower bound order) + + std::sort(forbidden_ranges.begin(), forbidden_ranges.end(), + [](auto &left, auto &right) { return left.first < right.first; }); + + for (size_t i = 1; i < forbidden_ranges.size(); i++) { + int range_start_front = forbidden_ranges[i].first; + int range_end_back = forbidden_ranges[i - 1].second; + if (range_start_front < range_end_back) { + return; // TODO + } + } +} + + +double_t ExcludePrintSpeeds::adjust_speed_if_in_forbidden_range(double speed) +{ + for (auto range : forbidden_ranges) { + if (speed > range.first && speed < range.second) { + speed = (move_to_lowest_allowed_speed) ? range.first : range.second; + return speed; + } + } + + return speed; +} + +} \ No newline at end of file diff --git a/src/libslic3r/GCode/ExcludePrintSpeeds.hpp b/src/libslic3r/GCode/ExcludePrintSpeeds.hpp new file mode 100644 index 00000000000..114087758c1 --- /dev/null +++ b/src/libslic3r/GCode/ExcludePrintSpeeds.hpp @@ -0,0 +1,30 @@ +#ifndef slic3r_ExcludePrintSpeeds_hpp_ +#define slic3r_ExcludePrintSpeeds_hpp_ + +#include "../libslic3r.h" + +#include + +namespace Slic3r { + +class ExcludePrintSpeeds +{ +private: +static constexpr size_t LOWER_BOUND_MATCH_INDEX = 1; +static constexpr size_t UPPER_BOUND_MATCH_INDEX = 2; + + std::vector> forbidden_ranges; + bool move_to_lowest_allowed_speed{true}; + + + +public: + ExcludePrintSpeeds(const std::string& _forbidden_ranges_user_input, bool _move_to_lowest_available_range); + + double_t adjust_speed_if_in_forbidden_range(double speed); + +}; + +} + +#endif // slic3r_ExcludePrintSpeeds_hpp_ \ No newline at end of file From 9cb8c421fbcc8c29587a427ab6755d2674adf7a3 Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Tue, 16 Jul 2024 17:19:00 +0300 Subject: [PATCH 12/20] Add exception handling to exclude print speed range feature - Throw exception if input is invalid - Show exception to user on GUI --- src/libslic3r/GCode.cpp | 14 ++++++++------ src/libslic3r/GCode/ExcludePrintSpeeds.cpp | 16 +++++++--------- src/libslic3r/GCode/ExcludePrintSpeeds.hpp | 5 +---- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 287d38eb1b5..4c2d506b590 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1473,12 +1473,14 @@ void GCode::_do_export(Print& print_mod, GCodeOutputStream &file, ThumbnailsGene m_pressure_equalizer = make_unique(print.config()); m_enable_extrusion_role_markers = (bool)m_pressure_equalizer; - if (!print.config().exclude_print_speed_ranges.empty()) { - m_exclude_print_speeds = - make_unique(print.config().exclude_print_speed_ranges, - print.config().exclude_print_speed_move_to_lowest_available_range); - } else { - std::cout << "chka46: No ranges set! Not proceeding with ExcludePrintSpeeds initialization" << std::endl; + try { + if (!print.config().exclude_print_speed_ranges.empty()) { + m_exclude_print_speeds = + make_unique(print.config().exclude_print_speed_ranges, + print.config().exclude_print_speed_move_to_lowest_available_range); + } + } catch (std::exception &e) { + throw Slic3r::SlicingError(_(L("Error on excluded print speeds:\n") + _(L(e.what())))); } std::string preamble_to_put_start_layer = ""; diff --git a/src/libslic3r/GCode/ExcludePrintSpeeds.cpp b/src/libslic3r/GCode/ExcludePrintSpeeds.cpp index 417b0dbc5e9..2333819aff2 100644 --- a/src/libslic3r/GCode/ExcludePrintSpeeds.cpp +++ b/src/libslic3r/GCode/ExcludePrintSpeeds.cpp @@ -25,9 +25,9 @@ ExcludePrintSpeeds::ExcludePrintSpeeds(const std::string &_forbidden_ranges_user for (const auto &elem : forbidden_ranges_strings) { std::smatch regex_match; if (!std::regex_match(elem, regex_match, numeric_range_regex)) { - std::cout << "Range element " << elem << " does not match int-int format" << std::endl; - // return speed; - return; // TODO + throw Slic3r::SlicingError("Invalid range " + elem + + ". Range must have start and end values," + " separated by \"-\" (example: 30 - 50)"); } constexpr size_t LOWER_BOUND_MATCH_INDEX = 1; @@ -35,8 +35,7 @@ ExcludePrintSpeeds::ExcludePrintSpeeds(const std::string &_forbidden_ranges_user auto lower_bound = std::stoi(regex_match[LOWER_BOUND_MATCH_INDEX]); auto higher_bound = std::stoi(regex_match[UPPER_BOUND_MATCH_INDEX]); if (lower_bound >= higher_bound) { - std::cout << "Invalid range: " << elem << ". Upper bound must be greater than lower bound." << std::endl; - return; // TODO + throw Slic3r::SlicingError("Invalid range " + elem + ". Upper bound must be greater than lower bound."); } forbidden_ranges.emplace_back(lower_bound, higher_bound); } @@ -47,10 +46,9 @@ ExcludePrintSpeeds::ExcludePrintSpeeds(const std::string &_forbidden_ranges_user [](auto &left, auto &right) { return left.first < right.first; }); for (size_t i = 1; i < forbidden_ranges.size(); i++) { - int range_start_front = forbidden_ranges[i].first; - int range_end_back = forbidden_ranges[i - 1].second; - if (range_start_front < range_end_back) { - return; // TODO + if (forbidden_ranges[i].first < forbidden_ranges[i - 1].second) { + throw Slic3r::SlicingError("Ranges " + forbidden_ranges_strings[i - 1] + " and " + + forbidden_ranges_strings[i] + " overlap."); } } } diff --git a/src/libslic3r/GCode/ExcludePrintSpeeds.hpp b/src/libslic3r/GCode/ExcludePrintSpeeds.hpp index 114087758c1..aa87945af06 100644 --- a/src/libslic3r/GCode/ExcludePrintSpeeds.hpp +++ b/src/libslic3r/GCode/ExcludePrintSpeeds.hpp @@ -16,13 +16,10 @@ static constexpr size_t UPPER_BOUND_MATCH_INDEX = 2; std::vector> forbidden_ranges; bool move_to_lowest_allowed_speed{true}; - - public: - ExcludePrintSpeeds(const std::string& _forbidden_ranges_user_input, bool _move_to_lowest_available_range); + ExcludePrintSpeeds(const std::string &_forbidden_ranges_user_input, bool _move_to_lowest_available_range); double_t adjust_speed_if_in_forbidden_range(double speed); - }; } From 952e0ea3891a377caa26ee00c98df880c52c7a93 Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Tue, 16 Jul 2024 17:31:37 +0300 Subject: [PATCH 13/20] Increase UI label and input field width --- resources/ui_layout/default/print.ui | 2 +- resources/ui_layout/example/print.ui | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui index cb3ea87e592..2cbfd712a4f 100644 --- a/resources/ui_layout/default/print.ui +++ b/resources/ui_layout/default/print.ui @@ -347,7 +347,7 @@ group:label_width$8:sidetext_width$7:Speed for print moves setting:width$4:label$Wipe starting speed:wipe_tower_wipe_starting_speed group:Exclude print speeds line:Exclude print speeds (beta) - setting:label_width$8:width$4:exclude_print_speed_ranges + setting:label_width$12:width$26:exclude_print_speed_ranges setting:exclude_print_speed_move_to_lowest_available_range group:Speed for non-print moves line:Travel speed diff --git a/resources/ui_layout/example/print.ui b/resources/ui_layout/example/print.ui index 15663b21934..c6f16c49265 100644 --- a/resources/ui_layout/example/print.ui +++ b/resources/ui_layout/example/print.ui @@ -337,7 +337,7 @@ group:Speed for non-print moves end_line group:Exclude print speeds line:Exclude print speeds (beta) - setting:label_width$8:width$4:exclude_print_speed_ranges + setting:label_width$12:width$26:exclude_print_speed_ranges setting:exclude_print_speed_move_to_lowest_available_range group:sidetext_width$7:Modifiers line:First layer speed From 2a432bc60b8bc49793cafd03354d701a6e8b89b8 Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Wed, 17 Jul 2024 15:15:13 +0300 Subject: [PATCH 14/20] Give option to adjust speed to lowest, highest, or nearest value in excluded range --- resources/ui_layout/default/print.ui | 2 +- resources/ui_layout/example/print.ui | 2 +- src/libslic3r/GCode.cpp | 2 +- src/libslic3r/GCode/ExcludePrintSpeeds.cpp | 25 +++++++++++--- src/libslic3r/GCode/ExcludePrintSpeeds.hpp | 7 ++-- src/libslic3r/Preset.cpp | 2 +- src/libslic3r/PrintConfig.cpp | 38 +++++++++++++++++----- src/libslic3r/PrintConfig.hpp | 8 ++++- src/slic3r/GUI/ConfigManipulation.cpp | 2 +- 9 files changed, 66 insertions(+), 22 deletions(-) diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui index 2cbfd712a4f..a01dfca5a34 100644 --- a/resources/ui_layout/default/print.ui +++ b/resources/ui_layout/default/print.ui @@ -348,7 +348,7 @@ group:label_width$8:sidetext_width$7:Speed for print moves group:Exclude print speeds line:Exclude print speeds (beta) setting:label_width$12:width$26:exclude_print_speed_ranges - setting:exclude_print_speed_move_to_lowest_available_range + setting:exclude_print_speed_adjustment_direction group:Speed for non-print moves line:Travel speed setting:label$xy:travel_speed diff --git a/resources/ui_layout/example/print.ui b/resources/ui_layout/example/print.ui index c6f16c49265..6582801b06d 100644 --- a/resources/ui_layout/example/print.ui +++ b/resources/ui_layout/example/print.ui @@ -338,7 +338,7 @@ group:Speed for non-print moves group:Exclude print speeds line:Exclude print speeds (beta) setting:label_width$12:width$26:exclude_print_speed_ranges - setting:exclude_print_speed_move_to_lowest_available_range + setting:exclude_print_speed_adjustment_direction group:sidetext_width$7:Modifiers line:First layer speed setting:label_width$8:width$4:first_layer_min_speed diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 4c2d506b590..d80b070e153 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1477,7 +1477,7 @@ void GCode::_do_export(Print& print_mod, GCodeOutputStream &file, ThumbnailsGene if (!print.config().exclude_print_speed_ranges.empty()) { m_exclude_print_speeds = make_unique(print.config().exclude_print_speed_ranges, - print.config().exclude_print_speed_move_to_lowest_available_range); + print.config().exclude_print_speed_adjustment_direction); } } catch (std::exception &e) { throw Slic3r::SlicingError(_(L("Error on excluded print speeds:\n") + _(L(e.what())))); diff --git a/src/libslic3r/GCode/ExcludePrintSpeeds.cpp b/src/libslic3r/GCode/ExcludePrintSpeeds.cpp index 2333819aff2..990dbc7f9f6 100644 --- a/src/libslic3r/GCode/ExcludePrintSpeeds.cpp +++ b/src/libslic3r/GCode/ExcludePrintSpeeds.cpp @@ -6,11 +6,11 @@ namespace Slic3r { +// TODO - CHKA: Clean code; extract functions ExcludePrintSpeeds::ExcludePrintSpeeds(const std::string &_forbidden_ranges_user_input, - bool _move_to_lowest_available_speed) + const ConfigOptionEnum &_adjustment_direction) { - std::cout << "chka46: initializing ExcludePrintSpeeds" << std::endl; - move_to_lowest_allowed_speed = _move_to_lowest_available_speed; + adjustment_direction = _adjustment_direction; std::string forbidden_ranges_user_input = _forbidden_ranges_user_input; forbidden_ranges_user_input.erase(std::remove_if(forbidden_ranges_user_input.begin(), @@ -58,7 +58,24 @@ double_t ExcludePrintSpeeds::adjust_speed_if_in_forbidden_range(double speed) { for (auto range : forbidden_ranges) { if (speed > range.first && speed < range.second) { - speed = (move_to_lowest_allowed_speed) ? range.first : range.second; + switch (adjustment_direction) { + case epsdLowest: + speed = range.first; + break; + case epsdHighest: + speed = range.second; + break; + case epsdNearest: + if ((speed - range.first) < (range.second - speed)) { + speed = range.first; + } else { + speed = range.second; + } + break; + default: + return speed; + } + return speed; } } diff --git a/src/libslic3r/GCode/ExcludePrintSpeeds.hpp b/src/libslic3r/GCode/ExcludePrintSpeeds.hpp index aa87945af06..236982d5a37 100644 --- a/src/libslic3r/GCode/ExcludePrintSpeeds.hpp +++ b/src/libslic3r/GCode/ExcludePrintSpeeds.hpp @@ -1,7 +1,7 @@ #ifndef slic3r_ExcludePrintSpeeds_hpp_ #define slic3r_ExcludePrintSpeeds_hpp_ -#include "../libslic3r.h" +#include "../Print.hpp" #include @@ -14,10 +14,11 @@ static constexpr size_t LOWER_BOUND_MATCH_INDEX = 1; static constexpr size_t UPPER_BOUND_MATCH_INDEX = 2; std::vector> forbidden_ranges; - bool move_to_lowest_allowed_speed{true}; + ConfigOptionEnum adjustment_direction; public: - ExcludePrintSpeeds(const std::string &_forbidden_ranges_user_input, bool _move_to_lowest_available_range); + ExcludePrintSpeeds(const std::string &_forbidden_ranges_user_input, + const ConfigOptionEnum &_adjustment_direction); double_t adjust_speed_if_in_forbidden_range(double speed); }; diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 1b11bd6d0bc..ac8e5be9c98 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -543,7 +543,7 @@ static std::vector s_Preset_print_options { "max_print_speed", "max_volumetric_speed", "exclude_print_speed_ranges", - "exclude_print_speed_move_to_lowest_available_range", + "exclude_print_speed_adjustment_direction", // gapfill "gap_fill_enabled", "gap_fill_extension", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 64573208e4a..33b5af6e1eb 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -317,6 +317,13 @@ static t_config_enum_values s_keys_map_PerimeterGeneratorType { }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(PerimeterGeneratorType) +static const t_config_enum_values s_keys_map_ExcludePrintSpeedsAdjustmentDirection { + {"lowest", epsdLowest}, + {"highest", epsdHighest}, + {"nearest", epsdNearest} +}; +CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(ExcludePrintSpeedsAdjustmentDirection) + static void assign_printer_technology_to_unknown(t_optiondef_map &options, PrinterTechnology printer_technology) { for (std::pair &kvp : options) @@ -1951,13 +1958,26 @@ void PrintConfigDef::init_fff_params() // def->is_vector_extruder = true; def->set_default_value(new ConfigOptionString{""}); - def = this->add("exclude_print_speed_move_to_lowest_available_range", coBool); - def->label = L("Adjust speed to lowest range"); - def->category = OptionCategory::speed; - def->tooltip = L("If set to true, the speed is dropped to the lowest value of the forbidden range." - "Otherwise, the highest value of the range is chosen."); - def->mode = comAdvancedE | comSuSi; - def->set_default_value(new ConfigOptionBool(true)); + def = this->add("exclude_print_speed_adjustment_direction", coEnum); + def->label = L("Adjustment direction"); + def->full_label = L("Exclude print speed adjustment direction"); + def->category = OptionCategory::speed; + def->tooltip = L("This option decides which direction to adjust any invalid print speeds." +// "\n * None: Warn the user that print speeds in the invalid region are in effect, but do not alter them." // TODO - CHKA + "\n * Lowest: drop the speed to the lowest value of the range." + "\n * Highest: raise the speed to the highest value of the range." + "\n * Nearest: change the speed to whichever value of the above is closest to the speed set."); + def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); +// def->enum_values.push_back("none"); + def->enum_values.emplace_back("lowest"); + def->enum_values.emplace_back("highest"); + def->enum_values.emplace_back("nearest"); +// def->enum_labels.push_back(L("None")); + def->enum_labels.emplace_back(L("Lowest")); + def->enum_labels.emplace_back(L("Highest")); + def->enum_labels.emplace_back(L("Nearest")); + def->mode = comAdvancedE | comSuSi; + def->set_default_value(new ConfigOptionEnum(epsdLowest)); def = this->add("filament_max_wipe_tower_speed", coFloats); def->label = L("Max speed on the wipe tower"); @@ -8114,8 +8134,8 @@ std::unordered_set prusa_export_to_remove_keys = { "default_speed", "enforce_full_fill_volume", // "exact_last_layer_height", -"exclude_print_speed_ranges" -"exclude_print_speed_move_to_lowest_available_range", +"exclude_print_speed_ranges", +"exclude_print_speed_adjustment_direction", "external_infill_margin", "external_perimeter_acceleration", "external_perimeter_cut_corners", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index fa1a442a834..9f23c8de1bc 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -193,6 +193,11 @@ enum InfillConnection { icConnected, icHoles, icOuterShell, icNotConnected, }; +enum ExcludePrintSpeedsAdjustmentDirection +{ + epsdLowest, epsdHighest, epsdNearest +}; + enum RemainingTimeType : uint8_t{ rtNone = 0, rtM117 = 1<<0, @@ -300,6 +305,7 @@ CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(DraftShield) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(GCodeThumbnailsFormat) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(ZLiftTop) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(PerimeterGeneratorType) +CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(ExcludePrintSpeedsAdjustmentDirection) #undef CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS @@ -1288,7 +1294,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloat, z_offset)) ((ConfigOptionFloat, init_z_rotate)) ((ConfigOptionString, exclude_print_speed_ranges)) - ((ConfigOptionBool, exclude_print_speed_move_to_lowest_available_range)) + ((ConfigOptionEnum, exclude_print_speed_adjustment_direction)) ) diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 3ebb827e5a0..21912e0ee8e 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -341,7 +341,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) "overhangs", "perimeter_speed", "perimeter_reverse", "seam_position", "small_perimeter_speed", "small_perimeter_min_length", " small_perimeter_max_length", "spiral_vase", "perimeter_generator", "seam_notch_all", "seam_notch_inner", "seam_notch_outer", - "exclude_print_speed_ranges", "exclude_print_speed_move_to_lowest_available_range"}) + "exclude_print_speed_ranges", "exclude_print_speed_adjustment_direction"}) toggle_field(el, have_perimeters); bool has_spiral_vase = have_perimeters && config->opt_bool("spiral_vase"); From aa4ea57a3d819be92a887185d5392f32bd3bd94f Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Thu, 18 Jul 2024 10:47:05 +0300 Subject: [PATCH 15/20] Constructor refactoring: extract functions, clean up code --- src/libslic3r/GCode/ExcludePrintSpeeds.cpp | 60 ++++++++++++++-------- src/libslic3r/GCode/ExcludePrintSpeeds.hpp | 6 ++- 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/libslic3r/GCode/ExcludePrintSpeeds.cpp b/src/libslic3r/GCode/ExcludePrintSpeeds.cpp index 990dbc7f9f6..5a2f0c17e5a 100644 --- a/src/libslic3r/GCode/ExcludePrintSpeeds.cpp +++ b/src/libslic3r/GCode/ExcludePrintSpeeds.cpp @@ -6,23 +6,33 @@ namespace Slic3r { -// TODO - CHKA: Clean code; extract functions ExcludePrintSpeeds::ExcludePrintSpeeds(const std::string &_forbidden_ranges_user_input, const ConfigOptionEnum &_adjustment_direction) { - adjustment_direction = _adjustment_direction; - std::string forbidden_ranges_user_input = _forbidden_ranges_user_input; + adjustment_direction = _adjustment_direction; + std::vector excluded_ranges_strings = split_user_input_ranges_to_individual_strings(_forbidden_ranges_user_input); + parse_input(excluded_ranges_strings); + check_input_correctness(excluded_ranges_strings); +} + +std::vector ExcludePrintSpeeds::split_user_input_ranges_to_individual_strings(const std::string &_excluded_ranges_user_input) +{ + std::string forbidden_ranges_user_input = _excluded_ranges_user_input; forbidden_ranges_user_input.erase(std::remove_if(forbidden_ranges_user_input.begin(), forbidden_ranges_user_input.end(), ::isspace), forbidden_ranges_user_input.end()); - std::vector forbidden_ranges_strings; - boost::split(forbidden_ranges_strings, forbidden_ranges_user_input, boost::is_any_of(",")); + std::vector excluded_ranges_strings; + boost::split(excluded_ranges_strings, forbidden_ranges_user_input, boost::is_any_of(",")); + return excluded_ranges_strings; +} + - // Parse input (check string regex and convert to numeric) +void ExcludePrintSpeeds::parse_input(std::vector excluded_ranges_strings) +{ auto numeric_range_regex = std::regex("^(\\d+)-(\\d+)$"); - for (const auto &elem : forbidden_ranges_strings) { + for (const auto &elem : excluded_ranges_strings) { std::smatch regex_match; if (!std::regex_match(elem, regex_match, numeric_range_regex)) { throw Slic3r::SlicingError("Invalid range " + elem + @@ -30,25 +40,33 @@ ExcludePrintSpeeds::ExcludePrintSpeeds(const std::string &_forbidden_ranges_user " separated by \"-\" (example: 30 - 50)"); } - constexpr size_t LOWER_BOUND_MATCH_INDEX = 1; - constexpr size_t UPPER_BOUND_MATCH_INDEX = 2; - auto lower_bound = std::stoi(regex_match[LOWER_BOUND_MATCH_INDEX]); - auto higher_bound = std::stoi(regex_match[UPPER_BOUND_MATCH_INDEX]); - if (lower_bound >= higher_bound) { - throw Slic3r::SlicingError("Invalid range " + elem + ". Upper bound must be greater than lower bound."); + auto lower_bound = std::stoi(regex_match[LOWER_BOUND_MATCH_INDEX]); + auto higher_bound = std::stoi(regex_match[UPPER_BOUND_MATCH_INDEX]); + excluded_ranges.emplace_back(lower_bound, higher_bound); + } +} + +// TODO - CHKA. The strings here been whitespace-filtered. I want to print the original +// user input for HCI reasons. Not strict, might skip doing this. +void ExcludePrintSpeeds::check_input_correctness(const std::vector &excluded_ranges_strings) +{ + size_t i = 0; + for (const auto &range : excluded_ranges) { + if (range.first >= range.second) { + throw Slic3r::SlicingError("Invalid range " + excluded_ranges_strings[i] + + ". Upper bound must be greater than lower bound."); } - forbidden_ranges.emplace_back(lower_bound, higher_bound); + i++; } // Check range consistency (Simply check for overlap. User can enter them in non-ascending lower bound order) - - std::sort(forbidden_ranges.begin(), forbidden_ranges.end(), + std::sort(excluded_ranges.begin(), excluded_ranges.end(), [](auto &left, auto &right) { return left.first < right.first; }); - for (size_t i = 1; i < forbidden_ranges.size(); i++) { - if (forbidden_ranges[i].first < forbidden_ranges[i - 1].second) { - throw Slic3r::SlicingError("Ranges " + forbidden_ranges_strings[i - 1] + " and " + - forbidden_ranges_strings[i] + " overlap."); + for (i = 1; i < excluded_ranges.size(); i++) { + if (excluded_ranges[i].first < excluded_ranges[i - 1].second) { + throw Slic3r::SlicingError("Ranges " + excluded_ranges_strings[i - 1] + " and " + + excluded_ranges_strings[i] + " overlap."); } } } @@ -56,7 +74,7 @@ ExcludePrintSpeeds::ExcludePrintSpeeds(const std::string &_forbidden_ranges_user double_t ExcludePrintSpeeds::adjust_speed_if_in_forbidden_range(double speed) { - for (auto range : forbidden_ranges) { + for (auto range : excluded_ranges) { if (speed > range.first && speed < range.second) { switch (adjustment_direction) { case epsdLowest: diff --git a/src/libslic3r/GCode/ExcludePrintSpeeds.hpp b/src/libslic3r/GCode/ExcludePrintSpeeds.hpp index 236982d5a37..229383f9249 100644 --- a/src/libslic3r/GCode/ExcludePrintSpeeds.hpp +++ b/src/libslic3r/GCode/ExcludePrintSpeeds.hpp @@ -13,9 +13,13 @@ class ExcludePrintSpeeds static constexpr size_t LOWER_BOUND_MATCH_INDEX = 1; static constexpr size_t UPPER_BOUND_MATCH_INDEX = 2; - std::vector> forbidden_ranges; + std::vector> excluded_ranges; ConfigOptionEnum adjustment_direction; + static std::vector split_user_input_ranges_to_individual_strings(const std::string &_excluded_ranges_user_input); + void parse_input(std::vector excluded_ranges_strings); + void check_input_correctness(const std::vector &excluded_ranges_strings); + public: ExcludePrintSpeeds(const std::string &_forbidden_ranges_user_input, const ConfigOptionEnum &_adjustment_direction); From a58ed74fa6b9569087dd2c67ed8c6fa901c9b4a8 Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Thu, 18 Jul 2024 10:56:17 +0300 Subject: [PATCH 16/20] Update gui message --- src/libslic3r/PrintConfig.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 33b5af6e1eb..a9b9c72510a 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1952,8 +1952,11 @@ void PrintConfigDef::init_fff_params() // other features. def = this->add("exclude_print_speed_ranges", coString); def->label = L("Excluded speed ranges (in mm/s)"); - def->tooltip = L("Speed ranges to be excluded. One use case is to avoid CoreXY kinematic resonances. " - "Leave empty to disable"); + def->tooltip = L("Speed ranges to be excluded. If any speeds fall in these ranges, they will be raised/lowered " + "based on the adjustment direction. In its current state, only speeds set by the user in the speed " + "section will be affected, not speeds set by the minimum layer time. One use case for this feature" + " is to avoid CoreXY kinematic resonances. " + "Leave empty to disable."); def->mode = comExpert | comPrusa; // def->is_vector_extruder = true; def->set_default_value(new ConfigOptionString{""}); From 27ff6c502eb75954f58a6b6193ed57dc9be1564e Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Thu, 18 Jul 2024 11:16:05 +0300 Subject: [PATCH 17/20] Move gui info from field to group name --- resources/ui_layout/default/print.ui | 4 ++-- resources/ui_layout/example/print.ui | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui index a01dfca5a34..c2ef7ea197d 100644 --- a/resources/ui_layout/default/print.ui +++ b/resources/ui_layout/default/print.ui @@ -345,8 +345,8 @@ group:label_width$8:sidetext_width$7:Speed for print moves line:Wipe tower setting:width$4:label$Main speed:wipe_tower_speed setting:width$4:label$Wipe starting speed:wipe_tower_wipe_starting_speed -group:Exclude print speeds - line:Exclude print speeds (beta) +group:Exclude print speeds (beta) + line:Exclude print speeds setting:label_width$12:width$26:exclude_print_speed_ranges setting:exclude_print_speed_adjustment_direction group:Speed for non-print moves diff --git a/resources/ui_layout/example/print.ui b/resources/ui_layout/example/print.ui index 6582801b06d..329f8c882d1 100644 --- a/resources/ui_layout/example/print.ui +++ b/resources/ui_layout/example/print.ui @@ -335,8 +335,8 @@ group:Speed for non-print moves setting:label$xy:travel_speed setting:label$z:travel_speed_z end_line -group:Exclude print speeds - line:Exclude print speeds (beta) +group:Exclude print speeds (beta) + line:Exclude print speeds setting:label_width$12:width$26:exclude_print_speed_ranges setting:exclude_print_speed_adjustment_direction group:sidetext_width$7:Modifiers From 82a5395811fc8481202dba9378aaf7c9a268a72f Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Thu, 18 Jul 2024 11:26:38 +0300 Subject: [PATCH 18/20] Update user message --- src/libslic3r/PrintConfig.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index a9b9c72510a..94b6e856465 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1952,11 +1952,13 @@ void PrintConfigDef::init_fff_params() // other features. def = this->add("exclude_print_speed_ranges", coString); def->label = L("Excluded speed ranges (in mm/s)"); - def->tooltip = L("Speed ranges to be excluded. If any speeds fall in these ranges, they will be raised/lowered " - "based on the adjustment direction. In its current state, only speeds set by the user in the speed " - "section will be affected, not speeds set by the minimum layer time. One use case for this feature" - " is to avoid CoreXY kinematic resonances. " - "Leave empty to disable."); + def->tooltip = L( + "Speed ranges to be excluded. Example input form: 30-40, 60-80. " + "If any speeds fall in these ranges, they will be raised/lowered " + "according to the adjustment direction. One use case for this feature" + " is to avoid CoreXY kinematic resonances. In its current state, only speeds set by the user in the speed " + "section will be affected, not speeds set by the minimum layer time. " + "Leave empty to disable."); def->mode = comExpert | comPrusa; // def->is_vector_extruder = true; def->set_default_value(new ConfigOptionString{""}); From c2d6f2355c17f180c06d97b4a1a882735082d17b Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Thu, 18 Jul 2024 11:27:43 +0300 Subject: [PATCH 19/20] Add newline --- src/libslic3r/PrintConfig.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 94b6e856465..f05856b8dfb 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1958,7 +1958,7 @@ void PrintConfigDef::init_fff_params() "according to the adjustment direction. One use case for this feature" " is to avoid CoreXY kinematic resonances. In its current state, only speeds set by the user in the speed " "section will be affected, not speeds set by the minimum layer time. " - "Leave empty to disable."); + "\nLeave empty to disable."); def->mode = comExpert | comPrusa; // def->is_vector_extruder = true; def->set_default_value(new ConfigOptionString{""}); From b851ae5383d568d703ef6f06c3be9f387080b12e Mon Sep 17 00:00:00 2001 From: Christos Karampeazis-Papadakis Date: Thu, 18 Jul 2024 20:11:17 +0300 Subject: [PATCH 20/20] Set feature display flags to expert --- src/libslic3r/PrintConfig.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index f05856b8dfb..ef98a36b5c5 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1959,7 +1959,7 @@ void PrintConfigDef::init_fff_params() " is to avoid CoreXY kinematic resonances. In its current state, only speeds set by the user in the speed " "section will be affected, not speeds set by the minimum layer time. " "\nLeave empty to disable."); - def->mode = comExpert | comPrusa; + def->mode = comExpert | comSuSi; // def->is_vector_extruder = true; def->set_default_value(new ConfigOptionString{""}); @@ -1981,7 +1981,7 @@ void PrintConfigDef::init_fff_params() def->enum_labels.emplace_back(L("Lowest")); def->enum_labels.emplace_back(L("Highest")); def->enum_labels.emplace_back(L("Nearest")); - def->mode = comAdvancedE | comSuSi; + def->mode = comExpert | comSuSi; def->set_default_value(new ConfigOptionEnum(epsdLowest)); def = this->add("filament_max_wipe_tower_speed", coFloats);