ENH: add transition_layer for normal support
jira: STUDIO-11033 Change-Id: I188fd9d4919170bdbc673a500cffe02a6bc6ff02
This commit is contained in:
parent
c7f5569d75
commit
e2c4b80435
|
@ -145,9 +145,9 @@ std::pair<SupportGeneratorLayersPtr, SupportGeneratorLayersPtr> generate_interfa
|
||||||
if (support_params.num_top_base_interface_layers > 0)
|
if (support_params.num_top_base_interface_layers > 0)
|
||||||
// Some top base interface layers will be generated.
|
// Some top base interface layers will be generated.
|
||||||
top_inteface_z = support_params.num_top_interface_layers_only() == 0 ?
|
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() :
|
- 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.
|
// 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
|
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.
|
// 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.
|
// Compress contact_out, remove the nullptr items.
|
||||||
// The parallel_for above may not have merged all the interface and base_interface layers
|
// The parallel_for above may not have merged all the interface and base_interface layers
|
||||||
// generated by the Organic supports code, do it here.
|
// 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)
|
// 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);
|
assert(! base_interface_layer.layer->bridging);
|
||||||
Flow interface_flow = support_params.support_material_flow.with_height(float(base_interface_layer.layer->height));
|
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->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));
|
filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / support_params.interface_density));
|
||||||
fill_expolygons_generate_paths(
|
fill_expolygons_generate_paths(
|
||||||
|
@ -1709,7 +1721,7 @@ void generate_support_toolpaths(
|
||||||
// Filler and its parameters
|
// Filler and its parameters
|
||||||
filler, float(support_params.interface_density),
|
filler, float(support_params.interface_density),
|
||||||
// Extrusion parameters
|
// Extrusion parameters
|
||||||
ExtrusionRole::erSupportMaterial, interface_flow);
|
ExtrusionRole::erSupportTransition, interface_flow);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Base support or flange.
|
// Base support or flange.
|
||||||
|
|
|
@ -110,6 +110,8 @@ namespace Slic3r {
|
||||||
size_t idx_object_layer_below{ size_t(-1) };
|
size_t idx_object_layer_below{ size_t(-1) };
|
||||||
// Use a bridging flow when printing this support layer.
|
// Use a bridging flow when printing this support layer.
|
||||||
bool bridging{ false };
|
bool bridging{ false };
|
||||||
|
//order of the transition layers
|
||||||
|
bool up{false};
|
||||||
|
|
||||||
// Polygons to be filled by the support pattern.
|
// Polygons to be filled by the support pattern.
|
||||||
Polygons polygons;
|
Polygons polygons;
|
||||||
|
|
|
@ -35,7 +35,7 @@ struct SupportParameters {
|
||||||
this->has_bottom_contacts = num_bottom_interface_layers > 0;
|
this->has_bottom_contacts = num_bottom_interface_layers > 0;
|
||||||
if (this->soluble_interface_non_soluble_base) {
|
if (this->soluble_interface_non_soluble_base) {
|
||||||
// Try to support soluble dense interfaces with non-soluble dense interfaces.
|
// 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));
|
this->num_bottom_base_interface_layers = size_t(std::min(int(num_bottom_interface_layers) / 2, 2));
|
||||||
} else {
|
} else {
|
||||||
// BBS: if support interface and support base do not use the same filament, add a base layer to improve their adhesion
|
// 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
|
// support_filament==0
|
||||||
bool differnt_support_interface_filament = object_config.support_interface_filament != 0 &&
|
bool differnt_support_interface_filament = object_config.support_interface_filament != 0 &&
|
||||||
object_config.support_interface_filament != object_config.support_filament;
|
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;
|
this->num_bottom_base_interface_layers = differnt_support_interface_filament ? 1 : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue