ENH: save ams list to compare with last sync

Change-Id: I44db0b0a61cf366929aed6ab703407e5d9b170b7
This commit is contained in:
chunmao.guo 2023-02-06 10:54:26 +08:00 committed by Lane.Wei
parent ddf8c216c6
commit b3a4384aec
7 changed files with 34 additions and 10 deletions

View file

@ -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;

View file

@ -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__

View file

@ -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();

View file

@ -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<std::string, Ams *> const &list)
void Sidebar::load_ams_list(std::string const &device, std::map<std::string, Ams *> const &list)
{
std::vector<DynamicPrintConfig> 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<std::string, Ams *> 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<std::string> 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<std::string> 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."),

View file

@ -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<std::string, Ams *> const &list);
void load_ams_list(std::string const & device, std::map<std::string, Ams *> const &list);
void sync_ams_list();
ObjectList* obj_list();

View file

@ -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()) {

View file

@ -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";