Skip to content

Commit 787415d

Browse files
committed
Can disabled 4 other settings (instead of -1 value):
* overhangs_bridge_threshold * overhangs_bridge_upper_layers * perimeters_hole * support_material_bottom_interface_layers
1 parent ef7cf96 commit 787415d

File tree

11 files changed

+106
-60
lines changed

11 files changed

+106
-60
lines changed

resources/ui_layout/default/print.ui

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
page:Perimeters & Shell:shell
33
group:Vertical shells
44
line:Perimeters
5-
setting:label$Contour:width$6:perimeters
5+
setting:label$Contour:width$6:sidetext_width$10:perimeters
66
setting:label$Holes:width$6:perimeters_hole
77
end_line
88
setting:tags$Simple$Expert$SuSi:script:float:depends$perimeter_spacing$external_perimeter_spacing:label$Wall Thickness:tooltip$Change the perimeter extrusion widths to ensure that there is an exact number of perimeters for this wall thickness value. It won't put the perimeter width below the nozzle diameter, and up to double.\nNote that the value displayed is just a view of the current perimeter thickness, like the info text below. The number of perimeters used to compute this value is one loop, or the custom variable 'wall_thickness_lines' (advanced mode) if defined.\nIf the value is too low, it will revert the widths to the saved value.\nIf the value is set to 0, it will show 0.:s_wall_thickness

src/libslic3r/Config.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3016,6 +3016,7 @@ class ConfigBase : public ConfigOptionResolver
30163016
bool get_bool(const t_config_option_key &opt_key, size_t idx = 0) const {return this->option(opt_key)->get_bool(idx);}
30173017
int32_t get_int(const t_config_option_key &opt_key, size_t idx = 0) const {return this->option(opt_key)->get_int(idx);}
30183018
double get_float(const t_config_option_key &opt_key, size_t idx = 0) const {return this->option(opt_key)->get_float(idx);}
3019+
bool is_enabled(const t_config_option_key &opt_key, size_t idx = 0) const {return this->option(opt_key)->is_enabled(idx);}
30193020

30203021
// In ConfigManipulation::toggle_print_fff_options, it is called on option with type ConfigOptionEnumGeneric* and also ConfigOptionEnum*.
30213022
// Thus the virtual method getInt() is used to retrieve the enum value.

