FIX: bottom bridge was not correctly detected

A bottome surface is detected as stBottom only if:
 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)

 Note:
 Since now the surface type depends on more parameters, changing them will trigger re-slicing and making the whole process slower.

github issues: 1253

Change-Id: I0fe719e0dbf7147206008c8726dd9c7be2b19226
(cherry picked from commit d4490afa6b9e4fbb583033a125bbebb50dc5f0bb)
This commit is contained in:
Arthur 2023-02-08 16:42:49 +08:00 committed by Lane.Wei
parent 49bc67eed1
commit 088668994c
1 changed files with 19 additions and 4 deletions

View File

@ -723,7 +723,14 @@ bool PrintObject::invalidate_state_by_config_options(
|| opt_key == "support_top_z_distance" || opt_key == "support_top_z_distance"
|| opt_key == "support_bottom_z_distance" || opt_key == "support_bottom_z_distance"
|| opt_key == "xy_hole_compensation" || 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); steps.emplace_back(posSlice);
} else if (opt_key == "enable_support") { } else if (opt_key == "enable_support") {
steps.emplace_back(posSupportMaterial); steps.emplace_back(posSupportMaterial);
@ -970,9 +977,17 @@ void PrintObject::detect_surfaces_type()
[this, region_id, interface_shells, &surfaces_new](const tbb::blocked_range<size_t>& range) { [this, region_id, interface_shells, &surfaces_new](const tbb::blocked_range<size_t>& range) {
// If we have soluble support material, don't bridge. The overhang will be squished against a soluble layer separating // If we have soluble support material, don't bridge. The overhang will be squished against a soluble layer separating
// the support from the print. // the support from the print.
SurfaceType surface_type_bottom_other = // BBS: the above logic only applys for normal(auto) support. Complete logic:
(this->has_support() && m_config.support_top_z_distance.value == 0) ? // 1. has support, top z distance=0 (soluble material), auto support
stBottom : stBottomBridge; // 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) { for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) {
m_print->throw_if_canceled(); m_print->throw_if_canceled();
// BOOST_LOG_TRIVIAL(trace) << "Detecting solid surfaces for region " << region_id << " and layer " << layer->print_z; // BOOST_LOG_TRIVIAL(trace) << "Detecting solid surfaces for region " << region_id << " and layer " << layer->print_z;