diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index dfd7ab0fb..972f62ca8 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -4249,11 +4249,14 @@ static std::map overhang_speed_key_map = double GCode::get_overhang_degree_corr_speed(float normal_speed, double path_degree) { - if (path_degree== 0) + //BBS: protection: overhang degree is float, make sure it not excess degree range + if (path_degree <= 0) return normal_speed; - int lower_degree_bound = int(path_degree); + if (path_degree >= 5 ) + return m_config.get_abs_value(overhang_speed_key_map[5].c_str()); + int lower_degree_bound = int(path_degree); if (path_degree==lower_degree_bound) return m_config.get_abs_value(overhang_speed_key_map[lower_degree_bound].c_str()); int upper_degree_bound = lower_degree_bound + 1; diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 3b07f38f9..26d97a2d4 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -13,6 +13,7 @@ static const int overhang_sampling_number = 6; static const double narrow_loop_length_threshold = 10; static const double min_degree_gap = 0.1; +static const int max_overhang_degree = overhang_sampling_number - 1; //BBS: when the width of expolygon is smaller than //ext_perimeter_width + ext_perimeter_spacing * (1 - SMALLER_EXT_INSET_OVERLAP_TOLERANCE), //we think it's small detail area and will generate smaller line width for it @@ -231,6 +232,7 @@ static std::deque split_polyline_by_degree(const Polyline &p // BBS: merge degree in limited range //find first degee base double degree_base = int(points_overhang[points_overhang.size() - 1] / min_degree_gap) * min_degree_gap + min_degree_gap; + degree_base = degree_base > max_overhang_degree ? max_overhang_degree : degree_base; double short_poly_len = 0; for (int point_idx = points_overhang.size() - 2; point_idx > 0; --point_idx) { @@ -245,7 +247,7 @@ static std::deque split_polyline_by_degree(const Polyline &p out.push_back(PolylineWithDegree(right, degree_base)); degree_base = int(degree / min_degree_gap) * min_degree_gap + min_degree_gap; - degree_base = degree_base > overhang_sampling_number - 2 ? overhang_sampling_number - 2 : degree_base; + degree_base = degree_base > max_overhang_degree ? max_overhang_degree : degree_base; } if (!temp_copy.empty()) { @@ -356,7 +358,7 @@ static std::deque detect_overahng_degree(Polygons low float overhang_dist = prev_layer_distancer->distance_from_perimeter(pt.cast()); overhang_dist = overhang_dist > upper_bound ? upper_bound : overhang_dist; // BBS : calculate overhang degree - int max_overhang = overhang_sampling_number - 2; + int max_overhang = max_overhang_degree; int min_overhang = 0; double t = (overhang_dist - lower_bound) / (upper_bound - lower_bound); t = t > 1.0 ? 1: t;