From 56c4cfb202f47a8bdcccaef1005f992aa3395c1e Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Wed, 8 Feb 2023 10:39:41 +0100 Subject: [PATCH] Fix of supports for soluble / non-soluble after refactoring of extrusions into islands. Fixes #9647 --- src/libslic3r/ExtrusionRole.hpp | 5 +++++ src/libslic3r/GCode.cpp | 25 ++++++++++--------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/libslic3r/ExtrusionRole.hpp b/src/libslic3r/ExtrusionRole.hpp index a6426e0c6..5952d3fc5 100644 --- a/src/libslic3r/ExtrusionRole.hpp +++ b/src/libslic3r/ExtrusionRole.hpp @@ -83,6 +83,11 @@ struct ExtrusionRole : public ExtrusionRoleModifiers bool is_solid_infill() const { return this->is_infill() && this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Solid); } bool is_external() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::External); } bool is_bridge() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Bridge); } + + bool is_support() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Support); } + bool is_support_base() const { return this->is_support() && ! this->is_external(); } + bool is_support_interface() const { return this->is_support() && this->is_external(); } + bool is_mixed() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Mixed); } }; // Special flags describing loop diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index d6d47cf71..07209c8d1 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2246,29 +2246,24 @@ void GCode::process_layer_single_object( if (! print_wipe_extrusions && layer_to_print.support_layer != nullptr) if (const SupportLayer &support_layer = *layer_to_print.support_layer; ! support_layer.support_fills.entities.empty()) { ExtrusionRole role = support_layer.support_fills.role(); - bool has_support = role == ExtrusionRole::Mixed || role == ExtrusionRole::SupportMaterial; - bool has_interface = role == ExtrusionRole::Mixed || role == ExtrusionRole::SupportMaterialInterface; + bool has_support = role.is_mixed() || role.is_support_base(); + bool has_interface = role.is_mixed() || role.is_support_interface(); // Extruder ID of the support base. -1 if "don't care". unsigned int support_extruder = print_object.config().support_material_extruder.value - 1; // Shall the support be printed with the active extruder, preferably with non-soluble, to avoid tool changes? - bool support_dontcare = print_object.config().support_material_extruder.value == 0; + bool support_dontcare = support_extruder == std::numeric_limits::max(); // Extruder ID of the support interface. -1 if "don't care". unsigned int interface_extruder = print_object.config().support_material_interface_extruder.value - 1; // Shall the support interface be printed with the active extruder, preferably with non-soluble, to avoid tool changes? - bool interface_dontcare = print_object.config().support_material_interface_extruder.value == 0; + bool interface_dontcare = interface_extruder == std::numeric_limits::max(); if (support_dontcare || interface_dontcare) { // Some support will be printed with "don't care" material, preferably non-soluble. // Is the current extruder assigned a soluble filament? - unsigned int dontcare_extruder = layer_tools.extruders.front(); - if (print.config().filament_soluble.get_at(dontcare_extruder)) { - // The last extruder printed on the previous layer extrudes soluble filament. - // Try to find a non-soluble extruder on the same layer. - for (unsigned int extruder_id : layer_tools.extruders) - if (! print.config().filament_soluble.get_at(extruder_id)) { - dontcare_extruder = extruder_id; - break; - } - } + auto it_nonsoluble = std::find_if(layer_tools.extruders.begin(), layer_tools.extruders.end(), + [&soluble = std::as_const(print.config().filament_soluble)](unsigned int extruder_id) { return ! soluble.get_at(extruder_id); }); + // There should be a non-soluble extruder available. + assert(it_nonsoluble != layer_tools.extruders.end()); + unsigned int dontcare_extruder = it_nonsoluble == layer_tools.extruders.end() ? layer_tools.extruders.front() : *it_nonsoluble; if (support_dontcare) support_extruder = dontcare_extruder; if (interface_dontcare) @@ -2282,7 +2277,7 @@ void GCode::process_layer_single_object( m_object_layer_over_raft = false; gcode += this->extrude_support( // support_extrusion_role is ExtrusionRole::SupportMaterial, ExtrusionRole::SupportMaterialInterface or ExtrusionRole::Mixed for all extrusion paths. - support_layer.support_fills.chained_path_from(m_last_pos, has_support ? (has_interface ? ExtrusionRole::Mixed : ExtrusionRole::SupportMaterial) : ExtrusionRole::SupportMaterialInterface)); + support_layer.support_fills.chained_path_from(m_last_pos, extrude_support ? (extrude_interface ? ExtrusionRole::Mixed : ExtrusionRole::SupportMaterial) : ExtrusionRole::SupportMaterialInterface)); } }