Update on infill api.

This commit is contained in:
supermerill 2018-09-26 12:37:33 +02:00
parent 619370950c
commit 0af53949eb
7 changed files with 65 additions and 32 deletions

View File

@ -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

View File

@ -136,7 +136,7 @@ std::pair<float, Point> Fill::_infill_direction(const Surface *surface) const
return std::pair<float, Point>(out_angle, out_shift);
}
void Fill::fill_surface_extrusion(const Surface *surface, const FillParams &params, const Flow &flow, ExtrusionEntityCollection &out) {
void Fill::fill_surface_extrusion(const Surface *surface, const FillParams &params, 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 &para
/// 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);
}

View File

@ -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 &params, 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 &params,
const Flow &flow, const ExtrusionRole &role, ExtrusionEntitiesPtr &out);
// Perform the fill.
virtual Polylines fill_surface(const Surface *surface, const FillParams &params);

View File

@ -1476,7 +1476,10 @@ Polylines FillCubic::fill_surface(const Surface *surface, const FillParams &para
//Polylines FillRectilinear2Peri::fill_surface(const Surface *surface, const FillParams &params) {
void FillRectilinear2Peri::fill_surface_extrusion(const Surface *surface, const FillParams &params, const Flow &flow, ExtrusionEntityCollection &out) {
void
FillRectilinear2Peri::fill_surface_extrusion(const Surface *surface, const FillParams &params,
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

View File

@ -76,7 +76,8 @@ public:
virtual Fill* clone() const { return new FillRectilinear2Peri(*this); };
virtual ~FillRectilinear2Peri() {}
//virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
virtual void fill_surface_extrusion(const Surface *surface, const FillParams &params, const Flow &flow, ExtrusionEntityCollection &out);
virtual void fill_surface_extrusion(const Surface *surface, const FillParams &params,
const Flow &flow, const ExtrusionRole &role, ExtrusionEntitiesPtr &out);
};

View File

@ -19,7 +19,8 @@ namespace Slic3r {
}
void FillSmooth::fill_surface_extrusion(const Surface *surface, const FillParams &params, const Flow &flow, ExtrusionEntityCollection &out)
void FillSmooth::fill_surface_extrusion(const Surface *surface, const FillParams &params,
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);
}

View File

@ -35,7 +35,8 @@ public:
virtual Fill* clone() const { return new FillSmooth(*this); }
virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
virtual void fill_surface_extrusion(const Surface *surface, const FillParams &params, const Flow &flow, ExtrusionEntityCollection &out );
virtual void fill_surface_extrusion(const Surface *surface, const FillParams &params,
const Flow &flow, const ExtrusionRole &role, ExtrusionEntitiesPtr &out);
protected:
int nbPass=2;