ENH:When the AMS option is turned on or off, update the correct thumbnail

jira: none
Change-Id: Ia001e4baa7de72ab077cf0fb76c45d4cb8bac088
This commit is contained in:
zhou.xu 2025-03-26 20:25:26 +08:00 committed by lane.wei
parent e58b96e79e
commit 89aa62f8b4
6 changed files with 121 additions and 161 deletions

View File

@ -732,6 +732,10 @@ void AmsMapingPopup::show_reset_button() {
m_reset_btn->Show();
}
void AmsMapingPopup::set_only_show_ext_spool(bool flag) {
m_only_show_ext_spool = flag;
}
void AmsMapingPopup::msw_rescale()
{
m_left_extra_slot->msw_rescale();
@ -1078,100 +1082,94 @@ void AmsMapingPopup::update(MachineObject* obj, const std::vector<FilamentInfo>&
}
}
if (!m_only_show_ext_spool) {
/*ams*/
bool has_left_ams = false, has_right_ams = false;
std::list<MappingContainer *> left_one_slot_containers;
std::list<MappingContainer *> right_one_slot_containers;
std::vector<MappingContainer *> left_four_slots_containers;
std::vector<MappingContainer *> right_four_slot_containers;
for (std::map<std::string, Ams *>::iterator ams_iter = obj->amsList.begin(); ams_iter != obj->amsList.end(); ams_iter++) {
int ams_indx = atoi(ams_iter->first.c_str());
int ams_type = ams_iter->second->type;
int nozzle_id = ams_iter->second->nozzle;
/*ams*/
bool has_left_ams = false, has_right_ams = false;
std::list<MappingContainer*> left_one_slot_containers;
std::list<MappingContainer*> right_one_slot_containers;
std::vector<MappingContainer*> left_four_slots_containers;
std::vector<MappingContainer*> right_four_slot_containers;
for (std::map<std::string, Ams *>::iterator ams_iter = obj->amsList.begin(); ams_iter != obj->amsList.end(); ams_iter++) {
if (ams_type >= 1 || ams_type <= 3) { // 1:ams 2:ams-lite 3:n3f
int ams_indx = atoi(ams_iter->first.c_str());
int ams_type = ams_iter->second->type;
int nozzle_id = ams_iter->second->nozzle;
auto sizer_mapping_list = new wxBoxSizer(wxHORIZONTAL);
auto ams_mapping_item_container = new MappingContainer(nozzle_id == 0 ? m_right_marea_panel : m_left_marea_panel, ams_iter->second->get_ams_device_name(),
ams_iter->second->trayList.size());
ams_mapping_item_container->SetName(nozzle_id == 0 ? m_right_marea_panel->GetName() : m_left_marea_panel->GetName());
ams_mapping_item_container->SetSizer(sizer_mapping_list);
ams_mapping_item_container->Layout();
if (ams_type >=1 || ams_type <= 3) { //1:ams 2:ams-lite 3:n3f
m_has_unmatch_filament = false;
auto sizer_mapping_list = new wxBoxSizer(wxHORIZONTAL);
auto ams_mapping_item_container = new MappingContainer(nozzle_id == 0 ? m_right_marea_panel : m_left_marea_panel,
ams_iter->second->get_ams_device_name(), ams_iter->second->trayList.size());
ams_mapping_item_container->SetName(nozzle_id == 0 ? m_right_marea_panel->GetName() : m_left_marea_panel->GetName());
ams_mapping_item_container->SetSizer(sizer_mapping_list);
ams_mapping_item_container->Layout();
BOOST_LOG_TRIVIAL(trace) << "ams_mapping ams id " << ams_iter->first.c_str();
m_has_unmatch_filament = false;
Ams * ams_group = ams_iter->second;
std::vector<TrayData> tray_datas;
std::map<std::string, AmsTray *>::iterator tray_iter;
BOOST_LOG_TRIVIAL(trace) << "ams_mapping ams id " << ams_iter->first.c_str();
for (tray_iter = ams_group->trayList.begin(); tray_iter != ams_group->trayList.end(); tray_iter++) {
AmsTray *tray_data = tray_iter->second;
TrayData td;
Ams* ams_group = ams_iter->second;
std::vector<TrayData> tray_datas;
std::map<std::string, AmsTray*>::iterator tray_iter;
td.id = ams_indx * AMS_TOTAL_COUNT + atoi(tray_data->id.c_str());
td.ams_id = std::stoi(ams_iter->second->id);
td.slot_id = std::stoi(tray_iter->second->id);
for (tray_iter = ams_group->trayList.begin(); tray_iter != ams_group->trayList.end(); tray_iter++) {
AmsTray* tray_data = tray_iter->second;
TrayData td;
td.id = ams_indx * AMS_TOTAL_COUNT + atoi(tray_data->id.c_str());
td.ams_id = std::stoi(ams_iter->second->id);
td.slot_id = std::stoi(tray_iter->second->id);
if (!tray_data->is_exists) {
td.type = EMPTY;
}
else {
if (!tray_data->is_tray_info_ready()) {
td.type = THIRD;
}
else {
td.type = NORMAL;
td.remain = tray_data->remain;
td.colour = AmsTray::decode_color(tray_data->color);
td.name = tray_data->get_display_filament_type();
td.filament_type = tray_data->get_filament_type();
td.ctype = tray_data->ctype;
for (auto col : tray_data->cols) {
td.material_cols.push_back(AmsTray::decode_color(col));
if (!tray_data->is_exists) {
td.type = EMPTY;
} else {
if (!tray_data->is_tray_info_ready()) {
td.type = THIRD;
} else {
td.type = NORMAL;
td.remain = tray_data->remain;
td.colour = AmsTray::decode_color(tray_data->color);
td.name = tray_data->get_display_filament_type();
td.filament_type = tray_data->get_filament_type();
td.ctype = tray_data->ctype;
for (auto col : tray_data->cols) { td.material_cols.push_back(AmsTray::decode_color(col)); }
}
}
tray_datas.push_back(td);
}
tray_datas.push_back(td);
}
ams_mapping_item_container->Show();
add_ams_mapping(tray_datas, obj->ams_calibrate_remain_flag, ams_mapping_item_container, sizer_mapping_list);
m_amsmapping_container_sizer_list.push_back(sizer_mapping_list);
m_amsmapping_container_list.push_back(ams_mapping_item_container);
ams_mapping_item_container->Show();
add_ams_mapping(tray_datas, obj->ams_calibrate_remain_flag, ams_mapping_item_container, sizer_mapping_list);
m_amsmapping_container_sizer_list.push_back(sizer_mapping_list);
m_amsmapping_container_list.push_back(ams_mapping_item_container);
if (nozzle_id == 0) {
has_right_ams = true;
if (ams_mapping_item_container->get_slots_num() == 1) {
right_one_slot_containers.push_back(ams_mapping_item_container);
} else {
right_four_slot_containers.push_back(ams_mapping_item_container);
}
}
else if (nozzle_id == 1) {
has_left_ams = true;
if (ams_mapping_item_container->get_slots_num() == 1) {
left_one_slot_containers.push_back(ams_mapping_item_container);
} else {
left_four_slots_containers.push_back(ams_mapping_item_container);
if (nozzle_id == 0) {
has_right_ams = true;
if (ams_mapping_item_container->get_slots_num() == 1) {
right_one_slot_containers.push_back(ams_mapping_item_container);
} else {
right_four_slot_containers.push_back(ams_mapping_item_container);
}
} else if (nozzle_id == 1) {
has_left_ams = true;
if (ams_mapping_item_container->get_slots_num() == 1) {
left_one_slot_containers.push_back(ams_mapping_item_container);
} else {
left_four_slots_containers.push_back(ams_mapping_item_container);
}
}
} else if (ams_type == 4) { // 4:n3s
}
}
else if(ams_type == 4){ //4:n3s
}
_add_containers(this, left_one_slot_containers, left_four_slots_containers, m_sizer_ams_basket_left);
_add_containers(this, right_one_slot_containers, right_four_slot_containers, m_sizer_ams_basket_right);
m_left_split_ams_sizer->Show(has_left_ams);
m_right_split_ams_sizer->Show(has_right_ams);
update_items_check_state(ams_mapping_result);
} else {
m_right_split_ams_sizer->Show(false);
}
_add_containers(this, left_one_slot_containers, left_four_slots_containers, m_sizer_ams_basket_left);
_add_containers(this, right_one_slot_containers, right_four_slot_containers, m_sizer_ams_basket_right);
m_left_split_ams_sizer->Show(has_left_ams);
m_right_split_ams_sizer->Show(has_right_ams);
update_items_check_state(ams_mapping_result);
Layout();
Fit();
Refresh();

View File

@ -282,6 +282,7 @@ public:
void show_reset_button();
void set_material_index_str(std::string str) { m_material_index = str; }
const std::string &get_material_index_str() { return m_material_index; }
void set_only_show_ext_spool(bool flag);
public:
void msw_rescale();
@ -289,6 +290,7 @@ public:
private:
ResetCallback m_reset_callback{nullptr};
std::string m_material_index;
bool m_only_show_ext_spool{false};
};
class AmsMapingTipPopup : public PopupWindow

View File

@ -643,11 +643,10 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
);
option_use_ams->Bind(EVT_SWITCH_PRINT_OPTION, [this](auto& e) {
m_ams_mapping_result.clear();
sync_ams_mapping_result(m_ams_mapping_result);
m_ams_mapping_result.clear();//clear and Scheduled call update_show_status
});
option_use_ams->setValue("off");
option_use_ams->setValue("on");
m_sizer_options_timelapse->Add(option_timelapse, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(5));
m_sizer_options_other->Add(option_use_ams, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(5));
m_sizer_options_other->Add(option_auto_bed_level, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(5));
@ -1189,7 +1188,7 @@ void print_ams_mapping_result(std::vector<FilamentInfo>& result)
}
}
bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_)
bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_,bool use_ams)
{
if (!obj_) return false;
obj_->get_ams_colors(m_cur_colors_in_thumbnail);
@ -1245,8 +1244,16 @@ bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_)
}
map_opt = {true, false, !has_left_ams, false}; //four values: use_left_ams, use_right_ams, use_left_ext, use_right_ext
if (!use_ams) {
map_opt[0] = false;
map_opt[2] = true;
}
int result_first = obj_->ams_filament_mapping(m_filament_left, m_ams_mapping_result_left, map_opt);
map_opt = { false, true, false, !has_right_ams };
if (!use_ams) {
map_opt[1] = false;
map_opt[3] = true;
}
int result_second = obj_->ams_filament_mapping(m_filament_right, m_ams_mapping_result_right, map_opt);
//m_ams_mapping_result.clear();
@ -1261,6 +1268,10 @@ bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_)
//can hybrid mapping
else {
map_opt = { true, true, true, true }; //four values: use_left_ams, use_right_ams, use_left_ext, use_right_ext
if (!use_ams) {
map_opt[0] = false;
map_opt[1] = false;
}
filament_result = obj_->ams_filament_mapping(m_filaments, m_ams_mapping_result, map_opt);
}
//When filaments cannot be matched automatically, whether to use ext for automatic supply
@ -1271,11 +1282,19 @@ bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_)
else {
if (obj_->is_support_amx_ext_mix_mapping()){
map_opt = { false, true, false, false }; //four values: use_left_ams, use_right_ams, use_left_ext, use_right_ext
if (!use_ams) {
map_opt[1] = false;
map_opt[3] = true;
}
filament_result = obj_->ams_filament_mapping(m_filaments, m_ams_mapping_result, map_opt);
//auto_supply_with_ext(obj_->vt_slot);
}
else {
map_opt = { false, true, false, false };
if (!use_ams) {
map_opt[1] = false;
map_opt[3] = true;
}
filament_result = obj_->ams_filament_mapping(m_filaments, m_ams_mapping_result, map_opt);
}
}
@ -3081,11 +3100,7 @@ void SelectMachineDialog::on_timer(wxTimerEvent &event)
if(!obj_) return;
if (!m_check_flag && obj_->is_info_ready()) {
update_select_layout(obj_);
update_ams_check(obj_);
m_check_flag = true;
}
if (obj_->m_extder_data.total_extder_count > 1) {
change_materialitem_tip(false); /*mapping to both ams and ext, is supported while total_extder_count is 2*/
@ -3379,21 +3394,15 @@ void SelectMachineDialog::update_show_status()
return;
}
// do ams mapping if no ams result
bool clean_ams_mapping = false;
if (m_ams_mapping_result.empty()) {
if (m_checkbox_list["use_ams"]->getValue() == "on") {
do_ams_mapping(obj_);
update_filament_change_count();
} else {
clean_ams_mapping = true;
}
if (!m_check_flag && obj_->is_info_ready()) {
update_select_layout(obj_);
update_ams_check(obj_);
m_check_flag = true;
}
if (clean_ams_mapping) {
m_ams_mapping_result.clear();
sync_ams_mapping_result(m_ams_mapping_result);
// do ams mapping if no ams result
if (m_ams_mapping_result.empty()) {
do_ams_mapping(obj_, m_checkbox_list["use_ams"]->getValue() == "on");
update_filament_change_count();
}
// reading done
@ -3565,16 +3574,10 @@ void SelectMachineDialog::update_show_status()
return;
}
if (m_checkbox_list["use_ams"]->getValue() != "on") {
m_ams_mapping_result.clear();
sync_ams_mapping_result(m_ams_mapping_result);
} else {
if (!m_ams_mapping_res && !obj_->is_valid_mapping_result(m_ams_mapping_result)) {
show_status(PrintDialogStatus::PrintStatusAmsMappingInvalid);
return;
}
if (!m_ams_mapping_res && !obj_->is_valid_mapping_result(m_ams_mapping_result)) {
show_status(PrintDialogStatus::PrintStatusAmsMappingInvalid);
return;
}
/*Warnings*/
// no ams
if (!obj_->has_ams() || m_checkbox_list["use_ams"]->getValue() != "on") {
@ -4012,6 +4015,7 @@ void SelectMachineDialog::reset_and_sync_ams_list()
if (obj_ && m_checkbox_list["use_ams"]->getValue() == "on" && obj_->dev_id == m_printer_last_select) {
m_mapping_popup.set_parent_item(item);
m_mapping_popup.set_only_show_ext_spool(m_checkbox_list["use_ams"]->getValue() == "off");
m_mapping_popup.set_current_filament_id(extruder);
m_mapping_popup.set_tag_texture(materials[extruder]);
m_mapping_popup.set_send_win(this);//fix bug:fisrt click is not valid
@ -4613,7 +4617,7 @@ bool SelectMachineDialog::Show(bool show)
return DPIDialog::Show(false);
}
show_init();
show_status(PrintDialogStatus::PrintStatusInit);
PresetBundle& preset_bundle = *wxGetApp().preset_bundle;
@ -4654,6 +4658,10 @@ bool SelectMachineDialog::Show(bool show)
return DPIDialog::Show(show);
}
void SelectMachineDialog::show_init() {
m_ams_mapping_result.clear();
}
wxString SelectMachineDialog::format_bed_name(std::string plate_name)
{
wxString name;

View File

@ -535,7 +535,8 @@ public:
int update_print_required_data(Slic3r::DynamicPrintConfig config, Slic3r::Model model, Slic3r::PlateDataPtrs plate_data_list, std::string file_name, std::string file_path);
void set_print_type(PrintFromType type) {m_print_type = type;};
bool Show(bool show);
bool do_ams_mapping(MachineObject *obj_);
void show_init();
bool do_ams_mapping(MachineObject *obj_,bool use_ams);
bool get_ams_mapping_result(std::string& mapping_array_str, std::string& mapping_array_str2, std::string& ams_mapping_info);
bool build_nozzles_info(std::string& nozzles_info);
bool can_hybrid_mapping(ExtderData data);

View File

@ -114,24 +114,6 @@ void SyncAmsInfoDialog::updata_ui_data_after_connected_printer() {
m_button_cancel->Show();
}
void SyncAmsInfoDialog::update_ams_check(MachineObject *obj)
{
if (!obj) { return; }
if (!obj->is_enable_np) {
if (obj->has_ams()) {
//m_checkbox_list["use_ams"]->Show();
m_checkbox_list["use_ams"]->setValue("on");
} else {
m_checkbox_list["use_ams"]->Hide();
//m_checkbox_list["use_ams"]->setValue("off");
}
} else {
m_checkbox_list["use_ams"]->Hide();
m_checkbox_list["use_ams"]->setValue("on");
}
}
void SyncAmsInfoDialog::update_select_layout(MachineObject *obj)
{
m_checkbox_list["timelapse"]->Hide();
@ -921,11 +903,6 @@ SyncAmsInfoDialog::SyncAmsInfoDialog(wxWindow *parent, SyncInfo &info) :
auto option_use_ams = new PrintOption(m_options_other, _L("Use AMS"), wxEmptyString, ops_no_auto);
option_use_ams->Bind(EVT_SWITCH_PRINT_OPTION, [this](auto &e) {
m_ams_mapping_result.clear();
sync_ams_mapping_result(m_ams_mapping_result);
});
option_use_ams->setValue("on");
m_sizer_options_timelapse->Add(option_timelapse, 0, wxEXPAND | wxBOTTOM, FromDIP(5));
m_sizer_options_other->Add(option_use_ams, 0, wxEXPAND | wxBOTTOM, FromDIP(5));
@ -2373,7 +2350,6 @@ void SyncAmsInfoDialog::on_timer(wxTimerEvent &event)
if (!m_check_flag && obj_->is_info_ready()) {
update_select_layout(obj_);
update_ams_check(obj_);
m_check_flag = true;
}
@ -2408,7 +2384,6 @@ void SyncAmsInfoDialog::update_show_status()
NetworkAgent * agent = Slic3r::GUI::wxGetApp().getAgent();
DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
if (!agent) {
update_ams_check(nullptr);
return;
}
if (!dev) return;
@ -2417,7 +2392,6 @@ void SyncAmsInfoDialog::update_show_status()
if (is_must_finish_slice_then_connected_printer()) { return; }
MachineObject * obj_ = dev->get_selected_machine();
if (!obj_) {
update_ams_check(nullptr);
if (agent) {
if (agent->is_user_login()) {
show_status(PrintDialogStatus::PrintStatusInvalidPrinter);
@ -2460,19 +2434,10 @@ void SyncAmsInfoDialog::update_show_status()
}
// do ams mapping if no ams result
bool clean_ams_mapping = false;
if (m_ams_mapping_result.empty()) {
if (m_checkbox_list.find("use_ams") != m_checkbox_list.end() && m_checkbox_list["use_ams"]->getValue() == "on") {
do_ams_mapping(obj_);
} else {
clean_ams_mapping = true;
}
do_ams_mapping(obj_);
}
if (clean_ams_mapping) {
m_ams_mapping_result.clear();
sync_ams_mapping_result(m_ams_mapping_result);
}
// reading done
if (wxGetApp().app_config && wxGetApp().app_config->get("internal_debug").empty()) {
@ -2527,19 +2492,6 @@ void SyncAmsInfoDialog::update_show_status()
return;
}
if (m_checkbox_list["use_ams"]->getValue() != "on") {
m_ams_mapping_result.clear();
sync_ams_mapping_result(m_ams_mapping_result);
if (has_timelapse_warning()) {
show_status(PrintDialogStatus::PrintStatusTimelapseWarning);
} else {
show_status(PrintDialogStatus::PrintStatusDisableAms);
}
return;
}
// do ams mapping if no ams result
if (m_ams_mapping_result.empty()) { do_ams_mapping(obj_); }

View File

@ -253,7 +253,6 @@ public:
public:
bool Show(bool show) override;
void updata_ui_data_after_connected_printer();
void update_ams_check(MachineObject *obj);
void set_default(bool hide_some = false);
void update_select_layout(MachineObject *obj);
void set_default_normal(const ThumbnailData &);