Responding to comments in 6710b24 and incorporating suggested changes made by @supermerill from #4553 as a single function with a flag instead of two methods.

This commit is contained in:
Joseph Lenox 2019-05-17 12:14:26 -05:00 committed by Joseph Lenox
parent 4075d34d9d
commit 954f74cd63
4 changed files with 34 additions and 14 deletions

View File

@ -315,6 +315,7 @@ set(SLIC3R_TEST_SOURCES
${TESTDIR}/libslic3r/test_skirt_brim.cpp ${TESTDIR}/libslic3r/test_skirt_brim.cpp
${TESTDIR}/libslic3r/test_test_data.cpp ${TESTDIR}/libslic3r/test_test_data.cpp
${TESTDIR}/libslic3r/test_trianglemesh.cpp ${TESTDIR}/libslic3r/test_trianglemesh.cpp
${TESTDIR}/libslic3r/test_extrusion_entity.cpp
${TESTDIR}/libslic3r/test_3mf.cpp ${TESTDIR}/libslic3r/test_3mf.cpp
) )

View File

@ -220,25 +220,41 @@ ExtrusionEntityCollection::items_count() const
return count; return count;
} }
/* Returns a single vector of pointers to all non-collection items contained in this one */ /* Returns a single vector of chained (new) pointers to all non-collection items contained in this one */
void void
ExtrusionEntityCollection::flatten(ExtrusionEntityCollection* retval) const ExtrusionEntityCollection::flatten(ExtrusionEntityCollection* retval, bool preserve_ordering) const
{ {
for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it) { if (this->no_sort and preserve_ordering) {
if ((*it)->is_collection()) { /// if we want to preserve ordering and we can't sort, break out the unsorted ones first.
ExtrusionEntityCollection* collection = dynamic_cast<ExtrusionEntityCollection*>(*it); ExtrusionEntityCollection *unsortable = new ExtrusionEntityCollection(*this);
retval->append(collection->flatten().entities); retval->append(*unsortable);
} else { unsortable->entities.clear();
retval->append(**it); for (ExtrusionEntitiesPtr::const_iterator it = this->entities.begin(); it != this->entities.end(); ++it) {
if ((*it)->is_collection()) {
ExtrusionEntityCollection* collection = dynamic_cast<ExtrusionEntityCollection*>(*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<ExtrusionEntityCollection*>(*it);
retval->append(collection->flatten(preserve_ordering).entities);
} else {
retval->append(**it);
}
} }
} }
} }
ExtrusionEntityCollection ExtrusionEntityCollection
ExtrusionEntityCollection::flatten() const ExtrusionEntityCollection::flatten(bool preserve_ordering) const
{ {
ExtrusionEntityCollection coll; ExtrusionEntityCollection coll;
this->flatten(&coll); this->flatten(&coll, preserve_ordering);
return coll; return coll;
} }

View File

@ -24,7 +24,7 @@ class ExtrusionEntityCollection : public ExtrusionEntity
ExtrusionEntityCollection& operator= (const ExtrusionEntityCollection &other); ExtrusionEntityCollection& operator= (const ExtrusionEntityCollection &other);
~ExtrusionEntityCollection(); ~ExtrusionEntityCollection();
/// Operator to convert and flatten this collection to a single vefctor of ExtrusionPaths. /// Operator to convert and flatten this collection to a single vector of ExtrusionPaths.
operator ExtrusionPaths() const; operator ExtrusionPaths() const;
/// This particular ExtrusionEntity is a collection. /// This particular ExtrusionEntity is a collection.
@ -59,11 +59,14 @@ class ExtrusionEntityCollection : public ExtrusionEntity
size_t items_count() const; size_t items_count() const;
/// Returns a single vector of pointers to all non-collection items contained in this one /// Returns a single vector of pointers to all non-collection items contained in this one
void flatten(ExtrusionEntityCollection* retval) const; /// \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. /// 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). /// You should be iterating over flatten().entities if you are interested in the underlying ExtrusionEntities (and don't care about hierarchy).
ExtrusionEntityCollection flatten() const; /// \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 min_mm3_per_mm() const;

View File

@ -665,7 +665,7 @@ PrintGCode::process_layer(size_t idx, const Layer* layer, const Points& copies)
// the ExtrusionPath objects of a certain infill "group" (also called "surface" // the ExtrusionPath objects of a certain infill "group" (also called "surface"
// throughout the code). We can redefine the order of such Collections but we have to // throughout the code). We can redefine the order of such Collections but we have to
// do each one completely at once. // do each one completely at once.
for(auto* fill : layerm->fills.flatten().entities) { for(auto* fill : layerm->fills.flatten(true).entities) {
if(fill->length() == 0) continue; // this shouldn't happen but first_point() would fail if(fill->length() == 0) continue; // this shouldn't happen but first_point() would fail
auto extruder_id = fill->is_solid_infill() auto extruder_id = fill->is_solid_infill()