ENH: don't calculate overhang degree if disable overhang slow down

When the model has no overhang, user may disable overhang
slowing down.
In this case, it's unnecessary to calculate overhang
degree which make slicing slow when model is complex.

This is improvement for github issue #331.

Signed-off-by: salt.wei <salt.wei@bambulab.com>
Change-Id: I2eaeca3ee4068f76709fe97535bbf05c0d27c062
This commit is contained in:
salt.wei 2022-10-09 18:24:51 +08:00 committed by Lane.Wei
parent 81da77d1e0
commit fd0f22b771
2 changed files with 33 additions and 15 deletions

View File

@ -222,29 +222,47 @@ static ExtrusionEntityCollection traverse_loops(const PerimeterGenerator &perime
if (perimeter_generator.config->detect_overhang_wall && perimeter_generator.layer_id > perimeter_generator.object_config->raft_layers) {
// get non 100% overhang paths by intersecting this loop with the grown lower slices
Polylines remain_polines;
for (auto it = lower_polygons_series->begin();
it != lower_polygons_series->end(); it++)
{
Polylines inside_polines = (it == lower_polygons_series->begin()) ?
intersection_pl({ polygon }, it->second) :
intersection_pl(remain_polines, it->second);
if (perimeter_generator.config->enable_overhang_speed) {
for (auto it = lower_polygons_series->begin();
it != lower_polygons_series->end(); it++)
{
Polylines inside_polines = (it == lower_polygons_series->begin()) ?
intersection_pl({ polygon }, it->second) :
intersection_pl(remain_polines, it->second);
extrusion_paths_append(
paths,
std::move(inside_polines),
it->first,
int(0),
role,
extrusion_mm3_per_mm,
extrusion_width,
(float)perimeter_generator.layer_height);
remain_polines = (it == lower_polygons_series->begin()) ?
diff_pl({ polygon }, it->second) :
diff_pl(remain_polines, it->second);
if (remain_polines.size() == 0)
break;
}
} else {
auto it = lower_polygons_series->end();
it--;
Polylines inside_polines = intersection_pl({ polygon }, it->second);
extrusion_paths_append(
paths,
std::move(inside_polines),
it->first,
int(0),
int(0),
role,
extrusion_mm3_per_mm,
extrusion_width,
(float)perimeter_generator.layer_height);
remain_polines = (it == lower_polygons_series->begin())?
diff_pl({ polygon }, it->second) :
diff_pl(remain_polines, it->second);
if (remain_polines.size() == 0)
break;
remain_polines = diff_pl({ polygon }, it->second);
}
// get 100% overhang paths by checking what parts of this loop fall

View File

@ -779,6 +779,8 @@ bool PrintObject::invalidate_state_by_config_options(
|| opt_key == "fuzzy_skin_thickness"
|| opt_key == "fuzzy_skin_point_distance"
|| opt_key == "detect_overhang_wall"
//BBS
|| opt_key == "enable_overhang_speed"
|| opt_key == "detect_thin_wall") {
steps.emplace_back(posPerimeters);
steps.emplace_back(posSupportMaterial);
@ -794,8 +796,6 @@ bool PrintObject::invalidate_state_by_config_options(
opt_key == "seam_position"
|| opt_key == "support_speed"
|| opt_key == "support_interface_speed"
//BBS
|| opt_key == "enable_overhang_speed"
|| opt_key == "overhang_1_4_speed"
|| opt_key == "overhang_2_4_speed"
|| opt_key == "overhang_3_4_speed"