diff --git a/resources/ui_layout/print.ui b/resources/ui_layout/print.ui index 6a7107bfc..ee297ffab 100644 --- a/resources/ui_layout/print.ui +++ b/resources/ui_layout/print.ui @@ -17,23 +17,24 @@ group:Horizontal shells setting:solid_over_perimeters setting:enforce_full_fill_volume group:Quality - line:Only one perimeter on Top surfaces - setting:label$ :only_one_perimeter_top + line:Only one perimeter + setting:label_width$8:label$On first layer:only_one_perimeter_first_layer + setting:label_width$10:label$On top surfaces:only_one_perimeter_top setting:label$Minimum width:sidetext_width$7:min_width_top_surface end_line line:Extra perimeters - setting:extra_perimeters_overhangs - setting:extra_perimeters_odd_layers + setting:label_width$8:extra_perimeters_overhangs + setting:label_width$10:extra_perimeters_odd_layers end_line setting:ensure_vertical_shell_thickness line:Avoid crossing perimeters setting:label$_:avoid_crossing_perimeters - setting:label$Not on first layer:avoid_crossing_not_first_layer + setting:label_width$12:label$Not on first layer:avoid_crossing_not_first_layer setting:avoid_crossing_perimeters_max_detour end_line line:Overlapping external perimeter setting:label$_:thin_perimeters - setting:label$Also for all perimeters:thin_perimeters_all + setting:label_width$12:label$Also for all perimeters:thin_perimeters_all end_line line:Thin walls setting:label$_:thin_walls diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index eb58b81a4..9fcad1426 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -165,6 +165,7 @@ void Layer::make_perimeters() && config.infill_dense == other_config.infill_dense && config.infill_dense_algo == other_config.infill_dense_algo && config.no_perimeter_unsupported_algo == other_config.no_perimeter_unsupported_algo + && (this->id() == 0 || config.only_one_perimeter_first_layer == other_config.only_one_perimeter_first_layer) && config.only_one_perimeter_top == other_config.only_one_perimeter_top && config.only_one_perimeter_top_other_algo == other_config.only_one_perimeter_top_other_algo && config.overhangs_width_speed == other_config.overhangs_width_speed diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 3bc2340c1..a24757c35 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -364,7 +364,7 @@ void PerimeterGenerator::process() int loop_number = this->config->perimeters + surface.extra_perimeters - 1 + extra_odd_perimeter; // 0-indexed loops surface_idx++; - if (this->config->only_one_perimeter_top && loop_number > 0 && this->upper_slices == NULL){ + if ((layer->id() == 0 && this->config->only_one_perimeter_first_layer) || (this->config->only_one_perimeter_top && loop_number > 0 && this->upper_slices == NULL)){ loop_number = 0; } @@ -678,7 +678,7 @@ void PerimeterGenerator::process() last = std::move(next_onion); //store surface for top infill if only_one_perimeter_top - if(i==0 && config->only_one_perimeter_top && this->upper_slices != NULL){ + if(i==0 && ((layer->id() == 0 && this->config->only_one_perimeter_first_layer) || (config->only_one_perimeter_top && this->upper_slices != NULL))){ if (this->config->only_one_perimeter_top_other_algo) { //split the polygons with top/not_top //get the offset from solid surface anchor diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index ea17f99d5..9f9e8b1e9 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -451,6 +451,7 @@ const std::vector& Preset::print_options() "extra_perimeters", "extra_perimeters_odd_layers", "extra_perimeters_overhangs", + "only_one_perimeter_first_layer", "only_one_perimeter_top", "only_one_perimeter_top_other_algo", "ensure_vertical_shell_thickness", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 72ab45c5b..adb8cf0fc 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1071,6 +1071,12 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionBool(false)); + def = this->add("only_one_perimeter_first_layer", coBool); + def->label = L("Only one perimeter on First layer"); + def->category = OptionCategory::perimeter; + def->tooltip = L("Use only one perimeter on first layer, to give more space to the top infill pattern."); + def->set_default_value(new ConfigOptionBool(false)); + def = this->add("only_one_perimeter_top", coBool); def->label = L("Only one perimeter on Top surfaces"); def->category = OptionCategory::perimeter; @@ -5742,6 +5748,7 @@ std::unordered_set prusa_export_to_remove_keys = { "no_perimeter_unsupported_algo", "only_one_perimeter_top_other_algo", "only_one_perimeter_top", +"only_one_perimeter_first_layer", "over_bridge_flow_ratio", "overhangs_reverse_threshold", "overhangs_reverse", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index a15d1a0ec..99a1c9316 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -781,6 +781,7 @@ public: ConfigOptionBool extra_perimeters; ConfigOptionBool extra_perimeters_odd_layers; ConfigOptionBool extra_perimeters_overhangs; + ConfigOptionBool only_one_perimeter_first_layer; ConfigOptionBool only_one_perimeter_top; ConfigOptionBool only_one_perimeter_top_other_algo; ConfigOptionFloat fill_angle; @@ -898,6 +899,7 @@ protected: OPT_PTR(extra_perimeters); OPT_PTR(extra_perimeters_odd_layers); OPT_PTR(extra_perimeters_overhangs); + OPT_PTR(only_one_perimeter_first_layer); OPT_PTR(only_one_perimeter_top); OPT_PTR(only_one_perimeter_top_other_algo); OPT_PTR(fill_angle); diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 4ccea201b..6cd4c3cbf 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -731,6 +731,7 @@ namespace Slic3r { opt_key == "gap_fill" || opt_key == "gap_fill_last" || opt_key == "gap_fill_min_area" + || opt_key == "only_one_perimeter_first_layer" || opt_key == "only_one_perimeter_top" || opt_key == "only_one_perimeter_top_other_algo" || opt_key == "overhangs_width_speed"