FIX: add protection when sync presets from other printers

jira:STUDIO-12575

Signed-off-by: xun.zhang <xun.zhang@bambulab.com>
Change-Id: I5a22129fe12a3600dcc4e3f387374122e349e38c
(cherry picked from commit 21863f925db1eeb1db79ba5859840aa23f852180)
This commit is contained in:
xun.zhang
2025-06-06 21:04:36 +08:00
committed by Noisyfox
parent af0c9f7ce2
commit e1626c26b1
3 changed files with 12 additions and 7 deletions

View File

@@ -154,7 +154,7 @@ static const std::unordered_map<std::string, std::string> pre_family_model_map {
// 中间版本兼容性处理如果是nil值先改成default值再进行扩展 // 中间版本兼容性处理如果是nil值先改成default值再进行扩展
void extend_default_config_length(DynamicPrintConfig& config, const DynamicPrintConfig& defaults) void extend_default_config_length(DynamicPrintConfig& config, const bool set_nil_to_default, const DynamicPrintConfig& defaults)
{ {
constexpr int default_param_length = 1; constexpr int default_param_length = 1;
int filament_variant_length = default_param_length; int filament_variant_length = default_param_length;
@@ -171,7 +171,7 @@ void extend_default_config_length(DynamicPrintConfig& config, const DynamicPrint
auto replace_nil_and_resize = [&](const std::string & key, int length){ auto replace_nil_and_resize = [&](const std::string & key, int length){
ConfigOption* raw_ptr = config.option(key); ConfigOption* raw_ptr = config.option(key);
ConfigOptionVectorBase* opt_vec = static_cast<ConfigOptionVectorBase *>(raw_ptr); ConfigOptionVectorBase* opt_vec = static_cast<ConfigOptionVectorBase *>(raw_ptr);
if(raw_ptr->is_nil() && defaults.has(key) && std::find(filament_extruder_override_keys.begin(), filament_extruder_override_keys.end(), key) == filament_extruder_override_keys.end()){ if(set_nil_to_default && raw_ptr->is_nil() && defaults.has(key) && std::find(filament_extruder_override_keys.begin(), filament_extruder_override_keys.end(), key) == filament_extruder_override_keys.end()){
opt_vec->clear(); opt_vec->clear();
opt_vec->resize(length, defaults.option(key)); opt_vec->resize(length, defaults.option(key));
} }
@@ -1297,6 +1297,7 @@ void PresetCollection::load_presets(
if (inherit_preset) { if (inherit_preset) {
preset.config = inherit_preset->config; preset.config = inherit_preset->config;
preset.filament_id = inherit_preset->filament_id; preset.filament_id = inherit_preset->filament_id;
extend_default_config_length(config, false, {});
preset.config.update_diff_values_to_child_config(config, extruder_id_name, extruder_variant_name, *key_set1, *key_set2); preset.config.update_diff_values_to_child_config(config, extruder_id_name, extruder_variant_name, *key_set1, *key_set2);
} }
else { else {
@@ -1310,7 +1311,7 @@ void PresetCollection::load_presets(
// Find a default preset for the config. The PrintPresetCollection provides different default preset based on the "printer_technology" field. // Find a default preset for the config. The PrintPresetCollection provides different default preset based on the "printer_technology" field.
preset.config = default_preset.config; preset.config = default_preset.config;
preset.config.apply(std::move(config)); preset.config.apply(std::move(config));
extend_default_config_length(preset.config, default_preset.config); extend_default_config_length(preset.config, true, default_preset.config);
} }
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " load preset: " << name << " and filament_id: " << preset.filament_id << " and base_id: " << preset.base_id; BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " load preset: " << name << " and filament_id: " << preset.filament_id << " and base_id: " << preset.base_id;
@@ -1867,8 +1868,10 @@ bool PresetCollection::load_user_preset(std::string name, std::map<std::string,
} }
// Find a default preset for the config. The PrintPresetCollection provides different default preset based on the "printer_technology" field. // Find a default preset for the config. The PrintPresetCollection provides different default preset based on the "printer_technology" field.
new_config = default_preset.config; new_config = default_preset.config;
extend_default_config_length(new_config, default_preset.config);
} }
extend_default_config_length(cloud_config, false, {});
if (inherit_preset) { if (inherit_preset) {
std::string extruder_id_name, extruder_variant_name; std::string extruder_id_name, extruder_variant_name;
std::set<std::string> *key_set1 = nullptr, *key_set2 = nullptr; std::set<std::string> *key_set1 = nullptr, *key_set2 = nullptr;
@@ -1876,8 +1879,10 @@ bool PresetCollection::load_user_preset(std::string name, std::map<std::string,
new_config.update_diff_values_to_child_config(cloud_config, extruder_id_name, extruder_variant_name, *key_set1, *key_set2); new_config.update_diff_values_to_child_config(cloud_config, extruder_id_name, extruder_variant_name, *key_set1, *key_set2);
} }
else else{
new_config.apply(std::move(cloud_config)); new_config.apply(std::move(cloud_config));
extend_default_config_length(new_config, true, default_preset.config);
}
Preset::normalize(new_config); Preset::normalize(new_config);
// Report configuration fields, which are misplaced into a wrong group. // Report configuration fields, which are misplaced into a wrong group.
std::string incorrect_keys = Preset::remove_invalid_keys(new_config, default_preset.config); std::string incorrect_keys = Preset::remove_invalid_keys(new_config, default_preset.config);

View File

@@ -90,7 +90,7 @@ extern int get_values_from_json(std::string file_path, std::vector<std::string>&
extern ConfigFileType guess_config_file_type(const boost::property_tree::ptree &tree); extern ConfigFileType guess_config_file_type(const boost::property_tree::ptree &tree);
extern void extend_default_config_length(DynamicPrintConfig& config, const DynamicPrintConfig& defaults); extern void extend_default_config_length(DynamicPrintConfig& config, const bool set_nil_to_default, const DynamicPrintConfig& defaults);
class VendorProfile class VendorProfile
{ {

View File

@@ -924,7 +924,7 @@ bool PresetBundle::import_json_presets(PresetsConfigSubstitutions & s
const Preset &default_preset = collection->default_preset_for(config); const Preset &default_preset = collection->default_preset_for(config);
new_config = default_preset.config; new_config = default_preset.config;
new_config.apply(std::move(config)); new_config.apply(std::move(config));
extend_default_config_length(new_config, default_preset.config); extend_default_config_length(new_config, true, default_preset.config);
} }
Preset &preset = collection->load_preset(collection->path_from_name(name, inherit_preset == nullptr), name, std::move(new_config), false); Preset &preset = collection->load_preset(collection->path_from_name(name, inherit_preset == nullptr), name, std::move(new_config), false);