diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index a2dc56a..d101e35 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -3370,6 +3370,19 @@ std::string GCodeGenerator::_extrude( m_config.get_abs_value("first_layer_speed", speed); else if (this->object_layer_over_raft()) speed = m_config.get_abs_value("first_layer_speed_over_raft", speed); + //w25 + 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 = (path_attr.role==ExtrusionRole::Perimeter||path_attr.role==ExtrusionRole::ExternalPerimeter) ? m_config.get_abs_value("first_layer_speed") : + m_config.get_abs_value("first_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)); + } + } + } + + std::pair dynamic_speed_and_fan_speed{-1, -1}; if (path_attr.overhang_attributes.has_value()) { diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 7e58fbb..db66349 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -465,6 +465,13 @@ private: // On the first printing layer. This flag triggers first layer speeds. bool on_first_layer() const { return m_layer != nullptr && m_layer->id() == 0; } + //w25 + 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 5a5ecc2..ea4f567 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -483,6 +483,8 @@ static std::vector s_Preset_print_options { ,"filter_top_gap_infill" //w23 ,"only_one_wall_first_layer" + //w25 + ,"slow_down_layers" }; static std::vector s_Preset_filament_options { diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 8fce2c9..7753279 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -251,7 +251,9 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n || opt_key == "first_layer_travel_speed" //B37 || opt_key == "first_layer_infill_speed" - || opt_key == "z_offset") { + || opt_key == "z_offset" + //w25 + || opt_key == "slow_down_layers") { steps.emplace_back(psWipeTower); steps.emplace_back(psSkirtBrim); } else if (opt_key == "filament_soluble") { diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index a1bfc14..7330a9a 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1482,6 +1482,16 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloatOrPercent(30, false)); + //w25 + 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("first_layer_temperature", coInts); def->label = L("First layer"); def->full_label = L("First layer nozzle temperature"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 5f34e6c..db2ec76 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -857,6 +857,8 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloatOrPercent, first_layer_extrusion_width)) ((ConfigOptionFloatOrPercent, first_layer_height)) ((ConfigOptionFloatOrPercent, first_layer_speed)) + //w25 + ((ConfigOptionInt, slow_down_layers)) ((ConfigOptionInts, first_layer_temperature)) ((ConfigOptionIntsNullable, idle_temperature)) //B26 diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index c5389c8..f14c476 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1607,6 +1607,8 @@ void TabPrint::build() optgroup->append_single_option_line("first_layer_travel_speed"); optgroup->append_single_option_line("first_layer_speed_over_raft"); + //w25 + optgroup->append_single_option_line("slow_down_layers"); optgroup = page->new_optgroup(L("Acceleration control (advanced)")); optgroup->append_single_option_line("external_perimeter_acceleration");