src/libslic3r/Format/BBConfig.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -597,8 +597,8 @@ void very_complicated_convert(ConfigSubstitutionContext &unconverted_config, Con
597597
double overhangs_max_slope = std::tan(make_overhang_printable_angle) * layer_height;
598598
conf_to_read_and_update.set_deserialize("overhangs_max_slope",
599599
Slic3r::to_string_nozero(overhangs_max_slope, 3));
600-
conf_to_read_and_update.set_deserialize("overhangs_bridge_threshold", "-1");
601-
conf_to_read_and_update.set_deserialize("overhangs_bridge_upper_layers", "-1");
600+
conf_to_read_and_update.set_deserialize("overhangs_bridge_threshold", "!0");
601+
conf_to_read_and_update.set_deserialize("overhangs_bridge_upper_layers", "!0");
602602
unconverted_config.erase("make_overhang_printable");
603603
unconverted_config.erase("make_overhang_printable_angle");
604604
} else {

src/libslic3r/PerimeterGenerator.cpp

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2760,23 +2760,26 @@ void PerimeterGenerator::process(// Input:
27602760

27612761
// detect how many perimeters must be generated for this island
27622762
int nb_loop_contour = params.config.perimeters;
2763+
assert(nb_loop_contour >= 0);
2764+
assert(params.config.perimeters.is_enabled());
27632765
if (nb_loop_contour > 0)
27642766
nb_loop_contour += extra_odd_perimeter + surface.extra_perimeters;
2765-
int nb_loop_holes = params.config.perimeters_hole;
2766-
if (nb_loop_holes > 0)
2767+
assert(nb_loop_contour >= 0);
2768+
int nb_loop_holes = params.config.perimeters_hole.value;
2769+
assert(nb_loop_holes >= 0);
2770+
if (params.config.perimeters_hole.is_enabled() && nb_loop_holes > 0)
27672771
nb_loop_holes += extra_odd_perimeter + surface.extra_perimeters;
2772+
assert(nb_loop_holes >= 0);
27682773

2769-
if (nb_loop_contour < 0)
2770-
nb_loop_contour = std::max(0, nb_loop_holes);
2771-
if (nb_loop_holes < 0)
2774+
if (!params.config.perimeters_hole.is_enabled())
27722775
nb_loop_holes = std::max(0, nb_loop_contour);
27732776

2774-
if (params.print_config.spiral_vase) {
2775-
if (params.layer->id() >= params.config.bottom_solid_layers) {
2776-
nb_loop_contour = 1;
2777-
nb_loop_holes = 0;
2778-
}
2777+
if (params.print_config.spiral_vase) {
2778+
if (params.layer->id() >= params.config.bottom_solid_layers) {
2779+
nb_loop_contour = 1;
2780+
nb_loop_holes = 0;
27792781
}
2782+
}
27802783

27812784
if ((params.layer->id() == 0 && params.config.only_one_perimeter_first_layer) ||
27822785
(params.config.only_one_perimeter_top && this->upper_slices == NULL)) {

src/libslic3r/PrintConfig.cpp

Lines changed: 44 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,14 @@ namespace {
387387
const int max_temp = 1500;
388388
};
389389

390+
ConfigOption *disable_defaultoption(ConfigOption *option) {
391+
return option->set_can_be_disabled()->set_enabled(false);
392+
}
393+
394+
ConfigOptionVectorBase *disable_defaultoption(ConfigOptionVectorBase *option) {
395+
return (ConfigOptionVectorBase *)option->set_can_be_disabled()->set_enabled(false);
396+
}
397+
390398
PrintConfigDef::PrintConfigDef()
391399
{
392400
this->init_common_params();
@@ -824,8 +832,6 @@ void PrintConfigDef::init_fff_params()
824832
{ "height", L("Layer height") },
825833
{ "flow", L("Keep current flow") },
826834
});
827-
def->min = -1;
828-
def->max = 100;
829835
def->mode = comAdvancedE | comSuSi;
830836
def->set_default_value(new ConfigOptionEnum<BridgeType>{ BridgeType::btFromNozzle });
831837

@@ -1362,7 +1368,7 @@ void PrintConfigDef::init_fff_params()
13621368
def->max = 100;
13631369
def->is_vector_extruder = true;
13641370
def->can_be_disabled = true;
1365-
def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false));
1371+
def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 })));
13661372
def->aliases = { "min_fan_speed" }; // only if "fan_always_on"
13671373

13681374
def = this->add("default_print_profile", coString);
@@ -1660,7 +1666,7 @@ void PrintConfigDef::init_fff_params()
16601666
def->mode = comAdvancedE | comSuSi;
16611667
def->is_vector_extruder = true;
16621668
def->can_be_disabled = true;
1663-
def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false));
1669+
def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 })));
16641670

16651671
def = this->add("external_perimeter_overlap", coPercent);
16661672
def->label = L("external perimeter overlap");
@@ -2904,7 +2910,7 @@ void PrintConfigDef::init_fff_params()
29042910
def->mode = comExpert | comSuSi;
29052911
def->is_vector_extruder = true;
29062912
def->can_be_disabled = true;
2907-
def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false));
2913+
def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 })));
29082914

29092915
def = this->add("gap_fill_flow_match_perimeter", coPercent);
29102916
def->label = L("Cap with perimeter flow");
@@ -3338,7 +3344,7 @@ void PrintConfigDef::init_fff_params()
33383344
def->mode = comExpert | comSuSi;
33393345
def->is_vector_extruder = true;
33403346
def->can_be_disabled = true;
3341-
def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false));
3347+
def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 })));
33423348

33433349
def = this->add("infill_first", coBool);
33443350
def->label = L("Infill before perimeters");
@@ -3436,7 +3442,7 @@ void PrintConfigDef::init_fff_params()
34363442
def->mode = comAdvancedE | comSuSi;
34373443
def->is_vector_extruder = true;
34383444
def->can_be_disabled = true;
3439-
def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false));
3445+
def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 })));
34403446
def->aliases = { "bridge_internal_fan_speed" };
34413447

