Skip to content

Commit

Permalink
[FEATURE] Only one perimeter on first layer
Browse files Browse the repository at this point in the history
  • Loading branch information
mjonuschat committed Feb 23, 2024
1 parent 88db1f2 commit 4fca510
Show file tree
Hide file tree
Showing 7 changed files with 17 additions and 4 deletions.
5 changes: 4 additions & 1 deletion src/libslic3r/PerimeterGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1116,6 +1116,9 @@ void PerimeterGenerator::process_arachne(
// extra perimeters for each one
// detect how many perimeters must be generated for this island
int loop_number = params.config.perimeters + surface.extra_perimeters - 1; // 0-indexed loops
// SuperSlicer: set the bottommost layer to be one perimeter
if (params.layer_id == 0 && params.config.only_one_perimeter_first_layer)
loop_number = 0;
// SuperSlicer: set the topmost layer to be one perimeter
if (loop_number > 0 && params.config.only_one_perimeter_top && upper_slices == nullptr)
loop_number = 0;
Expand Down Expand Up @@ -1441,7 +1444,7 @@ void PerimeterGenerator::process_classic(
int loop_number = params.config.perimeters + surface.extra_perimeters - 1; // 0-indexed loops

// SuperSlicer: set the topmost layer to be one perimeter
if (loop_number > 0 && params.config.only_one_perimeter_top && upper_slices == nullptr)
if ((params.layer_id == 0 && params.config.only_one_perimeter_first_layer) || (loop_number > 0 && params.config.only_one_perimeter_top && upper_slices == nullptr))
loop_number = 0;

ExPolygons last = union_ex(surface.expolygon.simplify_p(params.scaled_resolution));
Expand Down
2 changes: 1 addition & 1 deletion src/libslic3r/Preset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,7 @@ static std::vector<std::string> s_Preset_print_options {
"perimeter_generator", "wall_transition_length", "wall_transition_filter_deviation", "wall_transition_angle",
"wall_distribution_count", "min_feature_size", "min_bead_width",
// SuperSlicer
"only_one_perimeter_top", "min_width_top_surface",
"only_one_perimeter_first_layer", "only_one_perimeter_top", "min_width_top_surface",
};

static std::vector<std::string> s_Preset_filament_options {
Expand Down
6 changes: 6 additions & 0 deletions src/libslic3r/PrintConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -566,6 +566,12 @@ void PrintConfigDef::init_fff_params()
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloat(1));

def = this->add("only_one_perimeter_first_layer", coBool);
def->label = L("On First layer");
def->category = L("Layers and Perimeters");
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("On top surfaces");
def->category = L("Layers and Perimeters");
Expand Down
1 change: 1 addition & 0 deletions src/libslic3r/PrintConfig.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -663,6 +663,7 @@ PRINT_CONFIG_CLASS_DEFINE(
((ConfigOptionFloatOrPercent, top_solid_infill_speed))
((ConfigOptionBool, wipe_into_infill))
// SuperSlicer
((ConfigOptionBool, only_one_perimeter_first_layer))
((ConfigOptionBool, only_one_perimeter_top))
((ConfigOptionFloatOrPercent, min_width_top_surface))
)
Expand Down
3 changes: 2 additions & 1 deletion src/libslic3r/PrintObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -708,7 +708,8 @@ bool PrintObject::invalidate_state_by_config_options(
// Brim is printed below supports, support invalidates brim and skirt.
steps.emplace_back(posSupportMaterial);
} else if (
opt_key == "only_one_perimeter_top") {
opt_key == "only_one_perimeter_first_layer"
|| opt_key == "only_one_perimeter_top") {
steps.emplace_back(posPerimeters);
} else if (
opt_key == "perimeters"
Expand Down
3 changes: 2 additions & 1 deletion src/slic3r/GUI/ConfigManipulation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,8 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config)
bool have_perimeters = config->opt_int("perimeters") > 0;
for (auto el : { "extra_perimeters","extra_perimeters_on_overhangs", "thin_walls", "overhangs",
"seam_position","staggered_inner_seams", "external_perimeters_first", "external_perimeter_extrusion_width",
"perimeter_speed", "small_perimeter_speed", "external_perimeter_speed", "enable_dynamic_overhang_speeds"})
"perimeter_speed", "small_perimeter_speed", "external_perimeter_speed", "enable_dynamic_overhang_speeds",
"only_one_perimeter_first_layer", "only_one_perimeter_top"})
toggle_field(el, have_perimeters);

for (size_t i = 0; i < 4; i++) {
Expand Down
1 change: 1 addition & 0 deletions src/slic3r/GUI/Tab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1474,6 +1474,7 @@ void TabPrint::build()
optgroup = page->new_optgroup(L("Quality (slower slicing)"));
line = { L("Only one perimeter"), "" };
line.label_path = category_path + "only-one-perimeter-top-bottom";
line.append_option(optgroup->get_option("only_one_perimeter_first_layer"));
line.append_option(optgroup->get_option("only_one_perimeter_top"));
line.append_option(optgroup->get_option("min_width_top_surface"));
optgroup->append_line(line);
Expand Down

0 comments on commit 4fca510

Please sign in to comment.