ENH: enhance ensure vertical thickness

This patch support completely disable ensure_vertical_thickness
Cherry-Picked eff2c16ecc2017f8186e5804f9ed4d71d87e9248 from prusa slicer.
Thanks everyone involved

Co-authored-by: SoftFever
Co-authored-by: Vovodroid

jira:NONE

Signed-off-by: xun.zhang <xun.zhang@bambulab.com>
Change-Id: Ia00b9fb2dc5839d0e7306010260c1276c35c5d66
This commit is contained in:
xun.zhang 2025-02-08 09:39:42 +08:00 committed by lane.wei
parent 288b1eddc5
commit f8369e8796
3 changed files with 47 additions and 7 deletions

View File

@ -187,6 +187,13 @@ static t_config_enum_values s_keys_map_WallSequence {
};
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(WallSequence)
static t_config_enum_values s_keys_map_EnsureVerticalThicknessLevel {
{ "disabled", int(EnsureVerticalThicknessLevel::evtDisabled) },
{ "partial", int(EnsureVerticalThicknessLevel::evtPartial) },
{ "enabled", int(EnsureVerticalThicknessLevel::evtEnabled)}
};
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(EnsureVerticalThicknessLevel)
//BBS
static t_config_enum_values s_keys_map_PrintSequence {
{ "by layer", int(PrintSequence::ByLayer) },
@ -1330,6 +1337,21 @@ void PrintConfigDef::init_fff_params()
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionBool(true));
def = this->add("ensure_vertical_shell_thickness", coEnum);
def->label = L("Ensure vertical shell thickness");
def->category = L("Strength");
def->tooltip = L("Add solid infill near sloping surfaces to guarantee the vertical shell thickness "
"(top+bottom solid layers)");
def->mode = comAdvanced;
def->enum_keys_map = &ConfigOptionEnum<EnsureVerticalThicknessLevel>::get_enum_values();
def->enum_values.push_back("disabled");
def->enum_values.push_back("partial");
def->enum_values.push_back("enabled");
def->enum_labels.push_back(L("Disabled"));
def->enum_labels.push_back(L("Partial"));
def->enum_labels.push_back(L("Enabled"));
def->set_default_value(new ConfigOptionEnum<EnsureVerticalThicknessLevel>(EnsureVerticalThicknessLevel::evtEnabled));
def = this->add("internal_bridge_support_thickness", coFloat);
def->label = L("Internal bridge support thickness");
def->category = L("Strength");
@ -5378,6 +5400,14 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va
else if (opt_key == "extruder_type") {
ReplaceString(value, "DirectDrive", "Direct Drive");
}
else if (opt_key == "ensure_vertical_shell_thickness") {
auto kvmap=ConfigOptionEnum<EnsureVerticalThicknessLevel>::get_enum_names();
// handle old values
if (value == "1")
value = ConfigOptionEnum<EnsureVerticalThicknessLevel>::get_enum_names()[EnsureVerticalThicknessLevel::evtEnabled];
else if (value == "0")
value = ConfigOptionEnum<EnsureVerticalThicknessLevel>::get_enum_names()[EnsureVerticalThicknessLevel::evtPartial];
}
// Ignore the following obsolete configuration keys:
static std::set<std::string> ignore = {

View File

@ -58,6 +58,12 @@ enum InfillPattern : int {
ipCount,
};
enum EnsureVerticalThicknessLevel{
evtDisabled,
evtPartial,
evtEnabled
};
enum class IroningType {
NoIroning,
TopSurfaces,
@ -883,7 +889,7 @@ PRINT_CONFIG_CLASS_DEFINE(
((ConfigOptionFloat, bridge_flow))
((ConfigOptionFloatsNullable, overhang_totally_speed))
((ConfigOptionFloatsNullable, bridge_speed))
((ConfigOptionBool, ensure_vertical_shell_thickness))
((ConfigOptionEnum<EnsureVerticalThicknessLevel>, ensure_vertical_shell_thickness))
((ConfigOptionEnum<InfillPattern>, top_surface_pattern))
((ConfigOptionEnum<InfillPattern>, bottom_surface_pattern))
((ConfigOptionEnum<InfillPattern>, internal_solid_infill_pattern))

View File

@ -1525,7 +1525,7 @@ void PrintObject::discover_vertical_shells()
bool has_extra_layers = false;
for (size_t region_id = 0; region_id < this->num_printing_regions(); ++region_id) {
const PrintRegionConfig &config = this->printing_region(region_id).config();
if (config.ensure_vertical_shell_thickness.value) {
if (config.ensure_vertical_shell_thickness.value!=EnsureVerticalThicknessLevel::evtDisabled) {
has_extra_layers = true;
break;
}
@ -1604,7 +1604,7 @@ void PrintObject::discover_vertical_shells()
for (size_t region_id = 0; region_id < this->num_printing_regions(); ++ region_id) {
//FIXME Improve the heuristics for a grain size.
const PrintRegion &region = this->printing_region(region_id);
if (!region.config().ensure_vertical_shell_thickness.value)
if (region.config().ensure_vertical_shell_thickness.value==EnsureVerticalThicknessLevel::evtDisabled)
// This region will be handled by discover_horizontal_shells().
continue;
@ -1724,7 +1724,9 @@ void PrintObject::discover_vertical_shells()
++ i) {
at_least_one_top_projected = true;
const DiscoverVerticalShellsCacheEntry &cache = cache_top_botom_regions[i];
combine_holes(cache.holes);
if (region_config.ensure_vertical_shell_thickness.value != EnsureVerticalThicknessLevel::evtPartial) {
combine_holes(cache.holes);
}
combine_shells(cache.top_surfaces);
}
if (!at_least_one_top_projected && i < int(cache_top_botom_regions.size())) {
@ -1753,7 +1755,9 @@ void PrintObject::discover_vertical_shells()
-- i) {
at_least_one_bottom_projected = true;
const DiscoverVerticalShellsCacheEntry &cache = cache_top_botom_regions[i];
combine_holes(cache.holes);
if (region_config.ensure_vertical_shell_thickness.value != EnsureVerticalThicknessLevel::evtPartial) {
combine_holes(cache.holes);
}
combine_shells(cache.bottom_surfaces);
}
@ -3304,7 +3308,7 @@ void PrintObject::discover_horizontal_shells()
}
#endif
// If ensure_vertical_shell_thickness, then the rest has already been performed by discover_vertical_shells().
if (region_config.ensure_vertical_shell_thickness.value)
if (region_config.ensure_vertical_shell_thickness.value!=EnsureVerticalThicknessLevel::evtDisabled)
continue;
coordf_t print_z = layer->print_z;
@ -3375,7 +3379,7 @@ void PrintObject::discover_horizontal_shells()
// No internal solid needed on this layer. In order to decide whether to continue
// searching on the next neighbor (thus enforcing the configured number of solid
// layers, use different strategies according to configured infill density:
if (region_config.sparse_infill_density.value == 0) {
if (region_config.sparse_infill_density.value == 0 || region_config.ensure_vertical_shell_thickness.value == EnsureVerticalThicknessLevel::evtDisabled) {
// If user expects the object to be void (for example a hollow sloping vase),
// don't continue the search. In this case, we only generate the external solid
// shell if the object would otherwise show a hole (gap between perimeters of