diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 970320568c..b822c37c89 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -3408,8 +3408,14 @@ std::string GCodeGenerator::_extrude( } if (m_volumetric_speed != 0. && speed == 0) speed = m_volumetric_speed / path_attr.mm3_per_mm; - if (this->on_first_layer()) - speed = m_config.get_abs_value("first_layer_speed", speed); + if (this->on_first_layer()) { + const double first_layer_infill_speed{m_config.get_abs_value("first_layer_infill_speed", speed)}; + if (path_attr.role == ExtrusionRole::SolidInfill && first_layer_infill_speed > 0) { + speed = first_layer_infill_speed; + } else { + speed = 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); diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 557b7767da..3ffcce1269 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -485,7 +485,7 @@ static std::vector s_Preset_print_options { "perimeter_speed", "small_perimeter_speed", "external_perimeter_speed", "infill_speed", "solid_infill_speed", "enable_dynamic_overhang_speeds", "overhang_speed_0", "overhang_speed_1", "overhang_speed_2", "overhang_speed_3", "top_solid_infill_speed", "support_material_speed", "support_material_xy_spacing", "support_material_interface_speed", - "bridge_speed", "over_bridge_speed", "gap_fill_speed", "gap_fill_enabled", "travel_speed", "travel_speed_z", "first_layer_speed", "first_layer_speed_over_raft", "perimeter_acceleration", "infill_acceleration", + "bridge_speed", "over_bridge_speed", "gap_fill_speed", "gap_fill_enabled", "travel_speed", "travel_speed_z", "first_layer_speed", "first_layer_infill_speed", "first_layer_speed_over_raft", "perimeter_acceleration", "infill_acceleration", "external_perimeter_acceleration", "top_solid_infill_acceleration", "solid_infill_acceleration", "travel_acceleration", "wipe_tower_acceleration", "bridge_acceleration", "first_layer_acceleration", "first_layer_acceleration_over_raft", "default_acceleration", "skirts", "skirt_distance", "skirt_height", "draft_shield", "min_skirt_length", "brim_width", "brim_separation", "brim_type", "support_material", "support_material_auto", "support_material_threshold", "support_material_enforce_layers", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index db517d6f8e..bfed37095d 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1630,6 +1630,18 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloatOrPercent(30, false)); + def = this->add("first_layer_infill_speed", coFloatOrPercent); + def->label = L("First layer solid infill speed"); + def->tooltip = L("If expressed as absolute value in mm/s, this speed will be applied to the solid infill print moves " + "of the first layer. If expressed as a percentage " + "(for example: 40%) it will be a percantage of the solid infill speed " + "(for example: 40% of the solid infill speed). " + "Note that 0 means that the \"First layer speed\" value will be used."); + def->sidetext = L("mm/s or %"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloatOrPercent(0, false)); + def = this->add("first_layer_speed_over_raft", coFloatOrPercent); def->label = L("Speed of object first layer over raft interface"); def->tooltip = L("If expressed as absolute value in mm/s, this speed will be applied to all the print moves " diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 8da9046f6a..dad9d2a6f4 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -937,6 +937,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloatOrPercent, first_layer_extrusion_width)) ((ConfigOptionFloatOrPercent, first_layer_height)) ((ConfigOptionFloatOrPercent, first_layer_speed)) + ((ConfigOptionFloatOrPercent, first_layer_infill_speed)) ((ConfigOptionInts, first_layer_temperature)) ((ConfigOptionIntsNullable, idle_temperature)) ((ConfigOptionInts, full_fan_speed_layer)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 58f31e3e10..0fb31fe22b 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -920,6 +920,7 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "external_perimeter_speed" || opt_key == "small_perimeter_speed" || opt_key == "solid_infill_speed" + || opt_key == "first_layer_infill_speed" || opt_key == "top_solid_infill_speed") { invalidated |= m_print->invalidate_step(psGCodeExport); } else if ( diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index d6a890ae4d..4e9d3297b8 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1602,6 +1602,7 @@ void TabPrint::build() optgroup = page->new_optgroup(L("Modifiers")); optgroup->append_single_option_line("first_layer_speed"); + optgroup->append_single_option_line("first_layer_infill_speed"); optgroup->append_single_option_line("first_layer_speed_over_raft"); optgroup = page->new_optgroup(L("Acceleration control (advanced)"));