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
diff options
context:
space:
mode:
Diffstat (limited to 'src/libslic3r/PerimeterGenerator.cpp')
-rw-r--r--src/libslic3r/PerimeterGenerator.cpp27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp
index 2ec55961e..66678d72c 100644
--- a/src/libslic3r/PerimeterGenerator.cpp
+++ b/src/libslic3r/PerimeterGenerator.cpp
@@ -295,8 +295,8 @@ void PerimeterGenerator::process()
// Add perimeters on overhangs : initialization
ExPolygons overhangs_unsupported;
- if (this->config->extra_perimeters && !last.empty()
- && this->lower_slices != NULL && !this->lower_slices->empty()) {
+ if ( (this->config->extra_perimeters_overhangs || (this->config->overhangs_reverse && this->layer_id % 2 == 1))
+ && !last.empty() && this->lower_slices != NULL && !this->lower_slices->empty()) {
//remove holes from lower layer, we only ant that for overhangs, not bridges!
ExPolygons lower_without_holes;
for (const ExPolygon &exp : *this->lower_slices)
@@ -330,6 +330,18 @@ void PerimeterGenerator::process()
}
}
}
+ bool has_steep_overhang = false;
+ if (this->layer_id % 2 == 1 && this->config->overhangs_reverse //check if my option is set and good layer
+ && !last.empty() && !overhangs_unsupported.empty() //has something to work with
+ ) {
+ coord_t offset = scale_(config->overhangs_reverse_threshold.get_abs_value(this->perimeter_flow.width));
+ //version with °: scale_(std::tan(PI * (0.5f / 90) * config->overhangs_reverse_threshold.value ) * this->layer_height)
+
+ if (offset_ex(overhangs_unsupported, -offset / 2).size() > 0) {
+ //allow this loop to be printed in reverse
+ has_steep_overhang = true;
+ }
+ }
// In case no perimeters are to be generated, loop_number will equal to -1.
std::vector<PerimeterGeneratorLoops> contours(loop_number+1); // depth => loops
@@ -341,10 +353,10 @@ void PerimeterGenerator::process()
// We can add more perimeters if there are uncovered overhangs
// improvement for future: find a way to add perimeters only where it's needed.
bool has_overhang = false;
- if (this->config->extra_perimeters && !last.empty() && !overhangs_unsupported.empty()) {
+ if ( this->config->extra_perimeters_overhangs && !last.empty() && !overhangs_unsupported.empty()) {
overhangs_unsupported = intersection_ex(overhangs_unsupported, last, true);
if (overhangs_unsupported.size() > 0) {
- //add fake perimeters here
+ //please don't stop adding periemter yet.
has_overhang = true;
}
}
@@ -512,11 +524,11 @@ void PerimeterGenerator::process()
for (const ExPolygon &expolygon : next_onion) {
//TODO: add width here to allow variable width (if we want to extrude a sightly bigger perimeter, see thin wall)
- contours[i].emplace_back(PerimeterGeneratorLoop(expolygon.contour, i, true, has_overhang));
+ contours[i].emplace_back(expolygon.contour, i, true, has_steep_overhang);
if (! expolygon.holes.empty()) {
holes[i].reserve(holes[i].size() + expolygon.holes.size());
for (const Polygon &hole : expolygon.holes)
- holes[i].emplace_back(PerimeterGeneratorLoop(hole, i, false, has_overhang));
+ holes[i].emplace_back(hole, i, false, has_steep_overhang);
}
}
last = std::move(next_onion);
@@ -889,7 +901,8 @@ ExtrusionEntityCollection PerimeterGenerator::_traverse_loops(
ExtrusionLoop *eloop = static_cast<ExtrusionLoop*>(coll.entities[idx.first]);
coll.entities[idx.first] = nullptr;
if (loop.is_contour) {
- if (loop.is_overhang && this->layer_id % 2 == 1)
+ //note: this->layer_id % 2 == 1 already taken into account in the is_steep_overhang compute (to save time).
+ if (loop.is_steep_overhang && this->layer_id % 2 == 1)
eloop->make_clockwise();
else
eloop->make_counter_clockwise();