From 2eb9aea56a78bd8ca46a3ece7a974571528eed84 Mon Sep 17 00:00:00 2001 From: Stone Li Date: Wed, 3 Aug 2022 10:00:18 +0800 Subject: [PATCH] ENH: refine ams mapping for U0 firmware display index of filament Change-Id: I8a97a71cd334a1536ae7bfd4a5673e9757b2e662 Signed-off-by: Stone Li --- src/libslic3r/PrintConfig.cpp | 4 +-- src/libslic3r/ProjectTask.hpp | 7 +++++ src/slic3r/GUI/DeviceManager.cpp | 45 +++++++++++++++++++++++++++++--- src/slic3r/GUI/DeviceManager.hpp | 3 +++ src/slic3r/GUI/SelectMachine.cpp | 42 +++++++++++++++++++++++++---- src/slic3r/GUI/SelectMachine.hpp | 3 ++- 6 files changed, 93 insertions(+), 11 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index a7853767a1..a8f1f5b2b5 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3615,7 +3615,7 @@ std::string DynamicPrintConfig::get_filament_type(int id) return "Support G"; } else { - return filament_type->get_at(id) + "-Support"; + return filament_type->get_at(id); } } else { @@ -3624,7 +3624,7 @@ std::string DynamicPrintConfig::get_filament_type(int id) else if (filament_type->get_at(id) == "PA") return "Support G"; else - return filament_type->get_at(id) + "-Support"; + return filament_type->get_at(id); } } else { diff --git a/src/libslic3r/ProjectTask.hpp b/src/libslic3r/ProjectTask.hpp index a2c6bcf442..8d29f8ba22 100644 --- a/src/libslic3r/ProjectTask.hpp +++ b/src/libslic3r/ProjectTask.hpp @@ -27,6 +27,12 @@ enum MachineBedType { BED_TYPE_COUNT, }; +enum MappingResult { + MAPPING_RESULT_DEFAULT = 0, + MAPPING_RESULT_TYPE_MISMATCH = 1, + MAPPING_RESULT_EXCEED = 2 +}; + struct FilamentInfo { int id; // filament id = extruder id, start with 0. @@ -36,6 +42,7 @@ struct FilamentInfo float used_g; int tray_id; // start with 0 float distance; + int mapping_result = 0; }; class BBLSliceInfo { diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 454b6aae26..bcefd4bd7f 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -148,6 +148,16 @@ bool AmsTray::is_tray_info_ready() return true; } +bool AmsTray::is_unset_third_filament() +{ + if (this->is_bbl) + return false; + + if (color.empty() || type.empty()) + return true; + return false; +} + bool HMSItem::parse_hms_info(unsigned attr, unsigned code) { bool result = true; @@ -652,14 +662,23 @@ int MachineObject::ams_filament_mapping(std::vector filaments, std auto ams_it = amsList.find(std::to_string(ams_id)); if (ams_it == amsList.end()) { info.tray_id = -1; + info.mapping_result = (int)MappingResult::MAPPING_RESULT_EXCEED; } else { info.tray_id = filaments[i].id; - int tray_id = filaments[i].id % 4; auto tray_it = ams_it->second->trayList.find(std::to_string(tray_id)); if (tray_it != ams_it->second->trayList.end()) { - info.color = tray_it->second->color; - info.type = tray_it->second->type; + if (!tray_it->second->is_exists || tray_it->second->is_unset_third_filament()) { + ; + } else { + if (filaments[i].type == tray_it->second->type) { + info.color = tray_it->second->color; + info.type = tray_it->second->type; + } else { + info.tray_id = -1; + info.mapping_result = (int)MappingResult::MAPPING_RESULT_TYPE_MISMATCH; + } + } } } result.push_back(info); @@ -835,12 +854,32 @@ bool MachineObject::is_valid_mapping_result(std::vector& result) return true; } +bool MachineObject::is_mapping_exceed_filament(std::vector & result, int &exceed_index) +{ + bool is_exceed = false; + for (int i = 0; i < result.size(); i++) { + int ams_id = result[i].tray_id / 4; + if (amsList.find(std::to_string(ams_id)) == amsList.end()) { + exceed_index = result[i].tray_id; + result[i].tray_id = -1; + is_exceed = true; + break; + } + if (result[i].mapping_result == MappingResult::MAPPING_RESULT_EXCEED) { + exceed_index = result[i].id; + is_exceed = true; + break; + } + } + return is_exceed; +} void MachineObject::reset_mapping_result(std::vector& result) { for (int i = 0; i < result.size(); i++) { result[i].tray_id = -1; result[i].distance = 99999; + result[i].mapping_result = 0; } } diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index d67d9af152..6718fe8b3d 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -166,6 +166,7 @@ public: wxColour get_color(); bool is_tray_info_ready(); + bool is_unset_third_filament(); }; @@ -364,6 +365,8 @@ public: int ams_filament_mapping(std::vector filaments, std::vector &result, std::vector exclude_id = std::vector()); bool is_valid_mapping_result(std::vector& result); + // exceed index start with 0 + bool is_mapping_exceed_filament(std::vector& result, int &exceed_index); void reset_mapping_result(std::vector& result); diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 0ca233c600..9bf736a4bd 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -1263,7 +1263,7 @@ void SelectMachineDialog::update_print_status_msg(wxString msg, bool is_warning, } } -void SelectMachineDialog::show_status(PrintDialogStatus status) +void SelectMachineDialog::show_status(PrintDialogStatus status, std::vector params) { if (m_print_status != status) BOOST_LOG_TRIVIAL(info) << "select_machine_dialog: show_status = " << status; @@ -1331,7 +1331,11 @@ void SelectMachineDialog::show_status(PrintDialogStatus status) Enable_Send_Button(false); Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusNeedUpgradingAms) { - wxString msg_text = _L("The filament index exceeds the AMS's slot count and cannot send the print job."); + wxString msg_text; + if (params.size() > 0) + msg_text = wxString::Format(_L("Filament index %s exceeds the number of AMS slots. Please update the printer firmware to support AMS slot assignment."), params[0]); + else + msg_text = _L("Filament index exceeds the number of AMS slots. Please update the printer firmware to support AMS slot assignment."); update_print_status_msg(msg_text, true, false); Enable_Send_Button(false); Enable_Refresh_Button(true); @@ -1345,6 +1349,15 @@ void SelectMachineDialog::show_status(PrintDialogStatus status) update_print_status_msg(msg_text, true, false); Enable_Send_Button(false); Enable_Refresh_Button(true); + } else if (status == PrintDialogStatus::PrintStatusAmsMappingU0Invalid) { + wxString msg_text; + if (params.size() > 1) + msg_text = wxString::Format(_L("Filament index %s does not match the filament in AMS slot %s. Please update the printer firmware to support AMS slot assignment."), params[0], params[1]); + else + msg_text = _L("Filament index does not match the filament in AMS slot. Please update the printer firmware to support AMS slot assignment."); + update_print_status_msg(msg_text, true, false); + Enable_Send_Button(false); + Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusAmsMappingValid) { update_print_status_msg(wxEmptyString, false, false); Enable_Send_Button(true); @@ -1818,10 +1831,29 @@ void SelectMachineDialog::update_show_status() } if (!obj_->is_support_ams_mapping()) { - if (obj_->is_valid_mapping_result(m_ams_mapping_result)) { - show_status(PrintDialogStatus::PrintStatusAmsMappingByOrder); + int exceed_index = -1; + if (obj_->is_mapping_exceed_filament(m_ams_mapping_result, exceed_index)) { + std::vector params; + params.push_back(wxString::Format("%02d", exceed_index+1)); + show_status(PrintDialogStatus::PrintStatusNeedUpgradingAms, params); } else { - show_status(PrintDialogStatus::PrintStatusNeedUpgradingAms); + if (obj_->is_valid_mapping_result(m_ams_mapping_result)) { + show_status(PrintDialogStatus::PrintStatusAmsMappingByOrder); + } else { + int mismatch_index = -1; + for (int i = 0; i < m_ams_mapping_result.size(); i++) { + if (m_ams_mapping_result[i].mapping_result == MappingResult::MAPPING_RESULT_TYPE_MISMATCH) { + mismatch_index = m_ams_mapping_result[i].id; + break; + } + } + std::vector params; + if (mismatch_index >= 0) { + params.push_back(wxString::Format("%02d", mismatch_index+1)); + params.push_back(wxString::Format("%02d", mismatch_index+1)); + } + show_status(PrintDialogStatus::PrintStatusAmsMappingU0Invalid, params); + } } return; } diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index d0aec046ce..b450ad9991 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -237,6 +237,7 @@ enum PrintDialogStatus { PrintStatusInPrinting, PrintStatusAmsMappingSuccess, PrintStatusAmsMappingInvalid, + PrintStatusAmsMappingU0Invalid, PrintStatusAmsMappingValid, PrintStatusAmsMappingByOrder, PrintStatusRefreshingMachineList, @@ -328,7 +329,7 @@ public: bool do_ams_mapping(MachineObject *obj_); bool get_ams_mapping_result(std::string &mapping_array_str); void prepare(int print_plate_idx); - void show_status(PrintDialogStatus status); + void show_status(PrintDialogStatus status, std::vector params = std::vector()); PrintDialogStatus get_status() { return m_print_status; } bool Show(bool show);