From a552a7bc7889cad24a79c267c9743b7338bf0157 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 11 Jan 2019 11:15:32 +0100 Subject: [PATCH] Fixed a buggy test for a single extruder diameter for Single Extruder Multi Material prints & soluble supports. Disabled assert testing for the existence of "printer_technology" fields as it triggers on loading of legacy AMF/3MF files. --- src/libslic3r/Print.cpp | 26 +++++++++++++++----------- src/slic3r/GUI/Preset.hpp | 2 +- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 16fbb3738..f8d9f054a 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1282,16 +1282,20 @@ std::string Print::validate() const } } - { - // find the smallest nozzle diameter - std::vector extruders = this->extruders(); - if (extruders.empty()) - return L("The supplied settings will cause an empty print."); - - std::vector nozzle_diameters; - for (unsigned int extruder_id : extruders) - nozzle_diameters.push_back(m_config.nozzle_diameter.get_at(extruder_id)); - double min_nozzle_diameter = *std::min_element(nozzle_diameters.begin(), nozzle_diameters.end()); + { + // find the smallest nozzle diameter + std::vector extruders = this->extruders(); + if (extruders.empty()) + return L("The supplied settings will cause an empty print."); + + // Find the smallest used nozzle diameter and the number of unique nozzle diameters. + double min_nozzle_diameter = DBL_MAX; + double max_nozzle_diameter = 0; + for (unsigned int extruder_id : extruders) { + double dmr = m_config.nozzle_diameter.get_at(extruder_id); + min_nozzle_diameter = std::min(min_nozzle_diameter, dmr); + max_nozzle_diameter = std::max(max_nozzle_diameter, dmr); + } #if 0 // We currently allow one to assign extruders with a higher index than the number @@ -1304,7 +1308,7 @@ std::string Print::validate() const for (PrintObject *object : m_objects) { if (object->config().raft_layers > 0 || object->config().support_material.value) { - if ((object->config().support_material_extruder == 0 || object->config().support_material_interface_extruder == 0) && nozzle_diameters.size() > 1) { + if ((object->config().support_material_extruder == 0 || object->config().support_material_interface_extruder == 0) && max_nozzle_diameter - min_nozzle_diameter > EPSILON) { // The object has some form of support and either support_material_extruder or support_material_interface_extruder // will be printed with the current tool without a forced tool change. Play safe, assert that all object nozzles // are of the same diameter. diff --git a/src/slic3r/GUI/Preset.hpp b/src/slic3r/GUI/Preset.hpp index 021fea22c..eae406bef 100644 --- a/src/slic3r/GUI/Preset.hpp +++ b/src/slic3r/GUI/Preset.hpp @@ -166,7 +166,7 @@ public: auto *opt = cfg.option>("printer_technology"); // The following assert may trigger when importing some legacy profile, // but it is safer to keep it here to capture the cases where the "printer_technology" key is queried, where it should not. - assert(opt != nullptr); +// assert(opt != nullptr); return (opt == nullptr) ? ptFFF : opt->value; } PrinterTechnology printer_technology() const { return Preset::printer_technology(this->config); }