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"