Making the "Default" extruder transparent for modifier meshes and layer

range modifiers.
This commit is contained in:
Vojtech Bubnik 2021-05-26 14:25:33 +02:00
parent b3195614cf
commit e24026bfa5
2 changed files with 31 additions and 16 deletions

View file

@ -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; }

View file

@ -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());