Skip to content

Commit

Permalink
Extra perimeter on even layers.
Browse files Browse the repository at this point in the history
  • Loading branch information
vovodroid committed Dec 21, 2023
1 parent 77068e1 commit f2aefae
Show file tree
Hide file tree
Showing 9 changed files with 46 additions and 4 deletions.
6 changes: 6 additions & 0 deletions src/libslic3r/PerimeterGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1117,6 +1117,9 @@ void PerimeterGenerator::process_arachne(
// detect how many perimeters must be generated for this island
int loop_number = params.config.perimeters + surface.extra_perimeters - 1; // 0-indexed loops

if (params.config.extra_perimeter_odd_even != ExtraPerimeter::None && params.layer_id % 2 == static_cast<int>(params.config.extra_perimeter_odd_even.value) - 1)
loop_number++;

if (params.config.only_one_perimeter_first && params.layer_id == 0)
loop_number = 0;

Expand Down Expand Up @@ -1387,6 +1390,9 @@ void PerimeterGenerator::process_classic(
// detect how many perimeters must be generated for this island
int loop_number = params.config.perimeters + surface.extra_perimeters - 1; // 0-indexed loops

if (params.config.extra_perimeter_odd_even != ExtraPerimeter::None && params.layer_id % 2 == static_cast<int>(params.config.extra_perimeter_odd_even.value) - 1)
loop_number++;

if (params.config.only_one_perimeter_first && params.layer_id == 0)
loop_number = 0;

Expand Down
2 changes: 1 addition & 1 deletion src/libslic3r/Preset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -436,7 +436,7 @@ void Preset::set_visible_from_appconfig(const AppConfig &app_config)
}

static std::vector<std::string> s_Preset_print_options {
"layer_height", "first_layer_height", "perimeters", "only_one_perimeter_first", "spiral_vase", "slice_closing_radius", "slicing_mode",
"layer_height", "first_layer_height", "perimeters", "extra_perimeter_odd_even", "only_one_perimeter_first", "spiral_vase", "slice_closing_radius", "slicing_mode",
"top_solid_layers", "top_solid_min_thickness", "bottom_solid_layers", "bottom_solid_min_thickness",
"extra_perimeters", "extra_perimeters_on_overhangs", "ensure_vertical_shell_thickness", "avoid_crossing_curled_overhangs", "avoid_crossing_perimeters", "thin_walls", "overhangs", "overhangs_threshold",
"seam_position","staggered_inner_seams", "external_perimeters_first", "first_internal_on_overhangs", "fill_density", "fill_pattern", "top_fill_pattern", "bottom_fill_pattern", "solid_fill_pattern",
Expand Down
15 changes: 15 additions & 0 deletions src/libslic3r/PrintConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,13 @@ static t_config_enum_values s_keys_map_PerimeterGeneratorType {
};
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(PerimeterGeneratorType)

static t_config_enum_values s_keys_map_ExtraPerimeter {
{ "None", int(ExtraPerimeter::None) },
{ "Odd", int(ExtraPerimeter::Odd) },
{ "Even", int(ExtraPerimeter::Even) }
};
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(ExtraPerimeter)

static void assign_printer_technology_to_unknown(t_optiondef_map &options, PrinterTechnology printer_technology)
{
for (std::pair<const t_config_option_key, ConfigOptionDef> &kvp : options)
Expand Down Expand Up @@ -2374,6 +2381,14 @@ void PrintConfigDef::init_fff_params()
def->max = 10000;
def->set_default_value(new ConfigOptionInt(3));

def = this->add("extra_perimeter_odd_even", coEnum);
def->label = L("Add extra perimeter on");
def->category = L("Layers and Perimeters");
def->tooltip = L("It increases infill bonding to perimeter. Reduce shell thickness will be turned on.");
def->sidetext = L("layers");
def->set_enum<ExtraPerimeter>({"None", "Odd", "Even"});
def->set_default_value(new ConfigOptionEnum<ExtraPerimeter>(ExtraPerimeter::None));

def = this->add("only_one_perimeter_first", coBool);
def->label = L("One perimeter on first layer");
def->category = L("Layers and Perimeters");
Expand Down
7 changes: 6 additions & 1 deletion src/libslic3r/PrintConfig.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,10 @@ enum class GCodeThumbnailsFormat {
PNG, JPG, QOI
};

enum class ExtraPerimeter {
None, Odd, Even
};

#define CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(NAME) \
template<> const t_config_enum_names& ConfigOptionEnum<NAME>::get_enum_names(); \
template<> const t_config_enum_values& ConfigOptionEnum<NAME>::get_enum_values();
Expand Down Expand Up @@ -191,7 +195,7 @@ CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(LabelObjectsStyle)
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(GCodeThumbnailsFormat)
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(ForwardCompatibilitySubstitutionRule)
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(PerimeterGeneratorType)

CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(ExtraPerimeter)

#undef CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS

Expand Down Expand Up @@ -628,6 +632,7 @@ PRINT_CONFIG_CLASS_DEFINE(
((ConfigOptionBool, external_perimeters_first))
((ConfigOptionBool, extra_perimeters))
((ConfigOptionBool, extra_perimeters_on_overhangs))
((ConfigOptionEnum<ExtraPerimeter>, extra_perimeter_odd_even))
((ConfigOptionFloat, fill_angle))
((ConfigOptionFloat, top_fill_angle))
((ConfigOptionFloat, bottom_fill_angle))
Expand Down
1 change: 1 addition & 0 deletions src/libslic3r/PrintObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -735,6 +735,7 @@ bool PrintObject::invalidate_state_by_config_options(
steps.emplace_back(posPerimeters);
} else if (
opt_key == "perimeters"
|| opt_key == "extra_perimeter_odd_even"
|| opt_key == "only_one_perimeter_first"
|| opt_key == "extra_perimeters"
|| opt_key == "extra_perimeters_on_overhangs"
Expand Down
14 changes: 14 additions & 0 deletions src/slic3r/GUI/ConfigManipulation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con

if (config->opt_bool("spiral_vase") &&
! (config->opt_int("perimeters") == 1 &&
config->option<ConfigOptionEnum<ExtraPerimeter>>("extra_perimeter_odd_even")->value == ExtraPerimeter::None &&
config->opt_int("top_solid_layers") == 0 &&
fill_density == 0 &&
! config->opt_bool("support_material") &&
Expand All @@ -85,6 +86,7 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con
{
wxString msg_text = _(L("The Spiral Vase mode requires:\n"
"- one perimeter\n"
"- no extra perimeter on odd/even layers\n"
"- no top solid layers\n"
"- 0% fill density\n"
"- no support material\n"
Expand All @@ -98,6 +100,7 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con
bool support = true;
if (!is_global_config || answer == wxID_YES) {
new_conf.set_key_value("perimeters", new ConfigOptionInt(1));
new_conf.set_key_value("extra_perimeter_odd_even", new ConfigOptionEnum<ExtraPerimeter>(ExtraPerimeter::None));
new_conf.set_key_value("top_solid_layers", new ConfigOptionInt(0));
new_conf.set_key_value("fill_density", new ConfigOptionPercent(0));
new_conf.set_key_value("support_material", new ConfigOptionBool(false));
Expand Down Expand Up @@ -235,6 +238,17 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con
apply(config, &new_conf);
}

if (opt_key == "extra_perimeter_odd_even" && config->option<ConfigOptionEnum<ExtraPerimeter>>("extra_perimeter_odd_even")->value != ExtraPerimeter::None) {
DynamicPrintConfig new_conf = *config;
new_conf.set_key_value("ensure_vertical_shell_thickness", new ConfigOptionBool(false));
apply(config, &new_conf);
}

if (opt_key == "ensure_vertical_shell_thickness" && config->option<ConfigOptionBool>("ensure_vertical_shell_thickness")->value) {
DynamicPrintConfig new_conf = *config;
new_conf.set_key_value("extra_perimeter_odd_even", new ConfigOptionEnum<ExtraPerimeter>(ExtraPerimeter::None));
apply(config, &new_conf);
}
}

void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config)
Expand Down
2 changes: 1 addition & 1 deletion src/slic3r/GUI/GUI_Factories.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ static bool is_improper_category(const std::string& category, const int extruder
// pt_FFF
static SettingsFactory::Bundle FREQ_SETTINGS_BUNDLE_FFF =
{
{ L("Layers and Perimeters"), { "layer_height" , "perimeters", "only_one_perimeter_first", "top_solid_layers", "bottom_solid_layers" } },
{ L("Layers and Perimeters"), { "layer_height" , "perimeters", "extra_perimeter_odd_even", "only_one_perimeter_first", "top_solid_layers", "bottom_solid_layers" } },
{ L("Infill") , { "fill_density", "fill_pattern" } },
{ L("Support material") , { "support_material", "support_material_auto", "support_material_threshold",
"support_material_pattern", "support_material_interface_pattern", "support_material_buildplate_only",
Expand Down
2 changes: 1 addition & 1 deletion src/slic3r/GUI/Plater.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2103,7 +2103,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
"extruder_colour", "filament_colour", "material_colour", "max_print_height", "printer_model", "printer_notes", "printer_technology",
// These values are necessary to construct SlicingParameters by the Canvas3D variable layer height editor.
"layer_height", "first_layer_height", "min_layer_height", "max_layer_height",
"brim_width", "perimeters", "only_one_perimeter_first", "perimeter_extruder", "fill_density", "infill_extruder", "top_solid_layers",
"brim_width", "perimeters", "extra_perimeter_odd_even", "only_one_perimeter_first", "perimeter_extruder", "fill_density", "infill_extruder", "top_solid_layers",
"support_material", "support_material_extruder", "support_material_interface_extruder",
"support_material_contact_distance", "support_material_bottom_contact_distance", "raft_layers"
}))
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 @@ -1444,6 +1444,7 @@ void TabPrint::build()

optgroup = page->new_optgroup(L("Vertical shells"));
optgroup->append_single_option_line("perimeters", category_path + "perimeters");
optgroup->append_single_option_line("extra_perimeter_odd_even");
optgroup->append_single_option_line("only_one_perimeter_first");
optgroup->append_single_option_line("spiral_vase", category_path + "spiral-vase");

Expand Down

0 comments on commit f2aefae

Please sign in to comment.