From 004ec5480d38ec7fb3a456e70fb63e0c3892b9d6 Mon Sep 17 00:00:00 2001 From: supermerill Date: Tue, 29 Oct 2019 19:11:30 +0100 Subject: [PATCH] alternate extra wall: on odd layers #89 --- src/libslic3r/PerimeterGenerator.cpp | 3 ++- src/libslic3r/PrintConfig.cpp | 24 +++++++++++++++++------- src/libslic3r/PrintConfig.hpp | 2 ++ src/libslic3r/PrintObject.cpp | 1 + src/slic3r/GUI/ConfigManipulation.cpp | 2 +- src/slic3r/GUI/Preset.cpp | 4 +++- src/slic3r/GUI/PresetHints.cpp | 2 +- src/slic3r/GUI/Tab.cpp | 5 ++++- 8 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 8ef9815d5..302023d63 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -273,9 +273,10 @@ void PerimeterGenerator::process() } surface_idx = 0; + const int extra_odd_perimeter = (config->extra_perimeters_odd_layers && layer_id % 2 == 1 ? 1:0); for (const Surface &surface : all_surfaces) { // detect how many perimeters must be generated for this island - int loop_number = this->config->perimeters + surface.extra_perimeters - 1; // 0-indexed loops + 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 && this->upper_slices == NULL){ diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 055a7fafc..814e6eed7 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -619,17 +619,27 @@ void PrintConfigDef::init_fff_params() def->enum_labels.push_back(L("Nearest")); def->enum_labels.push_back(L("Rear")); def->mode = comAdvanced; - def->set_default_value(new ConfigOptionEnum(spRear)); - + def->set_default_value(new ConfigOptionEnum(spRear)); + def = this->add("extra_perimeters", coBool); - def->label = L("Extra perimeters if needed"); + def->label = L("filling horizontal gaps on slopes"); + def->full_label = L("Extra perimeters if needed"); def->category = L("Layers and Perimeters"); def->tooltip = L("Add more perimeters when needed for avoiding gaps in sloping walls. " - "Slic3r keeps adding perimeters, until more than 70% of the loop immediately above " - "is supported, and keep adding periemter until all overhangs are filled." - "\n!! this is a very slow algorithm !!"); + "Slic3r keeps adding perimeters, until more than 70% of the loop immediately above " + "is supported, and keep adding periemter until all overhangs are filled." + "\n!! this is a very slow algorithm !!"); def->mode = comAdvanced; - def->set_default_value(new ConfigOptionBool(true)); + def->set_default_value(new ConfigOptionBool(false)); + + def = this->add("extra_perimeters_odd_layers", coBool); + def->label = L("on odd layers"); + def->full_label = L("Extra perimeter on odd layers"); + def->category = L("Layers and Perimeters"); + def->tooltip = L("Add one perimeter every odd layer. With this, infill is taken into sandwitch" + " and you may be able to reduce drastically the infill/perimeter overlap setting. "); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); def = this->add("only_one_perimeter_top", coBool); def->label = "Only one perimeter on Top surfaces"; diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 838781f0b..a2c8b2bfa 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -587,6 +587,7 @@ public: ConfigOptionFloatOrPercent external_perimeter_speed; ConfigOptionBool external_perimeters_first; ConfigOptionBool extra_perimeters; + ConfigOptionBool extra_perimeters_odd_layers; ConfigOptionBool only_one_perimeter_top; ConfigOptionFloat fill_angle; ConfigOptionPercent fill_density; @@ -655,6 +656,7 @@ protected: OPT_PTR(external_perimeter_speed); OPT_PTR(external_perimeters_first); OPT_PTR(extra_perimeters); + OPT_PTR(extra_perimeters_odd_layers); OPT_PTR(only_one_perimeter_top); OPT_PTR(fill_angle); OPT_PTR(fill_density); diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 0e949a35c..f8c144add 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -472,6 +472,7 @@ bool PrintObject::invalidate_state_by_config_options(const std::vectoropt_int("perimeters") > 0; - for (auto el : { "extra_perimeters", "only_one_perimeter_top", "ensure_vertical_shell_thickness", "thin_walls", "overhangs", + for (auto el : { "extra_perimeters", "extra_perimeters_odd_layers", "only_one_perimeter_top", "ensure_vertical_shell_thickness", "thin_walls", "overhangs", "seam_position", "external_perimeters_first", "external_perimeter_extrusion_width", "perimeter_speed", "small_perimeter_speed", "external_perimeter_speed", "perimeter_loop", "perimeter_loop_seam" }) toggle_field(el, have_perimeters); diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index c2d4d97dc..6fb7bda53 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -379,7 +379,9 @@ const std::vector& Preset::print_options() { static std::vector s_opts { "layer_height", "first_layer_height", "perimeters", "spiral_vase", "slice_closing_radius", "top_solid_layers", "bottom_solid_layers", - "extra_perimeters", "only_one_perimeter_top", "ensure_vertical_shell_thickness", "avoid_crossing_perimeters", "thin_walls", "overhangs", + "extra_perimeters", + "extra_perimeters_odd_layers", + "only_one_perimeter_top", "ensure_vertical_shell_thickness", "avoid_crossing_perimeters", "thin_walls", "overhangs", "overhangs_width", "seam_position", "external_perimeters_first", "fill_density" , "fill_pattern" diff --git a/src/slic3r/GUI/PresetHints.cpp b/src/slic3r/GUI/PresetHints.cpp index 5d99467d8..e547e3c73 100644 --- a/src/slic3r/GUI/PresetHints.cpp +++ b/src/slic3r/GUI/PresetHints.cpp @@ -267,7 +267,7 @@ std::string PresetHints::recommended_thin_wall_thickness(const PresetBundle &pre if (num_perimeters > 0) { int num_lines = std::min(num_perimeters * 2, 10); - out += (boost::format(_utf8(L("Recommended object min thin wall thickness for layer height %.2f and"))) % layer_height).str() + " "; + out += (boost::format(_utf8(L("Recommended object min wall thickness for layer height %.2f and"))) % layer_height).str() + " "; // Start with the width of two closely spaced double width = external_perimeter_flow.width + external_perimeter_flow.spacing(); for (int i = 2; i <= num_lines; thin_walls ? ++ i : i += 2) { diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 78572470f..f461abd73 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1051,7 +1051,10 @@ void TabPrint::build() optgroup->append_single_option_line("enforce_full_fill_volume"); optgroup = page->new_optgroup(_(L("Quality (slower slicing)"))); - optgroup->append_single_option_line("extra_perimeters"); + line = { _(L("Extra perimeters")), "" }; + line.append_option(optgroup->get_option("extra_perimeters")); + line.append_option(optgroup->get_option("extra_perimeters_odd_layers")); + optgroup->append_line(line); optgroup->append_single_option_line("only_one_perimeter_top"); optgroup->append_single_option_line("ensure_vertical_shell_thickness"); optgroup->append_single_option_line("avoid_crossing_perimeters");