From fd0f22b7710c4113726ec4ebcdaf1d2cab1dc470 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"