diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index d340c0c2e..6005f61e1 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -1427,6 +1427,13 @@ unsigned int PresetBundle::sync_ams_list(unsigned int &unknowns) for (auto &ams : filament_ams_list) { auto filament_id = ams.opt_string("filament_id", 0u); auto filament_color = ams.opt_string("filament_colour", 0u); + auto filament_changed = !ams.has("filament_changed") || ams.opt_bool("filament_changed"); + if (filament_id.empty()) continue; + if (!filament_changed && this->filament_presets.size() > filament_presets.size()) { + filament_presets.push_back(this->filament_presets[filament_presets.size()]); + filament_colors.push_back(filament_color); + continue; + } auto iter = std::find_if(filaments.begin(), filaments.end(), [&filament_id](auto &f) { return f.is_compatible && f.is_system && f.filament_id == filament_id; }); if (iter == filaments.end()) { BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(": filament_id %1% not found or system or compatible") % filament_id; diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 0c9c5d4a1..ad3fd6ec4 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -1756,7 +1756,7 @@ void GUI_App::init_networking_callbacks() obj->parse_json(msg); if (this->m_device_manager->get_selected_machine() == obj && obj->is_ams_need_update) { - GUI::wxGetApp().sidebar().load_ams_list(obj->amsList); + GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj->amsList); } } }); @@ -1780,7 +1780,7 @@ void GUI_App::init_networking_callbacks() if (obj) { obj->parse_json(msg); if (this->m_device_manager->get_selected_machine() == obj && obj->is_ams_need_update) { - GUI::wxGetApp().sidebar().load_ams_list(obj->amsList); + GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj->amsList); } } }); @@ -3351,7 +3351,7 @@ void GUI_App::request_user_logout() m_agent->set_user_selected_machine(""); /* delete old user settings */ m_device_manager->clean_user_info(); - GUI::wxGetApp().sidebar().load_ams_list({}); + GUI::wxGetApp().sidebar().load_ams_list({}, {}); GUI::wxGetApp().stop_sync_user_preset(); #ifdef __WINDOWS__ diff --git a/src/slic3r/GUI/Monitor.cpp b/src/slic3r/GUI/Monitor.cpp index 536f825a4..699906534 100644 --- a/src/slic3r/GUI/Monitor.cpp +++ b/src/slic3r/GUI/Monitor.cpp @@ -153,7 +153,7 @@ MonitorPanel::~MonitorPanel() if (!dev) return; MachineObject *obj_ = dev->get_selected_machine(); if (obj_) - GUI::wxGetApp().sidebar().load_ams_list(obj_->amsList); + GUI::wxGetApp().sidebar().load_ams_list(obj_->dev_id, obj_->amsList); } void MonitorPanel::init_tabpanel() @@ -228,7 +228,7 @@ void MonitorPanel::set_default() /* reset side tool*/ //m_bitmap_wifi_signal->SetBitmap(wxNullBitmap); - wxGetApp().sidebar().load_ams_list({}); + wxGetApp().sidebar().load_ams_list({}, {}); } wxWindow* MonitorPanel::create_side_tools() @@ -309,7 +309,7 @@ void MonitorPanel::on_update_all(wxMouseEvent &event) MachineObject *obj_ = dev->get_selected_machine(); if (obj_) - GUI::wxGetApp().sidebar().load_ams_list(obj_->amsList); + GUI::wxGetApp().sidebar().load_ams_list(obj_->dev_id, obj_->amsList); Layout(); Refresh(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 1307827a4..e51070e90 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -334,6 +334,7 @@ struct Sidebar::priv bool is_collapsed {false}; Search::OptionsSearcher searcher; + std::string ams_list_device; priv(Plater *plater) : plater(plater) {} ~priv(); @@ -1355,13 +1356,12 @@ void Sidebar::on_bed_type_change(BedType bed_type) m_bed_type_list->SetSelection(sel_idx); } -void Sidebar::load_ams_list(std::map const &list) +void Sidebar::load_ams_list(std::string const &device, std::map const &list) { std::vector filament_ams_list; for (auto ams : list) { char n = ams.first.front() - '0' + 'A'; for (auto tray : ams.second->trayList) { - if (tray.second->setting_id.empty()) continue; BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": ams %1% tray %2% id %3% color %4%") % ams.first % tray.first % tray.second->setting_id % tray.second->color; char t = tray.first.front() - '0' + '1'; @@ -1373,6 +1373,7 @@ void Sidebar::load_ams_list(std::map const &list) filament_ams_list.emplace_back(std::move(ams)); } } + p->ams_list_device = device; wxGetApp().preset_bundle->filament_ams_list = filament_ams_list; for (auto c : p->combos_filament) c->update(); @@ -1392,6 +1393,17 @@ void Sidebar::sync_ams_list() _L("Sync filaments with AMS will drop all current selected filament presets and colors. Do you want to continue?"), _L("Sync filaments with AMS"), wxYES_NO); if (dlg.ShowModal() != wxID_YES) return; + std::string ams_filament_ids = wxGetApp().app_config->get("ams_filament_ids", p->ams_list_device); + if (!ams_filament_ids.empty()) { + std::vector list2; + boost::algorithm::split(list2, ams_filament_ids, boost::algorithm::is_any_of(",")); + if (list2.size() == list.size()) { + for (int i = 0; i < list.size(); ++i) { + list[i].set_key_value("filament_changed", + new ConfigOptionBool{!list2[i].empty() && list2[i] != list[i].opt_string("filament_id", 0u)}); + } + } + } unsigned int unknowns = 0; auto n = wxGetApp().preset_bundle->sync_ams_list(unknowns); if (n == 0) { @@ -1401,6 +1413,10 @@ void Sidebar::sync_ams_list() dlg.ShowModal(); return; } + std::vector list2; + for (auto &f : list) list2.push_back(f.opt_string("filament_id", 0u)); + ams_filament_ids = boost::algorithm::join(list2, ","); + wxGetApp().app_config ->set("ams_filament_ids", p->ams_list_device, ams_filament_ids); if (unknowns > 0) { MessageDialog dlg(this, _L("There are some unknown filaments mapped to generic preset. Please update Bambu Studio or restart Bambu Studio to check if there is an update to system presets."), diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 8106f7ed7..e8a14dffa 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -123,7 +123,7 @@ public: void on_filaments_change(size_t num_filaments); // BBS void on_bed_type_change(BedType bed_type); - void load_ams_list(std::map const &list); + void load_ams_list(std::string const & device, std::map const &list); void sync_ams_list(); ObjectList* obj_list(); diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index e29d46e45..14fd600a1 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -376,6 +376,7 @@ void PresetComboBox::add_ams_filaments(std::string selected, bool alias_name) auto &filaments = m_collection->get_presets(); for (auto &f : m_preset_bundle->filament_ams_list) { std::string filament_id = f.opt_string("filament_id", 0u); + if (filament_id.empty()) continue; auto iter = std::find_if(filaments.begin(), filaments.end(), [&filament_id](auto &f) { return f.is_compatible && f.is_system && f.filament_id == filament_id; }); if (iter == filaments.end()) { diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 099bb846b..51dcf6beb 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -2555,7 +2555,7 @@ void SelectMachineDialog::on_selection_changed(wxCommandEvent &event) obj->command_request_push_all(); dev->set_selected_machine(m_printer_last_select); // Has changed machine unrecoverably - GUI::wxGetApp().sidebar().load_ams_list(obj->amsList); + GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj->amsList); update_select_layout(obj); } else { BOOST_LOG_TRIVIAL(error) << "on_selection_changed dev_id not found";