diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index cfc185e461..7b7508d092 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -3225,8 +3225,8 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou // BBS: remove small small_perimeter_speed config, and will absolutely // remove related code if no other issue in the coming release. // apply the small perimeter speed - //if (is_perimeter(paths.front().role()) && loop.length() <= SMALL_PERIMETER_LENGTH && speed == -1) - // speed = m_config.small_perimeter_speed.get_abs_value(m_config.inner_wall_speed); + if (is_perimeter(paths.front().role()) && loop.length() <= SMALL_PERIMETER_LENGTH && speed == -1) + speed = m_config.small_perimeter_speed.get_abs_value(m_config.outer_wall_speed); // extrude along the path std::string gcode; diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index cb8e393d53..3bde8102d3 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -170,6 +170,7 @@ void Layer::make_perimeters() && config.wall_loops == other_config.wall_loops && config.inner_wall_speed == other_config.inner_wall_speed && config.outer_wall_speed == other_config.outer_wall_speed + && config.small_perimeter_speed == other_config.small_perimeter_speed && config.gap_infill_speed.value == other_config.gap_infill_speed.value && config.detect_overhang_wall == other_config.detect_overhang_wall && config.opt_serialize("inner_wall_line_width") == other_config.opt_serialize("inner_wall_line_width") diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 152d91fce3..a760ceb350 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -2769,6 +2769,7 @@ double Model::findMaxSpeed(const ModelObject* object) { double solidInfillSpeedObj = Model::printSpeedMap.solidInfillSpeed; double topSolidInfillSpeedObj = Model::printSpeedMap.topSolidInfillSpeed; double supportSpeedObj = Model::printSpeedMap.supportSpeed; + double smallPerimeterSpeedObj = Model::printSpeedMap.smallPerimeterSpeed; for (std::string objectKey : objectKeys) { if (objectKey == "inner_wall_speed"){ perimeterSpeedObj = object->config.opt_float(objectKey); @@ -2784,8 +2785,10 @@ double Model::findMaxSpeed(const ModelObject* object) { supportSpeedObj = object->config.opt_float(objectKey); if (objectKey == "outer_wall_speed") externalPerimeterSpeedObj = object->config.opt_float(objectKey); + if (objectKey == "small_perimeter_speed") + smallPerimeterSpeedObj = object->config.opt_float(objectKey); } - objMaxSpeed = std::max(perimeterSpeedObj, std::max(externalPerimeterSpeedObj, std::max(infillSpeedObj, std::max(solidInfillSpeedObj, std::max(topSolidInfillSpeedObj, std::max(supportSpeedObj, objMaxSpeed)))))); + objMaxSpeed = std::max(perimeterSpeedObj, std::max(externalPerimeterSpeedObj, std::max(infillSpeedObj, std::max(solidInfillSpeedObj, std::max(topSolidInfillSpeedObj, std::max(supportSpeedObj, std::max(smallPerimeterSpeedObj, objMaxSpeed))))))); if (objMaxSpeed <= 0) objMaxSpeed = 250.; return objMaxSpeed; } diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 2ce1123241..d661f208e6 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -1211,6 +1211,7 @@ struct GlobalSpeedMap double solidInfillSpeed; double topSolidInfillSpeed; double supportSpeed; + double smallPerimeterSpeed; double maxSpeed; }; diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 862f35ad2b..3c3c1d936a 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -695,7 +695,7 @@ static std::vector s_Preset_print_options { #ifdef HAS_PRESSURE_EQUALIZER "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative", #endif /* HAS_PRESSURE_EQUALIZER */ - "inner_wall_speed", "outer_wall_speed", "sparse_infill_speed", "internal_solid_infill_speed", + "inner_wall_speed", "outer_wall_speed", "small_perimeter_speed", "sparse_infill_speed", "internal_solid_infill_speed", "top_surface_speed", "support_speed", "support_object_xy_distance", "support_interface_speed", "bridge_speed", "gap_infill_speed", "travel_speed", "travel_speed_z", "initial_layer_speed", "initial_layer_acceleration", "top_surface_acceleration", "default_acceleration", "skirt_loops", "skirt_distance", "skirt_height", "draft_shield", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 31a76b9a83..2b88f0c4b4 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -934,6 +934,18 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloat(60)); + def = this->add("small_perimeter_speed", coFloatOrPercent); + def->label = L("Small perimeters"); + def->category = L("Speed"); + def->tooltip = L("This separate setting will affect the speed of perimeters having radius <= 6.5mm " + "(usually holes). If expressed as percentage (for example: 80%) it will be calculated " + "on the outer wall speed setting above. Set to zero for auto."); + def->sidetext = L("mm/s or %"); + def->ratio_over = "outer_wall_speed"; + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloatOrPercent(15, false)); + def = this->add("wall_infill_order", coEnum); def->label = L("Order of inner wall/outer wall/infil"); def->category = L("Quality"); @@ -3584,6 +3596,7 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va opt_key == "top_surface_speed" || opt_key == "support_interface_speed" || opt_key == "outer_wall_speed" || + opt_key == "small_perimeter_speed" || opt_key == "support_object_xy_distance") && value.find("%") != std::string::npos) { //BBS: this is old profile in which value is expressed as percentage. //But now these key-value must be absolute value. @@ -3623,7 +3636,7 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va // BBS , "support_sharp_tails","remove_small_overhangs", "support_with_sheath", "tree_support_branch_diameter_angle", "tree_support_collision_resolution", - "small_perimeter_speed", "max_volumetric_speed", "max_print_speed", + "max_volumetric_speed", "max_print_speed", "support_bottom_z_distance", "support_closing_radius", "slicing_mode", "remove_freq_sweep", "remove_bed_leveling", "remove_extrusion_calibration", "support_transition_line_width", "support_transition_speed", "bed_temperature", "bed_temperature_initial_layer", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index b1becfdc87..146f27e766 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -662,6 +662,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionEnum, bottom_surface_pattern)) ((ConfigOptionFloat, outer_wall_line_width)) ((ConfigOptionFloat, outer_wall_speed)) + ((ConfigOptionFloatOrPercent, small_perimeter_speed)) ((ConfigOptionFloat, infill_direction)) ((ConfigOptionPercent, sparse_infill_density)) ((ConfigOptionEnum, sparse_infill_pattern)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index a78bcff029..98f642a9f7 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -656,6 +656,7 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "brim_type" // BBS: brim generation depends on printing speed || opt_key == "outer_wall_speed" + || opt_key == "small_perimeter_speed" || opt_key == "sparse_infill_speed" || opt_key == "inner_wall_speed" || opt_key == "support_speed" @@ -827,6 +828,7 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "overhang_4_4_speed" || opt_key == "bridge_speed" || opt_key == "outer_wall_speed" + || opt_key == "small_perimeter_speed" || opt_key == "sparse_infill_speed" || opt_key == "inner_wall_speed" || opt_key == "internal_solid_infill_speed" diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 9d85b11058..b11def56c7 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -451,7 +451,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co bool have_perimeters = config->opt_int("wall_loops") > 0; for (auto el : { "detect_thin_wall", "detect_overhang_wall", "seam_position", "wall_infill_order", "outer_wall_line_width", - "inner_wall_speed", "outer_wall_speed" }) + "inner_wall_speed", "outer_wall_speed", "small_perimeter_speed" }) toggle_field(el, have_perimeters); bool have_infill = config->option("sparse_infill_density")->value > 0; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 62156490de..545700c45c 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2492,7 +2492,12 @@ void Plater::setPrintSpeedTable(GlobalSpeedMap &printSpeedMap) { if (printSpeedMap.supportSpeed > printSpeedMap.maxSpeed) printSpeedMap.maxSpeed = printSpeedMap.supportSpeed; } + if (config.has("small_perimeter_speed")) { + printSpeedMap.smallPerimeterSpeed = config.get_abs_value("small_perimeter_speed"); + if (printSpeedMap.smallPerimeterSpeed > printSpeedMap.maxSpeed) + printSpeedMap.maxSpeed = printSpeedMap.smallPerimeterSpeed; + } /* "inner_wall_speed", "outer_wall_speed", "sparse_infill_speed", "internal_solid_infill_speed", "top_surface_speed", "support_speed", "support_object_xy_distance", "support_interface_speed", "bridge_speed", "gap_infill_speed", "travel_speed", "initial_layer_speed"*/ diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 59bf8da70e..2a0b2b651e 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1816,6 +1816,7 @@ void TabPrint::build() 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"); + optgroup->append_single_option_line("small_perimeter_speed"); optgroup->append_single_option_line("sparse_infill_speed"); optgroup->append_single_option_line("internal_solid_infill_speed"); optgroup->append_single_option_line("top_surface_speed");