From 787415dc11880f3681effd06d0d8210328becb0d Mon Sep 17 00:00:00 2001 From: supermerill Date: Sun, 4 Aug 2024 17:52:51 +0200 Subject: [PATCH] Can disabled 4 other settings (instead of -1 value): * overhangs_bridge_threshold * overhangs_bridge_upper_layers * perimeters_hole * support_material_bottom_interface_layers --- resources/ui_layout/default/print.ui | 2 +- src/libslic3r/Config.hpp | 1 + src/libslic3r/Format/BBConfig.cpp | 4 +- src/libslic3r/PerimeterGenerator.cpp | 23 ++++--- src/libslic3r/PrintConfig.cpp | 72 +++++++++++++-------- src/libslic3r/PrintObjectSlice.cpp | 21 ++++-- src/libslic3r/Support/SupportCommon.cpp | 8 ++- src/libslic3r/Support/SupportMaterial.cpp | 2 +- src/libslic3r/Support/SupportParameters.cpp | 5 +- src/libslic3r/Support/TreeSupportCommon.cpp | 23 ++++--- src/slic3r/GUI/ConfigManipulation.cpp | 5 +- 11 files changed, 106 insertions(+), 60 deletions(-) diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui index 8053ee7f3fd..57fa7eeb883 100644 --- a/resources/ui_layout/default/print.ui +++ b/resources/ui_layout/default/print.ui @@ -2,7 +2,7 @@ page:Perimeters & Shell:shell group:Vertical shells line:Perimeters - setting:label$Contour:width$6:perimeters + setting:label$Contour:width$6:sidetext_width$10:perimeters setting:label$Holes:width$6:perimeters_hole end_line 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 diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index e9390c4338d..b372a34d961 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -3016,6 +3016,7 @@ class ConfigBase : public ConfigOptionResolver bool get_bool(const t_config_option_key &opt_key, size_t idx = 0) const {return this->option(opt_key)->get_bool(idx);} int32_t get_int(const t_config_option_key &opt_key, size_t idx = 0) const {return this->option(opt_key)->get_int(idx);} double get_float(const t_config_option_key &opt_key, size_t idx = 0) const {return this->option(opt_key)->get_float(idx);} + bool is_enabled(const t_config_option_key &opt_key, size_t idx = 0) const {return this->option(opt_key)->is_enabled(idx);} // In ConfigManipulation::toggle_print_fff_options, it is called on option with type ConfigOptionEnumGeneric* and also ConfigOptionEnum*. // Thus the virtual method getInt() is used to retrieve the enum value. diff --git a/src/libslic3r/Format/BBConfig.cpp b/src/libslic3r/Format/BBConfig.cpp index f959755e9cf..e2a4b7e9111 100644 --- a/src/libslic3r/Format/BBConfig.cpp +++ b/src/libslic3r/Format/BBConfig.cpp @@ -597,8 +597,8 @@ void very_complicated_convert(ConfigSubstitutionContext &unconverted_config, Con double overhangs_max_slope = std::tan(make_overhang_printable_angle) * layer_height; conf_to_read_and_update.set_deserialize("overhangs_max_slope", Slic3r::to_string_nozero(overhangs_max_slope, 3)); - conf_to_read_and_update.set_deserialize("overhangs_bridge_threshold", "-1"); - conf_to_read_and_update.set_deserialize("overhangs_bridge_upper_layers", "-1"); + conf_to_read_and_update.set_deserialize("overhangs_bridge_threshold", "!0"); + conf_to_read_and_update.set_deserialize("overhangs_bridge_upper_layers", "!0"); unconverted_config.erase("make_overhang_printable"); unconverted_config.erase("make_overhang_printable_angle"); } else { diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index a41d0077f72..5a26688b475 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -2760,23 +2760,26 @@ void PerimeterGenerator::process(// Input: // detect how many perimeters must be generated for this island int nb_loop_contour = params.config.perimeters; + assert(nb_loop_contour >= 0); + assert(params.config.perimeters.is_enabled()); if (nb_loop_contour > 0) nb_loop_contour += extra_odd_perimeter + surface.extra_perimeters; - int nb_loop_holes = params.config.perimeters_hole; - if (nb_loop_holes > 0) + assert(nb_loop_contour >= 0); + int nb_loop_holes = params.config.perimeters_hole.value; + assert(nb_loop_holes >= 0); + if (params.config.perimeters_hole.is_enabled() && nb_loop_holes > 0) nb_loop_holes += extra_odd_perimeter + surface.extra_perimeters; + assert(nb_loop_holes >= 0); - if (nb_loop_contour < 0) - nb_loop_contour = std::max(0, nb_loop_holes); - if (nb_loop_holes < 0) + if (!params.config.perimeters_hole.is_enabled()) nb_loop_holes = std::max(0, nb_loop_contour); - if (params.print_config.spiral_vase) { - if (params.layer->id() >= params.config.bottom_solid_layers) { - nb_loop_contour = 1; - nb_loop_holes = 0; - } + if (params.print_config.spiral_vase) { + if (params.layer->id() >= params.config.bottom_solid_layers) { + nb_loop_contour = 1; + nb_loop_holes = 0; } + } if ((params.layer->id() == 0 && params.config.only_one_perimeter_first_layer) || (params.config.only_one_perimeter_top && this->upper_slices == NULL)) { diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 6388e5609aa..7c37d8b16b4 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -387,6 +387,14 @@ namespace { const int max_temp = 1500; }; +ConfigOption *disable_defaultoption(ConfigOption *option) { + return option->set_can_be_disabled()->set_enabled(false); +} + +ConfigOptionVectorBase *disable_defaultoption(ConfigOptionVectorBase *option) { + return (ConfigOptionVectorBase *)option->set_can_be_disabled()->set_enabled(false); +} + PrintConfigDef::PrintConfigDef() { this->init_common_params(); @@ -824,8 +832,6 @@ void PrintConfigDef::init_fff_params() { "height", L("Layer height") }, { "flow", L("Keep current flow") }, }); - def->min = -1; - def->max = 100; def->mode = comAdvancedE | comSuSi; def->set_default_value(new ConfigOptionEnum{ BridgeType::btFromNozzle }); @@ -1362,7 +1368,7 @@ void PrintConfigDef::init_fff_params() def->max = 100; def->is_vector_extruder = true; def->can_be_disabled = true; - def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false)); + def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 }))); def->aliases = { "min_fan_speed" }; // only if "fan_always_on" def = this->add("default_print_profile", coString); @@ -1660,7 +1666,7 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvancedE | comSuSi; def->is_vector_extruder = true; def->can_be_disabled = true; - def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false)); + def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 }))); def = this->add("external_perimeter_overlap", coPercent); def->label = L("external perimeter overlap"); @@ -2904,7 +2910,7 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert | comSuSi; def->is_vector_extruder = true; def->can_be_disabled = true; - def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false)); + def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 }))); def = this->add("gap_fill_flow_match_perimeter", coPercent); def->label = L("Cap with perimeter flow"); @@ -3338,7 +3344,7 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert | comSuSi; def->is_vector_extruder = true; def->can_be_disabled = true; - def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false)); + def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 }))); def = this->add("infill_first", coBool); def->label = L("Infill before perimeters"); @@ -3436,7 +3442,7 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvancedE | comSuSi; def->is_vector_extruder = true; def->can_be_disabled = true; - def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false)); + def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 }))); def->aliases = { "bridge_internal_fan_speed" }; def = this->add("internal_bridge_speed", coFloatOrPercent); @@ -4144,7 +4150,7 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvancedE | comSuSi; def->is_vector_extruder = true; def->can_be_disabled = true; - def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false)); + def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 }))); def = this->add("overhangs_max_slope", coFloatOrPercent); def->label = L("Overhangs max slope"); @@ -4164,23 +4170,25 @@ void PrintConfigDef::init_fff_params() def->label = L("Bridge max length"); def->category = OptionCategory::slicing; def->tooltip = L("Maximum distance for bridges. If the distance is over that, it will be considered as overhangs for 'overhangs_max_slope'." - "\nSet to -1 to accept all distances." + "\nIf disabled, accept all distances." "\nSet to 0 to ignore bridges."); def->sidetext = L("mm"); - def->min = -1; + def->min = 0; + def->can_be_disabled = true; def->mode = comExpert | comSuSi; - def->set_default_value(new ConfigOptionFloat(-1)); + def->set_default_value(disable_defaultoption(new ConfigOptionFloat(0))); def = this->add("overhangs_bridge_upper_layers", coInt); def->label = L("Consider upper bridges"); def->category = OptionCategory::slicing; def->tooltip = L("Don't put overhangs if the area will filled in next layer by bridges." - "\nSet to -1 to accept all upper layers." + "\nIf disabled, accept all upper layers." "\nSet to 0 to only consider our layer bridges."); def->sidetext = L("layers"); - def->min = -1; + def->min = 0; + def->can_be_disabled = true; def->mode = comExpert | comSuSi; - def->set_default_value(new ConfigOptionInt(0)); + def->set_default_value(new ConfigOptionInt(2)); def = this->add("overhangs_speed", coFloatOrPercent); def->label = L("Overhangs"); @@ -4409,7 +4417,7 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert | comSuSi; def->is_vector_extruder = true; def->can_be_disabled = true; - def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false)); + def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 }))); def = this->add("perimeter_loop", coBool); def->label = L("Perimeters loop"); @@ -4499,15 +4507,16 @@ void PrintConfigDef::init_fff_params() def->category = OptionCategory::perimeter; def->tooltip = L("This option sets the number of perimeters to have over holes." " Note that if a hole-perimeter fuse with the contour, then it will go around like a contour perimeter.." - "\nSet to -1 to deactivate, then holes will have the same number of perimeters as contour." + "\nIf disabled, holes will have the same number of perimeters as contour." "\nNote that Slic3r may increase this number automatically when it detects " "sloping surfaces which benefit from a higher number of perimeters " "if the Extra Perimeters option is enabled."); def->sidetext = L("(minimum)."); - def->min = -1; + def->min = 0; def->max = 10000; + def->can_be_disabled = true; def->mode = comAdvancedE | comSuSi; - def->set_default_value(new ConfigOptionInt(-1)); + def->set_default_value(disable_defaultoption(new ConfigOptionInt(0))); def = this->add("post_process", coStrings); def->label = L("Post-processing scripts"); @@ -5399,7 +5408,7 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert | comSuSi; def->is_vector_extruder = true; def->can_be_disabled = true; - def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false)); + def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 }))); def = this->add("solid_infill_speed", coFloatOrPercent); def->label = L("Solid"); @@ -5777,7 +5786,7 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert | comSuSi; def->is_vector_extruder = true; def->can_be_disabled = true; - def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false)); + def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 }))); def = this->add("support_material_interface_angle", coFloat); def->label = L("Pattern angle"); @@ -5813,7 +5822,7 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvancedE | comSuSi; def->is_vector_extruder = true; def->can_be_disabled = true; - def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false)); + def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 }))); def = this->add("support_material_interface_contact_loops", coBool); @@ -5850,20 +5859,20 @@ void PrintConfigDef::init_fff_params() def = this->add("support_material_bottom_interface_layers", coInt); def->label = L("Bottom interface layers"); def->category = OptionCategory::support; - def->tooltip = L("Number of interface layers to insert between the object(s) and support material. " - "Set to -1 to use support_material_interface_layers"); + def->tooltip = L("Number of interface layers to insert between the object(s) and support material." + "\nIf disabled, support_material_interface_layers value is used"); def->sidetext = L("layers"); - def->min = -1; + def->min = 0; + def->can_be_disabled = true; def->set_enum_values(ConfigOptionDef::GUIType::i_enum_open, { //TRN Print Settings: "Bottom interface layers". Have to be as short as possible - { "-1", L("Same as top") }, { "0", L("0 (off)") }, { "1", L("1 (light)") }, { "2", L("2 (default)") }, { "3", L("3 (heavy)") } }); def->mode = comAdvancedE | comPrusa; - def->set_default_value(new ConfigOptionInt(-1)); + def->set_default_value(disable_defaultoption(new ConfigOptionInt(0))); def = this->add("support_material_closing_radius", coFloat); def->label = L("Closing radius"); @@ -6360,7 +6369,7 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvancedE | comSuSi; def->is_vector_extruder = true; def->can_be_disabled = true; - def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts({ 100 }))->set_can_be_disabled()->set_enabled(false)); + def->set_default_value(disable_defaultoption(new ConfigOptionInts({ 100 }))); def = this->add("top_infill_extrusion_width", coFloatOrPercent); def->label = L("Top solid infill"); @@ -7680,7 +7689,7 @@ void PrintConfigDef::init_sla_params() def->max = max_temp; def->can_be_disabled = true; def->mode = comSimpleAE | comPrusa; - def->set_default_value((ConfigOptionInts*)(new ConfigOptionInts{30})->set_can_be_disabled()->set_enabled(false)); + def->set_default_value(disable_defaultoption(new ConfigOptionInts{30})); def = this->add("bottle_volume", coFloat); def->label = L("Bottle volume"); @@ -8407,6 +8416,13 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va } } + if (value == "-1") { + if ("overhangs_bridge_threshold" == opt_key) {value = "!0";} + if ("overhangs_bridge_upper_layers" == opt_key) {value = "!2";} + if ("perimeters_hole" == opt_key) {value = "!0";} + if ("support_material_bottom_interface_layers" == opt_key) {value = "!0";} + } + if (!print_config_def.has(opt_key)) { //check the aliases for(const auto& entry : print_config_def.options) { diff --git a/src/libslic3r/PrintObjectSlice.cpp b/src/libslic3r/PrintObjectSlice.cpp index 45aea26447d..270aeb00c90 100644 --- a/src/libslic3r/PrintObjectSlice.cpp +++ b/src/libslic3r/PrintObjectSlice.cpp @@ -662,7 +662,8 @@ void PrintObject::_min_overhang_threshold() { // get bridgeable area for (size_t region_idx = 0; region_idx < my_layer->m_regions.size(); ++region_idx) { LayerRegion* lregion = my_layer->get_region(region_idx); - if (lregion->region().config().overhangs_bridge_threshold.value != 0) { + if (lregion->region().config().overhangs_bridge_threshold.value != 0 || + !lregion->region().config().overhangs_bridge_threshold.is_enabled()) { Surfaces & my_surfaces = lregion->m_slices.surfaces; ExPolygons unsupported = to_expolygons(my_surfaces); unsupported = diff_ex(unsupported, lower_layer->lslices, ApplySafetyOffset::Yes); @@ -678,13 +679,17 @@ void PrintObject::_min_overhang_threshold() { bridgeFlow.scaled_spacing(), scale_t(this->print()->config().bridge_precision.get_abs_value(bridgeFlow.spacing())), layer_idx); - detector.max_bridge_length = scale_d(std::max(0., lregion->region().config().overhangs_bridge_threshold.value)); + if (lregion->region().config().overhangs_bridge_threshold.is_enabled()) { + detector.max_bridge_length = scale_d(std::max(0., lregion->region().config().overhangs_bridge_threshold.value)); + } else { + detector.max_bridge_length = -1; + } if (detector.detect_angle(0)) append(bridged_area, union_ex(detector.coverage())); } // then, check other layers size_t max_layer_idx = lregion->region().config().overhangs_bridge_upper_layers.value; - if (max_layer_idx < 0) // -1 -> all layers + if (!lregion->region().config().overhangs_bridge_upper_layers.is_enabled()) // disabled -> all layers max_layer_idx = this->layers().size(); if (max_layer_idx > 0) { // 0 -> don't check other layers max_layer_idx += layer_idx; @@ -703,7 +708,9 @@ void PrintObject::_min_overhang_threshold() { ExPolygons new_bridged_area; for (size_t other_region_idx = 0; other_region_idx < my_layer->m_regions.size(); ++other_region_idx) { LayerRegion *other_lregion = my_layer->get_region(other_region_idx); - if (other_lregion->region().config().overhangs_bridge_threshold.value != 0 && other_lregion->region().config().overhangs_max_slope > 0) { + if ( (other_lregion->region().config().overhangs_bridge_threshold.value != 0 || + !lregion->region().config().overhangs_bridge_threshold.is_enabled()) + && other_lregion->region().config().overhangs_max_slope > 0) { coord_t enlargement = scale_t(my_layer->get_region(region_idx)->region().config().overhangs_max_slope.get_abs_value(unscaled(max_nz_diam))); enlargement = std::max(enlargement, max_nz_diam); Surfaces &my_surfaces = other_lregion->m_slices.surfaces; @@ -716,7 +723,11 @@ void PrintObject::_min_overhang_threshold() { scale_t(this->print()->config().bridge_precision.get_abs_value(bridgeFlow.spacing())), other_layer_bridge_idx); detector.layer_id = other_layer_bridge_idx; - detector.max_bridge_length = scale_d(std::max(0., other_lregion->region().config().overhangs_bridge_threshold.value)); + if (lregion->region().config().overhangs_bridge_threshold.is_enabled()) { + detector.max_bridge_length = scale_d(std::max(0., other_lregion->region().config().overhangs_bridge_threshold.value)); + } else { + detector.max_bridge_length = -1; + } if (detector.detect_angle(0)) { append(new_bridged_area, union_ex(detector.coverage())); } diff --git a/src/libslic3r/Support/SupportCommon.cpp b/src/libslic3r/Support/SupportCommon.cpp index 90cadb277da..924226440da 100644 --- a/src/libslic3r/Support/SupportCommon.cpp +++ b/src/libslic3r/Support/SupportCommon.cpp @@ -1798,7 +1798,9 @@ void generate_support_toolpaths( if (top_contact_layer.could_merge(interface_layer) && ! raft_layer) top_contact_layer.merge(std::move(interface_layer)); } - if ((config.support_material_interface_layers == 0 || config.support_material_bottom_interface_layers == 0) && support_params.can_merge_support_regions) { + if ( (config.support_material_interface_layers == 0 || + (config.support_material_bottom_interface_layers.is_enabled() && config.support_material_bottom_interface_layers.value == 0)) + && support_params.can_merge_support_regions) { if (base_layer.could_merge(bottom_contact_layer)) base_layer.merge(std::move(bottom_contact_layer)); else if (base_layer.empty() && ! bottom_contact_layer.empty() && ! bottom_contact_layer.layer->bridging) @@ -1893,7 +1895,9 @@ void generate_support_toolpaths( } }; const bool top_interfaces = config.support_material_interface_layers.value != 0; - const bool bottom_interfaces = top_interfaces && config.support_material_bottom_interface_layers != 0; + const bool bottom_interfaces = config.support_material_bottom_interface_layers.is_enabled() ? + top_interfaces && config.support_material_bottom_interface_layers.value != 0 : + top_interfaces; extrude_interface(top_contact_layer, raft_layer ? InterfaceLayerType::RaftContact : top_interfaces ? InterfaceLayerType::TopContact : InterfaceLayerType::InterfaceAsBase); extrude_interface(bottom_contact_layer, bottom_interfaces ? InterfaceLayerType::BottomContact : InterfaceLayerType::InterfaceAsBase); extrude_interface(interface_layer, top_interfaces ? InterfaceLayerType::Interface : InterfaceLayerType::InterfaceAsBase); diff --git a/src/libslic3r/Support/SupportMaterial.cpp b/src/libslic3r/Support/SupportMaterial.cpp index 89f0ad5b358..27b7d780011 100644 --- a/src/libslic3r/Support/SupportMaterial.cpp +++ b/src/libslic3r/Support/SupportMaterial.cpp @@ -2267,7 +2267,7 @@ SupportGeneratorLayersPtr PrintObjectSupportMaterial::raft_and_intermediate_supp { n_layers_top = m_object_config->support_material_interface_layers.value; coordf_t height_top_interface = std::max(0., support_interface_layer_height * n_layers_top); - n_layers_bot = m_object_config->support_material_bottom_interface_layers.value >= 0 ? m_object_config->support_material_bottom_interface_layers.value : n_layers_top; + n_layers_bot = m_object_config->support_material_bottom_interface_layers.is_enabled() ? m_object_config->support_material_bottom_interface_layers.value : n_layers_top; n_layers_bot = std::max(size_t(0), n_layers_bot - 1); //the first bot layer is already in the extreme list. coordf_t height_bot_interface = (support_interface_layer_height * n_layers_bot); if (dist <= height_top_interface + height_bot_interface) { diff --git a/src/libslic3r/Support/SupportParameters.cpp b/src/libslic3r/Support/SupportParameters.cpp index a017aa8ef91..2263c0413a6 100644 --- a/src/libslic3r/Support/SupportParameters.cpp +++ b/src/libslic3r/Support/SupportParameters.cpp @@ -29,8 +29,9 @@ SupportParameters::SupportParameters(const PrintObject &object) { int num_top_interface_layers = std::max(0, object_config.support_material_interface_layers.value); - int num_bottom_interface_layers = object_config.support_material_bottom_interface_layers < 0 ? - num_top_interface_layers : object_config.support_material_bottom_interface_layers; + int num_bottom_interface_layers = object_config.support_material_bottom_interface_layers.is_enabled() ? + object_config.support_material_bottom_interface_layers : + num_top_interface_layers; this->has_top_contacts = num_top_interface_layers > 0; this->has_bottom_contacts = num_bottom_interface_layers > 0; this->num_top_interface_layers = this->has_top_contacts ? size_t(num_top_interface_layers - 1) : 0; diff --git a/src/libslic3r/Support/TreeSupportCommon.cpp b/src/libslic3r/Support/TreeSupportCommon.cpp index 58e14460b81..a2a0fb957a8 100644 --- a/src/libslic3r/Support/TreeSupportCommon.cpp +++ b/src/libslic3r/Support/TreeSupportCommon.cpp @@ -41,12 +41,14 @@ TreeSupportMeshGroupSettings::TreeSupportMeshGroupSettings(const PrintObject &pr this->support_line_width = support_material_flow(&print_object, config.layer_height).scaled_width(); this->support_roof_line_width = support_material_interface_flow(&print_object, config.layer_height).scaled_width(); //FIXME add it to SlicingParameters and reuse in both tree and normal supports? - this->support_bottom_enable = config.support_material_interface_layers.value > 0 && config.support_material_bottom_interface_layers.value != 0; - this->support_bottom_height = this->support_bottom_enable ? - (config.support_material_bottom_interface_layers.value > 0 ? + this->support_bottom_enable = config.support_material_interface_layers.value > 0 && + (!config.support_material_bottom_interface_layers.is_enabled() || + config.support_material_bottom_interface_layers.value > 0); + this->support_bottom_height = !this->support_bottom_enable ? 0 : + this->layer_height * (config.support_material_bottom_interface_layers.is_enabled() ? config.support_material_bottom_interface_layers.value : - config.support_material_interface_layers.value) * this->layer_height : - 0; + config.support_material_interface_layers.value); + this->support_material_buildplate_only = config.support_material_buildplate_only; this->support_xy_distance = scaled(config.support_material_xy_spacing.get_abs_value(external_perimeter_width)); // Separation of interfaces, it is likely smaller than support_xy_distance. @@ -57,9 +59,14 @@ TreeSupportMeshGroupSettings::TreeSupportMeshGroupSettings(const PrintObject &pr // this->support_infill_angles = this->support_roof_enable = config.support_material_interface_layers.value > 0; this->support_roof_layers = this->support_roof_enable ? config.support_material_interface_layers.value : 0; - this->support_floor_enable = config.support_material_interface_layers.value > 0 && config.support_material_bottom_interface_layers.value > 0; - this->support_floor_layers = this->support_floor_enable ? config.support_material_bottom_interface_layers.value : 0; -// this->minimum_roof_area = + this->support_floor_enable = this->support_roof_enable && + (!config.support_material_bottom_interface_layers.is_enabled() || + config.support_material_bottom_interface_layers.value > 0); + this->support_floor_layers = !this->support_floor_enable ? 0 : + config.support_material_bottom_interface_layers.is_enabled() ? + config.support_material_bottom_interface_layers.value : + this->support_roof_layers; + // this->minimum_roof_area = // this->support_roof_angles = this->support_roof_pattern = config.support_material_top_interface_pattern.value; this->support_pattern = config.support_material_pattern; diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 3f7a1d130da..ee9874306e1 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -353,7 +353,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) bool has_spiral_vase = have_perimeters && config->opt_bool("spiral_vase"); - bool have_arachne = have_perimeters && (config->opt_int("perimeters") == config->opt_int("perimeters_hole") || config->opt_int("perimeters_hole") < 0); + bool have_arachne = have_perimeters && (config->opt_int("perimeters") == config->opt_int("perimeters_hole") || !config->is_enabled("perimeters_hole")); toggle_field("perimeter_generator", have_arachne); have_arachne = have_arachne && config->opt_enum("perimeter_generator") == PerimeterGeneratorType::Arachne; for (auto el : { "wall_transition_length", "wall_transition_filter_deviation", "wall_transition_angle", "wall_distribution_count", "min_feature_size", "min_bead_width", "aaa" }) @@ -473,6 +473,9 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) for (auto el : { "hole_to_polyhole_threshold", "hole_to_polyhole_twisted" }) toggle_field(el, config->opt_bool("hole_to_polyhole")); + for (auto el : { "overhangs_bridge_threshold", "overhangs_bridge_upper_layers" }) + toggle_field(el, config->get_float("overhangs_max_slope") > 0); + bool have_skirt = config->opt_int("skirts") > 0; toggle_field("skirt_height", have_skirt && config->opt_enum("draft_shield") != dsEnabled); toggle_field("skirt_width", have_skirt);