Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsupermerill <merill@free.fr>2021-11-19 19:50:30 +0300
committersupermerill <merill@free.fr>2021-11-19 19:51:58 +0300
commita535725e5d2b9037fe48a32163be4872f7ae65a7 (patch)
treeec73d7d0cc6077879d2fa9514a1ab83b1cdf581d /src
parent0d25f9b266ebe279a14e1a494bb60262f8ff9f2f (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.cpp2
-rw-r--r--src/libslic3r/PerimeterGenerator.cpp24
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)));