mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-18 12:17:54 -06:00
Implemented "renamed_from" attribute of a system profile,
so that references from user profiles and .3mfs / .amfs to system profiles are not being lost. If a system profile has no "renamed_from" profile name assigned, and the system profile name contains "@", then a profile name with the "@" is implicitely assumed to be the name, from which this profile has been renamed.
This commit is contained in:
parent
bb56988916
commit
0d9022c5f6
3 changed files with 97 additions and 36 deletions
|
@ -590,6 +590,7 @@ void PresetCollection::reset(bool delete_files)
|
||||||
m_presets.erase(m_presets.begin() + m_num_default_presets, m_presets.end());
|
m_presets.erase(m_presets.begin() + m_num_default_presets, m_presets.end());
|
||||||
this->select_preset(0);
|
this->select_preset(0);
|
||||||
}
|
}
|
||||||
|
m_map_system_profile_renamed.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PresetCollection::add_default_preset(const std::vector<std::string> &keys, const Slic3r::StaticPrintConfig &defaults, const std::string &preset_name)
|
void PresetCollection::add_default_preset(const std::vector<std::string> &keys, const Slic3r::StaticPrintConfig &defaults, const std::string &preset_name)
|
||||||
|
@ -703,6 +704,11 @@ Preset& PresetCollection::load_external_preset(
|
||||||
// Is there a preset already loaded with the name stored inside the config?
|
// Is there a preset already loaded with the name stored inside the config?
|
||||||
std::deque<Preset>::iterator it = this->find_preset_internal(original_name);
|
std::deque<Preset>::iterator it = this->find_preset_internal(original_name);
|
||||||
bool found = it != m_presets.end() && it->name == original_name;
|
bool found = it != m_presets.end() && it->name == original_name;
|
||||||
|
if (! found) {
|
||||||
|
// Try to match the original_name against the "renamed_from" profile names of loaded system profiles.
|
||||||
|
it = this->find_preset_renamed(original_name);
|
||||||
|
found = it != m_presets.end();
|
||||||
|
}
|
||||||
if (found && profile_print_params_same(it->config, cfg)) {
|
if (found && profile_print_params_same(it->config, cfg)) {
|
||||||
// The preset exists and it matches the values stored inside config.
|
// The preset exists and it matches the values stored inside config.
|
||||||
if (select)
|
if (select)
|
||||||
|
@ -872,24 +878,27 @@ const Preset* PresetCollection::get_selected_preset_parent() const
|
||||||
if (this->get_selected_idx() == -1)
|
if (this->get_selected_idx() == -1)
|
||||||
// This preset collection has no preset activated yet. Only the get_edited_preset() is valid.
|
// This preset collection has no preset activated yet. Only the get_edited_preset() is valid.
|
||||||
return nullptr;
|
return nullptr;
|
||||||
// const std::string &inherits = this->get_edited_preset().inherits();
|
|
||||||
// if (inherits.empty())
|
|
||||||
// return this->get_selected_preset().is_system ? &this->get_selected_preset() : nullptr;
|
|
||||||
|
|
||||||
std::string inherits = this->get_edited_preset().inherits();
|
const Preset &selected_preset = this->get_selected_preset();
|
||||||
if (inherits.empty())
|
if (selected_preset.is_system || selected_preset.is_default)
|
||||||
{
|
return &selected_preset;
|
||||||
if (this->get_selected_preset().is_system || this->get_selected_preset().is_default)
|
|
||||||
return &this->get_selected_preset();
|
const Preset &edited_preset = this->get_edited_preset();
|
||||||
if (this->get_selected_preset().is_external)
|
const std::string &inherits = edited_preset.inherits();
|
||||||
|
const Preset *preset = nullptr;
|
||||||
|
if (inherits.empty()) {
|
||||||
|
if (selected_preset.is_external)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
preset = &this->default_preset(m_type == Preset::Type::TYPE_PRINTER && edited_preset.printer_technology() == ptSLA ? 1 : 0);
|
||||||
inherits = m_type != Preset::Type::TYPE_PRINTER ? "- default -" :
|
} else
|
||||||
this->get_edited_preset().printer_technology() == ptFFF ?
|
preset = this->find_preset(inherits, false);
|
||||||
"- default FFF -" : "- default SLA -" ;
|
if (preset == nullptr) {
|
||||||
|
// Resolve the "renamed_from" field.
|
||||||
|
assert(! inherits.empty());
|
||||||
|
auto it = this->find_preset_renamed(inherits);
|
||||||
|
if (it != m_presets.end())
|
||||||
|
preset = &(*it);
|
||||||
}
|
}
|
||||||
|
|
||||||
const Preset* preset = this->find_preset(inherits, false);
|
|
||||||
return (preset == nullptr/* || preset->is_default*/ || preset->is_external) ? nullptr : preset;
|
return (preset == nullptr/* || preset->is_default*/ || preset->is_external) ? nullptr : preset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -900,6 +909,11 @@ const Preset* PresetCollection::get_preset_parent(const Preset& child) const
|
||||||
// return this->get_selected_preset().is_system ? &this->get_selected_preset() : nullptr;
|
// return this->get_selected_preset().is_system ? &this->get_selected_preset() : nullptr;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
const Preset* preset = this->find_preset(inherits, false);
|
const Preset* preset = this->find_preset(inherits, false);
|
||||||
|
if (preset == nullptr) {
|
||||||
|
auto it = this->find_preset_renamed(inherits);
|
||||||
|
if (it != m_presets.end())
|
||||||
|
preset = &(*it);
|
||||||
|
}
|
||||||
return (preset == nullptr/* || preset->is_default */|| preset->is_external) ? nullptr : preset;
|
return (preset == nullptr/* || preset->is_default */|| preset->is_external) ? nullptr : preset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1402,6 +1416,17 @@ std::vector<std::string> PresetCollection::merge_presets(PresetCollection &&othe
|
||||||
return duplicates;
|
return duplicates;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PresetCollection::update_map_system_profile_renamed()
|
||||||
|
{
|
||||||
|
m_map_system_profile_renamed.clear();
|
||||||
|
for (Preset &preset : m_presets)
|
||||||
|
for (const std::string &renamed_from : preset.renamed_from) {
|
||||||
|
const auto [it, success] = m_map_system_profile_renamed.insert(std::pair<std::string, std::string>(renamed_from, preset.name));
|
||||||
|
if (! success)
|
||||||
|
BOOST_LOG_TRIVIAL(error) << boost::format("Preset name \"%1%\" was marked as renamed from \"%2%\", though preset name \"%3%\" was marked as renamed from \"%2%\" as well.") % preset.name % renamed_from % it->second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::string PresetCollection::name() const
|
std::string PresetCollection::name() const
|
||||||
{
|
{
|
||||||
switch (this->type()) {
|
switch (this->type()) {
|
||||||
|
|
|
@ -163,6 +163,10 @@ public:
|
||||||
|
|
||||||
// Alias of the preset
|
// Alias of the preset
|
||||||
std::string alias = "";
|
std::string alias = "";
|
||||||
|
// List of profile names, from which this profile was renamed at some point of time.
|
||||||
|
// This list is then used to match profiles by their names when loaded from .gcode, .3mf, .amf,
|
||||||
|
// and to match the "inherits" field of user profiles with updated system profiles.
|
||||||
|
std::vector<std::string> renamed_from;
|
||||||
|
|
||||||
void save();
|
void save();
|
||||||
|
|
||||||
|
@ -333,7 +337,8 @@ public:
|
||||||
// The parent preset may be a system preset or a user preset, which will be
|
// The parent preset may be a system preset or a user preset, which will be
|
||||||
// reflected by the UI.
|
// reflected by the UI.
|
||||||
const Preset* get_selected_preset_parent() const;
|
const Preset* get_selected_preset_parent() const;
|
||||||
// get parent preset for some child preset
|
// Get parent preset for a child preset, based on the "inherits" field of a child,
|
||||||
|
// where the "inherits" profile name is searched for in both m_presets and m_map_system_profile_renamed.
|
||||||
const Preset* get_preset_parent(const Preset& child) const;
|
const Preset* get_preset_parent(const Preset& child) const;
|
||||||
// Return the selected preset including the user modifications.
|
// Return the selected preset including the user modifications.
|
||||||
Preset& get_edited_preset() { return m_edited_preset; }
|
Preset& get_edited_preset() { return m_edited_preset; }
|
||||||
|
@ -465,6 +470,9 @@ protected:
|
||||||
// Merge one vendor's presets with the other vendor's presets, report duplicates.
|
// Merge one vendor's presets with the other vendor's presets, report duplicates.
|
||||||
std::vector<std::string> merge_presets(PresetCollection &&other, const VendorMap &new_vendors);
|
std::vector<std::string> merge_presets(PresetCollection &&other, const VendorMap &new_vendors);
|
||||||
|
|
||||||
|
// Update m_map_system_profile_renamed from loaded system profiles.
|
||||||
|
void update_map_system_profile_renamed();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PresetCollection();
|
PresetCollection();
|
||||||
PresetCollection(const PresetCollection &other);
|
PresetCollection(const PresetCollection &other);
|
||||||
|
@ -490,6 +498,14 @@ private:
|
||||||
}
|
}
|
||||||
std::deque<Preset>::const_iterator find_preset_internal(const std::string &name) const
|
std::deque<Preset>::const_iterator find_preset_internal(const std::string &name) const
|
||||||
{ return const_cast<PresetCollection*>(this)->find_preset_internal(name); }
|
{ return const_cast<PresetCollection*>(this)->find_preset_internal(name); }
|
||||||
|
std::deque<Preset>::iterator find_preset_renamed(const std::string &name) {
|
||||||
|
auto it_renamed = m_map_system_profile_renamed.find(name);
|
||||||
|
auto it = (it_renamed == m_map_system_profile_renamed.end()) ? m_presets.end() : this->find_preset_internal(it_renamed->second);
|
||||||
|
assert((it_renamed == m_map_system_profile_renamed.end()) || (it != m_presets.end() && it->name == it_renamed->second));
|
||||||
|
return it;
|
||||||
|
}
|
||||||
|
std::deque<Preset>::const_iterator find_preset_renamed(const std::string &name) const
|
||||||
|
{ return const_cast<PresetCollection*>(this)->find_preset_renamed(name); }
|
||||||
|
|
||||||
size_t update_compatible_internal(const PresetWithVendorProfile &active_printer, const PresetWithVendorProfile *active_print, bool unselect_if_incompatible);
|
size_t update_compatible_internal(const PresetWithVendorProfile &active_printer, const PresetWithVendorProfile *active_print, bool unselect_if_incompatible);
|
||||||
|
|
||||||
|
@ -501,6 +517,8 @@ private:
|
||||||
// Use deque to force the container to allocate an object per each entry,
|
// Use deque to force the container to allocate an object per each entry,
|
||||||
// so that the addresses of the presets don't change during resizing of the container.
|
// so that the addresses of the presets don't change during resizing of the container.
|
||||||
std::deque<Preset> m_presets;
|
std::deque<Preset> m_presets;
|
||||||
|
// Map from old system profile name to a current system profile name.
|
||||||
|
std::map<std::string, std::string> m_map_system_profile_renamed;
|
||||||
// Initially this preset contains a copy of the selected preset. Later on, this copy may be modified by the user.
|
// Initially this preset contains a copy of the selected preset. Later on, this copy may be modified by the user.
|
||||||
Preset m_edited_preset;
|
Preset m_edited_preset;
|
||||||
// Selected preset.
|
// Selected preset.
|
||||||
|
|
|
@ -288,6 +288,11 @@ std::string PresetBundle::load_system_presets()
|
||||||
// No config bundle loaded, reset.
|
// No config bundle loaded, reset.
|
||||||
this->reset(false);
|
this->reset(false);
|
||||||
}
|
}
|
||||||
|
this->prints .update_map_system_profile_renamed();
|
||||||
|
this->sla_prints .update_map_system_profile_renamed();
|
||||||
|
this->filaments .update_map_system_profile_renamed();
|
||||||
|
this->sla_materials.update_map_system_profile_renamed();
|
||||||
|
this->printers .update_map_system_profile_renamed();
|
||||||
return errors_cummulative;
|
return errors_cummulative;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1132,7 +1137,6 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla
|
||||||
PresetCollection *presets = nullptr;
|
PresetCollection *presets = nullptr;
|
||||||
std::vector<std::string> *loaded = nullptr;
|
std::vector<std::string> *loaded = nullptr;
|
||||||
std::string preset_name;
|
std::string preset_name;
|
||||||
std::string alias_name;
|
|
||||||
if (boost::starts_with(section.first, "print:")) {
|
if (boost::starts_with(section.first, "print:")) {
|
||||||
presets = &this->prints;
|
presets = &this->prints;
|
||||||
loaded = &loaded_prints;
|
loaded = &loaded_prints;
|
||||||
|
@ -1141,12 +1145,6 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla
|
||||||
presets = &this->filaments;
|
presets = &this->filaments;
|
||||||
loaded = &loaded_filaments;
|
loaded = &loaded_filaments;
|
||||||
preset_name = section.first.substr(9);
|
preset_name = section.first.substr(9);
|
||||||
|
|
||||||
for (const auto& item : section.second)
|
|
||||||
if (boost::starts_with(item.first, "alias")) {
|
|
||||||
alias_name = item.second.data();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (boost::starts_with(section.first, "sla_print:")) {
|
} else if (boost::starts_with(section.first, "sla_print:")) {
|
||||||
presets = &this->sla_prints;
|
presets = &this->sla_prints;
|
||||||
loaded = &loaded_sla_prints;
|
loaded = &loaded_sla_prints;
|
||||||
|
@ -1155,9 +1153,6 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla
|
||||||
presets = &this->sla_materials;
|
presets = &this->sla_materials;
|
||||||
loaded = &loaded_sla_materials;
|
loaded = &loaded_sla_materials;
|
||||||
preset_name = section.first.substr(13);
|
preset_name = section.first.substr(13);
|
||||||
|
|
||||||
int end_pos = preset_name.find_first_of("0.");
|
|
||||||
alias_name = preset_name.substr(0, end_pos-1);
|
|
||||||
} else if (boost::starts_with(section.first, "printer:")) {
|
} else if (boost::starts_with(section.first, "printer:")) {
|
||||||
presets = &this->printers;
|
presets = &this->printers;
|
||||||
loaded = &loaded_printers;
|
loaded = &loaded_printers;
|
||||||
|
@ -1213,19 +1208,32 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla
|
||||||
// Load the print, filament or printer preset.
|
// Load the print, filament or printer preset.
|
||||||
const DynamicPrintConfig *default_config = nullptr;
|
const DynamicPrintConfig *default_config = nullptr;
|
||||||
DynamicPrintConfig config;
|
DynamicPrintConfig config;
|
||||||
|
std::string alias_name;
|
||||||
|
std::vector<std::string> renamed_from;
|
||||||
|
auto parse_config_section = [§ion, &alias_name, &renamed_from, &path](DynamicPrintConfig &config) {
|
||||||
|
for (auto &kvp : section.second) {
|
||||||
|
if (kvp.first == "alias")
|
||||||
|
alias_name = kvp.second.data();
|
||||||
|
else if (kvp.first == "renamed_from") {
|
||||||
|
if (! unescape_strings_cstyle(kvp.second.data(), renamed_from)) {
|
||||||
|
BOOST_LOG_TRIVIAL(error) << "Error in a Vendor Config Bundle \"" << path << "\": The preset \"" <<
|
||||||
|
section.first << "\" contains invalid \"renamed_from\" key, which is being ignored.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
config.set_deserialize(kvp.first, kvp.second.data());
|
||||||
|
}
|
||||||
|
};
|
||||||
if (presets == &this->printers) {
|
if (presets == &this->printers) {
|
||||||
// Select the default config based on the printer_technology field extracted from kvp.
|
// Select the default config based on the printer_technology field extracted from kvp.
|
||||||
DynamicPrintConfig config_src;
|
DynamicPrintConfig config_src;
|
||||||
for (auto &kvp : section.second)
|
parse_config_section(config_src);
|
||||||
config_src.set_deserialize(kvp.first, kvp.second.data());
|
|
||||||
default_config = &presets->default_preset_for(config_src).config;
|
default_config = &presets->default_preset_for(config_src).config;
|
||||||
config = *default_config;
|
config = *default_config;
|
||||||
config.apply(config_src);
|
config.apply(config_src);
|
||||||
} else {
|
} else {
|
||||||
default_config = &presets->default_preset().config;
|
default_config = &presets->default_preset().config;
|
||||||
config = *default_config;
|
config = *default_config;
|
||||||
for (auto &kvp : section.second)
|
parse_config_section(config);
|
||||||
config.set_deserialize(kvp.first, kvp.second.data());
|
|
||||||
}
|
}
|
||||||
Preset::normalize(config);
|
Preset::normalize(config);
|
||||||
// Report configuration fields, which are misplaced into a wrong group.
|
// Report configuration fields, which are misplaced into a wrong group.
|
||||||
|
@ -1304,12 +1312,22 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla
|
||||||
loaded.vendor = vendor_profile;
|
loaded.vendor = vendor_profile;
|
||||||
}
|
}
|
||||||
|
|
||||||
// next step of an preset name aliasing
|
// Derive the profile logical name aka alias from the preset name if the alias was not stated explicitely.
|
||||||
int end_pos = preset_name.find_first_of("@");
|
if (alias_name.empty()) {
|
||||||
if (end_pos != std::string::npos)
|
int end_pos = preset_name.find_first_of("@");
|
||||||
alias_name = preset_name.substr(0, end_pos - 1);
|
if (end_pos != std::string::npos) {
|
||||||
|
alias_name = preset_name.substr(0, end_pos);
|
||||||
loaded.alias = alias_name.empty() ? preset_name : alias_name;
|
if (renamed_from.empty())
|
||||||
|
// Add the preset name with the '@' character removed into the "renamed_from" list.
|
||||||
|
renamed_from.emplace_back(alias_name + preset_name.substr(end_pos + 1));
|
||||||
|
boost::trim_right(alias_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (alias_name.empty())
|
||||||
|
loaded.alias = preset_name;
|
||||||
|
else
|
||||||
|
loaded.alias = std::move(alias_name);
|
||||||
|
loaded.renamed_from = std::move(renamed_from);
|
||||||
|
|
||||||
++ presets_loaded;
|
++ presets_loaded;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue