mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-08-16 07:55:57 +08:00
extra_perimeters : seems unsused, now used to add more perimeters on overhangs if needed.
TODO: change the tooltip & description
This commit is contained in:
parent
0f41fb46ba
commit
586b38f0b2
@ -68,6 +68,29 @@ void PerimeterGenerator::process()
|
|||||||
ThickPolylines thin_walls;
|
ThickPolylines thin_walls;
|
||||||
// we loop one time more than needed in order to find gaps after the last perimeter was applied
|
// we loop one time more than needed in order to find gaps after the last perimeter was applied
|
||||||
for (int i = 0;; ++ i) { // outer loop is 0
|
for (int i = 0;; ++ i) { // outer loop is 0
|
||||||
|
// We can add more perimeters if there are uncovered overhangs
|
||||||
|
// improvement for future: find a way to add perimeters only where it's needed.
|
||||||
|
// It's hard to do, so here is a simple version.
|
||||||
|
bool may_add_more_perimeters = false;
|
||||||
|
if (this->config->extra_perimeters && i > loop_number && !last.empty()
|
||||||
|
&& this->lower_slices != NULL && !this->lower_slices->expolygons.empty()){
|
||||||
|
//split the polygons with bottom/notbottom
|
||||||
|
ExPolygons support(this->lower_slices->expolygons);
|
||||||
|
ExPolygons unsupported = diff_ex(last, support, true);
|
||||||
|
if (!unsupported.empty()) {
|
||||||
|
//only consider overhangs and let bridges alone
|
||||||
|
// it's more reliable than the BridgeDetector
|
||||||
|
ExPolygonCollection coll_last(support);
|
||||||
|
ExPolygon hull;
|
||||||
|
hull.contour = coll_last.convex_hull();
|
||||||
|
unsupported = diff_ex(unsupported, ExPolygons() = { hull });
|
||||||
|
if (!unsupported.empty()) {
|
||||||
|
//add fake perimeters here
|
||||||
|
may_add_more_perimeters = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Calculate next onion shell of perimeters.
|
// Calculate next onion shell of perimeters.
|
||||||
ExPolygons offsets;
|
ExPolygons offsets;
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
@ -138,8 +161,14 @@ void PerimeterGenerator::process()
|
|||||||
last.clear();
|
last.clear();
|
||||||
break;
|
break;
|
||||||
} else if (i > loop_number) {
|
} else if (i > loop_number) {
|
||||||
// If i > loop_number, we were looking just for gaps.
|
if (may_add_more_perimeters) {
|
||||||
break;
|
loop_number++;
|
||||||
|
contours.emplace_back();
|
||||||
|
holes.emplace_back();
|
||||||
|
} else {
|
||||||
|
// If i > loop_number, we were looking just for gaps.
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for (const ExPolygon &expolygon : offsets) {
|
for (const ExPolygon &expolygon : offsets) {
|
||||||
contours[i].emplace_back(PerimeterGeneratorLoop(expolygon.contour, i, true));
|
contours[i].emplace_back(PerimeterGeneratorLoop(expolygon.contour, i, true));
|
||||||
@ -151,7 +180,7 @@ void PerimeterGenerator::process()
|
|||||||
}
|
}
|
||||||
last = std::move(offsets);
|
last = std::move(offsets);
|
||||||
|
|
||||||
if(i==0 && config->only_one_perimeter_top && this->upper_slices != NULL){
|
if(i==0 && config->only_one_perimeter_top && this->upper_slices != NULL) {
|
||||||
//split the polygons with top/not_top
|
//split the polygons with top/not_top
|
||||||
ExPolygons upper_polygons(this->upper_slices->expolygons);
|
ExPolygons upper_polygons(this->upper_slices->expolygons);
|
||||||
ExPolygons inner_polygons = diff_ex(last, (upper_polygons), true);
|
ExPolygons inner_polygons = diff_ex(last, (upper_polygons), true);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user