diff --git a/xs/src/libslic3r/Fill/FillRectilinear.cpp b/xs/src/libslic3r/Fill/FillRectilinear.cpp index bfee321ed..f2e5ba7a3 100644 --- a/xs/src/libslic3r/Fill/FillRectilinear.cpp +++ b/xs/src/libslic3r/Fill/FillRectilinear.cpp @@ -340,7 +340,12 @@ FillRectilinear::_fill_single_direction(ExPolygon expolygon, // Get the first lower point. vertical_t::iterator it = v.begin(); // minimum x,y IntersectionPoint p = it->second; - assert(p.type == IntersectionPoint::ipTypeLower); + if (p.type != IntersectionPoint::ipTypeLower) { + // Degenerate polygon, this shouldn't happen. + // We used to have an assert here, but let's be tolerant. + grid.erase(p.x); + continue; + } // Start our polyline. Polyline polyline; @@ -351,17 +356,32 @@ FillRectilinear::_fill_single_direction(ExPolygon expolygon, // Complete the vertical line by finding the corresponding upper or lower point. if (p.type == IntersectionPoint::ipTypeUpper) { // find first point along c.x with y < c.y - assert(it != grid[p.x].begin()); + if (it == grid[p.x].begin()) { + // Degenerate polygon, this shouldn't happen. + // We used to have an assert here, but let's be tolerant. + grid.erase(p.x); + break; + } --it; } else { // find first point along c.x with y > c.y ++it; - assert(it != grid[p.x].end()); + if (it == grid[p.x].end()) { + // Degenerate polygon, this shouldn't happen. + // We used to have an assert here, but let's be tolerant. + grid.erase(p.x); + break; + } } // Append the point to our polyline. IntersectionPoint b = it->second; - assert(b.type != p.type); + if (b.type == p.type) { + // Degenerate polygon, this shouldn't happen. + // We used to have an assert here, but let's be tolerant. + grid.erase(p.x); + break; + } polyline.append(b); polyline.points.back().y += this->endpoints_overlap * (b.type == IntersectionPoint::ipTypeUpper ? 1 : -1); @@ -409,8 +429,12 @@ FillRectilinear::_fill_single_direction(ExPolygon expolygon, // If the connection brought us to another x coordinate, we expect the point // type to be the same. - assert((p.type == b.type && p.x > b.x) - || (p.type != b.type && p.x == b.x)); + if (!(p.type == b.type && p.x > b.x) && !(p.type != b.type && p.x == b.x)) { + // Degenerate polygon, this shouldn't happen. + // We used to have an assert here, but let's be tolerant. + grid.erase(p.x); + break; + } } // Yay, we have a polyline!