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

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsupermerill <merill@fr.fr>2018-09-10 14:42:27 +0300
committersupermerill <merill@fr.fr>2018-09-10 14:42:27 +0300
commite482c84e981b97de4b66743f4e0b4f80ebcff3ac (patch)
tree5ded11c21095dce8e1917b071a01321d0dcd28c1
parent7d1b6bd6808656f30702d1fee63dfbcdb8005ca0 (diff)
bugfix: dense_infill too small region make export gcode crash1.41.1
-rw-r--r--xs/src/libslic3r/Fill/FillRectilinear2.cpp81
1 files changed, 47 insertions, 34 deletions
diff --git a/xs/src/libslic3r/Fill/FillRectilinear2.cpp b/xs/src/libslic3r/Fill/FillRectilinear2.cpp
index 3d4186aac..3c0f0a7cc 100644
--- a/xs/src/libslic3r/Fill/FillRectilinear2.cpp
+++ b/xs/src/libslic3r/Fill/FillRectilinear2.cpp
@@ -1481,10 +1481,10 @@ void FillRectilinear2Peri::fill_surface_extrusion(const Surface *surface, const
//you don't want to sort the extrusions: big infill first, small second
eecroot->no_sort = true;
+ // === extrude perimeter ===
Polylines polylines_1;
//generate perimeter:
- //TODO: better optimize start/end point?
- ExPolygons path_perimeter = offset_ex(surface->expolygon, scale_(-this->spacing/2));
+ ExPolygons path_perimeter = offset2_ex(surface->expolygon, scale_(-this->spacing), scale_(this->spacing / 2));
for (ExPolygon &expolygon : path_perimeter) {
expolygon.contour.make_counter_clockwise();
polylines_1.push_back(expolygon.contour.split_at_index(0));
@@ -1494,48 +1494,61 @@ void FillRectilinear2Peri::fill_surface_extrusion(const Surface *surface, const
}
}
- // Save into layer.
- auto *eec = new ExtrusionEntityCollection();
- /// pass the no_sort attribute to the extrusion path
- eec->no_sort = this->no_sort();
- /// add it into the collection
- eecroot->entities.push_back(eec);
- /// push the path
- extrusion_entities_append_paths(
- eec->entities, STDMOVE(polylines_1),
- flow.bridge ?
- erBridgeInfill :
- (surface->is_solid() ?
- ((surface->is_top()) ? erTopSolidInfill : erSolidInfill) :
- erInternalInfill),
- flow.mm3_per_mm() * params.flow_mult, flow.width * params.flow_mult, flow.height);
+ if (!polylines_1.empty()) {
+ // Save into layer.
+ ExtrusionEntityCollection *eec = new ExtrusionEntityCollection();
+ /// pass the no_sort attribute to the extrusion path
+ eec->no_sort = this->no_sort();
+ /// add it into the collection
+ eecroot->entities.push_back(eec);
+ /// push the path
+ extrusion_entities_append_paths(
+ eec->entities, (polylines_1),
+ flow.bridge ?
+ erBridgeInfill :
+ (surface->is_solid() ?
+ ((surface->is_top()) ? erTopSolidInfill : erSolidInfill) :
+ erInternalInfill),
+ flow.mm3_per_mm() * params.flow_mult, flow.width * params.flow_mult, flow.height);
+ }
+ // === extrude dense infill ===
Polylines polylines_2;
+ bool canFill = true;
//50% overlap with the new perimeter
ExPolygons path_inner = offset2_ex(surface->expolygon, scale_(-this->spacing * 1.5), scale_(this->spacing));
for (ExPolygon &expolygon : path_inner) {
Surface surfInner(*surface, expolygon);
if (!fill_surface_by_lines(&surfInner, params, 0.f, 0.f, polylines_2)) {
printf("FillRectilinear2::fill_surface() failed to fill a region.\n");
+ canFill = false;
}
}
- // Save into layer.
- eec = new ExtrusionEntityCollection();
- /// pass the no_sort attribute to the extrusion path
- eec->no_sort = this->no_sort();
- /// add it into the collection
- eecroot->entities.push_back(eec);
- /// push the path
- extrusion_entities_append_paths(
- eec->entities, STDMOVE(polylines_2),
- flow.bridge ?
- erBridgeInfill :
- (surface->is_solid() ?
- ((surface->is_top()) ? erTopSolidInfill : erSolidInfill) :
- erInternalInfill),
- flow.mm3_per_mm() * params.flow_mult, flow.width * params.flow_mult, flow.height);
-
- out.entities.push_back(eecroot);
+ if (canFill && !polylines_2.empty()) {
+ // Save into layer.
+ ExtrusionEntityCollection *eec = new ExtrusionEntityCollection();
+ /// pass the no_sort attribute to the extrusion path
+ eec->no_sort = this->no_sort();
+ /// add it into the collection
+ eecroot->entities.push_back(eec);
+ /// push the path
+ extrusion_entities_append_paths(
+ eec->entities, (polylines_2),
+ flow.bridge ?
+ erBridgeInfill :
+ (surface->is_solid() ?
+ ((surface->is_top()) ? erTopSolidInfill : erSolidInfill) :
+ erInternalInfill),
+ flow.mm3_per_mm() * params.flow_mult, flow.width * params.flow_mult, flow.height);
+ }
+
+ // === end ===
+ if (!eecroot->empty()) {
+ out.entities.push_back(eecroot);
+ } else {
+ delete eecroot;
+ }
+
}
} // namespace Slic3r