diff --git a/src/libslic3r/ExtrusionEntityCollection.hpp b/src/libslic3r/ExtrusionEntityCollection.hpp index 7d6f92a528..613d531db0 100644 --- a/src/libslic3r/ExtrusionEntityCollection.hpp +++ b/src/libslic3r/ExtrusionEntityCollection.hpp @@ -62,6 +62,19 @@ public: } return out; } + bool has_perimeters() const + { + return std::any_of(entities.begin(), entities.end(), [](const ExtrusionEntity* ee) { return is_perimeter(ee->role()); }); + } + bool has_infill() const + { + return std::any_of(entities.begin(), entities.end(), [](const ExtrusionEntity* ee) { return is_infill(ee->role()); }); + } + bool has_solid_infill() const + { + return std::any_of(entities.begin(), entities.end(), [](const ExtrusionEntity* ee) { return is_solid_infill(ee->role()); }); + } + bool can_sort() const override { return !this->no_sort; } bool can_reverse() const override { diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index 03a3c491e9..1f2aa13e7f 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -1,3 +1,4 @@ +#include "ExtrusionEntity.hpp" #include "Print.hpp" #include "ToolOrdering.hpp" #include "Layer.hpp" @@ -171,12 +172,25 @@ unsigned int LayerTools::extruder(const ExtrusionEntityCollection &extrusions, c assert(region.config().sparse_infill_filament.value > 0); assert(region.config().solid_infill_filament.value > 0); // 1 based extruder ID. - unsigned int extruder = ((this->extruder_override == 0) ? - (is_infill(extrusions.role()) ? - (is_solid_infill(extrusions.entities.front()->role()) ? region.config().solid_infill_filament : region.config().sparse_infill_filament) : - region.config().wall_filament.value) : - this->extruder_override); - return (extruder == 0) ? 0 : extruder - 1; + unsigned int extruder = 1; + + if (this->extruder_override == 0) { + if (extrusions.has_infill()) { + if (extrusions.has_solid_infill()) { + extruder = region.config().solid_infill_filament; + } else { + extruder = region.config().sparse_infill_filament; + } + } else if (extrusions.has_perimeters()) { + extruder = region.config().wall_filament.value; + } else { + extruder = this->extruder_override; + } + } else { + extruder = this->extruder_override; + } + + return (extruder == 0) ? 0 : extruder - 1; } static double calc_max_layer_height(const PrintConfig &config, double max_object_layer_height) diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index b45edc8a85..a6f55a9bfe 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -2275,7 +2275,7 @@ DynamicPrintConfig PresetBundle::full_fff_config() const //BBS: add logic for settings check between different system presets out.erase("different_settings_to_system"); - static const char *keys[] = { "support_filament", "support_interface_filament" }; + static const char* keys[] = {"support_filament", "support_interface_filament", "wipe_tower_filament"}; for (size_t i = 0; i < sizeof(keys) / sizeof(keys[0]); ++ i) { std::string key = std::string(keys[i]); auto *opt = dynamic_cast(out.option(key, false)); @@ -2283,6 +2283,14 @@ DynamicPrintConfig PresetBundle::full_fff_config() const opt->value = boost::algorithm::clamp(opt->value, 0, int(num_filaments)); } + static const char* keys_1based[] = {"wall_filament", "sparse_infill_filament", "solid_infill_filament"}; + for (size_t i = 0; i < sizeof(keys_1based) / sizeof(keys_1based[0]); ++ i) { + std::string key = std::string(keys_1based[i]); + auto *opt = dynamic_cast(out.option(key, false)); + assert(opt != nullptr); + if(opt->value < 1 || opt->value > int(num_filaments)) + opt->value = 1; + } out.option("print_settings_id", true)->value = this->prints.get_selected_preset_name(); out.option("filament_settings_id", true)->values = this->filament_presets; out.option("printer_settings_id", true)->value = this->printers.get_selected_preset_name(); diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 72efdb02a8..0efc1a5421 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -2887,11 +2887,11 @@ static void apply_to_print_region_config(PrintRegionConfig &out, const DynamicPr // 1) Copy the "extruder key to sparse_infill_filament and wall_filament. auto *opt_extruder = in.opt(key_extruder); if (opt_extruder) - if (int extruder = opt_extruder->value; extruder != 1) { + if (int extruder = opt_extruder->value; extruder != 0) { // Not a default extruder. - out.sparse_infill_filament .value = extruder; - out.solid_infill_filament.value = extruder; - out.wall_filament .value = extruder; + out.sparse_infill_filament.value = extruder; + out.solid_infill_filament.value = extruder; + out.wall_filament.value = extruder; } // 2) Copy the rest of the values. for (auto it = in.cbegin(); it != in.cend(); ++ it)