ENH: clip the organic supports outside bed

1. Clip the organic supports outside bed.
jira: STUDIO-7061, STUDIO-7211, STUDIO-8076,
github: #4175, #4769
2. Move raft_first_layer_density outside raft section. raft_first_layer_density controls both raft and support first layer density.
jira: STUDIO-8083
github: #4773

Change-Id: I6a1300787cef917a9c1395707ef50aaf6dad66e5
This commit is contained in:
Arthur 2024-09-12 09:31:13 +08:00 committed by Lane.Wei
parent a45a2eec54
commit 2c6a6ae5f4
3 changed files with 12 additions and 8 deletions

View File

@ -4331,6 +4331,11 @@ static void generate_support_areas(Print &print, TreeSupport* tree_support, cons
SupportGeneratorLayersPtr raft_layers = generate_raft_base(print_object, support_params, print_object.slicing_parameters(), top_contacts, interface_layers, base_interface_layers, intermediate_layers, layer_storage);
SupportGeneratorLayersPtr layers_sorted = generate_support_layers(print_object, raft_layers, bottom_contacts, top_contacts, intermediate_layers, interface_layers, base_interface_layers);
// BBS: This is a hack to avoid the support being generated outside the bed area. See #4769.
for (SupportGeneratorLayer *layer : layers_sorted) {
if (layer) layer->polygons = intersection(layer->polygons, volumes.m_bed_area);
}
// Don't fill in the tree supports, make them hollow with just a single sheath line.
print.set_status(69, _L("Generating support"));
generate_support_toolpaths(print_object.support_layers(), print_object.config(), support_params, print_object.slicing_parameters(),
@ -4584,9 +4589,10 @@ void organic_draw_branches(
std::vector<Polygons> slices = slice_mesh(partial_mesh, slice_z, mesh_slicing_params, throw_on_cancel);
bottom_contacts.clear();
//FIXME parallelize?
for (LayerIndex i = 0; i < LayerIndex(slices.size()); ++i)
slices[i] = diff_clipped(slices[i], volumes.getCollision(0, layer_begin + i, true)); //FIXME parent_uses_min || draw_area.element->state.use_min_xy_dist);
for (LayerIndex i = 0; i < LayerIndex(slices.size()); ++i) {
slices[i] = diff_clipped(slices[i], volumes.getCollision(0, layer_begin + i, true)); // FIXME parent_uses_min || draw_area.element->state.use_min_xy_dist);
slices[i] = intersection(slices[i], volumes.m_bed_area);
}
size_t num_empty = 0;
if (slices.front().empty()) {
// Some of the initial layers are empty.

View File

@ -682,8 +682,6 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co
toggle_field("support_filament", have_support_material || have_skirt);
toggle_line("raft_contact_distance", have_raft && !have_support_soluble);
for (auto el : { "raft_first_layer_density"})
toggle_line(el, have_raft);
bool has_ironing = (config->opt_enum<IroningType>("ironing_type") != IroningType::NoIroning);
for (auto el : {

View File

@ -2059,7 +2059,6 @@ void TabPrint::build()
optgroup = page->new_optgroup(L("Raft"), L"param_raft");
optgroup->append_single_option_line("raft_layers");
optgroup->append_single_option_line("raft_contact_distance");
optgroup->append_single_option_line("raft_first_layer_density");
optgroup = page->new_optgroup(L("Support filament"), L"param_support_filament");
optgroup->append_single_option_line("support_filament", "support#support-filament");
@ -2070,6 +2069,7 @@ void TabPrint::build()
//BBS
optgroup = page->new_optgroup(L("Advanced"), L"param_advanced");
optgroup->append_single_option_line("raft_first_layer_density"); // not only for raft, but for support too
optgroup->append_single_option_line("raft_first_layer_expansion"); // not only for raft, but for support too
optgroup->append_single_option_line("tree_support_wall_count");
optgroup->append_single_option_line("support_top_z_distance", "support#top-z-distance");