diff options
author | supermerill <merill@free.fr> | 2021-11-19 19:50:30 +0300 |
---|---|---|
committer | supermerill <merill@free.fr> | 2021-11-19 19:51:58 +0300 |
commit | a535725e5d2b9037fe48a32163be4872f7ae65a7 (patch) | |
tree | ec73d7d0cc6077879d2fa9514a1ab83b1cdf581d /src | |
parent | 0d25f9b266ebe279a14e1a494bb60262f8ff9f2f (diff) |
Fix some cases where "no perimeter on bridge" won't activate
(when the bridge are near the border of the object)
Also the "only bridge" now won't create artifacts on the perimeter path.
supermerill/SuperSlicer#1917
Diffstat (limited to 'src')
-rw-r--r-- | src/libslic3r/LayerRegion.cpp | 2 | ||||
-rw-r--r-- | src/libslic3r/PerimeterGenerator.cpp | 24 |
2 files changed, 20 insertions, 6 deletions
diff --git a/src/libslic3r/LayerRegion.cpp b/src/libslic3r/LayerRegion.cpp index 36051dbfd..bd60347dc 100644 --- a/src/libslic3r/LayerRegion.cpp +++ b/src/libslic3r/LayerRegion.cpp @@ -296,7 +296,7 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly std::vector<size_t> bridge_group(bridges.size(), (size_t)-1); size_t n_groups = 0; for (size_t i = 0; i < bridges.size(); ++ i) { - // A grup id for this bridge. + // A group id for this bridge. size_t group_id = (bridge_group[i] == size_t(-1)) ? (n_groups ++) : bridge_group[i]; bridge_group[i] = group_id; // For all possibly overlaping bridges: diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 610cce98f..a41974cb3 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -175,7 +175,7 @@ void PerimeterGenerator::process() for (surface_idx = 0; surface_idx < all_surfaces.size(); surface_idx++) { Surface *surface = &all_surfaces[surface_idx]; - ExPolygons last = union_ex(surface->expolygon); + ExPolygons last = { surface->expolygon }; //compute our unsupported surface ExPolygons unsupported = diff_ex(last, *this->lower_slices, true); if (!unsupported.empty()) { @@ -214,7 +214,8 @@ void PerimeterGenerator::process() //check convex, has some bridge, not overhang if (contour_simplified.size() == 1 && contour_bigger.size() == 1 && contour_simplified[0].concave_points().size() == 0 && intersection_ex(bridgeable, { poly_unsupp }).size() > 0 - && diff_ex({ poly_unsupp_bigger }, last, true).size() == 0) { + && diff_ex({ poly_unsupp_bigger }, union_ex(last, offset_ex(bridgeable, perimeter_spacing * 1.5)), true).size() == 0 + ) { //ok, keep it i++; } else { @@ -298,14 +299,27 @@ void PerimeterGenerator::process() expol.holes.clear(); unbridgeable = diff_ex(unbridgeable, bridgeable_simplified); unbridgeable = offset2_ex(unbridgeable, -ext_perimeter_width*2, ext_perimeter_width*2); - ExPolygons bridges_temp = intersection_ex(last, diff_ex(unsupported_filtered, unbridgeable)); + ExPolygons bridges_temp = offset2_ex(intersection_ex(last, diff_ex(unsupported_filtered, unbridgeable),true),-ext_perimeter_width/4, ext_perimeter_width/4); //remove the overhangs section from the surface polygons ExPolygons reference = last; last = diff_ex(last, unsupported_filtered); //ExPolygons no_bridge = diff_ex(offset_ex(unbridgeable, ext_perimeter_width * 3 / 2), last); //bridges_temp = diff_ex(bridges_temp, no_bridge); - coordf_t bridged_infill_margin = config->bridged_infill_margin.get_abs_value(ext_perimeter_width); - unsupported_filtered = diff_ex(offset_ex(bridges_temp, bridged_infill_margin), offset_ex(unbridgeable, ext_perimeter_width * 2, jtSquare)); + coordf_t bridged_infill_margin = scale_d(config->bridged_infill_margin.get_abs_value(unscaled(ext_perimeter_width))); + coordf_t offset_to_do = bridged_infill_margin; + bool first = true; + unbridgeable = diff_ex(unbridgeable, offset_ex(bridges_temp, ext_perimeter_width)); + while (offset_to_do > ext_perimeter_width * 1.5) { + unbridgeable = offset2_ex(unbridgeable, -ext_perimeter_width/4, ext_perimeter_width*2.25, ClipperLib::jtSquare); + bridges_temp = diff_ex(bridges_temp, unbridgeable); + bridges_temp = offset_ex(bridges_temp, ext_perimeter_width, ClipperLib::jtMiter, 6.); + unbridgeable = diff_ex(unbridgeable, offset_ex(bridges_temp, ext_perimeter_width)); + offset_to_do -= ext_perimeter_width; + first = false; + } + unbridgeable = offset_ex(unbridgeable, ext_perimeter_width + offset_to_do, ClipperLib::jtSquare); + bridges_temp = diff_ex(bridges_temp, unbridgeable); + unsupported_filtered = offset_ex(bridges_temp, offset_to_do); unsupported_filtered = intersection_ex(unsupported_filtered, reference); } else { ExPolygons unbridgeable = intersection_ex(unsupported, diff_ex(unsupported_filtered, offset_ex(bridgeable_simplified, ext_perimeter_width / 2))); |