From 319d0552ed3ddc62b958437f361631a2461e0456 Mon Sep 17 00:00:00 2001 From: supermerill Date: Wed, 10 Jun 2020 16:00:34 +0200 Subject: [PATCH] #211 % max speed reduction waiting for a good name --- resources/ui_layout/filament.ui | 3 ++- src/libslic3r/Config.hpp | 1 + src/libslic3r/GCode/CoolingBuffer.cpp | 20 +++++++++++++++++--- src/libslic3r/PrintConfig.cpp | 14 ++++++++++++-- src/libslic3r/PrintConfig.hpp | 2 ++ src/slic3r/GUI/Preset.cpp | 8 ++++++-- src/slic3r/GUI/PresetHints.cpp | 12 +++++++++--- 7 files changed, 49 insertions(+), 11 deletions(-) diff --git a/resources/ui_layout/filament.ui b/resources/ui_layout/filament.ui index 09a246780..29b0fbc25 100644 --- a/resources/ui_layout/filament.ui +++ b/resources/ui_layout/filament.ui @@ -30,7 +30,8 @@ group:Short layer time - began to increase base fan speed setting:label$Max fan speed:max_fan_speed group:Very short layer time - began to decrease extrusion rate setting:label$Layer time goal:slowdown_below_layer_time - setting:min_print_speed + setting:width$4:max_speed_reduction + setting:width$4:min_print_speed group:Behavior cooling_description diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index c0a0967cf..1cc0378cf 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -867,6 +867,7 @@ public: ConfigOption* clone() const override { return new ConfigOptionPercentsTempl(*this); } ConfigOptionPercentsTempl& operator=(const ConfigOption *opt) { this->set(opt); return *this; } bool operator==(const ConfigOptionPercentsTempl &rhs) const { return this->values == rhs.values; } + double get_abs_value(size_t i, double ratio_over) const { return is_nil(i) ? 0 : ratio_over * get_at(i) / 100; } std::string serialize() const override { diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp index 52e4e31c7..d4e73d8bd 100644 --- a/src/libslic3r/GCode/CoolingBuffer.cpp +++ b/src/libslic3r/GCode/CoolingBuffer.cpp @@ -193,6 +193,11 @@ struct PerExtruderAdjustments if (line.feedrate > min_feedrate) { line.time *= std::max(1.f, line.feedrate / min_feedrate); line.feedrate = min_feedrate; + //test to never go over max_time + if (line.time > line.time_max) { + line.time = line.time_max; + line.feedrate = line.length / line.time; + } line.slowdown = true; } } @@ -206,6 +211,8 @@ struct PerExtruderAdjustments float slowdown_below_layer_time = 0.f; // Minimum print speed allowed for this extruder. float min_print_speed = 0.f; + // Max speed reduction allowed for this extruder. + float max_speed_reduction = 1; // Parsed lines. std::vector lines; @@ -307,6 +314,7 @@ std::vector CoolingBuffer::parse_layer_gcode(const std:: adj.cooling_slow_down_enabled = config.cooling.get_at(extruder_id); adj.slowdown_below_layer_time = float(config.slowdown_below_layer_time.get_at(extruder_id)); adj.min_print_speed = float(config.min_print_speed.get_at(extruder_id)); + adj.max_speed_reduction = float(config.max_speed_reduction.get_at(extruder_id) / 100); map_extruder_to_per_extruder_adjustment[extruder_id] = i; } @@ -394,8 +402,11 @@ std::vector CoolingBuffer::parse_layer_gcode(const std:: if (line.length > 0) line.time = line.length / line.feedrate; line.time_max = line.time; - if ((line.type & CoolingLine::TYPE_ADJUSTABLE) || active_speed_modifier != size_t(-1)) + if ((line.type & CoolingLine::TYPE_ADJUSTABLE) || active_speed_modifier != size_t(-1)) { line.time_max = (adjustment->min_print_speed == 0.f) ? FLT_MAX : std::max(line.time, line.length / adjustment->min_print_speed); + if(adjustment->max_speed_reduction > 0) + line.time_max = std::min(line.time_max, line.time / (1- adjustment->max_speed_reduction)); + } if (active_speed_modifier < adjustment->lines.size() && (line.type & CoolingLine::TYPE_G1)) { // Inside the ";_EXTRUDE_SET_SPEED" blocks, there must not be a G1 Fxx entry. assert((line.type & CoolingLine::TYPE_HAS_F) == 0); @@ -534,8 +545,10 @@ static inline void extruder_range_slow_down_non_proportional( } assert(feedrate > 0.f); // Sort by min_print_speed, maximum speed first. + //multiplied by max_speed_reductionto be able to sort them when only this one change. std::sort(by_min_print_speed.begin(), by_min_print_speed.end(), - [](const PerExtruderAdjustments *p1, const PerExtruderAdjustments *p2){ return p1->min_print_speed > p2->min_print_speed; }); + [](const PerExtruderAdjustments *p1, const PerExtruderAdjustments *p2){ + return (1 - p1->max_speed_reduction) * p1->min_print_speed > (1 - p2->max_speed_reduction) * p2->min_print_speed; }); // Slow down, fast moves first. for (;;) { // For each extruder, find the span of lines with a feedrate close to feedrate. @@ -552,6 +565,7 @@ static inline void extruder_range_slow_down_non_proportional( // Slow down, limited by max(feedrate_next, min_print_speed). for (auto adj = by_min_print_speed.begin(); adj != by_min_print_speed.end();) { // Slow down at most by time_stretch. + //note: the max_speed reduction is used via the max_time, nothing else to do as it's a proportional limit. if ((*adj)->min_print_speed == 0.f) { // All the adjustable speeds are now lowered to the same speed, // and the minimum speed is set to zero. @@ -580,7 +594,7 @@ static inline void extruder_range_slow_down_non_proportional( } // Skip the other extruders with nearly the same min_print_speed, as they have been processed already. auto next = adj; - for (++ next; next != by_min_print_speed.end() && (*next)->min_print_speed > (*adj)->min_print_speed - EPSILON; ++ next); + for (++ next; next != by_min_print_speed.end() && (*next)->min_print_speed > (*adj)->min_print_speed - EPSILON && (*next)->max_speed_reduction < (*adj)->max_speed_reduction + EPSILON; ++ next); adj = next; } if (feedrate_next == 0.f) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 33795038c..0c65ab3af 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1943,13 +1943,23 @@ void PrintConfigDef::init_fff_params() def->label = L("Max print speed"); def->category = OptionCategory::speed; def->tooltip = L("When setting other speed settings to 0 Slic3r will autocalculate the optimal speed " - "in order to keep constant extruder pressure. This experimental setting is used " - "to set the highest print speed you want to allow."); + "in order to keep constant extruder pressure. This experimental setting is used " + "to set the highest print speed you want to allow."); def->sidetext = L("mm/s"); def->min = 1; def->mode = comExpert; def->set_default_value(new ConfigOptionFloat(80)); + def = this->add("max_speed_reduction", coPercents); + def->label = L("Max speed reduction"); + def->category = OptionCategory::speed; + def->tooltip = L("Amount of speed you can reduce per extrusion speed."); + def->sidetext = L("%"); + def->min = 0; + def->max = 100; + def->mode = comExpert; + def->set_default_value(new ConfigOptionPercents{ 90 }); + def = this->add("max_volumetric_speed", coFloat); def->label = L("Max volumetric speed"); def->category = OptionCategory::extruders; diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index ecdbcf19a..d2dea2f51 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1060,6 +1060,7 @@ public: ConfigOptionInts max_fan_speed; ConfigOptionFloats max_layer_height; ConfigOptionFloat max_print_height; + ConfigOptionPercents max_speed_reduction; ConfigOptionFloats milling_diameter; ConfigOptionStrings milling_toolchange_end_gcode; ConfigOptionStrings milling_toolchange_start_gcode; @@ -1148,6 +1149,7 @@ protected: OPT_PTR(max_fan_speed); OPT_PTR(max_layer_height); OPT_PTR(max_print_height); + OPT_PTR(max_speed_reduction); OPT_PTR(milling_diameter); OPT_PTR(milling_toolchange_end_gcode); OPT_PTR(milling_toolchange_start_gcode); diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index f689773c8..745481b6e 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -457,7 +457,8 @@ const std::vector& Preset::print_options() , "bottom_fill_pattern" , "solid_fill_pattern", "infill_every_layers", "infill_only_where_needed", "solid_infill_every_layers", "fill_angle", "bridge_angle", - "solid_infill_below_area", "only_retract_when_crossing_perimeters", "infill_first", "max_print_speed", + "solid_infill_below_area", "only_retract_when_crossing_perimeters", "infill_first", + "max_print_speed", "max_volumetric_speed", #ifdef HAS_PRESSURE_EQUALIZER "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative", @@ -566,7 +567,10 @@ const std::vector& Preset::filament_options() "max_fan_speed", "bridge_fan_speed" , "top_fan_speed" , "disable_fan_first_layers" - , "fan_below_layer_time", "slowdown_below_layer_time", "min_print_speed", + , "fan_below_layer_time", + "slowdown_below_layer_time", + "max_speed_reduction", + "min_print_speed", "start_filament_gcode", "end_filament_gcode", "external_perimeter_fan_speed", // Retract overrides diff --git a/src/slic3r/GUI/PresetHints.cpp b/src/slic3r/GUI/PresetHints.cpp index f7c3dbe90..1901ce2cd 100644 --- a/src/slic3r/GUI/PresetHints.cpp +++ b/src/slic3r/GUI/PresetHints.cpp @@ -26,6 +26,7 @@ std::string PresetHints::cooling_description(const Preset &preset) int disable_fan_first_layers = preset.config.opt_int("disable_fan_first_layers", 0); int slowdown_below_layer_time = preset.config.opt_int("slowdown_below_layer_time", 0); int min_print_speed = int(preset.config.opt_float("min_print_speed", 0) + 0.5); + int max_speed_reduc = int(preset.config.opt_float("max_speed_reduction", 0)); int fan_below_layer_time = preset.config.opt_int("fan_below_layer_time", 0); //if (preset.config.opt_bool("cooling", 0)) { @@ -97,9 +98,14 @@ std::string PresetHints::cooling_description(const Preset &preset) } out += " " + (boost::format(_utf8(L("print speed will be reduced " - "so that no less than %1%s are spent on that layer " - "(however, speed will never be reduced below %2%mm/s)."))) - % slowdown_below_layer_time % min_print_speed).str(); + "so that no less than %1%s are spent on that layer"))) % slowdown_below_layer_time).str(); + if(min_print_speed > 0) + if(max_speed_reduc > 0) + out += " " + (boost::format(_utf8(L("(however, speed will never be reduced below %1%mm/s or up to %2%%% reduction)"))) + % min_print_speed % max_speed_reduc).str(); + else + out += " " + (boost::format(_utf8(L("(however, speed will never be reduced below %1%mm/s)"))) + % min_print_speed).str(); } return out;