34423448
def = this->add("internal_bridge_speed", coFloatOrPercent);
@@ -4144,7 +4150,7 @@ void PrintConfigDef::init_fff_params()
41444150
def->mode = comAdvancedE | comSuSi;
41454151
def->is_vector_extruder = true;
41464152
def->can_be_disabled = true;
4147-
def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false));
4153+
def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 })));
41484154

41494155
def = this->add("overhangs_max_slope", coFloatOrPercent);
41504156
def->label = L("Overhangs max slope");
@@ -4164,23 +4170,25 @@ void PrintConfigDef::init_fff_params()
41644170
def->label = L("Bridge max length");
41654171
def->category = OptionCategory::slicing;
41664172
def->tooltip = L("Maximum distance for bridges. If the distance is over that, it will be considered as overhangs for 'overhangs_max_slope'."
4167-
"\nSet to -1 to accept all distances."
4173+
"\nIf disabled, accept all distances."
41684174
"\nSet to 0 to ignore bridges.");
41694175
def->sidetext = L("mm");
4170-
def->min = -1;
4176+
def->min = 0;
4177+
def->can_be_disabled = true;
41714178
def->mode = comExpert | comSuSi;
4172-
def->set_default_value(new ConfigOptionFloat(-1));
4179+
def->set_default_value(disable_defaultoption(new ConfigOptionFloat(0)));
41734180

41744181
def = this->add("overhangs_bridge_upper_layers", coInt);
41754182
def->label = L("Consider upper bridges");
41764183
def->category = OptionCategory::slicing;
41774184
def->tooltip = L("Don't put overhangs if the area will filled in next layer by bridges."
4178-
"\nSet to -1 to accept all upper layers."
4185+
"\nIf disabled, accept all upper layers."
41794186
"\nSet to 0 to only consider our layer bridges.");
41804187
def->sidetext = L("layers");
4181-
def->min = -1;
4188+
def->min = 0;
4189+
def->can_be_disabled = true;
41824190
def->mode = comExpert | comSuSi;
4183-
def->set_default_value(new ConfigOptionInt(0));
4191+
def->set_default_value(new ConfigOptionInt(2));
41844192

41854193
def = this->add("overhangs_speed", coFloatOrPercent);
41864194
def->label = L("Overhangs");
@@ -4409,7 +4417,7 @@ void PrintConfigDef::init_fff_params()
44094417
def->mode = comExpert | comSuSi;
44104418
def->is_vector_extruder = true;
44114419
def->can_be_disabled = true;
4412-
def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false));
4420+
def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 })));
44134421

44144422
def = this->add("perimeter_loop", coBool);
44154423
def->label = L("Perimeters loop");
@@ -4499,15 +4507,16 @@ void PrintConfigDef::init_fff_params()
44994507
def->category = OptionCategory::perimeter;
45004508
def->tooltip = L("This option sets the number of perimeters to have over holes."
45014509
" Note that if a hole-perimeter fuse with the contour, then it will go around like a contour perimeter.."
4502-
"\nSet to -1 to deactivate, then holes will have the same number of perimeters as contour."
4510+
"\nIf disabled, holes will have the same number of perimeters as contour."
45034511
"\nNote that Slic3r may increase this number automatically when it detects "
45044512
"sloping surfaces which benefit from a higher number of perimeters "
45054513
"if the Extra Perimeters option is enabled.");
45064514
def->sidetext = L("(minimum).");
4507-
def->min = -1;
4515+
def->min = 0;
45084516
def->max = 10000;
4517+
def->can_be_disabled = true;
45094518
def->mode = comAdvancedE | comSuSi;
4510-
def->set_default_value(new ConfigOptionInt(-1));
4519+
def->set_default_value(disable_defaultoption(new ConfigOptionInt(0)));
45114520

