diff --git a/xs/src/libslic3r/Fill/Fill.cpp b/xs/src/libslic3r/Fill/Fill.cpp index 40e87cbe4..0158221af 100644 --- a/xs/src/libslic3r/Fill/Fill.cpp +++ b/xs/src/libslic3r/Fill/Fill.cpp @@ -296,7 +296,7 @@ void make_fill(LayerRegion &layerm, ExtrusionEntityCollection &out) //params.flow_mult = layerm.region()->config.over_bridge_flow_ratio; } - f->fill_surface_extrusion(&surface, params, flow, out); + f->fill_surface_extrusion(&surface, params, flow, erNone, out.entities); } // add thin fill regions diff --git a/xs/src/libslic3r/Fill/FillBase.cpp b/xs/src/libslic3r/Fill/FillBase.cpp index f8647a0b0..e1eae0244 100644 --- a/xs/src/libslic3r/Fill/FillBase.cpp +++ b/xs/src/libslic3r/Fill/FillBase.cpp @@ -136,7 +136,7 @@ std::pair Fill::_infill_direction(const Surface *surface) const return std::pair(out_angle, out_shift); } -void Fill::fill_surface_extrusion(const Surface *surface, const FillParams ¶ms, const Flow &flow, ExtrusionEntityCollection &out) { +void Fill::fill_surface_extrusion(const Surface *surface, const FillParams ¶ms, const Flow &flow, const ExtrusionRole &role, ExtrusionEntitiesPtr &out) { //add overlap & call fill_surface Polylines polylines = this->fill_surface(surface, params); if (polylines.empty()) @@ -184,16 +184,22 @@ void Fill::fill_surface_extrusion(const Surface *surface, const FillParams ¶ /// pass the no_sort attribute to the extrusion path eec->no_sort = this->no_sort(); /// add it into the collection - out.entities.push_back(eec); + out.push_back(eec); + //get the role + ExtrusionRole good_role = role; + if (good_role == erNone || good_role == erCustom) { + good_role = (flow.bridge ? erBridgeInfill : + (surface->is_solid() ? + ((surface->is_top()) ? erTopSolidInfill : erSolidInfill) : + erInternalInfill)); + } /// push the path extrusion_entities_append_paths( eec->entities, STDMOVE(polylines), - flow.bridge ? - erBridgeInfill : - (surface->is_solid() ? - ((surface->is_top()) ? erTopSolidInfill : erSolidInfill) : - erInternalInfill), - flow.mm3_per_mm() * params.flow_mult * multFlow, flow.width * params.flow_mult * multFlow, flow.height); + good_role, + flow.mm3_per_mm() * params.flow_mult * multFlow, + flow.width * params.flow_mult * multFlow, + flow.height); } diff --git a/xs/src/libslic3r/Fill/FillBase.hpp b/xs/src/libslic3r/Fill/FillBase.hpp index e569a4773..79a43a821 100644 --- a/xs/src/libslic3r/Fill/FillBase.hpp +++ b/xs/src/libslic3r/Fill/FillBase.hpp @@ -86,7 +86,9 @@ public: virtual bool no_sort() const { return false; } // This method have to fill the ExtrusionEntityCollection. It call fill_surface by default - virtual void fill_surface_extrusion(const Surface *surface, const FillParams ¶ms, const Flow &flow, ExtrusionEntityCollection &out ); + // if role == erNone or ERCustom, this method have to choose the best role itself, else it must use the argument's role. + virtual void fill_surface_extrusion(const Surface *surface, const FillParams ¶ms, + const Flow &flow, const ExtrusionRole &role, ExtrusionEntitiesPtr &out); // Perform the fill. virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); diff --git a/xs/src/libslic3r/Fill/FillRectilinear2.cpp b/xs/src/libslic3r/Fill/FillRectilinear2.cpp index 3d4186aac..5d56885c0 100644 --- a/xs/src/libslic3r/Fill/FillRectilinear2.cpp +++ b/xs/src/libslic3r/Fill/FillRectilinear2.cpp @@ -1476,7 +1476,10 @@ Polylines FillCubic::fill_surface(const Surface *surface, const FillParams ¶ //Polylines FillRectilinear2Peri::fill_surface(const Surface *surface, const FillParams ¶ms) { -void FillRectilinear2Peri::fill_surface_extrusion(const Surface *surface, const FillParams ¶ms, const Flow &flow, ExtrusionEntityCollection &out) { +void +FillRectilinear2Peri::fill_surface_extrusion(const Surface *surface, const FillParams ¶ms, + const Flow &flow, const ExtrusionRole &role, ExtrusionEntitiesPtr &out) +{ ExtrusionEntityCollection *eecroot = new ExtrusionEntityCollection(); //you don't want to sort the extrusions: big infill first, small second eecroot->no_sort = true; @@ -1500,15 +1503,22 @@ void FillRectilinear2Peri::fill_surface_extrusion(const Surface *surface, const eec->no_sort = this->no_sort(); /// add it into the collection eecroot->entities.push_back(eec); + //get the role + ExtrusionRole good_role = role; + if (good_role == erNone || good_role == erCustom) { + good_role = flow.bridge ? + erBridgeInfill : + (surface->is_solid() ? + ((surface->is_top()) ? erTopSolidInfill : erSolidInfill) : + erInternalInfill); + } /// push the path extrusion_entities_append_paths( eec->entities, STDMOVE(polylines_1), - flow.bridge ? - erBridgeInfill : - (surface->is_solid() ? - ((surface->is_top()) ? erTopSolidInfill : erSolidInfill) : - erInternalInfill), - flow.mm3_per_mm() * params.flow_mult, flow.width * params.flow_mult, flow.height); + good_role, + flow.mm3_per_mm() * params.flow_mult, + flow.width * params.flow_mult, + flow.height); Polylines polylines_2; //50% overlap with the new perimeter @@ -1528,14 +1538,12 @@ void FillRectilinear2Peri::fill_surface_extrusion(const Surface *surface, const /// push the path extrusion_entities_append_paths( eec->entities, STDMOVE(polylines_2), - flow.bridge ? - erBridgeInfill : - (surface->is_solid() ? - ((surface->is_top()) ? erTopSolidInfill : erSolidInfill) : - erInternalInfill), - flow.mm3_per_mm() * params.flow_mult, flow.width * params.flow_mult, flow.height); + good_role, + flow.mm3_per_mm() * params.flow_mult, + flow.width * params.flow_mult, + flow.height); - out.entities.push_back(eecroot); + out.push_back(eecroot); } } // namespace Slic3r diff --git a/xs/src/libslic3r/Fill/FillRectilinear2.hpp b/xs/src/libslic3r/Fill/FillRectilinear2.hpp index 53621d139..3457fad95 100644 --- a/xs/src/libslic3r/Fill/FillRectilinear2.hpp +++ b/xs/src/libslic3r/Fill/FillRectilinear2.hpp @@ -76,7 +76,8 @@ public: virtual Fill* clone() const { return new FillRectilinear2Peri(*this); }; virtual ~FillRectilinear2Peri() {} //virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); - virtual void fill_surface_extrusion(const Surface *surface, const FillParams ¶ms, const Flow &flow, ExtrusionEntityCollection &out); + virtual void fill_surface_extrusion(const Surface *surface, const FillParams ¶ms, + const Flow &flow, const ExtrusionRole &role, ExtrusionEntitiesPtr &out); }; diff --git a/xs/src/libslic3r/Fill/FillSmooth.cpp b/xs/src/libslic3r/Fill/FillSmooth.cpp index 59e63c792..7168c5882 100644 --- a/xs/src/libslic3r/Fill/FillSmooth.cpp +++ b/xs/src/libslic3r/Fill/FillSmooth.cpp @@ -19,7 +19,8 @@ namespace Slic3r { } - void FillSmooth::fill_surface_extrusion(const Surface *surface, const FillParams ¶ms, const Flow &flow, ExtrusionEntityCollection &out) + void FillSmooth::fill_surface_extrusion(const Surface *surface, const FillParams ¶ms, + const Flow &flow, const ExtrusionRole &role, ExtrusionEntitiesPtr &out) { coordf_t init_spacing = this->spacing; @@ -142,9 +143,14 @@ namespace Slic3r { eec = new ExtrusionEntityCollection(); eecroot->entities.push_back(eec); eec->no_sort = false; //can be sorted inside the pass + //get the role + ExtrusionRole good_role = role; + if (good_role == erNone || good_role == erCustom) { + good_role = flow.bridge ? erBridgeInfill : rolePass[0]; + } extrusion_entities_append_paths( eec->entities, STDMOVE(polylines_layer1), - flow.bridge ? erBridgeInfill : rolePass[0], + good_role, //reduced flow height for a better view (it's only a gui thing) params.flow_mult * flow.mm3_per_mm() * percentFlow[0] * (params.fill_exactly ? poylineVolume / extrudedVolume : 1), (float)(flow.width*percentFlow[0] * (params.fill_exactly ? poylineVolume / extrudedVolume : 1)), (float)flow.height*0.8); @@ -192,11 +198,15 @@ namespace Slic3r { eec = new ExtrusionEntityCollection(); eecroot->entities.push_back(eec); eec->no_sort = false; + //get the role + ExtrusionRole good_role = role; + if (good_role == erNone || good_role == erCustom) { + good_role = rolePass[1]; + } // print thin - extrusion_entities_append_paths( eec->entities, STDMOVE(polylines_layer2), - rolePass[1], + good_role, params.flow_mult * flow.mm3_per_mm() * percentFlow[1] * (params.fill_exactly ? volumeToOccupy / extrudedVolume : 1), //min-reduced flow width for a better view (it's only a gui thing) (float)(flow.width*(percentFlow[1] < 0.1 ? 0.1 : percentFlow[1])), (float)flow.height); @@ -244,10 +254,15 @@ namespace Slic3r { eec = new ExtrusionEntityCollection(); eecroot->entities.push_back(eec); eec->no_sort = false; + //get the role + ExtrusionRole good_role = role; + if (good_role == erNone || good_role == erCustom) { + good_role = rolePass[2]; + } // print thin extrusion_entities_append_paths( eec->entities, STDMOVE(polylines_layer3), - rolePass[2], //slow (if last) + good_role, //slow (if last) //reduced flow width for a better view (it's only a gui thing) params.flow_mult * flow.mm3_per_mm() * percentFlow[2] * (params.fill_exactly ? volumeToOccupy / extrudedVolume : 1), (float)(flow.width*(percentFlow[2] < 0.1 ? 0.1 : percentFlow[2])), (float)flow.height); @@ -255,7 +270,7 @@ namespace Slic3r { } if (!eecroot->entities.empty()) - out.entities.push_back(eecroot); + out.push_back(eecroot); } diff --git a/xs/src/libslic3r/Fill/FillSmooth.hpp b/xs/src/libslic3r/Fill/FillSmooth.hpp index 3e9300a8f..eb558f088 100644 --- a/xs/src/libslic3r/Fill/FillSmooth.hpp +++ b/xs/src/libslic3r/Fill/FillSmooth.hpp @@ -35,7 +35,8 @@ public: virtual Fill* clone() const { return new FillSmooth(*this); } virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); - virtual void fill_surface_extrusion(const Surface *surface, const FillParams ¶ms, const Flow &flow, ExtrusionEntityCollection &out ); + virtual void fill_surface_extrusion(const Surface *surface, const FillParams ¶ms, + const Flow &flow, const ExtrusionRole &role, ExtrusionEntitiesPtr &out); protected: int nbPass=2;