From e482c84e981b97de4b66743f4e0b4f80ebcff3ac Mon Sep 17 00:00:00 2001 From: supermerill Date: Mon, 10 Sep 2018 13:42:27 +0200 Subject: [PATCH] bugfix: dense_infill too small region make export gcode crash --- xs/src/libslic3r/Fill/FillRectilinear2.cpp | 81 +++++++++++++--------- 1 file changed, 47 insertions(+), 34 deletions(-) diff --git a/xs/src/libslic3r/Fill/FillRectilinear2.cpp b/xs/src/libslic3r/Fill/FillRectilinear2.cpp index 3d4186aac6e..3c0f0a7cced 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