45124521
def = this->add("post_process", coStrings);
45134522
def->label = L("Post-processing scripts");
@@ -5399,7 +5408,7 @@ void PrintConfigDef::init_fff_params()
53995408
def->mode = comExpert | comSuSi;
54005409
def->is_vector_extruder = true;
54015410
def->can_be_disabled = true;
5402-
def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false));
5411+
def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 })));
54035412

54045413
def = this->add("solid_infill_speed", coFloatOrPercent);
54055414
def->label = L("Solid");
@@ -5777,7 +5786,7 @@ void PrintConfigDef::init_fff_params()
57775786
def->mode = comExpert | comSuSi;
57785787
def->is_vector_extruder = true;
57795788
def->can_be_disabled = true;
5780-
def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false));
5789+
def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 })));
57815790

57825791
def = this->add("support_material_interface_angle", coFloat);
57835792
def->label = L("Pattern angle");
@@ -5813,7 +5822,7 @@ void PrintConfigDef::init_fff_params()
58135822
def->mode = comAdvancedE | comSuSi;
58145823
def->is_vector_extruder = true;
58155824
def->can_be_disabled = true;
5816-
def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false));
5825+
def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 })));
58175826

58185827

58195828
def = this->add("support_material_interface_contact_loops", coBool);
@@ -5850,20 +5859,20 @@ void PrintConfigDef::init_fff_params()
58505859
def = this->add("support_material_bottom_interface_layers", coInt);
58515860
def->label = L("Bottom interface layers");
58525861
def->category = OptionCategory::support;
5853-
def->tooltip = L("Number of interface layers to insert between the object(s) and support material. "
5854-
"Set to -1 to use support_material_interface_layers");
5862+
def->tooltip = L("Number of interface layers to insert between the object(s) and support material."
5863+
"\nIf disabled, support_material_interface_layers value is used");
58555864
def->sidetext = L("layers");
5856-
def->min = -1;
5865+
def->min = 0;
5866+
def->can_be_disabled = true;
58575867
def->set_enum_values(ConfigOptionDef::GUIType::i_enum_open, {
58585868
//TRN Print Settings: "Bottom interface layers". Have to be as short as possible
5859-
{ "-1", L("Same as top") },
58605869
{ "0", L("0 (off)") },
58615870
{ "1", L("1 (light)") },
58625871
{ "2", L("2 (default)") },
58635872
{ "3", L("3 (heavy)") }
58645873
});
58655874
def->mode = comAdvancedE | comPrusa;
5866-
def->set_default_value(new ConfigOptionInt(-1));
5875+
def->set_default_value(disable_defaultoption(new ConfigOptionInt(0)));
58675876

58685877
def = this->add("support_material_closing_radius", coFloat);
58695878
def->label = L("Closing radius");
@@ -6360,7 +6369,7 @@ void PrintConfigDef::init_fff_params()
63606369
def->mode = comAdvancedE | comSuSi;
63616370
def->is_vector_extruder = true;
63626371
def->can_be_disabled = true;
6363-
def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false));
6372+
def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 })));
63646373

63656374
def = this->add("top_infill_extrusion_width", coFloatOrPercent);
63666375
def->label = L("Top solid infill");
@@ -7680,7 +7689,7 @@ void PrintConfigDef::init_sla_params()
76807689
def->max = max_temp;
76817690
def->can_be_disabled = true;
76827691
def->mode = comSimpleAE | comPrusa;
7683-
def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts{30})->set_can_be_disabled()->set_enabled(false));
7692+
def->set_default_value(disable_defaultoption(new ConfigOptionInts{30}));
76847693

76857694
def = this->add("bottle_volume", coFloat);
76867695
def->label = L("Bottle volume");
@@ -8407,6 +8416,13 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va
84078416
}
84088417
}
84098418

