FIX: several issue of organic support

1. raft under organic trees are not generated
2. Studio may crash when generating organic supports for some objects.

jira: STUDIO-6407
Change-Id: I6e7ff2423b9fee95e4a4a85ccc2844549142f0c8
(cherry picked from commit 00db6c241270f5524bf1618109a2b45872073fd0)
This commit is contained in:
Arthur 2024-03-08 16:02:47 +08:00 committed by Lane.Wei
parent 1330b1b959
commit c7d12b703e
1 changed files with 25 additions and 11 deletions

View File

@ -209,7 +209,7 @@ static std::vector<std::pair<TreeSupportSettings, std::vector<size_t>>> group_me
} }
#endif #endif
[[nodiscard]] static const std::vector<Polygons> generate_overhangs(const TreeSupportSettings &settings, const PrintObject &print_object, std::function<void()> throw_on_cancel) [[nodiscard]] static const std::vector<Polygons> generate_overhangs(const TreeSupportSettings &settings, PrintObject &print_object, std::function<void()> throw_on_cancel)
{ {
const size_t num_raft_layers = settings.raft_layers.size(); const size_t num_raft_layers = settings.raft_layers.size();
const size_t num_object_layers = print_object.layer_count(); const size_t num_object_layers = print_object.layer_count();
@ -232,6 +232,20 @@ static std::vector<std::pair<TreeSupportSettings, std::vector<size_t>>> group_me
double support_tree_tip_diameter = 0.8; double support_tree_tip_diameter = 0.8;
auto enforcer_overhang_offset = scaled<double>(support_tree_tip_diameter); auto enforcer_overhang_offset = scaled<double>(support_tree_tip_diameter);
// calc the extrudable expolygons of each layer
const coordf_t extrusion_width = config.line_width.value;
const coordf_t extrusion_width_scaled = scale_(extrusion_width);
tbb::parallel_for(tbb::blocked_range<size_t>(0, print_object.layer_count()),
[&](const tbb::blocked_range<size_t>& range) {
for (size_t layer_nr = range.begin(); layer_nr < range.end(); layer_nr++) {
if (print_object.print()->canceled())
break;
Layer* layer = print_object.get_layer(layer_nr);
// Filter out areas whose diameter that is smaller than extrusion_width, but we don't want to lose any details.
layer->lslices_extrudable = intersection_ex(layer->lslices, offset2_ex(layer->lslices, -extrusion_width_scaled / 2, extrusion_width_scaled));
}
});
size_t num_overhang_layers = support_auto ? num_object_layers : std::min(num_object_layers, std::max(size_t(support_enforce_layers), enforcers_layers.size())); size_t num_overhang_layers = support_auto ? num_object_layers : std::min(num_object_layers, std::max(size_t(support_enforce_layers), enforcers_layers.size()));
tbb::parallel_for(tbb::blocked_range<LayerIndex>(1, num_overhang_layers), tbb::parallel_for(tbb::blocked_range<LayerIndex>(1, num_overhang_layers),
[&print_object, &config, &print_config, &enforcers_layers, &blockers_layers, [&print_object, &config, &print_config, &enforcers_layers, &blockers_layers,
@ -259,9 +273,8 @@ static std::vector<std::pair<TreeSupportSettings, std::vector<size_t>>> group_me
lower_layer_offset = float(0.5 * external_perimeter_width); lower_layer_offset = float(0.5 * external_perimeter_width);
} else } else
lower_layer_offset = scaled<float>(lower_layer.height / tan_threshold); lower_layer_offset = scaled<float>(lower_layer.height / tan_threshold);
overhangs = lower_layer_offset == 0 ? Polygons lower_layer_offseted = offset(lower_layer.lslices_extrudable, lower_layer_offset);
diff(current_layer.lslices, lower_layer.lslices) : overhangs = diff(current_layer.lslices_extrudable, lower_layer_offseted);
diff(current_layer.lslices, offset(lower_layer.lslices, lower_layer_offset));
if (lower_layer_offset == 0) { if (lower_layer_offset == 0) {
raw_overhangs = overhangs; raw_overhangs = overhangs;
raw_overhangs_calculated = true; raw_overhangs_calculated = true;
@ -4269,18 +4282,19 @@ static void generate_support_areas(Print &print, TreeSupport* tree_support, cons
auto t_place = std::chrono::high_resolution_clock::now(); auto t_place = std::chrono::high_resolution_clock::now();
// ### draw these points as circles // ### draw these points as circles
#if 0
indexed_triangle_set branches = draw_branches(*print.get_object(processing.second.front()), volumes, config, move_bounds, throw_on_cancel); indexed_triangle_set branches = draw_branches(*print.get_object(processing.second.front()), volumes, config, move_bounds, throw_on_cancel);
// Reduce memory footprint. After this point only slice_branches() will use volumes and from that only collisions with zero radius will be used. // Reduce memory footprint. After this point only slice_branches() will use volumes and from that only collisions with zero radius will be used.
volumes.clear_all_but_object_collision(); volumes.clear_all_but_object_collision();
slice_branches(*print.get_object(processing.second.front()), volumes, config, overhangs, move_bounds, branches, slice_branches(*print.get_object(processing.second.front()), volumes, config, overhangs, move_bounds, branches,
bottom_contacts, top_contacts, intermediate_layers, layer_storage, throw_on_cancel); bottom_contacts, top_contacts, intermediate_layers, layer_storage, throw_on_cancel);
#else
// this new function may cause bad_function_call exception // this new function give correct result when raft is also enabled
//organic_draw_branches( organic_draw_branches(
// *print.get_object(processing.second.front()), volumes, config, move_bounds, *print.get_object(processing.second.front()), volumes, config, move_bounds,
// bottom_contacts, top_contacts, interface_placer, intermediate_layers, layer_storage, bottom_contacts, top_contacts, interface_placer, intermediate_layers, layer_storage,
// throw_on_cancel); throw_on_cancel);
#endif
remove_undefined_layers(); remove_undefined_layers();