From 182d68ad85055e5019187fd3d890f432e543cc84 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Wed, 11 Jan 2017 18:55:48 +0100 Subject: [PATCH] Automatically switch to rectilinear when a pattern is used that doesn't support solid infill --- xs/src/libslic3r/Fill/Fill.hpp | 3 +++ xs/src/libslic3r/Fill/FillConcentric.hpp | 1 + xs/src/libslic3r/Fill/FillRectilinear.hpp | 6 ++++++ xs/src/libslic3r/LayerRegionFill.cpp | 9 +++++++++ 4 files changed, 19 insertions(+) diff --git a/xs/src/libslic3r/Fill/Fill.hpp b/xs/src/libslic3r/Fill/Fill.hpp index 151d61436..abb9e1c65 100644 --- a/xs/src/libslic3r/Fill/Fill.hpp +++ b/xs/src/libslic3r/Fill/Fill.hpp @@ -75,6 +75,9 @@ public: // Do not sort the fill lines to optimize the print head path? virtual bool no_sort() const { return false; }; + // Can this pattern be used for solid infill? + virtual bool can_solid() const { return false; }; + // Perform the fill. virtual Polylines fill_surface(const Surface &surface); diff --git a/xs/src/libslic3r/Fill/FillConcentric.hpp b/xs/src/libslic3r/Fill/FillConcentric.hpp index f19a5d2b1..bc973b757 100644 --- a/xs/src/libslic3r/Fill/FillConcentric.hpp +++ b/xs/src/libslic3r/Fill/FillConcentric.hpp @@ -19,6 +19,7 @@ protected: Polylines* polylines_out); virtual bool no_sort() const { return true; } + virtual bool can_solid() const { return true; }; }; } // namespace Slic3r diff --git a/xs/src/libslic3r/Fill/FillRectilinear.hpp b/xs/src/libslic3r/Fill/FillRectilinear.hpp index 6d493fbc7..d5d5b8ecf 100644 --- a/xs/src/libslic3r/Fill/FillRectilinear.hpp +++ b/xs/src/libslic3r/Fill/FillRectilinear.hpp @@ -12,6 +12,7 @@ class FillRectilinear : public Fill public: virtual Fill* clone() const { return new FillRectilinear(*this); }; virtual ~FillRectilinear() {} + virtual bool can_solid() const { return true; }; protected: virtual void _fill_surface_single( @@ -50,6 +51,7 @@ class FillAlignedRectilinear : public FillRectilinear public: virtual Fill* clone() const { return new FillAlignedRectilinear(*this); }; virtual ~FillAlignedRectilinear() {}; + virtual bool can_solid() const { return false; }; protected: // Keep the angle constant in all layers. @@ -61,6 +63,7 @@ class FillGrid : public FillRectilinear public: virtual Fill* clone() const { return new FillGrid(*this); }; virtual ~FillGrid() {} + virtual bool can_solid() const { return false; }; protected: // The grid fill will keep the angle constant between the layers,; see the implementation of Slic3r::Fill. @@ -78,6 +81,7 @@ class FillTriangles : public FillRectilinear public: virtual Fill* clone() const { return new FillTriangles(*this); }; virtual ~FillTriangles() {} + virtual bool can_solid() const { return false; }; protected: // The grid fill will keep the angle constant between the layers,; see the implementation of Slic3r::Fill. @@ -95,6 +99,7 @@ class FillStars : public FillRectilinear public: virtual Fill* clone() const { return new FillStars(*this); }; virtual ~FillStars() {} + virtual bool can_solid() const { return false; }; protected: // The grid fill will keep the angle constant between the layers,; see the implementation of Slic3r::Fill. @@ -112,6 +117,7 @@ class FillCubic : public FillRectilinear public: virtual Fill* clone() const { return new FillCubic(*this); }; virtual ~FillCubic() {} + virtual bool can_solid() const { return false; }; protected: // The grid fill will keep the angle constant between the layers,; see the implementation of Slic3r::Fill. diff --git a/xs/src/libslic3r/LayerRegionFill.cpp b/xs/src/libslic3r/LayerRegionFill.cpp index 6beb82e36..1899b7fcc 100644 --- a/xs/src/libslic3r/LayerRegionFill.cpp +++ b/xs/src/libslic3r/LayerRegionFill.cpp @@ -183,6 +183,15 @@ LayerRegion::make_fill() #else std::auto_ptr f = std::auto_ptr(Fill::new_from_type(fill_pattern)); #endif + + // switch to rectilinear if this pattern doesn't support solid infill + if (density > 0.9999f && !f->can_solid()) + #if SLIC3R_CPPVER >= 11 + f = std::unique_ptr(Fill::new_from_type(ipRectilinear)); + #else + f = std::auto_ptr(Fill::new_from_type(ipRectilinear)); + #endif + f->bounding_box = this->layer()->object()->bounding_box(); // calculate the actual flow we'll be using for this infill