From 27943f70472a16d90c23f42d6e7a674ea5215259 Mon Sep 17 00:00:00 2001 From: "fei2.fang" Date: Sat, 28 Jun 2025 17:35:14 +0800 Subject: [PATCH] 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 for cleaner and safer traversal. jira: STUDIO-12955 Change-Id: I09a68e259b56864260abb6c59ff9b1bf7ec2823c (cherry picked from commit 60c47473047a3fba20d59cd974179537c116524d) --- src/libslic3r/PresetBundle.cpp | 18 +++++++++--------- src/slic3r/GUI/Plater.cpp | 2 +- src/slic3r/GUI/PresetComboBoxes.cpp | 3 +-- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index b4d56c2b94..6a169ce8cc 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -2225,20 +2225,20 @@ unsigned int PresetBundle::sync_ams_list(std::vector("filament_map"); if (use_map) { auto check_has_merge_info = [](std::map &maps, MergeFilamentInfo &merge_info, int exist_colors_size) { - std::map done; - for (int i = 0; i < maps.size(); i++) { + std::set done; + for (auto it_i = maps.begin(); it_i != maps.end(); ++it_i) { std::vector 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) { diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index e625be6905..a32e416bd9 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2922,9 +2922,9 @@ std::map 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 info; if (wxGetApp().preset_bundle) { info = wxGetApp().preset_bundle->get_filament_by_filament_id(tray.setting_id); diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index d0bdd82601..e820e6bc1c 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -1404,8 +1404,7 @@ FilamentColor PlaterPresetComboBox::get_cur_color_info() std::vector 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 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()) {