diff --git a/src/libslic3r/ExtrusionEntityCollection.cpp b/src/libslic3r/ExtrusionEntityCollection.cpp index e2da7c57d..f8ede16e9 100644 --- a/src/libslic3r/ExtrusionEntityCollection.cpp +++ b/src/libslic3r/ExtrusionEntityCollection.cpp @@ -26,10 +26,9 @@ ExtrusionEntityCollection::ExtrusionEntityCollection(const ExtrusionPaths &paths ExtrusionEntityCollection& ExtrusionEntityCollection::operator= (const ExtrusionEntityCollection &other) { - this->entities = other.entities; - for (size_t i = 0; i < this->entities.size(); ++i) - this->entities[i] = this->entities[i]->clone(); - this->no_sort = other.no_sort; + this->no_sort = other.no_sort; + clear(); + this->append(other.entities); return *this; } @@ -56,14 +55,6 @@ ExtrusionEntityCollection::operator ExtrusionPaths() const return paths; } -ExtrusionEntityCollection* ExtrusionEntityCollection::clone() const -{ - ExtrusionEntityCollection* coll = new ExtrusionEntityCollection(*this); - for (size_t i = 0; i < coll->entities.size(); ++i) - coll->entities[i] = this->entities[i]->clone(); - return coll; -} - void ExtrusionEntityCollection::reverse() { for (ExtrusionEntity *ptr : this->entities) @@ -118,7 +109,7 @@ ExtrusionEntityCollection ExtrusionEntityCollection::chained_path_from(const Ext ExtrusionEntityCollection out; out.entities = filter_by_extrusion_role(extrusion_entities, role); // Clone the extrusion entities. - for (auto &ptr : out.entities) + for (ExtrusionEntity* &ptr : out.entities) ptr = ptr->clone(); chain_and_reorder_extrusion_entities(out.entities, &start_near); return out; diff --git a/src/libslic3r/ExtrusionEntityCollection.hpp b/src/libslic3r/ExtrusionEntityCollection.hpp index 1d0f2f191..4f878a4f1 100644 --- a/src/libslic3r/ExtrusionEntityCollection.hpp +++ b/src/libslic3r/ExtrusionEntityCollection.hpp @@ -24,7 +24,7 @@ inline ExtrusionEntitiesPtr filter_by_extrusion_role(const ExtrusionEntitiesPtr class ExtrusionEntityCollection : public ExtrusionEntity { public: - virtual ExtrusionEntityCollection* clone() const override; + virtual ExtrusionEntityCollection* clone() const override { return new ExtrusionEntityCollection(*this); } // Create a new object, initialize it with this object using the move semantics. virtual ExtrusionEntityCollection* clone_move() override { return new ExtrusionEntityCollection(std::move(*this)); } @@ -86,8 +86,13 @@ public: void replace(size_t i, const ExtrusionEntity &entity); void remove(size_t i); static ExtrusionEntityCollection chained_path_from(const ExtrusionEntitiesPtr &extrusion_entities, const Point &start_near, ExtrusionRole role = erMixed); - ExtrusionEntityCollection chained_path_from(const Point &start_near, ExtrusionRole role = erMixed) const - { return (this->no_sort || (role == erMixed) )? *this : chained_path_from(this->entities, start_near, role); } + ExtrusionEntityCollection chained_path_from(const Point &start_near, ExtrusionRole role = erNone) const { + if (role == erNone) role = this->role(); + if( this->no_sort || (role == erMixed) ) + return *this; + else + return chained_path_from(this->entities, start_near, role); + } void reverse() override; const Point& first_point() const override { return this->entities.front()->first_point(); } const Point& last_point() const override { return this->entities.back()->last_point(); }