When loading a config bundle, make sure a config value is not accepted
if it is placed in a wrong group (for example, max_print_height does not belong to print settings, but a printer settings, so Slic3r will now complain about it being in print settings, and it will remove the value from the print settings).
This commit is contained in:
parent
6ea81279ff
commit
e8247c5646
2 changed files with 38 additions and 15 deletions
|
@ -244,6 +244,7 @@ public:
|
|||
const std::string& get_suffix_modified();
|
||||
|
||||
// Return a preset possibly with modifications.
|
||||
Preset& default_preset() { return m_presets.front(); }
|
||||
const Preset& default_preset() const { return m_presets.front(); }
|
||||
// Return a preset by an index. If the preset is active, a temporary copy is returned.
|
||||
Preset& preset(size_t idx) { return (int(idx) == m_idx_selected) ? m_edited_preset : m_presets[idx]; }
|
||||
|
|
|
@ -53,27 +53,31 @@ PresetBundle::PresetBundle() :
|
|||
wxImage::AddHandler(new wxPNGHandler);
|
||||
|
||||
// Create the ID config keys, as they are not part of the Static print config classes.
|
||||
this->prints.preset(0).config.opt_string("print_settings_id", true);
|
||||
this->filaments.preset(0).config.opt_string("filament_settings_id", true);
|
||||
this->printers.preset(0).config.opt_string("print_settings_id", true);
|
||||
this->prints.default_preset().config.opt_string("print_settings_id", true);
|
||||
this->filaments.default_preset().config.opt_string("filament_settings_id", true);
|
||||
this->printers.default_preset().config.opt_string("printer_settings_id", true);
|
||||
// Create the "compatible printers" keys, as they are not part of the Static print config classes.
|
||||
this->filaments.preset(0).config.optptr("compatible_printers", true);
|
||||
this->filaments.preset(0).config.optptr("compatible_printers_condition", true);
|
||||
this->prints.preset(0).config.optptr("compatible_printers", true);
|
||||
this->prints.preset(0).config.optptr("compatible_printers_condition", true);
|
||||
this->filaments.default_preset().config.optptr("compatible_printers", true);
|
||||
this->filaments.default_preset().config.optptr("compatible_printers_condition", true);
|
||||
this->prints.default_preset().config.optptr("compatible_printers", true);
|
||||
this->prints.default_preset().config.optptr("compatible_printers_condition", true);
|
||||
// Create the "inherits" keys.
|
||||
this->prints.preset(0).config.optptr("inherits", true);
|
||||
this->filaments.preset(0).config.optptr("inherits", true);
|
||||
this->printers.preset(0).config.optptr("inherits", true);
|
||||
this->prints.default_preset().config.optptr("inherits", true);
|
||||
this->filaments.default_preset().config.optptr("inherits", true);
|
||||
this->printers.default_preset().config.optptr("inherits", true);
|
||||
// Create the "printer_vendor", "printer_model" and "printer_variant" keys.
|
||||
this->printers.preset(0).config.optptr("printer_vendor", true);
|
||||
this->printers.preset(0).config.optptr("printer_model", true);
|
||||
this->printers.preset(0).config.optptr("printer_variant", true);
|
||||
|
||||
this->printers.default_preset().config.optptr("printer_vendor", true);
|
||||
this->printers.default_preset().config.optptr("printer_model", true);
|
||||
this->printers.default_preset().config.optptr("printer_variant", true);
|
||||
// Load the default preset bitmaps.
|
||||
this->prints .load_bitmap_default("cog.png");
|
||||
this->filaments.load_bitmap_default("spool.png");
|
||||
this->printers .load_bitmap_default("printer_empty.png");
|
||||
this->load_compatible_bitmaps();
|
||||
// Re-activate the default presets, so their "edited" preset copies will be updated with the additional configuration values above.
|
||||
this->prints .select_preset(0);
|
||||
this->filaments.select_preset(0);
|
||||
this->printers .select_preset(0);
|
||||
|
||||
this->project_config.apply_only(FullPrintConfig::defaults(), s_project_options);
|
||||
}
|
||||
|
@ -832,10 +836,28 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla
|
|||
continue;
|
||||
if (presets != nullptr) {
|
||||
// Load the print, filament or printer preset.
|
||||
DynamicPrintConfig config(presets->default_preset().config);
|
||||
const DynamicPrintConfig &default_config = presets->default_preset().config;
|
||||
DynamicPrintConfig config(default_config);
|
||||
for (auto &kvp : section.second)
|
||||
config.set_deserialize(kvp.first, kvp.second.data());
|
||||
Preset::normalize(config);
|
||||
// Report configuration fields, which are misplaced into a wrong group.
|
||||
std::string incorrect_keys;
|
||||
size_t n_incorrect_keys = 0;
|
||||
for (const std::string &key : config.keys())
|
||||
if (! default_config.has(key)) {
|
||||
if (incorrect_keys.empty())
|
||||
incorrect_keys = key;
|
||||
else {
|
||||
incorrect_keys += ", ";
|
||||
incorrect_keys += key;
|
||||
}
|
||||
config.erase(key);
|
||||
++ n_incorrect_keys;
|
||||
}
|
||||
if (! incorrect_keys.empty())
|
||||
BOOST_LOG_TRIVIAL(error) << "Error in a Vendor Config Bundle \"" << path << "\": The printer preset \"" <<
|
||||
section.first << "\" contains the following incorrect keys: " << incorrect_keys << ", which were removed";
|
||||
if ((flags & LOAD_CFGBNDLE_SYSTEM) && presets == &printers) {
|
||||
// Filter out printer presets, which are not mentioned in the vendor profile.
|
||||
// These presets are considered not installed.
|
||||
|
|
Loading…
Add table
Reference in a new issue