From 3aea01e815af4582be2a1dcf9a95d2588303879a Mon Sep 17 00:00:00 2001 From: supermerill Date: Thu, 27 Jun 2019 19:19:01 +0200 Subject: [PATCH] cherry-picked slic3r/Slic3r#4809 changed the ExtrusionEntity visitor a bit and add new ones. --- src/libslic3r/ExtrusionEntity.cpp | 53 ++++++--- src/libslic3r/ExtrusionEntity.hpp | 73 ++++++++---- src/libslic3r/ExtrusionEntityCollection.cpp | 121 ++++++++++---------- src/libslic3r/ExtrusionEntityCollection.hpp | 53 ++++++++- src/libslic3r/Fill/Fill.cpp | 1 + src/libslic3r/Fill/FillRectilinear2.cpp | 5 +- src/libslic3r/GCode.cpp | 6 +- src/libslic3r/GCode.hpp | 2 +- src/libslic3r/SupportMaterial.cpp | 1 + src/slic3r/GUI/3DScene.cpp | 3 +- src/slic3r/GUI/3DScene.hpp | 2 +- src/slic3r/GUI/GLCanvas3D.cpp | 13 ++- src/test/CMakeLists.txt | 1 + src/test/libslic3r/test_denserinfill.cpp | 2 + 14 files changed, 211 insertions(+), 125 deletions(-) diff --git a/src/libslic3r/ExtrusionEntity.cpp b/src/libslic3r/ExtrusionEntity.cpp index 7c41f287c..326772d89 100644 --- a/src/libslic3r/ExtrusionEntity.cpp +++ b/src/libslic3r/ExtrusionEntity.cpp @@ -9,6 +9,21 @@ #include namespace Slic3r { + +//// extrusion entity visitor +void ExtrusionVisitor::use(ExtrusionPath &path) { default_use(path); }; +void ExtrusionVisitor::use(ExtrusionPath3D &path3D) { default_use(path3D); } +void ExtrusionVisitor::use(ExtrusionMultiPath &multipath) { default_use(multipath); } +void ExtrusionVisitor::use(ExtrusionMultiPath3D &multipath3D) { default_use(multipath3D); } +void ExtrusionVisitor::use(ExtrusionLoop &loop) { default_use(loop); } +void ExtrusionVisitor::use(ExtrusionEntityCollection &collection) { default_use(collection); } + +void ExtrusionVisitorConst::use(const ExtrusionPath &path) { default_use(path); } +void ExtrusionVisitorConst::use(const ExtrusionPath3D &path3D) { default_use(path3D); } +void ExtrusionVisitorConst::use(const ExtrusionMultiPath &multipath) { default_use(multipath); } +void ExtrusionVisitorConst::use(const ExtrusionMultiPath3D &multipath3D) { default_use(multipath3D); } +void ExtrusionVisitorConst::use(const ExtrusionLoop &loop) { default_use(loop); } +void ExtrusionVisitorConst::use(const ExtrusionEntityCollection &collection) { default_use(collection); } void ExtrusionPath::intersect_expolygons(const ExPolygonCollection &collection, ExtrusionEntityCollection* retval) const @@ -299,24 +314,24 @@ void ExtrusionPrinter::use(const ExtrusionEntityCollection &collection) { } -class ExtrusionTreeVisitor : ExtrusionVisitor { -public: - //virtual void use(ExtrusionEntity &entity) { assert(false); }; - virtual void use(ExtrusionPath &path) override { const ExtrusionPath &constpath = path; use(constpath); }; - virtual void use(ExtrusionPath3D &path3D) override { const ExtrusionPath3D &constpath3D = path3D; use(constpath3D); }; - virtual void use(ExtrusionMultiPath &multipath) override { const ExtrusionMultiPath &constmultipath = multipath; use(constmultipath); }; - virtual void use(ExtrusionMultiPath3D &multipath3D) override { const ExtrusionMultiPath3D &constmultipath3D = multipath3D; use(constmultipath3D); }; - virtual void use(ExtrusionLoop &loop) override { const ExtrusionLoop &constloop = loop; use(constloop); }; - virtual void use(ExtrusionEntityCollection &collection) { const ExtrusionEntityCollection &constcollection = collection; use(constcollection); }; - virtual void use(const ExtrusionPath &path) override { assert(false); }; - virtual void use(const ExtrusionPath3D &path3D) override { assert(false); }; - virtual void use(const ExtrusionMultiPath &multipath) override { assert(false); }; - virtual void use(const ExtrusionMultiPath3D &multipath3D) { assert(false); }; - virtual void use(const ExtrusionLoop &loop) override { assert(false); }; - virtual void use(const ExtrusionEntityCollection &collection) { assert(false); }; - virtual void use_default(ExtrusionEntity &entity) { const ExtrusionEntity &constentity = entity; use_default(constentity); }; - virtual void use_default(const ExtrusionEntity &entity) {}; - -}; +//class ExtrusionTreeVisitor : ExtrusionVisitor { +//public: +// //virtual void use(ExtrusionEntity &entity) { assert(false); }; +// virtual void use(ExtrusionPath &path) override { const ExtrusionPath &constpath = path; use(constpath); }; +// virtual void use(ExtrusionPath3D &path3D) override { const ExtrusionPath3D &constpath3D = path3D; use(constpath3D); }; +// virtual void use(ExtrusionMultiPath &multipath) override { const ExtrusionMultiPath &constmultipath = multipath; use(constmultipath); }; +// virtual void use(ExtrusionMultiPath3D &multipath3D) override { const ExtrusionMultiPath3D &constmultipath3D = multipath3D; use(constmultipath3D); }; +// virtual void use(ExtrusionLoop &loop) override { const ExtrusionLoop &constloop = loop; use(constloop); }; +// virtual void use(ExtrusionEntityCollection &collection) { const ExtrusionEntityCollection &constcollection = collection; use(constcollection); }; +// virtual void use(const ExtrusionPath &path) override { assert(false); }; +// virtual void use(const ExtrusionPath3D &path3D) override { assert(false); }; +// virtual void use(const ExtrusionMultiPath &multipath) override { assert(false); }; +// virtual void use(const ExtrusionMultiPath3D &multipath3D) { assert(false); }; +// virtual void use(const ExtrusionLoop &loop) override { assert(false); }; +// virtual void use(const ExtrusionEntityCollection &collection) { assert(false); }; +// virtual void use_default(ExtrusionEntity &entity) { const ExtrusionEntity &constentity = entity; use_default(constentity); }; +// virtual void use_default(const ExtrusionEntity &entity) {}; +// +//}; } diff --git a/src/libslic3r/ExtrusionEntity.hpp b/src/libslic3r/ExtrusionEntity.hpp index 1cdee2de9..3af4b3898 100644 --- a/src/libslic3r/ExtrusionEntity.hpp +++ b/src/libslic3r/ExtrusionEntity.hpp @@ -69,27 +69,53 @@ enum ExtrusionLoopRole { }; +class ExtrusionEntity; class ExtrusionPath; class ExtrusionPath3D; class ExtrusionMultiPath; class ExtrusionMultiPath3D; class ExtrusionLoop; +// +//class ExtrusionVisitor { +//public: +// virtual void default_use(ExtrusionEntity &entity) { assert(false); }; +// virtual void use(ExtrusionPath &path) { ExtrusionEntity &entity = path; default_use(entity); }; +// virtual void use(ExtrusionPath3D &path3D) { ExtrusionPath &path = path3D; use(path); }; +// virtual void use(ExtrusionMultiPath &multipath) { ExtrusionEntity &entity = multipath; default_use(entity); }; +// virtual void use(ExtrusionMultiPath3D &multipath3D) { ExtrusionEntity &entity = multipath3D; default_use(entity); }; +// virtual void use(ExtrusionLoop &loop) { ExtrusionEntity &entity = loop; default_use(entity); }; +// virtual void use(ExtrusionEntityCollection &collection) { ExtrusionEntity &entity = collection; default_use(entity); }; +//}; +//class ExtrusionVisitorConst { +//public: +// virtual void default_use(const ExtrusionEntity &entity) { assert(false); }; +// virtual void use(const ExtrusionPath &path) { const ExtrusionEntity &entity = path; default_use(entity); }; +// virtual void use(const ExtrusionPath3D &path3D) { const ExtrusionPath &path = path3D; use(path); }; +// virtual void use(const ExtrusionMultiPath &multipath) { const ExtrusionEntity &entity = multipath; default_use(entity); }; +// virtual void use(const ExtrusionMultiPath3D &multipath3D) { const ExtrusionEntity &entity = multipath3D; default_use(entity); }; +// virtual void use(const ExtrusionLoop &loop) { const ExtrusionEntity &entity = loop; default_use(entity); }; +// virtual void use(const ExtrusionEntityCollection &collection) { const ExtrusionEntity &entity = collection; default_use(entity); }; +//}; + class ExtrusionVisitor { public: - //virtual void use(ExtrusionEntity &entity) { assert(false); }; - virtual void use(ExtrusionPath &path) { const ExtrusionPath &constpath = path; use(constpath); }; - virtual void use(ExtrusionPath3D &path3D) { const ExtrusionPath3D &constpath3D = path3D; use(constpath3D); }; - virtual void use(ExtrusionMultiPath &multipath) { const ExtrusionMultiPath &constmultipath = multipath; use(constmultipath); }; - virtual void use(ExtrusionMultiPath3D &multipath3D) { const ExtrusionMultiPath3D &constmultipath3D = multipath3D; use(constmultipath3D); }; - virtual void use(ExtrusionLoop &loop) { const ExtrusionLoop &constloop = loop; use(constloop); }; - virtual void use(ExtrusionEntityCollection &collection) { const ExtrusionEntityCollection &constcollection = collection; use(constcollection); }; - virtual void use(const ExtrusionPath &path) { assert(false); }; - virtual void use(const ExtrusionPath3D &path3D) { assert(false); }; - virtual void use(const ExtrusionMultiPath &multipath) { assert(false); }; - virtual void use(const ExtrusionMultiPath3D &multipath3D) { assert(false); }; - virtual void use(const ExtrusionLoop &loop) { assert(false); }; - virtual void use(const ExtrusionEntityCollection &collection) { assert(false); }; - + virtual void default_use(ExtrusionEntity &entity) { assert(false); }; + virtual void use(ExtrusionPath &path); + virtual void use(ExtrusionPath3D &path3D); + virtual void use(ExtrusionMultiPath &multipath); + virtual void use(ExtrusionMultiPath3D &multipath3D); + virtual void use(ExtrusionLoop &loop); + virtual void use(ExtrusionEntityCollection &collection); +}; +class ExtrusionVisitorConst { +public: + virtual void default_use(const ExtrusionEntity &entity) { assert(false); }; + virtual void use(const ExtrusionPath &path); + virtual void use(const ExtrusionPath3D &path3D); + virtual void use(const ExtrusionMultiPath &multipath); + virtual void use(const ExtrusionMultiPath3D &multipath3D); + virtual void use(const ExtrusionLoop &loop); + virtual void use(const ExtrusionEntityCollection &collection); }; class ExtrusionEntity @@ -123,7 +149,7 @@ public: virtual double length() const = 0; virtual double total_volume() const = 0; virtual void visit(ExtrusionVisitor &visitor) = 0; - virtual void visit(ExtrusionVisitor &visitor) const = 0; + virtual void visit(ExtrusionVisitorConst &visitor) const = 0; }; typedef std::vector ExtrusionEntitiesPtr; @@ -185,7 +211,7 @@ public: void collect_polylines(Polylines &dst) const override { if (! this->polyline.empty()) dst.emplace_back(this->polyline); } double total_volume() const override { return mm3_per_mm * unscale(length()); } virtual void visit(ExtrusionVisitor &visitor) override { visitor.use(*this); }; - virtual void visit(ExtrusionVisitor &visitor) const override { visitor.use(*this); }; + virtual void visit(ExtrusionVisitorConst &visitor) const override { visitor.use(*this); }; protected: void _inflate_collection(const Polylines &polylines, ExtrusionEntityCollection* collection) const; @@ -214,7 +240,7 @@ public: } ExtrusionPath3D* clone() const { return new ExtrusionPath3D(*this); } virtual void visit(ExtrusionVisitor &visitor) override { visitor.use(*this); }; - virtual void visit(ExtrusionVisitor &visitor) const override { visitor.use(*this); }; + virtual void visit(ExtrusionVisitorConst &visitor) const override { visitor.use(*this); }; void push_back(Point p, coord_t z_offset) { polyline.points.push_back(p); z_offsets.push_back(z_offset); } @@ -320,7 +346,7 @@ public: virtual ExtrusionMultiPath* clone() const override { return new ExtrusionMultiPath(*this); } virtual void visit(ExtrusionVisitor &visitor) override { visitor.use(*this); }; - virtual void visit(ExtrusionVisitor &visitor) const override { visitor.use(*this); }; + virtual void visit(ExtrusionVisitorConst &visitor) const override { visitor.use(*this); }; }; // Single continuous extrusion path, possibly with varying extrusion thickness, extrusion height or bridging / non bridging. class ExtrusionMultiPath3D : public ExtrusionMultiEntity { @@ -335,7 +361,7 @@ public: virtual ExtrusionMultiPath3D* clone() const override { return new ExtrusionMultiPath3D(*this); } virtual void visit(ExtrusionVisitor &visitor) override { visitor.use(*this); }; - virtual void visit(ExtrusionVisitor &visitor) const override { visitor.use(*this); }; + virtual void visit(ExtrusionVisitorConst &visitor) const override { visitor.use(*this); }; virtual bool can_reverse() const override { return false; } virtual void reverse() override { @@ -391,7 +417,7 @@ public: void collect_polylines(Polylines &dst) const override { Polyline pl = this->as_polyline(); if (! pl.empty()) dst.emplace_back(std::move(pl)); } double total_volume() const override { double volume = 0.; for (const auto& path : paths) volume += path.total_volume(); return volume; } virtual void visit(ExtrusionVisitor &visitor) override { visitor.use(*this); }; - virtual void visit(ExtrusionVisitor &visitor) const override { visitor.use(*this); }; + virtual void visit(ExtrusionVisitorConst &visitor) const override { visitor.use(*this); }; private: ExtrusionLoopRole m_loop_role; @@ -482,7 +508,7 @@ inline void extrusion_entities_append_loops(ExtrusionEntitiesPtr &dst, Polygons loops.clear(); } -class ExtrusionPrinter : public ExtrusionVisitor { +class ExtrusionPrinter : public ExtrusionVisitorConst { std::stringstream ss; public: virtual void use(const ExtrusionPath &path); @@ -492,7 +518,10 @@ public: virtual void use(const ExtrusionLoop &loop); virtual void use(const ExtrusionEntityCollection &collection); std::string str() { return ss.str(); } -// void clear() { return ss.clear(); } + std::string && print(ExtrusionEntity &entity) && { + entity.visit(*this); + return std::move(ss.str()); + } }; } diff --git a/src/libslic3r/ExtrusionEntityCollection.cpp b/src/libslic3r/ExtrusionEntityCollection.cpp index 77faf1569..3a8602cc6 100644 --- a/src/libslic3r/ExtrusionEntityCollection.cpp +++ b/src/libslic3r/ExtrusionEntityCollection.cpp @@ -174,78 +174,73 @@ void ExtrusionEntityCollection::polygons_covered_by_spacing(Polygons &out, const size_t ExtrusionEntityCollection::items_count() const { - size_t count = 0; - for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it) { - if ((*it)->is_collection()) { - ExtrusionEntityCollection* collection = dynamic_cast(*it); - count += collection->items_count(); - } else { - ++count; - } - } - return count; + return CountEntities().count(*this); } -/* Returns a single vector of pointers to all non-collection items contained in this one */ void -ExtrusionEntityCollection::flatten(ExtrusionEntityCollection* retval) const +CountEntities::use(const ExtrusionEntityCollection &coll) { + for (const ExtrusionEntity* entity : coll.entities) { + entity->visit(*this); + } +} +// +//void +//ExtrusionEntityCollection::flatten(ExtrusionEntityCollection* retval, bool preserve_ordering) const +//{ +// if (this->no_sort && preserve_ordering) { +// /// if we want to preserve ordering and we can't sort, break out the unsorted ones first. +// ExtrusionEntityCollection *unsortable = new ExtrusionEntityCollection(); +// unsortable->no_sort = true; +// unsortable->orig_indices = this->orig_indices; +// retval->append(*unsortable); +// for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it) { +// if ((*it)->is_collection()) { +// ExtrusionEntityCollection* collection = dynamic_cast(*it); +// collection->flatten(unsortable, preserve_ordering); +// } else { +// unsortable->append(**it); +// } +// } +// } else { +// for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it) { +// if ((*it)->is_collection()) { +// ExtrusionEntityCollection* collection = dynamic_cast(*it); +// retval->append(collection->flatten().entities); +// } else { +// retval->append(**it); +// } +// } +// } +//} + +/* Returns a single vector of chained (new) pointers to all non-collection items contained in this one */ +ExtrusionEntityCollection +ExtrusionEntityCollection::flatten(bool preserve_ordering) const { - for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it) { - if ((*it)->is_collection()) { - ExtrusionEntityCollection* collection = dynamic_cast(*it); - retval->append(collection->flatten().entities); - } else { - retval->append(**it); + //ExtrusionEntityCollection coll; + //this->flatten(&coll, preserve_ordering); + //return coll; + return FlatenEntities(preserve_ordering).flatten(*this); + +} +void +FlatenEntities::use(const ExtrusionEntityCollection &coll) { + if (coll.no_sort && preserve_ordering) { + to_fill.append(FlatenEntities(coll, preserve_ordering).flatten(coll)); + } else { + for (const ExtrusionEntity* entity : coll.entities) { + entity->visit(*this); } } } - -ExtrusionEntityCollection -ExtrusionEntityCollection::flatten() const -{ - ExtrusionEntityCollection coll; - this->flatten(&coll); - return coll; +ExtrusionEntityCollection&& +FlatenEntities::flatten(const ExtrusionEntityCollection &to_flatten) && { + for (const ExtrusionEntity* entity : to_flatten.entities) { + entity->visit(*this); + } + return std::move(to_fill); } -/* Returns a vector of chained (new) pointers to all non-collection items contained in this one */ -void -ExtrusionEntityCollection::flattenIfSortable(ExtrusionEntityCollection* retval) const -{ - if (no_sort){ - ExtrusionEntityCollection *unsortable = new ExtrusionEntityCollection(*this); - retval->append(*unsortable); - unsortable->entities.clear(); - for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it) { - if ((*it)->is_collection()) { - ExtrusionEntityCollection* collection = dynamic_cast(*it); - collection->flattenIfSortable(unsortable); - } - else { - unsortable->append(**it); - } - } - } - else{ - for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it) { - if ((*it)->is_collection()) { - ExtrusionEntityCollection* collection = dynamic_cast(*it); - retval->append(collection->flattenIfSortable().entities); - } - else { - retval->append(**it); - } - } - } -} - -ExtrusionEntityCollection -ExtrusionEntityCollection::flattenIfSortable() const -{ - ExtrusionEntityCollection coll; - this->flattenIfSortable(&coll); - return coll; -} double ExtrusionEntityCollection::min_mm3_per_mm() const diff --git a/src/libslic3r/ExtrusionEntityCollection.hpp b/src/libslic3r/ExtrusionEntityCollection.hpp index f6dcfe566..07407421d 100644 --- a/src/libslic3r/ExtrusionEntityCollection.hpp +++ b/src/libslic3r/ExtrusionEntityCollection.hpp @@ -10,9 +10,14 @@ class ExtrusionEntityCollection : public ExtrusionEntity { public: ExtrusionEntityCollection* clone() const; + + /// Owned ExtrusionEntities and descendent ExtrusionEntityCollections. + /// Iterating over this needs to check each child to see if it, too is a collection. ExtrusionEntitiesPtr entities; // we own these entities + std::vector orig_indices; // handy for XS bool no_sort; + ExtrusionEntityCollection(): no_sort(false) {}; ExtrusionEntityCollection(const ExtrusionEntityCollection &other) : orig_indices(other.orig_indices), no_sort(other.no_sort) { this->append(other.entities); } ExtrusionEntityCollection(ExtrusionEntityCollection &&other) : entities(std::move(other.entities)), orig_indices(std::move(other.orig_indices)), no_sort(other.no_sort) {} @@ -21,6 +26,8 @@ public: ExtrusionEntityCollection& operator=(ExtrusionEntityCollection &&other) { this->entities = std::move(other.entities); this->orig_indices = std::move(other.orig_indices); this->no_sort = other.no_sort; return *this; } ~ExtrusionEntityCollection() { clear(); } + + /// Operator to convert and flatten this collection to a single vector of ExtrusionPaths. explicit operator ExtrusionPaths() const; bool is_collection() const { return true; }; @@ -80,11 +87,20 @@ public: { Polygons out; this->polygons_covered_by_width(out, scaled_epsilon); return out; } Polygons polygons_covered_by_spacing(const float scaled_epsilon = 0.f) const { Polygons out; this->polygons_covered_by_spacing(out, scaled_epsilon); return out; } + + /// Recursively count paths and loops contained in this collection size_t items_count() const; - void flatten(ExtrusionEntityCollection* retval) const; - ExtrusionEntityCollection flatten() const; - void flattenIfSortable(ExtrusionEntityCollection* retval) const; - ExtrusionEntityCollection flattenIfSortable() const; + + /// Returns a single vector of pointers to all non-collection items contained in this one + /// \param retval a pointer to the output memory space. + /// \param preserve_ordering Flag to method that will flatten if and only if the underlying collection is sortable when True (default: False). + void flatten(ExtrusionEntityCollection* retval, bool preserve_ordering = false) const; + + /// Returns a flattened copy of this ExtrusionEntityCollection. That is, all of the items in its entities vector are not collections. + /// You should be iterating over flatten().entities if you are interested in the underlying ExtrusionEntities (and don't care about hierarchy). + /// \param preserve_ordering Flag to method that will flatten if and only if the underlying collection is sortable when True (default: False). + ExtrusionEntityCollection flatten(bool preserve_ordering = false) const; + double min_mm3_per_mm() const; double total_volume() const override { double volume=0.; for (const auto& ent : entities) volume+=ent->total_volume(); return volume; } @@ -104,7 +120,34 @@ public: return 0.; } virtual void visit(ExtrusionVisitor &visitor) { visitor.use(*this); }; - virtual void visit(ExtrusionVisitor &visitor) const { visitor.use(*this); }; + virtual void visit(ExtrusionVisitorConst &visitor) const { visitor.use(*this); }; +}; + +//// visitors ///// + +class CountEntities : public ExtrusionVisitorConst { +public: + size_t count(const ExtrusionEntity &coll) { coll.visit(*this); return leaf_number; } + size_t leaf_number = 0; + virtual void default_use(const ExtrusionEntity &entity) override { ++leaf_number; } + virtual void use(const ExtrusionEntityCollection &coll) override; +}; + +class FlatenEntities : public ExtrusionVisitorConst { + ExtrusionEntityCollection to_fill; + bool preserve_ordering; +public: + FlatenEntities(bool preserve_ordering) : preserve_ordering(preserve_ordering) {} + FlatenEntities(ExtrusionEntityCollection pattern, bool preserve_ordering) : preserve_ordering(preserve_ordering) { + to_fill.no_sort = pattern.no_sort; + to_fill.orig_indices = pattern.orig_indices; + } + ExtrusionEntityCollection get() { + return to_fill; + }; + ExtrusionEntityCollection&& flatten(const ExtrusionEntityCollection &to_flatten) &&; + virtual void default_use(const ExtrusionEntity &entity) override { to_fill.append(entity); } + virtual void use(const ExtrusionEntityCollection &coll) override; }; } diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 9a851bbf9..64574d4a3 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -221,6 +221,7 @@ void make_fill(LayerRegion &layerm, ExtrusionEntityCollection &out) else if (!is_bridge) fill_pattern = layerm.region()->config().solid_fill_pattern.value; } else { + if (layerm.region()->config().infill_dense.getBool() && layerm.region()->config().fill_density<40 && surface.maxNbSolidLayersOnTop <= 1 diff --git a/src/libslic3r/Fill/FillRectilinear2.cpp b/src/libslic3r/Fill/FillRectilinear2.cpp index a0215e30a..33b83bc40 100644 --- a/src/libslic3r/Fill/FillRectilinear2.cpp +++ b/src/libslic3r/Fill/FillRectilinear2.cpp @@ -1420,7 +1420,8 @@ bool FillRectilinear2::fill_surface_by_lines(const Surface *surface, const FillP for (Polylines::iterator it = polylines_out.begin() + n_polylines_out_initial; it != polylines_out.end(); ++ it) { // No need to translate, the absolute position is irrelevant. // it->translate(- rotate_vector.second(0), - rotate_vector.second(1)); - assert(! it->has_duplicate_points()); + //assert(! it->has_duplicate_points()); + it->remove_duplicate_points(); it->rotate(rotate_vector.first); //FIXME rather simplify the paths to avoid very short edges? //assert(! it->has_duplicate_points()); @@ -1750,14 +1751,12 @@ FillRectilinearSawtooth::fill_surface_extrusion(const Surface *surface, const Fi idx++; } if (current_extrusion->size() < 2) extrusions->paths.pop_back(); - ExtrusionPrinter print; extrusions->visit(print); if (!extrusions->paths.empty()) eec->entities.push_back(extrusions); else delete extrusions; } // === end === if (!eec->empty()) { out.push_back(eec); - ExtrusionPrinter print; eec->visit(print); } else { delete eec; } diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index effe3caea..967513ec5 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2547,7 +2547,7 @@ void GCode::_write(FILE* file, const char *what) //const char * gcode_pp = _post_process(what).c_str(); std::string str_preproc{ what }; - _post_process(str_preproc); + //_post_process(str_preproc); const std::string str_ana = m_analyzer.process_gcode(str_preproc); @@ -3030,8 +3030,8 @@ void GCode::ObjectByExtruder::Island::Region::append(const std::string& type, co // First we append the entities, there are eec->entities.size() of them: - //don't do fill->entities because it will discard no_sort, we must use flattenIfSortable() - ExtrusionEntitiesPtr entities = eec->flattenIfSortable().entities; + //don't do fill->entities because it will discard no_sort, we must use flatten(preserve_ordering = true) + ExtrusionEntitiesPtr entities = eec->flatten(true).entities; perimeters_or_infills->append(entities); for (unsigned int i = 0; ifills.entities) { // fill represents infill extrusions of a single island. const auto *fill = dynamic_cast(ee); - if (!fill->entities.empty()) - if (fill != nullptr) - _3DScene::extrusionentity_to_verts(*fill, float(layer->print_z), copy, + if (fill != nullptr && !fill->entities.empty()) + _3DScene::extrusionentity_to_verts(*fill, + float(layer->print_z), + copy, volume(idx_layer, - is_solid_infill(fill->entities.front()->role()) ? - layerm->region()->config().solid_infill_extruder : - layerm->region()->config().infill_extruder, + is_solid_infill(fill->entities.front()->role()) ? + layerm->region()->config().solid_infill_extruder : + layerm->region()->config().infill_extruder, 1)); } } diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index ce8607f22..36d8d79db 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -19,6 +19,7 @@ set(SLIC3R_TEST_SOURCES libslic3r/test_print.cpp libslic3r/test_thin.cpp libslic3r/test_denserinfill.cpp + libslic3r/test_extrusion_entity.cpp ) if (NOT TARGET Catch) diff --git a/src/test/libslic3r/test_denserinfill.cpp b/src/test/libslic3r/test_denserinfill.cpp index 8c54002c4..d6e3ab8a0 100644 --- a/src/test/libslic3r/test_denserinfill.cpp +++ b/src/test/libslic3r/test_denserinfill.cpp @@ -1,4 +1,6 @@ +#define CATCH_CONFIG_DISABLE + #include #include "../test_data.hpp" #include "../../libslic3r/libslic3r.h"