diff --git a/src/libslic3r/Arrange.cpp b/src/libslic3r/Arrange.cpp index bb13a9a0a2..3800d49e31 100644 --- a/src/libslic3r/Arrange.cpp +++ b/src/libslic3r/Arrange.cpp @@ -572,10 +572,13 @@ static void process_arrangeable(const ArrangePolygon &arrpoly, clppr::Polygon clpath(Slic3rMultiPoint_to_ClipperPath(p)); - if (!clpath.Contour.empty()) { - auto firstp = clpath.Contour.front(); - clpath.Contour.emplace_back(firstp); - } + // This fixes: + // https://github.com/prusa3d/PrusaSlicer/issues/2209 + if (clpath.Contour.size() < 3) + return; + + auto firstp = clpath.Contour.front(); + clpath.Contour.emplace_back(firstp); outp.emplace_back(std::move(clpath)); outp.back().rotation(rotation); diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index b06b1f3471..5887931df0 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -1273,6 +1273,10 @@ void ModelObject::split(ModelObjectPtrs* new_objects) ModelVolume* volume = this->volumes.front(); TriangleMeshPtrs meshptrs = volume->mesh().split(); for (TriangleMesh *mesh : meshptrs) { + + // FIXME: crashes if not satisfied + if (mesh->facets_count() < 3) continue; + mesh->repair(); // XXX: this seems to be the only real usage of m_model, maybe refactor this so that it's not needed? @@ -1858,8 +1862,6 @@ arrangement::ArrangePolygon ModelInstance::get_arrange_polygon() const assert(!p.points.empty()); - // this may happen for malformed models, see: - // https://github.com/prusa3d/PrusaSlicer/issues/2209 // if (!p.points.empty()) { // Polygons pp{p}; // pp = p.simplify(scaled(SIMPLIFY_TOLERANCE_MM));