From 91b1d469eb01a918d7ea824065d60787ad3db1e5 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 3 Dec 2020 14:16:13 +0100 Subject: [PATCH 1/2] Fix arrange with malformed contours --- src/libslic3r/Arrange.cpp | 11 +++++++---- src/libslic3r/Model.cpp | 2 -- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/Arrange.cpp b/src/libslic3r/Arrange.cpp index bb13a9a0a..3800d49e3 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 b06b1f347..c0258e719 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -1858,8 +1858,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)); From 310de2f2ef8bcbe46643b4edb65018856d122c79 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 3 Dec 2020 14:58:56 +0100 Subject: [PATCH 2/2] Fix crash when splitting objects fixes partially #2209 --- src/libslic3r/Model.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index c0258e719..5887931df 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?