FIX: Correct virtual tray loading and multi-color material display

- Fixed incorrect is_array() check on vtray["cols"], causing virtual tray init failure.
- Rewrote AMS grouping logic using iterators and set<int> for cleaner and safer traversal.

jira: STUDIO-12955

Change-Id: I09a68e259b56864260abb6c59ff9b1bf7ec2823c
(cherry picked from commit 60c47473047a3fba20d59cd974179537c116524d)
This commit is contained in:
fei2.fang
2025-06-28 17:35:14 +08:00
committed by Noisyfox
parent 470ed6af5d
commit 27943f7047
3 changed files with 11 additions and 12 deletions

View File

@@ -2225,20 +2225,20 @@ unsigned int PresetBundle::sync_ams_list(std::vector<std::pair<DynamicPrintConfi
ConfigOptionInts * filament_map = project_config.option<ConfigOptionInts>("filament_map");
if (use_map) {
auto check_has_merge_info = [](std::map<int, AMSMapInfo> &maps, MergeFilamentInfo &merge_info, int exist_colors_size) {
std::map<int, bool> done;
for (int i = 0; i < maps.size(); i++) {
std::set<int> done;
for (auto it_i = maps.begin(); it_i != maps.end(); ++it_i) {
std::vector<int> same_ams;
same_ams.emplace_back(i);
for (size_t j = i + 1; j < maps.size(); j++) {
if (done.find(j) != done.end()) {
same_ams.emplace_back(it_i->first);
for (auto it_j = std::next(it_i); it_j != maps.end(); ++it_j) {
if (done.find(it_j->first) != done.end()) {
continue;
}
if (maps[i].slot_id == "" || maps[i].ams_id == ""){//reserve
if (it_i->second.slot_id == "" || it_i->second.ams_id == ""){
continue;
}
if (maps[i].slot_id == maps[j].slot_id && maps[i].ams_id == maps[j].ams_id) {
same_ams.emplace_back(j);
done[j] =true;
if (it_i->second.slot_id == it_j->second.slot_id && it_i->second.ams_id == it_j->second.ams_id) {
same_ams.emplace_back(it_j->first);
done.insert(it_j->first);
}
}
if (same_ams.size() > 1) {

View File

@@ -2922,9 +2922,9 @@ std::map<int, DynamicPrintConfig> Sidebar::build_filament_ams_list(MachineObject
tray_config.set_key_value("filament_type", new ConfigOptionStrings{tray.type});
tray_config.set_key_value("tray_name", new ConfigOptionStrings{ name });
tray_config.set_key_value("filament_colour", new ConfigOptionStrings{into_u8(wxColour("#" + tray.color).GetAsString(wxC2S_HTML_SYNTAX))});
tray_config.set_key_value("filament_exist", new ConfigOptionBools{tray.is_exists});
tray_config.set_key_value("filament_multi_colour", new ConfigOptionStrings{});
tray_config.set_key_value("filament_colour_type", new ConfigOptionStrings{std::to_string(tray.ctype)});
tray_config.set_key_value("filament_exist", new ConfigOptionBools{tray.is_exists});
std::optional<FilamentBaseInfo> info;
if (wxGetApp().preset_bundle) {
info = wxGetApp().preset_bundle->get_filament_by_filament_id(tray.setting_id);

View File

@@ -1404,8 +1404,7 @@ FilamentColor PlaterPresetComboBox::get_cur_color_info()
std::vector<std::string> filament_color_type = Slic3r::GUI::wxGetApp().plater()->get_filament_color_render_type();
std::string filament_color_info = filaments_multi_color[m_filament_idx];
std::vector<std::string> colors;
boost::split(colors, filament_color_info, boost::is_any_of(" "));
colors = Slic3r::split_string(filament_color_info, ' ');
FilamentColor fila_color;
for (const std::string& color_str : colors) {
if (!color_str.empty()) {