diff --git a/src/libslic3r/GCode/ExtrusionProcessor.cpp b/src/libslic3r/GCode/ExtrusionProcessor.cpp index 3f6aa5f5ed..38c3c3b1f6 100644 --- a/src/libslic3r/GCode/ExtrusionProcessor.cpp +++ b/src/libslic3r/GCode/ExtrusionProcessor.cpp @@ -76,8 +76,9 @@ ExtrusionPaths calculate_and_split_overhanging_extrusions(const ExtrusionPath for (size_t i = 1; i < extended_points.size(); i++) { result.back().polyline.append(Point::new_scale(extended_points[i].position)); result.back().overhang_attributes_mutable()->end_distance_from_prev_layer = extended_points[i].distance; - if (std::abs(calculated_distances[sequence_start_index].first - calculated_distances[i - 1].first) < path.width() * 0.05 && - std::abs(calculated_distances[sequence_start_index].second - calculated_distances[i - 1].second) < 0.05) { + + if (std::abs(calculated_distances[sequence_start_index].first - calculated_distances[i].first) < path.width() * 0.0001 && + std::abs(calculated_distances[sequence_start_index].second - calculated_distances[i].second) < 0.0001) { // do not start new path, the attributes are similar enough } else if (i +1 < extended_points.size()) { // do not start new path if this is last point! // start new path, parameters differ @@ -86,6 +87,7 @@ ExtrusionPaths calculate_and_split_overhanging_extrusions(const ExtrusionPath new_attrs.overhang_attributes->proximity_to_curled_lines = calculated_distances[i].second; sequence_start_index = i; result.emplace_back(new_attrs); + result.back().polyline.append(Point::new_scale(extended_points[i].position)); } } diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 90e05ae78a..336f19d868 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -554,17 +554,22 @@ void PrintObject::calculate_overhanging_perimeters() curled_lines[l->id()] = AABBTreeLines::LinesDistancer{l->curled_lines}; unscaled_polygons_lines[l->id()] = AABBTreeLines::LinesDistancer{to_unscaled_linesf(l->lslices)}; } + curled_lines[size_t(-1)] = {}; + unscaled_polygons_lines[size_t(-1)] = {}; for (Layer *l : this->layers()) { + if (l->id() == 0) { // first layer, do not split + continue; + } for (LayerRegion *layer_region : l->regions()) { if (regions_with_dynamic_overhangs.find(layer_region->m_region) == regions_with_dynamic_overhangs.end()) { continue; } - ExPolygons prev_layer_polygon = l->lower_layer == nullptr ? ExPolygons() : l->lower_layer->lslices; + size_t prev_layer_id = l->lower_layer ? l->lower_layer->id() : size_t(-1); layer_region->m_perimeters = ExtrusionProcessor::calculate_and_split_overhanging_extrusions(&layer_region->m_perimeters, - unscaled_polygons_lines[l->id()], - curled_lines[l->id()]); + unscaled_polygons_lines[prev_layer_id], + curled_lines[prev_layer_id]); } }