diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 8cf4a2baf..56b018edf 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -33,8 +33,9 @@ Fill* Fill::new_from_type(const InfillPattern type) case ip3DHoneycomb: return new Fill3DHoneycomb(); case ipGyroid: return new FillGyroid(); case ipRectilinear: return new FillRectilinear(); - case ipMonotonic: return new FillMonotonic(); case ipRectilinearWGapFill: return new FillRectilinearWGapFill(); + case ipMonotonic: return new FillMonotonic(); + case ipMonotonicWGapFill: return new FillMonotonicWGapFill(); case ipScatteredRectilinear:return new FillScatteredRectilinear(); case ipLine: return new FillLine(); case ipGrid: return new FillGrid(); diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp index ba21061ee..77b093b31 100644 --- a/src/libslic3r/Fill/FillRectilinear.cpp +++ b/src/libslic3r/Fill/FillRectilinear.cpp @@ -3328,7 +3328,7 @@ FillRectilinearWGapFill::fill_surface_extrusion(const Surface *surface, const Fi Polylines polylines_rectilinear; Surface rectilinear_surface{ *surface }; FillParams params_monotonic = params; - params_monotonic.monotonic = true; + params_monotonic.monotonic = is_monotonic(); for (const ExPolygon &rectilinear_area : rectilinear_areas) { rectilinear_surface.expolygon = rectilinear_area, 0 - 0.5 * params.flow.scaled_spacing(); if (!fill_surface_by_lines(&rectilinear_surface, params_monotonic, 0.f, 0.f, polylines_rectilinear)) { @@ -3368,7 +3368,7 @@ FillRectilinearWGapFill::fill_surface_extrusion(const Surface *surface, const Fi ExtrusionEntityCollection *eec = new ExtrusionEntityCollection(); /// pass the no_sort attribute to the extrusion path //don't force monotonic if not top or bottom - if (surface->surface_type & (stPosTop | stPosBottom) != 0) + if (is_monotonic()) eec->no_sort = true; else eec->no_sort = this->no_sort(); diff --git a/src/libslic3r/Fill/FillRectilinear.hpp b/src/libslic3r/Fill/FillRectilinear.hpp index 7dcaefc27..0f372dbfd 100644 --- a/src/libslic3r/Fill/FillRectilinear.hpp +++ b/src/libslic3r/Fill/FillRectilinear.hpp @@ -126,11 +126,22 @@ public: class FillRectilinearWGapFill : public FillRectilinear { public: - Fill* clone() const override { return new FillRectilinearWGapFill(*this); }; ~FillRectilinearWGapFill() override = default; void fill_surface_extrusion(const Surface* surface, const FillParams& params, ExtrusionEntitiesPtr& out) const override; static void split_polygon_gap_fill(const Surface& surface, const FillParams& params, ExPolygons& rectilinear, ExPolygons& gapfill); +protected: + virtual bool is_monotonic() const { return false; } +}; + +class FillMonotonicWGapFill : public FillRectilinearWGapFill +{ +public: + + Fill* clone() const override { return new FillMonotonicWGapFill(*this); }; + ~FillMonotonicWGapFill() override = default; +protected: + virtual bool is_monotonic() const override { return true; } }; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index c8957dead..df7d39ff0 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -697,7 +697,7 @@ void PrintConfigDef::init_fff_params() def->cli = "top-fill-pattern|external-fill-pattern=s"; def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("rectilinear"); - def->enum_values.push_back("rectilineargapfill"); + def->enum_values.push_back("monotonicgapfillgapfill"); def->enum_values.push_back("monotonic"); def->enum_values.push_back("concentric"); def->enum_values.push_back("concentricgapfill"); @@ -728,7 +728,7 @@ void PrintConfigDef::init_fff_params() def->cli = "bottom-fill-pattern|external-fill-pattern=s"; def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("rectilinear"); - def->enum_values.push_back("rectilineargapfill"); + def->enum_values.push_back("monotonicgapfill"); def->enum_values.push_back("monotonic"); def->enum_values.push_back("concentric"); def->enum_values.push_back("concentricgapfill"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index e07915ae5..44f0f5536 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -83,8 +83,11 @@ enum InfillPattern : uint8_t{ ipGyroid, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipAdaptiveCubic, ipSupportCubic, ipSmooth, ipSmoothHilbert, ipSmoothTriple, - ipRectiWithPerimeter, ipConcentricGapFill, ipScatteredRectilinear, ipSawtooth, ipRectilinearWGapFill, + ipRectiWithPerimeter, ipConcentricGapFill, ipScatteredRectilinear, + ipSawtooth, + ipRectilinearWGapFill, ipMonotonic, + ipMonotonicWGapFill, ipCount }; @@ -229,7 +232,7 @@ template<> inline const t_config_enum_values& ConfigOptionEnum::g static t_config_enum_values keys_map; if (keys_map.empty()) { keys_map["rectilinear"] = ipRectilinear; - keys_map["monotonic"] = ipMonotonic; + keys_map["monotonic"] = ipMonotonic; keys_map["grid"] = ipGrid; keys_map["triangles"] = ipTriangles; keys_map["stars"] = ipStars; @@ -249,6 +252,7 @@ template<> inline const t_config_enum_values& ConfigOptionEnum::g keys_map["rectiwithperimeter"] = ipRectiWithPerimeter; keys_map["scatteredrectilinear"]= ipScatteredRectilinear; keys_map["rectilineargapfill"] = ipRectilinearWGapFill; + keys_map["monotonicgapfill"] = ipMonotonicWGapFill; keys_map["sawtooth"] = ipSawtooth; keys_map["adaptivecubic"] = ipAdaptiveCubic; keys_map["supportcubic"] = ipSupportCubic;