From 29fff628c7f19546c25993f07c0f870725aac896 Mon Sep 17 00:00:00 2001 From: "salt.wei" Date: Sun, 9 Oct 2022 18:24:51 +0800 Subject: [PATCH] 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 Change-Id: I2eaeca3ee4068f76709fe97535bbf05c0d27c062 --- src/libslic3r/PerimeterGenerator.cpp | 44 ++++++++++++++++++++-------- src/libslic3r/PrintObject.cpp | 4 +-- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index c997ec713..3b67a7c12 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -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 diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 8806a5b15..03e42d392 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -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"