From ef69474636e1a05b5039738d9e53f5971917856a Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sun, 20 Nov 2016 12:38:59 +0100 Subject: [PATCH] Optimized Layer::merge_slices() Don't merge classified pieces of layerm->slices, but use the non-split islands of a layer. For a single region print, these shall be equal. Added Slic3r-console.ico windows icon for the console Slic3r. This is a copy of the big icon, with the big images stripped off. --- var/Slic3r-console.ico | Bin 0 -> 17542 bytes xs/src/libslic3r/Layer.cpp | 15 +++++++++++++-- xs/src/libslic3r/Layer.hpp | 1 - xs/src/libslic3r/LayerRegion.cpp | 11 +---------- 4 files changed, 14 insertions(+), 13 deletions(-) create mode 100644 var/Slic3r-console.ico diff --git a/var/Slic3r-console.ico b/var/Slic3r-console.ico new file mode 100644 index 0000000000000000000000000000000000000000..64e8183404e8d1111af208173d80ab671644ef24 GIT binary patch literal 17542 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 + if (this->regions.size() == 1) { + // Optimization, also more robust. Don't merge classified pieces of layerm->slices, + // but use the non-split islands of a layer. For a single region print, these shall be equal. + this->regions.front()->slices.surfaces.clear(); + surfaces_append(this->regions.front()->slices.surfaces, this->slices.expolygons, stInternal); + } else { + FOREACH_LAYERREGION(this, layerm) { + ExPolygons expp; + // without safety offset, artifacts are generated (GH #2494) + union_(to_polygons(STDMOVE((*layerm)->slices.surfaces)), &expp, true); + (*layerm)->slices.surfaces.clear(); + surfaces_append((*layerm)->slices.surfaces, expp, stInternal); + } } } diff --git a/xs/src/libslic3r/Layer.hpp b/xs/src/libslic3r/Layer.hpp index 14957dd1c..e59f0c9e1 100644 --- a/xs/src/libslic3r/Layer.hpp +++ b/xs/src/libslic3r/Layer.hpp @@ -63,7 +63,6 @@ class LayerRegion ExtrusionEntityCollection fills; Flow flow(FlowRole role, bool bridge = false, double width = -1) const; - void merge_slices(); void slices_to_fill_surfaces_clipped(); void prepare_fill_surfaces(); void make_perimeters(const SurfaceCollection &slices, SurfaceCollection* fill_surfaces); diff --git a/xs/src/libslic3r/LayerRegion.cpp b/xs/src/libslic3r/LayerRegion.cpp index a236c0389..7c84629e2 100644 --- a/xs/src/libslic3r/LayerRegion.cpp +++ b/xs/src/libslic3r/LayerRegion.cpp @@ -41,16 +41,6 @@ LayerRegion::flow(FlowRole role, bool bridge, double width) const ); } -void -LayerRegion::merge_slices() -{ - ExPolygons expp; - // without safety offset, artifacts are generated (GH #2494) - union_(to_polygons(STDMOVE(this->slices.surfaces)), &expp, true); - this->slices.surfaces.clear(); - surfaces_append(this->slices.surfaces, expp, stInternal); -} - // Fill in layerm->fill_surfaces by trimming the layerm->slices by the cummulative layerm->fill_surfaces. void LayerRegion::slices_to_fill_surfaces_clipped() { @@ -126,6 +116,7 @@ LayerRegion::process_external_surfaces(const Layer* lower_layer) // Internal surfaces, not grown. Surfaces internal; // Areas, where an infill of various types (top, bottom, bottom bride, sparse, void) could be placed. + //FIXME if non zero infill, then fill_boundaries could be cheaply initialized from layerm->fill_expolygons. Polygons fill_boundaries; // Collect top surfaces and internal surfaces.