diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 84ada8964d..7b59545231 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -4000,6 +4000,21 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, if (path.role() != erBottomSurface) speed = m_config.get_abs_value("initial_layer_speed"); } + else if(m_config.slow_down_layers > 1){ + const auto _layer = layer_id() + 1; + if (_layer > 0 && _layer < m_config.slow_down_layers) { + const auto first_layer_speed = + is_perimeter(path.role()) + ? m_config.get_abs_value("initial_layer_speed") + : m_config.get_abs_value("initial_layer_infill_speed"); + if (first_layer_speed < speed) { + speed = std::min( + speed, + Slic3r::lerp(first_layer_speed, speed, + (double)_layer / m_config.slow_down_layers)); + } + } + } //BBS: remove this config //else if (this->object_layer_over_raft()) // speed = m_config.get_abs_value("first_layer_speed_over_raft", speed); diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 532efee380..dd1c357267 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -511,7 +511,12 @@ private: void _print_first_layer_extruder_temperatures(GCodeOutputStream &file, Print &print, const std::string &gcode, unsigned int first_printing_extruder_id, bool wait); // On the first printing layer. This flag triggers first layer speeds. //BBS - bool on_first_layer() const { return m_layer != nullptr && m_layer->id() == 0 && abs(m_layer->bottom_z()) < EPSILON; } + bool on_first_layer() const { return m_layer != nullptr && m_layer->id() == 0 && abs(m_layer->bottom_z()) < EPSILON; } + int layer_id() const { + if (m_layer == nullptr) + return -1; + return m_layer->id(); + } // To control print speed of 1st object layer over raft interface. bool object_layer_over_raft() const { return m_object_layer_over_raft; } diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index ed14e856e9..80456be868 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -756,7 +756,7 @@ static std::vector s_Preset_print_options { "bridge_density", "precise_outer_wall", "overhang_speed_classic", "bridge_acceleration", "sparse_infill_acceleration", "internal_solid_infill_acceleration", "tree_support_adaptive_layer_height", "tree_support_auto_brim", "tree_support_brim_width", "gcode_comments", "gcode_label_objects", - "initial_layer_travel_speed", "exclude_object" + "initial_layer_travel_speed", "exclude_object", "slow_down_layers" }; diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index debee90894..eefbc78fbd 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -229,7 +229,8 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n || opt_key == "travel_speed" || opt_key == "travel_speed_z" || opt_key == "initial_layer_speed" - || opt_key == "initial_layer_travel_speed") { + || opt_key == "initial_layer_travel_speed" + || opt_key == "slow_down_layers") { //|| opt_key == "z_offset") { steps.emplace_back(psWipeTower); steps.emplace_back(psSkirtBrim); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index d2c41e3107..6666ca1248 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1631,6 +1631,14 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloatOrPercent(100, true)); + def = this->add("slow_down_layers", coInt); + def->label = L("Number of slow layers"); + def->tooltip = L("The first few layers are printed slower than normal. " + "The speed is gradually increased in a linear fashion over the specified number of layers."); + def->category = L("Speed"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionInt(0)); def = this->add("nozzle_temperature_initial_layer", coInts); def->label = L("Initial layer"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index b4dd002413..ebe5790489 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1010,6 +1010,8 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionBool, gcode_label_objects)) ((ConfigOptionBool, exclude_object)) ((ConfigOptionBool, gcode_comments)) + ((ConfigOptionInt, slow_down_layers)) + ) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 529c0e7870..0d4cbf67b2 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1922,6 +1922,7 @@ void TabPrint::build() optgroup->append_single_option_line("initial_layer_speed"); optgroup->append_single_option_line("initial_layer_infill_speed"); optgroup->append_single_option_line("initial_layer_travel_speed"); + optgroup->append_single_option_line("slow_down_layers"); optgroup = page->new_optgroup(L("Other layers speed"), L"param_speed", 15); optgroup->append_single_option_line("outer_wall_speed"); optgroup->append_single_option_line("inner_wall_speed");