From e24026bfa524c2dab4a7506d636acf31d86007c0 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Wed, 26 May 2021 14:25:33 +0200 Subject: [PATCH] Making the "Default" extruder transparent for modifier meshes and layer range modifiers. --- src/libslic3r/PrintApply.cpp | 2 +- src/libslic3r/PrintObject.cpp | 45 +++++++++++++++++++++++------------ 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/libslic3r/PrintApply.cpp b/src/libslic3r/PrintApply.cpp index 3c1a03af66..003305c4da 100644 --- a/src/libslic3r/PrintApply.cpp +++ b/src/libslic3r/PrintApply.cpp @@ -594,7 +594,7 @@ const BoundingBoxf3* find_volume_extents(const PrintObjectRegions::LayerRangeReg return it != layer_range.volumes.end() && it->volume_id == volume.id() ? &it->bbox : nullptr; } -PrintRegionConfig region_config_from_model_volume(const PrintRegionConfig &default_region_config, const DynamicPrintConfig *layer_range_config, const ModelVolume &volume, size_t num_extruders); +PrintRegionConfig region_config_from_model_volume(const PrintRegionConfig &default_or_parent_region_config, const DynamicPrintConfig *layer_range_config, const ModelVolume &volume, size_t num_extruders); void print_region_ref_inc(PrintRegion &r) { ++ r.m_ref_cnt; } void print_region_ref_reset(PrintRegion &r) { r.m_ref_cnt = 0; } diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 1f5246fcea..c0964b032f 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -1536,34 +1536,49 @@ PrintObjectConfig PrintObject::object_config_from_model_object(const PrintObject return config; } +const std::string key_extruder { "extruder" }; +static constexpr const std::initializer_list keys_extruders { "infill_extruder", "solid_infill_extruder", "perimeter_extruder" }; + static void apply_to_print_region_config(PrintRegionConfig &out, const DynamicPrintConfig &in) { // 1) Copy the "extruder key to infill_extruder and perimeter_extruder. - std::string sextruder = "extruder"; - auto *opt_extruder = in.opt(sextruder); - if (opt_extruder) { - int extruder = opt_extruder->value; - if (extruder != 0) { + auto *opt_extruder = in.opt(key_extruder); + if (opt_extruder) + if (int extruder = opt_extruder->value; extruder != 0) { + // Not a default extruder. out.infill_extruder .value = extruder; out.solid_infill_extruder.value = extruder; out.perimeter_extruder .value = extruder; } - } // 2) Copy the rest of the values. for (auto it = in.cbegin(); it != in.cend(); ++ it) - if (it->first != sextruder) { - ConfigOption *my_opt = out.option(it->first, false); - if (my_opt) - my_opt->set(it->second.get()); - } + if (it->first != key_extruder) + if (ConfigOption* my_opt = out.option(it->first, false); my_opt != nullptr) { + if (one_of(it->first, keys_extruders)) { + // Ignore "default" extruders. + int extruder = static_cast(it->second.get())->value; + if (extruder > 0) + my_opt->setInt(extruder); + } else + my_opt->set(it->second.get()); + } } -PrintRegionConfig region_config_from_model_volume(const PrintRegionConfig &default_region_config, const DynamicPrintConfig *layer_range_config, const ModelVolume &volume, size_t num_extruders) +PrintRegionConfig region_config_from_model_volume(const PrintRegionConfig &default_or_parent_region_config, const DynamicPrintConfig *layer_range_config, const ModelVolume &volume, size_t num_extruders) { - PrintRegionConfig config = default_region_config; - apply_to_print_region_config(config, volume.get_object()->config.get()); - if (layer_range_config != nullptr) + PrintRegionConfig config = default_or_parent_region_config; + if (volume.is_model_part()) { + // default_or_parent_region_config contains the Print's PrintRegionConfig. + // Override with ModelObject's PrintRegionConfig values. + apply_to_print_region_config(config, volume.get_object()->config.get()); + } else { + // default_or_parent_region_config contains parent PrintRegion config, which already contains ModelVolume's config. + } + if (layer_range_config != nullptr) { + // Not applicable to modifiers. + assert(volume.is_model_part()); apply_to_print_region_config(config, *layer_range_config); + } apply_to_print_region_config(config, volume.config.get()); if (! volume.material_id().empty()) apply_to_print_region_config(config, volume.material()->config.get());