FIX: config: fix some potential crash when switch configs

switch configs between single extruder and multiple extruders
jira: no-jira

Change-Id: I3a7ebd590b061f7dec4d8d12d5508e869a941beb
This commit is contained in:
lane.wei 2025-03-12 09:05:11 +08:00
parent 576d931475
commit 1e4c82c781
1 changed files with 77 additions and 53 deletions

View File

@ -6181,57 +6181,68 @@ int DynamicPrintConfig::update_values_from_single_to_multi(DynamicPrintConfig& m
switch (optdef->type) { switch (optdef->type) {
case coStrings: case coStrings:
{ {
ConfigOptionStrings * opt = this->option<ConfigOptionStrings>(key); ConfigOptionStrings* src_opt = multi_config.option<ConfigOptionStrings>(key);
ConfigOptionStrings * src_opt = multi_config.option<ConfigOptionStrings>(key); if (src_opt) {
ConfigOptionStrings* opt = this->option<ConfigOptionStrings>(key, true);
opt->values = src_opt->values; opt->values = src_opt->values;
}
break; break;
} }
case coInts: case coInts:
{ {
ConfigOptionInts * opt = this->option<ConfigOptionInts>(key); ConfigOptionInts* src_opt = multi_config.option<ConfigOptionInts>(key);
ConfigOptionInts * src_opt = multi_config.option<ConfigOptionInts>(key); if (src_opt) {
ConfigOptionInts* opt = this->option<ConfigOptionInts>(key, true);
opt->values = src_opt->values; opt->values = src_opt->values;
}
break; break;
} }
case coFloats: case coFloats:
{ {
ConfigOptionFloats * opt = this->option<ConfigOptionFloats>(key);
ConfigOptionFloats * src_opt = multi_config.option<ConfigOptionFloats>(key); ConfigOptionFloats * src_opt = multi_config.option<ConfigOptionFloats>(key);
if (src_opt) {
ConfigOptionFloats * opt = this->option<ConfigOptionFloats>(key, true);
assert(variant_count == src_opt->size()); assert(variant_count == src_opt->size());
opt->resize(variant_count, opt); opt->resize(variant_count, opt);
for (int index = 0; index < variant_count; index++) for (int index = 0; index < variant_count; index++)
{ {
if (opt->values[index] > src_opt->values[index]) if (opt->values[index] > src_opt->values[index])
opt->values[index] = src_opt->values[index]; opt->values[index] = src_opt->values[index];
}
} }
break; break;
} }
case coFloatsOrPercents: case coFloatsOrPercents:
{ {
ConfigOptionFloatsOrPercents * opt = this->option<ConfigOptionFloatsOrPercents>(key);
ConfigOptionFloatsOrPercents * src_opt = multi_config.option<ConfigOptionFloatsOrPercents>(key); ConfigOptionFloatsOrPercents * src_opt = multi_config.option<ConfigOptionFloatsOrPercents>(key);
if (src_opt) {
ConfigOptionFloatsOrPercents * opt = this->option<ConfigOptionFloatsOrPercents>(key, true);
assert(variant_count == src_opt->size()); assert(variant_count == src_opt->size());
opt->resize(variant_count, opt); opt->resize(variant_count, opt);
for (int index = 0; index < variant_count; index++) for (int index = 0; index < variant_count; index++)
{ {
if (opt->values[index].value > src_opt->values[index].value) if (opt->values[index].value > src_opt->values[index].value)
opt->values[index] = src_opt->values[index]; opt->values[index] = src_opt->values[index];
}
} }
break; break;
} }
case coBools: case coBools:
{ {
ConfigOptionBools * opt = this->option<ConfigOptionBools>(key);
ConfigOptionBools * src_opt = multi_config.option<ConfigOptionBools>(key); ConfigOptionBools * src_opt = multi_config.option<ConfigOptionBools>(key);
if (src_opt)
{
ConfigOptionBools * opt = this->option<ConfigOptionBools>(key, true);
assert(variant_count == src_opt->size()); assert(variant_count == src_opt->size());
opt->resize(variant_count, opt); opt->resize(variant_count, opt);
}
break; break;
} }
@ -6271,7 +6282,7 @@ int DynamicPrintConfig::update_values_from_single_to_multi_2(DynamicPrintConfig&
ConfigOptionFloatsNullable * opt = this->option<ConfigOptionFloatsNullable>(key); ConfigOptionFloatsNullable * opt = this->option<ConfigOptionFloatsNullable>(key);
ConfigOptionFloatsNullable* src_opt = multi_config.option<ConfigOptionFloatsNullable>(key); ConfigOptionFloatsNullable* src_opt = multi_config.option<ConfigOptionFloatsNullable>(key);
if (!opt->is_nil(0)) if (src_opt && !opt->is_nil(0))
opt->values.resize(src_opt->size(), opt->values[0]); opt->values.resize(src_opt->size(), opt->values[0]);
break; break;
} }
@ -6280,7 +6291,7 @@ int DynamicPrintConfig::update_values_from_single_to_multi_2(DynamicPrintConfig&
ConfigOptionFloatsOrPercentsNullable* opt = this->option<ConfigOptionFloatsOrPercentsNullable>(key); ConfigOptionFloatsOrPercentsNullable* opt = this->option<ConfigOptionFloatsOrPercentsNullable>(key);
ConfigOptionFloatsOrPercentsNullable* src_opt = multi_config.option<ConfigOptionFloatsOrPercentsNullable>(key); ConfigOptionFloatsOrPercentsNullable* src_opt = multi_config.option<ConfigOptionFloatsOrPercentsNullable>(key);
if (!opt->is_nil(0)) if (src_opt &&!opt->is_nil(0))
opt->values.resize(src_opt->size(), opt->values[0]); opt->values.resize(src_opt->size(), opt->values[0]);
break; break;
} }
@ -6289,7 +6300,7 @@ int DynamicPrintConfig::update_values_from_single_to_multi_2(DynamicPrintConfig&
ConfigOptionBoolsNullable* opt = this->option<ConfigOptionBoolsNullable>(key); ConfigOptionBoolsNullable* opt = this->option<ConfigOptionBoolsNullable>(key);
ConfigOptionBoolsNullable* src_opt = multi_config.option<ConfigOptionBoolsNullable>(key); ConfigOptionBoolsNullable* src_opt = multi_config.option<ConfigOptionBoolsNullable>(key);
if (!opt->is_nil(0)) if (src_opt &&!opt->is_nil(0))
opt->values.resize(src_opt->size(), opt->values[0]); opt->values.resize(src_opt->size(), opt->values[0]);
break; break;
@ -6347,64 +6358,77 @@ int DynamicPrintConfig::update_values_from_multi_to_single(DynamicPrintConfig& s
switch (optdef->type) { switch (optdef->type) {
case coStrings: case coStrings:
{ {
ConfigOptionStrings* opt = this->option<ConfigOptionStrings>(key);
ConfigOptionStrings* src_opt = single_config.option<ConfigOptionStrings>(key); ConfigOptionStrings* src_opt = single_config.option<ConfigOptionStrings>(key);
if (src_opt) {
ConfigOptionStrings* opt = this->option<ConfigOptionStrings>(key, true);
assert(variant_count == opt->size()); assert(variant_count == opt->size());
opt->values = src_opt->values; opt->values = src_opt->values;
}
break; break;
} }
case coInts: case coInts:
{ {
ConfigOptionInts* opt = this->option<ConfigOptionInts>(key);
ConfigOptionInts* src_opt = single_config.option<ConfigOptionInts>(key); ConfigOptionInts* src_opt = single_config.option<ConfigOptionInts>(key);
if (src_opt) {
ConfigOptionInts* opt = this->option<ConfigOptionInts>(key, true);
assert(variant_count == opt->size()); assert(variant_count == opt->size());
opt->values = src_opt->values; opt->values = src_opt->values;
}
break; break;
} }
case coFloats: case coFloats:
{ {
ConfigOptionFloats* opt = this->option<ConfigOptionFloats>(key);
ConfigOptionFloats* src_opt = single_config.option<ConfigOptionFloats>(key); ConfigOptionFloats* src_opt = single_config.option<ConfigOptionFloats>(key);
std::vector<double> old_values = opt->values; if (src_opt) {
ConfigOptionFloats* opt = this->option<ConfigOptionFloats>(key, true);
assert(variant_count == opt->size()); std::vector<double> old_values = opt->values;
opt->values = src_opt->values; int old_count = old_values.size();
for (int i = 0; i < extruder_count; i++) assert(variant_count == opt->size());
{ opt->values = src_opt->values;
assert(extruder_index[i] != -1);
if (old_values[extruder_index[i]] < opt->values[0]) for (int i = 0; i < extruder_count; i++)
opt->values[0] = old_values[extruder_index[i]]; {
assert(extruder_index[i] != -1);
if ((old_count > extruder_index[i]) && (old_values[extruder_index[i]] < opt->values[0]))
opt->values[0] = old_values[extruder_index[i]];
}
} }
break; break;
} }
case coFloatsOrPercents: case coFloatsOrPercents:
{ {
ConfigOptionFloatsOrPercents* opt = this->option<ConfigOptionFloatsOrPercents>(key);
ConfigOptionFloatsOrPercents* src_opt = single_config.option<ConfigOptionFloatsOrPercents>(key); ConfigOptionFloatsOrPercents* src_opt = single_config.option<ConfigOptionFloatsOrPercents>(key);
if (src_opt) {
ConfigOptionFloatsOrPercents* opt = this->option<ConfigOptionFloatsOrPercents>(key, true);
std::vector<FloatOrPercent> old_values = opt->values; std::vector<FloatOrPercent> old_values = opt->values;
int old_count = old_values.size();
assert(variant_count == opt->size()); assert(variant_count == opt->size());
opt->values = src_opt->values; opt->values = src_opt->values;
for (int i = 0; i < extruder_count; i++) for (int i = 0; i < extruder_count; i++)
{ {
assert(extruder_index[i] != -1); assert(extruder_index[i] != -1);
if (old_values[extruder_index[i]].value < opt->values[0].value) if ((old_count > extruder_index[i]) && (old_values[extruder_index[i]] < opt->values[0]))
opt->values[0] = old_values[extruder_index[i]]; opt->values[0] = old_values[extruder_index[i]];
}
} }
break; break;
} }
case coBools: case coBools:
{ {
ConfigOptionBools* opt = this->option<ConfigOptionBools>(key);
ConfigOptionBools* src_opt = single_config.option<ConfigOptionBools>(key); ConfigOptionBools* src_opt = single_config.option<ConfigOptionBools>(key);
if (src_opt) {
ConfigOptionBools* opt = this->option<ConfigOptionBools>(key, true);
assert(variant_count == opt->size()); assert(variant_count == opt->size());
opt->values = src_opt->values; opt->values = src_opt->values;
}
break; break;
} }