Don't overextrude perimeters, put bigger gapfill instead

This commit is contained in:
supermerill 2019-07-12 19:24:07 +02:00
parent aa5d17eff4
commit 0ce30559b9
2 changed files with 26 additions and 4 deletions

View File

@ -62,6 +62,9 @@ public:
// This method is used exclusively to calculate new flow of 100% infill, where the extrusion width was allowed to scale
// to fit a region with integer number of lines.
static Flow new_from_spacing(float spacing, float nozzle_diameter, float height, bool bridge);
static float overlap(float height) {
return (float)(height * (1. - 0.25 * PI));
}
};
extern Flow support_material_flow(const PrintObject *object, float layer_height = 0.f);

View File

@ -363,8 +363,9 @@ void PerimeterGenerator::process()
ExPolygons no_thin_onion = offset_ex(last, double( - ext_perimeter_width / 2));
float div = 2;
while (no_thin_onion.size() > 0 && next_onion.size() > no_thin_onion.size() && no_thin_onion.size() + next_onion.size() > 3) {
div += 0.5;
//use a sightly smaller spacing to try to drastically improve the split, but with a little bit of over-extrusion
div -= 0.3;
if (div == 2) div -= 0.3;
//use a sightly bigger spacing to try to drastically improve the split, that can lead to very thick gapfill
ExPolygons next_onion_secondTry = offset2_ex(
last,
-(float)(ext_perimeter_width / 2 + ext_min_spacing / div - 1),
@ -372,7 +373,7 @@ void PerimeterGenerator::process()
if (next_onion.size() > next_onion_secondTry.size() * 1.1) {
next_onion = next_onion_secondTry;
}
if (div > 3) break;
if (div > 3 || div < 1.2) break;
}
// the following offset2 ensures almost nothing in @thin_walls is narrower than $min_width
@ -436,6 +437,23 @@ void PerimeterGenerator::process()
next_onion = offset2_ex(last,
-(float)(good_spacing + min_spacing / 2 - 1),
+(float)(min_spacing / 2 - 1));
ExPolygons no_thin_onion = offset_ex(last, double(-good_spacing));
float div = 2;
while (no_thin_onion.size() > 0 && next_onion.size() > no_thin_onion.size() && no_thin_onion.size() + next_onion.size() > 3) {
div -= 0.3;
if (div == 2) div -= 0.3;
//use a sightly bigger spacing to try to drastically improve the split, that can lead to very thick gapfill
ExPolygons next_onion_secondTry = offset2_ex(
last,
-(float)(good_spacing + min_spacing / div - 1),
+(float)(min_spacing / div - 1));
if (next_onion.size() > next_onion_secondTry.size() * 1.1) {
next_onion = next_onion_secondTry;
}
if (div > 3 || div < 1.2) break;
}
} else {
// If "detect thin walls" is not enabled, this paths will be entered, which
// leads to overflows, as in prusa3d/Slic3r GH #32
@ -471,6 +489,7 @@ 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));
if (! expolygon.holes.empty()) {
holes[i].reserve(holes[i].size() + expolygon.holes.size());
@ -593,7 +612,7 @@ void PerimeterGenerator::process()
double min = 0.2 * perimeter_width * (1 - INSET_OVERLAP_TOLERANCE);
//be sure we don't gapfill where the perimeters are already touching each other (negative spacing).
min = std::max(min, double(Flow::new_from_spacing(EPSILON, nozzle_diameter, this->layer_height, false).scaled_width()));
double max = 2. * perimeter_spacing;
double max = 3. * perimeter_spacing;
ExPolygons gaps_ex = diff_ex(
offset2_ex(gaps, double(-min / 2), double(+min / 2)),
offset2_ex(gaps, double(-max / 2), double(+max / 2)),