diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index d2c8ec054..b0705873d 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -723,7 +723,14 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "support_top_z_distance" || opt_key == "support_bottom_z_distance" || opt_key == "xy_hole_compensation" - || opt_key == "xy_contour_compensation") { + || opt_key == "xy_contour_compensation" + //BBS: [Arthur] the following params affect bottomBridge surface type detection + || opt_key == "support_type" + || opt_key == "bridge_no_support" + || opt_key == "max_bridge_length" + || opt_key == "support_interface_top_layers" + || opt_key == "support_critical_regions_only" + ) { steps.emplace_back(posSlice); } else if (opt_key == "enable_support") { steps.emplace_back(posSupportMaterial); @@ -970,9 +977,17 @@ void PrintObject::detect_surfaces_type() [this, region_id, interface_shells, &surfaces_new](const tbb::blocked_range& range) { // If we have soluble support material, don't bridge. The overhang will be squished against a soluble layer separating // the support from the print. - SurfaceType surface_type_bottom_other = - (this->has_support() && m_config.support_top_z_distance.value == 0) ? - stBottom : stBottomBridge; + // BBS: the above logic only applys for normal(auto) support. Complete logic: + // 1. has support, top z distance=0 (soluble material), auto support + // 2. for normal(auto), bridge_no_support is off + // 3. for tree(auto), interface top layers=0, max bridge length=0, support_critical_regions_only=false (only in this way the bridge is fully supported) + bool bottom_is_fully_supported = this->has_support() && m_config.support_top_z_distance.value == 0 && is_auto(m_config.support_type.value); + if (m_config.support_type.value == stNormalAuto) + bottom_is_fully_supported &= !m_config.bridge_no_support.value; + else if (m_config.support_type.value == stTreeAuto) { + bottom_is_fully_supported &= (m_config.support_interface_top_layers.value > 0 && m_config.max_bridge_length.value == 0 && m_config.support_critical_regions_only.value==false); + } + SurfaceType surface_type_bottom_other = bottom_is_fully_supported ? stBottom : stBottomBridge; for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { m_print->throw_if_canceled(); // BOOST_LOG_TRIVIAL(trace) << "Detecting solid surfaces for region " << region_id << " and layer " << layer->print_z;