diff --git a/src/libslic3r/ClipperUtils.cpp b/src/libslic3r/ClipperUtils.cpp index 6db624590d..a1dd638cae 100644 --- a/src/libslic3r/ClipperUtils.cpp +++ b/src/libslic3r/ClipperUtils.cpp @@ -647,7 +647,9 @@ Lines _clipper_ln(ClipperLib::ClipType clipType, const Lines &subject, const Pol // convert Polylines to Lines Lines retval; for (Polylines::const_iterator polyline = polylines.begin(); polyline != polylines.end(); ++polyline) - retval.emplace_back(polyline->line()); + if (polyline->size() >= 2) + //FIXME It may happen, that Clipper produced a polyline with more than 2 collinear points by clipping a single line with polygons. It is a very rare issue, but it happens, see GH #6933. + retval.push_back({ polyline->front(), polyline->back() }); return retval; } diff --git a/src/libslic3r/Fill/FillAdaptive.cpp b/src/libslic3r/Fill/FillAdaptive.cpp index 91610cf511..29b343db01 100644 --- a/src/libslic3r/Fill/FillAdaptive.cpp +++ b/src/libslic3r/Fill/FillAdaptive.cpp @@ -928,7 +928,9 @@ static Polylines connect_lines_using_hooks(Polylines &&lines, const ExPolygon &b Linef l { { bg::get<0, 0>(seg), bg::get<0, 1>(seg) }, { bg::get<1, 0>(seg), bg::get<1, 1>(seg) } }; assert(line_alg::distance_to_squared(l, Vec2d(pt.cast())) > 1000 * 1000); #endif // NDEBUG - } else if (pl.line().distance_to_squared(pt) <= 1000 * 1000) + } else if (pl.size() >= 2 && + //FIXME Hoping that pl is really a line, trimmed by a polygon using ClipperUtils. Sometimes Clipper leaves some additional collinear points on the polyline, let's hope it is all right. + Line{ pl.front(), pl.back() }.distance_to_squared(pt) <= 1000 * 1000) out = closest.front().second; } return out; diff --git a/src/libslic3r/MultiPoint.hpp b/src/libslic3r/MultiPoint.hpp index 46b47832a7..935348279c 100644 --- a/src/libslic3r/MultiPoint.hpp +++ b/src/libslic3r/MultiPoint.hpp @@ -33,7 +33,9 @@ public: void rotate(double angle, const Point ¢er); void reverse() { std::reverse(this->points.begin(), this->points.end()); } - const Point& first_point() const { return this->points.front(); } + const Point& front() const { return this->points.front(); } + const Point& back() const { return this->points.back(); } + const Point& first_point() const { return this->front(); } virtual const Point& last_point() const = 0; virtual Lines lines() const = 0; size_t size() const { return points.size(); } diff --git a/src/libslic3r/Polyline.cpp b/src/libslic3r/Polyline.cpp index e451e04c9d..1255d5473d 100644 --- a/src/libslic3r/Polyline.cpp +++ b/src/libslic3r/Polyline.cpp @@ -10,13 +10,6 @@ namespace Slic3r { -Line Polyline::line() const -{ - if (this->points.size() > 2) - throw Slic3r::InvalidArgument("Can't convert polyline with more than two points to a line"); - return Line(this->points.front(), this->points.back()); -} - const Point& Polyline::leftmost_point() const { const Point *p = &this->points.front(); diff --git a/src/libslic3r/Polyline.hpp b/src/libslic3r/Polyline.hpp index cc090b0843..31e0b88d32 100644 --- a/src/libslic3r/Polyline.hpp +++ b/src/libslic3r/Polyline.hpp @@ -62,7 +62,6 @@ public: const Point& last_point() const override { return this->points.back(); } const Point& leftmost_point() const; - Line line() const; Lines lines() const override; void clip_end(double distance);