mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-08-15 00:26:09 +08:00
fixes to EEC: avoid duplicated clones, fix a possible memory leak
chained_path_from now chain if called with no second parameter
This commit is contained in:
parent
2c33dc9cc8
commit
4359c2a4f8
@ -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;
|
||||
|
@ -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(); }
|
||||
|
Loading…
x
Reference in New Issue
Block a user