From 71ba15b6f08613826fb77d460178ce7b973644c4 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Sat, 7 Aug 2021 08:13:16 +0200 Subject: [PATCH] Fixed comparison of layer height profiles when printing with wipe tower: while the layer height profile vector may not contain all print z values, the only real case with two eqiuvalent layer height profiles is when one was created as a copy of another, so the vectors should in fact be equal. --- src/libslic3r/Print.cpp | 37 ++++--------------------------------- 1 file changed, 4 insertions(+), 33 deletions(-) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index c673f8810..b33e8bda2 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -434,6 +434,8 @@ static inline bool sequential_print_vertical_clearance_valid(const Print &print) return it == print_instances_ordered.end() || (*it)->print_object->height() <= scale_(print.config().extruder_clearance_height.value); } + + // Precondition: Print::validate() requires the Print::apply() to be called its invocation. std::string Print::validate(std::string* warning) const { @@ -526,42 +528,11 @@ std::string Print::validate(std::string* warning) const } if (has_custom_layering) { - const std::vector &layer_height_profile_tallest = layer_height_profiles[tallest_object_idx]; for (size_t idx_object = 0; idx_object < m_objects.size(); ++ idx_object) { if (idx_object == tallest_object_idx) continue; - const std::vector &layer_height_profile = layer_height_profiles[idx_object]; - - // The comparison of the profiles is not just about element-wise equality, some layers may not be - // explicitely included. Always remember z and height of last reference layer that in the vector - // and compare to that. In case some layers are in the vectors multiple times, only the last entry is - // taken into account and compared. - size_t i = 0; // index into tested profile - size_t j = 0; // index into reference profile - coordf_t ref_z = -1.; - coordf_t next_ref_z = layer_height_profile_tallest[0]; - coordf_t ref_height = -1.; - while (i < layer_height_profile.size()) { - coordf_t this_z = layer_height_profile[i]; - // find the last entry with this z - while (i+2 < layer_height_profile.size() && layer_height_profile[i+2] == this_z) - i += 2; - - coordf_t this_height = layer_height_profile[i+1]; - if (ref_height < -1. || next_ref_z < this_z + EPSILON) { - ref_z = next_ref_z; - do { // one layer can be in the vector several times - ref_height = layer_height_profile_tallest[j+1]; - if (j+2 >= layer_height_profile_tallest.size()) - break; - j += 2; - next_ref_z = layer_height_profile_tallest[j]; - } while (ref_z == next_ref_z); - } - if (std::abs(this_height - ref_height) > EPSILON) - return L("The Wipe tower is only supported if all objects have the same variable layer height"); - i += 2; - } + if (layer_height_profiles[idx_object] != layer_height_profiles[tallest_object_idx]) + return L("The Wipe tower is only supported if all objects have the same variable layer height"); } } }