diff options
author | Vojtech Bubnik <bubnikv@gmail.com> | 2021-05-26 15:25:33 +0300 |
---|---|---|
committer | Vojtech Bubnik <bubnikv@gmail.com> | 2021-05-26 15:25:33 +0300 |
commit | e24026bfa524c2dab4a7506d636acf31d86007c0 (patch) | |
tree | c3f96b16be61497e4898387e85e58419d3accbe2 /src | |
parent | b3195614cf62610b0c12589006a3a970a6768de3 (diff) |
Making the "Default" extruder transparent for modifier meshes and layer
range modifiers.
Diffstat (limited to 'src')
-rw-r--r-- | src/libslic3r/PrintApply.cpp | 2 | ||||
-rw-r--r-- | 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 3c1a03af6..003305c4d 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 1f5246fce..c0964b032 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<std::string_view> 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<ConfigOptionInt>(sextruder); - if (opt_extruder) { - int extruder = opt_extruder->value; - if (extruder != 0) { + auto *opt_extruder = in.opt<ConfigOptionInt>(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<const ConfigOptionInt*>(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()); |