diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 1b5b507522..edb3f6b8b3 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -838,8 +838,8 @@ void PerimeterGenerator::process_classic() for (const Surface &surface : this->slices->surfaces) { // detect how many perimeters must be generated for this island int loop_number = this->config->wall_loops + surface.extra_perimeters - 1; // 0-indexed loops - //BBS: set the topmost layer to be one wall - if (loop_number > 0 && config->only_one_wall_top && this->upper_slices == nullptr) + //BBS: set the topmost and bottom most layer to be one wall + if (loop_number > 0 && ((this->object_config->only_one_wall_top && this->upper_slices == nullptr) || (this->object_config->only_one_wall_first_layer && layer_id == 0))) loop_number = 0; ExPolygons last = union_ex(surface.expolygon.simplify_p(surface_simplify_resolution)); @@ -986,7 +986,7 @@ void PerimeterGenerator::process_classic() //BBS: refer to superslicer //store surface for top infill if only_one_wall_top - if (i == 0 && i!=loop_number && config->only_one_wall_top && this->upper_slices != NULL) { + if (i == 0 && i != loop_number && this->object_config->only_one_wall_top && this->upper_slices != NULL) { //split the polygons with top/not_top //get the offset from solid surface anchor coord_t offset_top_surface = scale_(1.5 * (config->wall_loops.value == 0 ? 0. : unscaled(double(ext_perimeter_width + perimeter_spacing * int(int(config->wall_loops.value) - int(1)))))); @@ -1283,6 +1283,9 @@ void PerimeterGenerator::process_arachne() for (const Surface& surface : this->slices->surfaces) { // detect how many perimeters must be generated for this island int loop_number = this->config->wall_loops + surface.extra_perimeters - 1; // 0-indexed loops + if (loop_number > 0 && this->object_config->only_one_wall_first_layer && layer_id == 0) + loop_number = 0; + ExPolygons last = offset_ex(surface.expolygon.simplify_p(surface_simplify_resolution), -float(ext_perimeter_width / 2. - ext_perimeter_spacing / 2.)); Polygons last_p = to_polygons(last); diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 167d57b4ff..e5481516b3 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -744,7 +744,7 @@ static std::vector s_Preset_print_options { "detect_narrow_internal_solid_infill", "gcode_add_line_number", "enable_arc_fitting", "infill_combination", /*"adaptive_layer_height",*/ "support_bottom_interface_spacing", "enable_overhang_speed", "overhang_1_4_speed", "overhang_2_4_speed", "overhang_3_4_speed", "overhang_4_4_speed", - "initial_layer_infill_speed", "only_one_wall_top", + "initial_layer_infill_speed", "only_one_wall_top", "only_one_wall_first_layer", "timelapse_type", "internal_bridge_support_thickness", "wall_generator", "wall_transition_length", "wall_transition_filter_deviation", "wall_transition_angle", "wall_distribution_count", "min_feature_size", "min_bead_width", "post_process" diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 43a35eeca9..1164c1ee4f 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -695,6 +695,12 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Use only one wall on flat top surface, to give more space to the top infill pattern"); def->set_default_value(new ConfigOptionBool(false)); + def = this->add("only_one_wall_first_layer", coBool); + def->label = L("Only one wall on first layer"); + def->category = L("Quality"); + def->tooltip = L("Use only one wall on the first layer of model"); + def->set_default_value(new ConfigOptionBool(false)); + def = this->add("enable_overhang_speed", coBool); def->label = L("Slow down for overhang"); def->category = L("Speed"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 22808f1b42..fd624b2829 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -696,6 +696,8 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionInt, wall_distribution_count)) ((ConfigOptionPercent, min_feature_size)) ((ConfigOptionPercent, min_bead_width)) + ((ConfigOptionBool, only_one_wall_top)) + ((ConfigOptionBool, only_one_wall_first_layer)) ) // This object is mapped to Perl as Slic3r::Config::PrintRegion. @@ -752,9 +754,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloat, overhang_1_4_speed)) ((ConfigOptionFloat, overhang_2_4_speed)) ((ConfigOptionFloat, overhang_3_4_speed)) - ((ConfigOptionFloat, overhang_4_4_speed)) - ((ConfigOptionBool, only_one_wall_top)) -) + ((ConfigOptionFloat, overhang_4_4_speed))) PRINT_CONFIG_CLASS_DEFINE( MachineEnvelopeConfig, diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 50f3fac5a4..149218a1da 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -692,6 +692,7 @@ bool PrintObject::invalidate_state_by_config_options( } else if ( opt_key == "wall_loops" || opt_key == "only_one_wall_top" + || opt_key == "only_one_wall_first_layer" || opt_key == "initial_layer_line_width" || opt_key == "inner_wall_line_width" || opt_key == "infill_wall_overlap") { diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index c4f2e87c99..2c5bbec087 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1870,6 +1870,7 @@ void TabPrint::build() optgroup->append_single_option_line("bridge_flow"); optgroup->append_single_option_line("thick_bridges"); optgroup->append_single_option_line("only_one_wall_top"); + optgroup->append_single_option_line("only_one_wall_first_layer"); optgroup->append_single_option_line("detect_overhang_wall"); optgroup->append_single_option_line("reduce_crossing_wall"); optgroup->append_single_option_line("max_travel_detour_distance");