diff options
author | bubnikv <bubnikv@gmail.com> | 2016-11-03 12:24:32 +0300 |
---|---|---|
committer | bubnikv <bubnikv@gmail.com> | 2016-11-03 12:24:32 +0300 |
commit | 7b6b609df146da7a829cdad935029f162a817839 (patch) | |
tree | 0ef159e9bba879b913b2ccc1148016e4ebc719f0 /xs/src | |
parent | 12b7818caa436d6c84f8be0e5ec6273ff37ec128 (diff) |
ExtrusionEntity and derived classes: Documented, short methods made
inline for efficiency and readability, grow() renamed to polygons_covered().
Diffstat (limited to 'xs/src')
-rw-r--r-- | xs/src/libslic3r/ExtrusionEntity.cpp | 121 | ||||
-rw-r--r-- | xs/src/libslic3r/ExtrusionEntity.hpp | 118 | ||||
-rw-r--r-- | xs/src/libslic3r/ExtrusionEntityCollection.cpp | 8 | ||||
-rw-r--r-- | xs/src/libslic3r/ExtrusionEntityCollection.hpp | 2 | ||||
-rw-r--r-- | xs/src/libslic3r/PerimeterGenerator.cpp | 4 |
5 files changed, 89 insertions, 164 deletions
diff --git a/xs/src/libslic3r/ExtrusionEntity.cpp b/xs/src/libslic3r/ExtrusionEntity.cpp index ab462eb03..0fed22490 100644 --- a/xs/src/libslic3r/ExtrusionEntity.cpp +++ b/xs/src/libslic3r/ExtrusionEntity.cpp @@ -4,35 +4,12 @@ #include "ClipperUtils.hpp" #include "Extruder.hpp" #include <cmath> +#include <limits> #include <sstream> namespace Slic3r { - -ExtrusionPath* -ExtrusionPath::clone() const -{ - return new ExtrusionPath (*this); -} void -ExtrusionPath::reverse() -{ - this->polyline.reverse(); -} - -Point -ExtrusionPath::first_point() const -{ - return this->polyline.points.front(); -} - -Point -ExtrusionPath::last_point() const -{ - return this->polyline.points.back(); -} - -void ExtrusionPath::intersect_expolygons(const ExPolygonCollection &collection, ExtrusionEntityCollection* retval) const { // perform clipping @@ -68,38 +45,6 @@ ExtrusionPath::length() const return this->polyline.length(); } -bool -ExtrusionPath::is_perimeter() const -{ - return this->role == erPerimeter - || this->role == erExternalPerimeter - || this->role == erOverhangPerimeter; -} - -bool -ExtrusionPath::is_infill() const -{ - return this->role == erBridgeInfill - || this->role == erInternalInfill - || this->role == erSolidInfill - || this->role == erTopSolidInfill; -} - -bool -ExtrusionPath::is_solid_infill() const -{ - return this->role == erBridgeInfill - || this->role == erSolidInfill - || this->role == erTopSolidInfill; -} - -bool -ExtrusionPath::is_bridge() const -{ - return this->role == erBridgeInfill - || this->role == erOverhangPerimeter; -} - void ExtrusionPath::_inflate_collection(const Polylines &polylines, ExtrusionEntityCollection* collection) const { @@ -111,19 +56,13 @@ ExtrusionPath::_inflate_collection(const Polylines &polylines, ExtrusionEntityCo } Polygons -ExtrusionPath::grow() const +ExtrusionPath::polygons_covered() const { Polygons pp; offset(this->polyline, &pp, +scale_(this->width/2)); return pp; } -ExtrusionLoop* -ExtrusionLoop::clone() const -{ - return new ExtrusionLoop (*this); -} - bool ExtrusionLoop::make_clockwise() { @@ -148,18 +87,6 @@ ExtrusionLoop::reverse() std::reverse(this->paths.begin(), this->paths.end()); } -Point -ExtrusionLoop::first_point() const -{ - return this->paths.front().polyline.points.front(); -} - -Point -ExtrusionLoop::last_point() const -{ - return this->paths.back().polyline.points.back(); // which coincides with first_point(), by the way -} - Polygon ExtrusionLoop::polygon() const { @@ -296,53 +223,21 @@ ExtrusionLoop::has_overhang_point(const Point &point) const return false; } -bool -ExtrusionLoop::is_perimeter() const -{ - return this->paths.front().role == erPerimeter - || this->paths.front().role == erExternalPerimeter - || this->paths.front().role == erOverhangPerimeter; -} - -bool -ExtrusionLoop::is_infill() const -{ - return this->paths.front().role == erBridgeInfill - || this->paths.front().role == erInternalInfill - || this->paths.front().role == erSolidInfill - || this->paths.front().role == erTopSolidInfill; -} - -bool -ExtrusionLoop::is_solid_infill() const -{ - return this->paths.front().role == erBridgeInfill - || this->paths.front().role == erSolidInfill - || this->paths.front().role == erTopSolidInfill; -} - Polygons -ExtrusionLoop::grow() const +ExtrusionLoop::polygons_covered() const { Polygons pp; - for (ExtrusionPaths::const_iterator path = this->paths.begin(); path != this->paths.end(); ++path) { - Polygons path_pp = path->grow(); - pp.insert(pp.end(), path_pp.begin(), path_pp.end()); - } + for (ExtrusionPaths::const_iterator path = this->paths.begin(); path != this->paths.end(); ++path) + polygons_append(pp, path->polygons_covered()); return pp; } double ExtrusionLoop::min_mm3_per_mm() const { - double min_mm3_per_mm = 0; - for (ExtrusionPaths::const_iterator path = this->paths.begin(); path != this->paths.end(); ++path) { - if (min_mm3_per_mm == 0) { - min_mm3_per_mm = path->mm3_per_mm; - } else { - min_mm3_per_mm = fmin(min_mm3_per_mm, path->mm3_per_mm); - } - } + double min_mm3_per_mm = std::numeric_limits<double>::max(); + for (ExtrusionPaths::const_iterator path = this->paths.begin(); path != this->paths.end(); ++path) + min_mm3_per_mm = std::min(min_mm3_per_mm, path->mm3_per_mm); return min_mm3_per_mm; } diff --git a/xs/src/libslic3r/ExtrusionEntity.hpp b/xs/src/libslic3r/ExtrusionEntity.hpp index 7b4e796e4..f461d79f4 100644 --- a/xs/src/libslic3r/ExtrusionEntity.hpp +++ b/xs/src/libslic3r/ExtrusionEntity.hpp @@ -36,22 +36,18 @@ enum ExtrusionLoopRole { class ExtrusionEntity { - public: - virtual bool is_collection() const { - return false; - }; - virtual bool is_loop() const { - return false; - }; - virtual bool can_reverse() const { - return true; - }; +public: + virtual bool is_collection() const { return false; } + virtual bool is_loop() const { return false; } + virtual bool can_reverse() const { return true; } virtual ExtrusionEntity* clone() const = 0; virtual ~ExtrusionEntity() {}; virtual void reverse() = 0; virtual Point first_point() const = 0; virtual Point last_point() const = 0; - virtual Polygons grow() const = 0; + // Produce a list of 2D polygons covered by the extruded path. + virtual Polygons polygons_covered() const = 0; + // Minimum volumetric velocity of this extrusion entity. Used by the constant nozzle pressure algorithm. virtual double min_mm3_per_mm() const = 0; virtual Polyline as_polyline() const = 0; virtual double length() const { return 0; }; @@ -61,34 +57,57 @@ typedef std::vector<ExtrusionEntity*> ExtrusionEntitiesPtr; class ExtrusionPath : public ExtrusionEntity { - public: +public: Polyline polyline; ExtrusionRole role; - double mm3_per_mm; // mm^3 of plastic per mm of linear head motion + // Volumetric velocity. mm^3 of plastic per mm of linear head motion + double mm3_per_mm; + // Width of the extrusion. float width; + // Height of the extrusion. float height; ExtrusionPath(ExtrusionRole role) : role(role), mm3_per_mm(-1), width(-1), height(-1) {}; - ExtrusionPath* clone() const; - void reverse(); - Point first_point() const; - Point last_point() const; + ExtrusionPath(ExtrusionRole role, double mm3_per_mm, float width, float height) : role(role), mm3_per_mm(mm3_per_mm), width(width), height(height) {}; +// ExtrusionPath(ExtrusionRole role, const Flow &flow) : role(role), mm3_per_mm(flow.mm3_per_mm()), width(flow.width), height(flow.height) {}; + ExtrusionPath* clone() const { return new ExtrusionPath (*this); } + void reverse() { this->polyline.reverse(); } + Point first_point() const { return this->polyline.points.front(); } + Point last_point() const { return this->polyline.points.back(); } + // Produce a list of extrusion paths into retval by clipping this path by ExPolygonCollection. + // Currently not used. void intersect_expolygons(const ExPolygonCollection &collection, ExtrusionEntityCollection* retval) const; + // Produce a list of extrusion paths into retval by removing parts of this path by ExPolygonCollection. + // Currently not used. void subtract_expolygons(const ExPolygonCollection &collection, ExtrusionEntityCollection* retval) const; void clip_end(double distance); void simplify(double tolerance); virtual double length() const; - bool is_perimeter() const; - bool is_infill() const; - bool is_solid_infill() const; - bool is_bridge() const; - Polygons grow() const; - double min_mm3_per_mm() const { - return this->mm3_per_mm; - }; - Polyline as_polyline() const { - return this->polyline; - }; + bool is_perimeter() const { + return this->role == erPerimeter + || this->role == erExternalPerimeter + || this->role == erOverhangPerimeter; + } + bool is_infill() const { + return this->role == erBridgeInfill + || this->role == erInternalInfill + || this->role == erSolidInfill + || this->role == erTopSolidInfill; + } + bool is_solid_infill() const { + return this->role == erBridgeInfill + || this->role == erSolidInfill + || this->role == erTopSolidInfill; + } + bool is_bridge() const { + return this->role == erBridgeInfill + || this->role == erOverhangPerimeter; + } + // Produce a list of 2D polygons covered by the extruded path. + Polygons polygons_covered() const; + // Minimum volumetric velocity of this extrusion entity. Used by the constant nozzle pressure algorithm. + double min_mm3_per_mm() const { return this->mm3_per_mm; } + Polyline as_polyline() const { return this->polyline; } private: void _inflate_collection(const Polylines &polylines, ExtrusionEntityCollection* collection) const; @@ -109,32 +128,43 @@ class ExtrusionLoop : public ExtrusionEntity : role(role) { this->paths.push_back(path); }; - bool is_loop() const { - return true; - }; - bool can_reverse() const { - return false; - }; - ExtrusionLoop* clone() const; + bool is_loop() const { return true; } + bool can_reverse() const { return false; } + ExtrusionLoop* clone() const { return new ExtrusionLoop (*this); } bool make_clockwise(); bool make_counter_clockwise(); void reverse(); - Point first_point() const; - Point last_point() const; + Point first_point() const { return this->paths.front().polyline.points.front(); } + Point last_point() const { assert(first_point() == this->paths.back().polyline.points.back()); return first_point(); } Polygon polygon() const; virtual double length() const; bool split_at_vertex(const Point &point); void split_at(const Point &point); void clip_end(double distance, ExtrusionPaths* paths) const; + // Test, whether the point is extruded by a bridging flow. + // This used to be used to avoid placing seams on overhangs, but now the EdgeGrid is used instead. bool has_overhang_point(const Point &point) const; - bool is_perimeter() const; - bool is_infill() const; - bool is_solid_infill() const; - Polygons grow() const; + bool is_perimeter() const { + return this->paths.front().role == erPerimeter + || this->paths.front().role == erExternalPerimeter + || this->paths.front().role == erOverhangPerimeter; + } + bool is_infill() const { + return this->paths.front().role == erBridgeInfill + || this->paths.front().role == erInternalInfill + || this->paths.front().role == erSolidInfill + || this->paths.front().role == erTopSolidInfill; + } + bool is_solid_infill() const { + return this->paths.front().role == erBridgeInfill + || this->paths.front().role == erSolidInfill + || this->paths.front().role == erTopSolidInfill; + } + // Produce a list of 2D polygons covered by the extruded path. + Polygons polygons_covered() const; + // Minimum volumetric velocity of this extrusion entity. Used by the constant nozzle pressure algorithm. double min_mm3_per_mm() const; - Polyline as_polyline() const { - return this->polygon().split_at_first_point(); - }; + Polyline as_polyline() const { return this->polygon().split_at_first_point(); } }; } diff --git a/xs/src/libslic3r/ExtrusionEntityCollection.cpp b/xs/src/libslic3r/ExtrusionEntityCollection.cpp index 7776d332a..c33e75980 100644 --- a/xs/src/libslic3r/ExtrusionEntityCollection.cpp +++ b/xs/src/libslic3r/ExtrusionEntityCollection.cpp @@ -181,13 +181,11 @@ ExtrusionEntityCollection::chained_path_from(Point start_near, ExtrusionEntityCo } Polygons -ExtrusionEntityCollection::grow() const +ExtrusionEntityCollection::polygons_covered() const { Polygons pp; - for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it) { - Polygons entity_pp = (*it)->grow(); - pp.insert(pp.end(), entity_pp.begin(), entity_pp.end()); - } + for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it) + polygons_append(pp, (*it)->polygons_covered()); return pp; } diff --git a/xs/src/libslic3r/ExtrusionEntityCollection.hpp b/xs/src/libslic3r/ExtrusionEntityCollection.hpp index 23405136d..166f9d3b9 100644 --- a/xs/src/libslic3r/ExtrusionEntityCollection.hpp +++ b/xs/src/libslic3r/ExtrusionEntityCollection.hpp @@ -42,7 +42,7 @@ class ExtrusionEntityCollection : public ExtrusionEntity void reverse(); Point first_point() const; Point last_point() const; - Polygons grow() const; + Polygons polygons_covered() const; size_t items_count() const; void flatten(ExtrusionEntityCollection* retval) const; ExtrusionEntityCollection flatten() const; diff --git a/xs/src/libslic3r/PerimeterGenerator.cpp b/xs/src/libslic3r/PerimeterGenerator.cpp index e34cd87ba..b4c841124 100644 --- a/xs/src/libslic3r/PerimeterGenerator.cpp +++ b/xs/src/libslic3r/PerimeterGenerator.cpp @@ -281,7 +281,9 @@ PerimeterGenerator::process() are not subtracted from fill surfaces (they might be too short gaps that medial axis skips but infill might join with other infill regions and use zigzag). */ - last = diff(last, gap_fill.grow()); + //FIXME Vojtech: This grows by a rounded extrusion width, not by line spacing, + // therefore it may cover the area, but no the volume. + last = diff(last, gap_fill.polygons_covered()); } } |