8419+
if (value == "-1") {
8420+
if ("overhangs_bridge_threshold" == opt_key) {value = "!0";}
8421+
if ("overhangs_bridge_upper_layers" == opt_key) {value = "!2";}
8422+
if ("perimeters_hole" == opt_key) {value = "!0";}
8423+
if ("support_material_bottom_interface_layers" == opt_key) {value = "!0";}
8424+
}
8425+
84108426
if (!print_config_def.has(opt_key)) {
84118427
//check the aliases
84128428
for(const auto& entry : print_config_def.options) {

src/libslic3r/PrintObjectSlice.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,8 @@ void PrintObject::_min_overhang_threshold() {
662662
// get bridgeable area
663663
for (size_t region_idx = 0; region_idx < my_layer->m_regions.size(); ++region_idx) {
664664
LayerRegion* lregion = my_layer->get_region(region_idx);
665-
if (lregion->region().config().overhangs_bridge_threshold.value != 0) {
665+
if (lregion->region().config().overhangs_bridge_threshold.value != 0 ||
666+
!lregion->region().config().overhangs_bridge_threshold.is_enabled()) {
666667
Surfaces & my_surfaces = lregion->m_slices.surfaces;
667668
ExPolygons unsupported = to_expolygons(my_surfaces);
668669
unsupported = diff_ex(unsupported, lower_layer->lslices, ApplySafetyOffset::Yes);
@@ -678,13 +679,17 @@ void PrintObject::_min_overhang_threshold() {
678679
bridgeFlow.scaled_spacing(),
679680
scale_t(this->print()->config().bridge_precision.get_abs_value(bridgeFlow.spacing())),
680681
layer_idx);
681-
detector.max_bridge_length = scale_d(std::max(0., lregion->region().config().overhangs_bridge_threshold.value));
682+
if (lregion->region().config().overhangs_bridge_threshold.is_enabled()) {
683+
detector.max_bridge_length = scale_d(std::max(0., lregion->region().config().overhangs_bridge_threshold.value));
684+
} else {
685+
detector.max_bridge_length = -1;
686+
}
682687
if (detector.detect_angle(0))
683688
append(bridged_area, union_ex(detector.coverage()));
684689
}
685690
// then, check other layers
686691
size_t max_layer_idx = lregion->region().config().overhangs_bridge_upper_layers.value;
687-
if (max_layer_idx < 0) // -1 -> all layers
692+
if (!lregion->region().config().overhangs_bridge_upper_layers.is_enabled()) // disabled -> all layers
688693
max_layer_idx = this->layers().size();
689694
if (max_layer_idx > 0) { // 0 -> don't check other layers
690695
max_layer_idx += layer_idx;
@@ -703,7 +708,9 @@ void PrintObject::_min_overhang_threshold() {
703708
ExPolygons new_bridged_area;
704709
for (size_t other_region_idx = 0; other_region_idx < my_layer->m_regions.size(); ++other_region_idx) {
705710
LayerRegion *other_lregion = my_layer->get_region(other_region_idx);
706-
if (other_lregion->region().config().overhangs_bridge_threshold.value != 0 && other_lregion->region().config().overhangs_max_slope > 0) {
711+
if ( (other_lregion->region().config().overhangs_bridge_threshold.value != 0 ||
712+
!lregion->region().config().overhangs_bridge_threshold.is_enabled())
713+
&& other_lregion->region().config().overhangs_max_slope > 0) {
707714
coord_t enlargement = scale_t(my_layer->get_region(region_idx)->region().config().overhangs_max_slope.get_abs_value(unscaled(max_nz_diam)));
708715
enlargement = std::max(enlargement, max_nz_diam);
709716
Surfaces &my_surfaces = other_lregion->m_slices.surfaces;
@@ -716,7 +723,11 @@ void PrintObject::_min_overhang_threshold() {
716723
scale_t(this->print()->config().bridge_precision.get_abs_value(bridgeFlow.spacing())),
717724
other_layer_bridge_idx);
718725
detector.layer_id = other_layer_bridge_idx;
719-
detector.max_bridge_length = scale_d(std::max(0., other_lregion->region().config().overhangs_bridge_threshold.value));
726+
if (lregion->region().config().overhangs_bridge_threshold.is_enabled()) {
727+
detector.max_bridge_length = scale_d(std::max(0., other_lregion->region().config().overhangs_bridge_threshold.value));
728+
} else {
729+
detector.max_bridge_length = -1;
730+
}
720731
if (detector.detect_angle(0)) {
721732
append(new_bridged_area, union_ex(detector.coverage()));
722733
}

0 commit comments

Comments
 (0)