ENH: add transition_layer for normal support

jira: STUDIO-11033
Change-Id: I188fd9d4919170bdbc673a500cffe02a6bc6ff02
This commit is contained in:
jiaxi.chen 2025-04-08 11:11:21 +08:00 committed by lane.wei
parent c7f5569d75
commit e2c4b80435
3 changed files with 20 additions and 6 deletions

View File

@ -145,9 +145,9 @@ std::pair<SupportGeneratorLayersPtr, SupportGeneratorLayersPtr> generate_interfa
if (support_params.num_top_base_interface_layers > 0)
// Some top base interface layers will be generated.
top_inteface_z = support_params.num_top_interface_layers_only() == 0 ?
// Only base interface layers to generate.
// Only base interface layers to generate.
- std::numeric_limits<coordf_t>::max() :
intermediate_layers[std::min(num_intermediate - 1, idx_intermediate_layer + int(support_params.num_top_interface_layers_only()) - 1)]->print_z;
intermediate_layers[std::min(num_intermediate - 1, idx_intermediate_layer + int(support_params.num_top_interface_layers_only()) - 1)]->print_z;
// Move idx_top_contact_first up until above the current print_z.
idx_top_contact_first = idx_higher_or_equal(top_contacts, idx_top_contact_first, [&intermediate_layer](const SupportGeneratorLayer *layer){ return layer->print_z >= intermediate_layer.print_z; }); // - EPSILON
// Collect the top contact areas above this intermediate layer, below top_z.
@ -208,6 +208,17 @@ std::pair<SupportGeneratorLayersPtr, SupportGeneratorLayersPtr> generate_interfa
}
});
tbb::parallel_for(tbb::blocked_range<int>(1, int(base_interface_layers.size())), [&base_interface_layers](const tbb::blocked_range<int> &range) {
for (int layer_id = range.begin(); layer_id < range.end(); ++layer_id) {
auto &base_interface_layer = base_interface_layers[layer_id];
if (!base_interface_layer) return;
auto &lower_layer = base_interface_layers[layer_id - 1];
if (!lower_layer) return;
if (base_interface_layer->polygons == lower_layer->polygons) base_interface_layer->up = true;
}
});
// Compress contact_out, remove the nullptr items.
// The parallel_for above may not have merged all the interface and base_interface layers
// generated by the Organic supports code, do it here.
@ -1697,7 +1708,8 @@ void generate_support_toolpaths(
// the bridging flow does not quite apply. Reduce the flow to area of an ellipse? (A = pi * a * b)
assert(! base_interface_layer.layer->bridging);
Flow interface_flow = support_params.support_material_flow.with_height(float(base_interface_layer.layer->height));
filler->angle = interface_angles[(support_layer_id + 1) % interface_angles.size()]; // need to be the same as the interface layer above
filler->angle = base_interface_layer.layer->up ? interface_angles[(support_layer_id + 1) % interface_angles.size()] + M_PI_2 :
(angles[(support_layer_id - 1) % angles.size()] + M_PI_2);
filler->spacing = support_params.support_material_interface_flow.spacing();
filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / support_params.interface_density));
fill_expolygons_generate_paths(
@ -1709,7 +1721,7 @@ void generate_support_toolpaths(
// Filler and its parameters
filler, float(support_params.interface_density),
// Extrusion parameters
ExtrusionRole::erSupportMaterial, interface_flow);
ExtrusionRole::erSupportTransition, interface_flow);
}
// Base support or flange.

View File

@ -110,6 +110,8 @@ namespace Slic3r {
size_t idx_object_layer_below{ size_t(-1) };
// Use a bridging flow when printing this support layer.
bool bridging{ false };
//order of the transition layers
bool up{false};
// Polygons to be filled by the support pattern.
Polygons polygons;

View File

@ -35,7 +35,7 @@ struct SupportParameters {
this->has_bottom_contacts = num_bottom_interface_layers > 0;
if (this->soluble_interface_non_soluble_base) {
// Try to support soluble dense interfaces with non-soluble dense interfaces.
this->num_top_base_interface_layers = size_t(std::min(int(num_top_interface_layers) / 2, 2));
this->num_top_base_interface_layers = num_top_interface_layers > 0 ? 2 : 0;
this->num_bottom_base_interface_layers = size_t(std::min(int(num_bottom_interface_layers) / 2, 2));
} else {
// BBS: if support interface and support base do not use the same filament, add a base layer to improve their adhesion
@ -43,7 +43,7 @@ struct SupportParameters {
// support_filament==0
bool differnt_support_interface_filament = object_config.support_interface_filament != 0 &&
object_config.support_interface_filament != object_config.support_filament;
this->num_top_base_interface_layers = differnt_support_interface_filament ? 1 : 0;
this->num_top_base_interface_layers = differnt_support_interface_filament ? 2 : 0;
this->num_bottom_base_interface_layers = differnt_support_interface_filament ? 1 : 0;
}
}