Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorremi <remi-j.durand@thalesgroup.com>2018-01-31 12:24:55 +0300
committerremi <remi-j.durand@thalesgroup.com>2018-01-31 12:24:55 +0300
commit954dd00b85c10373a92c3ee49ef432f5c208859b (patch)
tree28468e3a38811c7b07974affa026e19f0c208f03
parent506ebc0e779d3d9949a8c9a0fa6c08b2cbade190 (diff)
tuning & avoid duplicate codebad2
-rw-r--r--xs/src/libslic3r/Fill/FillRectilinear2.cpp86
-rw-r--r--xs/src/libslic3r/Fill/FillRectilinear2.hpp1
2 files changed, 34 insertions, 53 deletions
diff --git a/xs/src/libslic3r/Fill/FillRectilinear2.cpp b/xs/src/libslic3r/Fill/FillRectilinear2.cpp
index 208c51a40..282053fc4 100644
--- a/xs/src/libslic3r/Fill/FillRectilinear2.cpp
+++ b/xs/src/libslic3r/Fill/FillRectilinear2.cpp
@@ -1471,16 +1471,16 @@ Polylines FillCubic::fill_surface(const Surface *surface, const FillParams &para
Polylines FillSmooth::fill_surface(const Surface *surface, const FillParams &params)
{
- //second pass with half layer width
- FillParams params2 = params;
- params2.density *= 2.0f;
+ //ERROR: you shouldn't call that. Default to the rectilinear one.
+ printf("FillSmooth::fill_surface() : you call the wrong method (fill_surface instead of fill_surface_extrusion).\n");
Polylines polylines_out;
- if (! fill_surface_by_lines(surface, params, 0.f, 0., polylines_out) ||
- ! fill_surface_by_lines(surface, params2, float(M_PI/2), 0., polylines_out)) {
- printf("FillCubic::fill_surface() failed to fill a region.\n");
- }
- return polylines_out;
+ if (! fill_surface_by_lines(surface, params, 0.f, 0.f, polylines_out)) {
+ printf("FillRectilinear2::fill_surface() failed to fill a region.\n");
+ }
+ return polylines_out;
}
+
+
void FillSmooth::fill_surface_extrusion(const Surface *surface, const FillParams &params, const Flow &flow, ExtrusionEntityCollection &out )
{
//second pass with half layer width
@@ -1490,10 +1490,13 @@ void FillSmooth::fill_surface_extrusion(const Surface *surface, const FillParams
Polylines polylines_outNoExtrud;
//choose between v1 (no extrusion on second pass) and v2 (small extrusion on second pass)
- if(surface->area() < (scale_(this->spacing)*scale_(this->spacing)) * 100){
- //v1 (only if < 100 nozzle˛ (for a 0.4 nozzle, it's 16 mm˛ ~ 0.16 cm˛ ~ half of a 5mmx5mm cube on a notebook)
+ if(surface->area() < (scale_(this->spacing)*scale_(this->spacing)) * 200){
+ //v1 (only if < 200 nozzle˛ (for a 0.4 nozzle, it's 32 mm˛ ~ 0.32 cm˛ ~ a 5mmx5mm cube on a notebook)
+ //TODO: also use the v1 if the surface is too narrow (no 5x5mm cube can fit inside)
+
+ // a complete perimeter overlap (no extrusion anyway)
Surface surfaceIncr(*surface);
- Polygons paths = offset(surfaceIncr.expolygon.contour, scale_(this->spacing));
+ Polygons paths = offset(surfaceIncr.expolygon.contour, scale_(this->spacing));
surfaceIncr.expolygon.contour = paths[0];
if (! fill_surface_by_lines(surface, params, 0.f, 0.f, polylines_out) ||
@@ -1504,40 +1507,13 @@ void FillSmooth::fill_surface_extrusion(const Surface *surface, const FillParams
if (polylines_out.empty())
return;
- // Flow tempFlow = flow;
-
- ExtrusionEntityCollection *eecroot = new ExtrusionEntityCollection();
- out.entities.push_back(eecroot);
- eecroot->no_sort = true;
-
- // float stdflowWidth = tempFlow.width;
- // Save into layer.
- ExtrusionEntityCollection *eec = new ExtrusionEntityCollection();
- eecroot->entities.push_back(eec);
- eec->no_sort = true;
- // print at almost 100% (90%) flow
- extrusion_entities_append_paths(
- eec->entities, STDMOVE(polylines_out),
- flow.bridge ?
- erBridgeInfill :
- (surface->is_solid() ?
- ((surface->surface_type == stTop) ? erTopSolidInfill : erSolidInfill) :
- erInternalInfill),
- flow.mm3_per_mm()*1, flow.width*1, flow.height);
-
- // Save into layer smoothing path.
- eec = new ExtrusionEntityCollection();
- eecroot->entities.push_back(eec);
- eec->no_sort = true;
- //print the last 10% with 2*15% -> gapfill (if less => gaps)
- extrusion_entities_append_paths(
- eec->entities, STDMOVE(polylines_outNoExtrud),
- erInternalInfill, //speedy (it's generally the most speedy)
- 0.f, flow.width*0.05, flow.height);
+ out.entities.push_back(create_extrusions(1.f, 0.f, polylines_out, polylines_outNoExtrud));
}else{
//v2
+
+ //a small overlap
Surface surfaceIncr(*surface);
- Polygons paths = offset(surfaceIncr.expolygon.contour, scale_(this->spacing * 0.3f));
+ Polygons paths = offset(surfaceIncr.expolygon.contour, scale_(this->spacing * 0.25f));
surfaceIncr.expolygon.contour = paths[0];
if (! fill_surface_by_lines(surface, params, 0.f, 0.f, polylines_out) ||
@@ -1548,38 +1524,42 @@ void FillSmooth::fill_surface_extrusion(const Surface *surface, const FillParams
if (polylines_out.empty())
return;
- // Flow tempFlow = flow;
-
+ out.entities.push_back(create_extrusions(0.9f, 0.15f, polylines_out, polylines_outNoExtrud));
+ }
+
+}
+
+ExtrusionEntityCollection* FillSmooth::create_extrusions(float flowThickP, float flowThinP, Polylines &polylines_thick, Polylines &polylines_thin){
+
ExtrusionEntityCollection *eecroot = new ExtrusionEntityCollection();
- out.entities.push_back(eecroot);
+ //you don't want to sort the extrusions: big infill first, quick weak second
eecroot->no_sort = true;
- // float stdflowWidth = tempFlow.width;
// Save into layer.
ExtrusionEntityCollection *eec = new ExtrusionEntityCollection();
eecroot->entities.push_back(eec);
eec->no_sort = true;
- // print at almost 100% (90%) flow
+ // print thick
extrusion_entities_append_paths(
- eec->entities, STDMOVE(polylines_out),
+ eec->entities, STDMOVE(polylines_thick),
flow.bridge ?
erBridgeInfill :
(surface->is_solid() ?
((surface->surface_type == stTop) ? erTopSolidInfill : erSolidInfill) :
erInternalInfill),
- flow.mm3_per_mm()*0.9, flow.width*0.9, flow.height);
+ flow.mm3_per_mm()*flowThickP, flow.width*1, flow.height);
+ //note: the flow.width*0.9 is here only for the gui (visual) , the flow.mm3_per_mm() is the real one
// Save into layer smoothing path.
eec = new ExtrusionEntityCollection();
eecroot->entities.push_back(eec);
eec->no_sort = true;
- //print the last 10% with 2*15% -> gapfill (if less => gaps)
+ // print thin
extrusion_entities_append_paths(
- eec->entities, STDMOVE(polylines_outNoExtrud),
+ eec->entities, STDMOVE(polylines_thin),
erInternalInfill, //speedy (it's generally the most speedy)
- flow.mm3_per_mm()*0.15, flow.width*0.15, flow.height);
+ flow.mm3_per_mm()*flowThinP, flow.width*0.15, flow.height);
}
-
}
} // namespace Slic3r
diff --git a/xs/src/libslic3r/Fill/FillRectilinear2.hpp b/xs/src/libslic3r/Fill/FillRectilinear2.hpp
index 69856fac9..c552d95fe 100644
--- a/xs/src/libslic3r/Fill/FillRectilinear2.hpp
+++ b/xs/src/libslic3r/Fill/FillRectilinear2.hpp
@@ -76,6 +76,7 @@ public:
virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
virtual bool can_create_extrusion_entity_collection() const { return true; }
virtual void fill_surface_extrusion(const Surface *surface, const FillParams &params, const Flow &flow, ExtrusionEntityCollection &out );
+ virtual void create_extrusions(const Surface *surface, const FillParams &params, const Flow &flow, ExtrusionEntityCollection &out );
};