From 28de7f5504181b6898c403264fda175a9b90ff24 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 26 Oct 2021 12:09:46 +0200 Subject: [PATCH] Support generator: Merging of bottom contacts with top contacts and interface layers if possible. This should always be possible with soluble supports and it should have been done long time ago. For non-soluble supports, it may or may not be possible to merge these layers: They will only be merged if they are extruded without bridging and with the same layer height. Fixes Support enforcer interfaces not generated as needed. #6784 or at least some of the issues reported. Experimental: Added experimental filtering of propagated support columns to two extrusions, overlapping by maximum 20%. This filtering step will remove spurious columns that do not support anything, but the filtering step may remove supports supporting tiny islands. Those supports would likely not be printable anyways without the user intervention (extending the supported area by painting). --- src/libslic3r/SupportMaterial.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp index a668a385b..9e1eb3e75 100644 --- a/src/libslic3r/SupportMaterial.cpp +++ b/src/libslic3r/SupportMaterial.cpp @@ -945,6 +945,8 @@ public: { { union_ex(*m_support_polygons) }, { "src", "green", 0.5f } }, }); #endif /* SLIC3R_DEBUG */ + //FIXME do we want to trim with the object here? On one side the columns will be thinner, on the other side support interfaces may disappear for snug supports. + // return diff(smooth_outward(closing(*m_support_polygons, closing_distance, SUPPORT_SURFACES_OFFSET_PARAMETERS), smoothing_distance), *m_trimming_polygons); return smooth_outward(closing(*m_support_polygons, closing_distance, SUPPORT_SURFACES_OFFSET_PARAMETERS), smoothing_distance); } assert(false); @@ -2346,7 +2348,9 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_conta Polygons &layer_support_area = layer_support_areas[layer_id]; Polygons *layer_buildplate_covered = buildplate_covered.empty() ? nullptr : &buildplate_covered[layer_id]; - task_group.run([&grid_params, &overhangs_projection, &overhangs_projection_raw, &layer, &layer_support_area, layer_buildplate_covered + // Filtering the propagated support columns to two extrusions, overlapping by maximum 20%. + float column_propagation_filtering_radius = scaled(0.8 * 0.5 * (m_support_params.support_material_flow.spacing() + m_support_params.support_material_flow.width())); + task_group.run([&grid_params, &overhangs_projection, &overhangs_projection_raw, &layer, &layer_support_area, layer_buildplate_covered, column_propagation_filtering_radius #ifdef SLIC3R_DEBUG , iRun, layer_id #endif /* SLIC3R_DEBUG */ @@ -2357,6 +2361,8 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_conta , iRun, layer_id, "general" #endif /* SLIC3R_DEBUG */ ); + // When propagating support areas downwards, stop propagating the support column if it becomes too thin to be printable. + //overhangs_projection = opening(overhangs_projection, column_propagation_filtering_radius); }); Polygons layer_support_area_enforcers; @@ -4115,7 +4121,10 @@ void PrintObjectSupportMaterial::generate_toolpaths( base_layer.merge(std::move(bottom_contact_layer)); else if (base_layer.empty() && ! bottom_contact_layer.empty() && ! bottom_contact_layer.layer->bridging) base_layer = std::move(bottom_contact_layer); - } + } else if (bottom_contact_layer.could_merge(top_contact_layer)) + top_contact_layer.merge(std::move(bottom_contact_layer)); + else if (bottom_contact_layer.could_merge(interface_layer)) + bottom_contact_layer.merge(std::move(interface_layer)); #if 0 if ( ! interface_layer.empty() && ! base_layer.empty()) {