From 14c5215b48ef948fe8d9b840def8a398b3943ff3 Mon Sep 17 00:00:00 2001 From: tao wang Date: Thu, 23 Feb 2023 16:51:23 +0800 Subject: [PATCH] ENH:optimize the logic related to the virtual tray Change-Id: I4d3b78f86191a4f3760d16234006b3aa603dd09e --- src/slic3r/GUI/StatusPanel.cpp | 108 +++++++++++++++++++------- src/slic3r/GUI/StatusPanel.hpp | 2 +- src/slic3r/GUI/Widgets/AMSControl.cpp | 57 +++----------- src/slic3r/GUI/Widgets/AMSControl.hpp | 9 ++- 4 files changed, 99 insertions(+), 77 deletions(-) diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index fa5aabb21..d1ddc93af 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -1962,8 +1962,8 @@ void StatusPanel::update_ams(MachineObject *obj) is_vt_tray = true; // set segment 1, 2 - if (m_ams_control->GetCurentAms() != std::to_string(VIRTUAL_TRAY_ID)) { - if (obj->m_tray_now != "255" && obj->is_filament_at_extruder()) { + if (obj->m_tray_now != std::to_string(VIRTUAL_TRAY_ID)) { + if (obj->m_tray_now != "255" && obj->is_filament_at_extruder() && !obj->m_tray_id.empty()) { m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); } else if (obj->m_tray_now != "255") { @@ -1977,7 +1977,7 @@ void StatusPanel::update_ams(MachineObject *obj) } // set segment 3 - if (m_ams_control->GetCurentAms() == std::to_string(VIRTUAL_TRAY_ID)) { + if (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_ID)) { m_ams_control->SetExtruder(obj->is_filament_at_extruder(), obj->vt_tray.get_color()); } else { m_ams_control->SetExtruder(obj->is_filament_at_extruder(), m_ams_control->GetCanColour(curr_ams_id, obj->m_tray_id)); @@ -2078,34 +2078,67 @@ void StatusPanel::update_ams(MachineObject *obj) } catch (...) {} } - update_ams_control_state(curr_ams_id, is_support_extrusion_cali); -} - -void StatusPanel::update_ams_control_state(std::string ams_id, bool is_support_virtual_tray) -{ - // update load/unload enable state - if (obj->is_in_extrusion_cali()) { - m_ams_control->SetActionState(AMSAction::AMS_ACTION_CALI, is_support_virtual_tray); - } - else if (!obj->has_ams()) { - m_ams_control->SetActionState(AMSAction::AMS_ACTION_NOAMS, is_support_virtual_tray); - } - else if (obj->is_in_printing() && !obj->can_resume()) { - m_ams_control->SetActionState(AMSAction::AMS_ACTION_PRINTING, is_support_virtual_tray); - } - else { - if (obj->ams_status_main != AMS_STATUS_MAIN_FILAMENT_CHANGE) { - if (obj->m_tray_now == "255") { - m_ams_control->SetActionState(AMSAction::AMS_ACTION_LOAD, is_support_virtual_tray); - } - else { - m_ams_control->SetActionState(AMSAction::AMS_ACTION_NORMAL, is_support_virtual_tray); - } + bool is_curr_tray_selected = false; + if (!curr_ams_id.empty() && !curr_can_id.empty()) { + if (curr_can_id == obj->m_tray_now) { + is_curr_tray_selected = true; } else { - m_ams_control->SetActionState(AMSAction::AMS_ACTION_PRINTING, is_support_virtual_tray); + + std::map::iterator it = obj->amsList.find(curr_ams_id); + if (it == obj->amsList.end()) { + BOOST_LOG_TRIVIAL(trace) << "ams: find " << curr_ams_id << " failed"; + return; + } + auto tray_it = it->second->trayList.find(curr_can_id); + if (tray_it == it->second->trayList.end()) { + BOOST_LOG_TRIVIAL(trace) << "ams: find " << curr_can_id << " failed"; + return; + } + + if (!tray_it->second->is_exists) { + is_curr_tray_selected = true; + } } } + else { + is_curr_tray_selected = true; + } + + update_ams_control_state(is_support_extrusion_cali, is_curr_tray_selected); +} + +void StatusPanel::update_ams_control_state(bool is_support_virtual_tray, bool is_curr_tray_selected) +{ + bool enable[ACTION_BTN_COUNT]; + + // set default value to true + + if (obj->is_in_printing() && !obj->can_resume()) { + enable[ACTION_BTN_LOAD] = false; + enable[ACTION_BTN_UNLOAD] = false; + } + + if (!is_support_virtual_tray) { + enable[ACTION_BTN_CALI] = false; + } else { + // update load/unload enable state + if (obj->is_in_extrusion_cali()) { + enable[ACTION_BTN_LOAD] = false; + enable[ACTION_BTN_UNLOAD] = false; + } + } + + // select current + if (is_curr_tray_selected) { + enable[ACTION_BTN_LOAD] = false; + } + + if (obj->m_tray_now == "255") { + enable[ACTION_BTN_UNLOAD] = false; + } + + m_ams_control->SetActionState(enable); } void StatusPanel::update_cali(MachineObject *obj) @@ -2739,12 +2772,27 @@ void StatusPanel::on_ext_spool_edit(wxCommandEvent &event) m_filament_setting_dlg->obj = obj; try { m_filament_setting_dlg->tray_id = VIRTUAL_TRAY_ID; + std::string sn_number; + std::string filament; + std::string temp_max; + std::string temp_min; wxString k_val; wxString n_val; k_val = wxString::Format("%.3f", obj->vt_tray.k); n_val = wxString::Format("%.3f", obj->vt_tray.n); + wxColor color = AmsTray::decode_color(obj->vt_tray.color); + m_filament_setting_dlg->set_color(color); + m_filament_setting_dlg->ams_filament_id = obj->vt_tray.setting_id; + m_filament_setting_dlg->m_is_third = !MachineObject::is_bbl_filament(obj->vt_tray.tag_uid); + if (!m_filament_setting_dlg->m_is_third) { + sn_number = obj->vt_tray.uuid; + filament = obj->vt_tray.sub_brands; + temp_max = obj->vt_tray.nozzle_temp_max; + temp_min = obj->vt_tray.nozzle_temp_min; + } + m_filament_setting_dlg->SetPosition(m_ams_control->GetScreenPosition()); - m_filament_setting_dlg->Popup(wxEmptyString, wxEmptyString, wxEmptyString, wxEmptyString, k_val, n_val); + m_filament_setting_dlg->Popup(filament, sn_number, temp_min, temp_max, k_val, n_val); } catch (...) { ; @@ -2798,7 +2846,7 @@ void StatusPanel::on_ams_selected(wxCommandEvent &event) if (obj) { std::string curr_ams_id = m_ams_control->GetCurentAms(); if (curr_ams_id.compare(std::to_string(VIRTUAL_TRAY_ID)) == 0) { - update_ams_control_state(curr_ams_id, true); + //update_ams_control_state(curr_ams_id, true); return; } else { std::string curr_can_id = event.GetString().ToStdString(); @@ -2818,7 +2866,7 @@ void StatusPanel::on_ams_selected(wxCommandEvent &event) } catch (...) { ; } - update_ams_control_state(curr_ams_id, obj->is_function_supported(PrinterFunction::FUNC_EXTRUSION_CALI)); + //update_ams_control_state(curr_ams_id, obj->is_function_supported(PrinterFunction::FUNC_EXTRUSION_CALI)); } } } diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp index eaa9b2dec..422dc94fb 100644 --- a/src/slic3r/GUI/StatusPanel.hpp +++ b/src/slic3r/GUI/StatusPanel.hpp @@ -383,7 +383,7 @@ protected: void update_misc_ctrl(MachineObject *obj); void update_ams(MachineObject* obj); void update_extruder_status(MachineObject* obj); - void update_ams_control_state(std::string ams_id, bool is_support_virtual_tray); + void update_ams_control_state(bool is_support_virtual_tray, bool is_curr_tray_selected); void update_cali(MachineObject* obj); void reset_printing_values(); diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index ee50bedc9..b445a67ea 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -1471,11 +1471,10 @@ void AmsCans::PlayRridLoading(wxString canid) std::string AmsCans::GetCurrentCan() { - if (m_canlib_selection > -1 && m_canlib_selection < m_can_lib_list.size()) { - CanLibs *lib = m_can_lib_list[m_canlib_selection]; - return lib->canLib->m_info.can_id; - } - return ""; + if (m_canlib_selection < 0) + return ""; + + return wxString::Format("%d", m_canlib_selection).ToStdString(); } void AmsCans::StopRridLoading(wxString canid) @@ -2028,48 +2027,16 @@ wxColour AMSControl::GetCanColour(std::string amsid, std::string canid) return col; } -void AMSControl::SetActionState(AMSAction action, bool support_virtual_tray) +void AMSControl::SetActionState(bool button_status[]) { - m_button_area->Layout(); - m_button_area->Fit(); + if (button_status[ActionButton::ACTION_BTN_CALI]) m_button_extrusion_cali->Enable(); + else m_button_extrusion_cali->Disable(); - switch (action) { - case Slic3r::GUI::AMSAction::AMS_ACTION_NONE: break; - case Slic3r::GUI::AMSAction::AMS_ACTION_LOAD: - m_button_extrusion_cali->Enable(); - m_button_extruder_feed->Enable(); - m_button_extruder_back->Disable(); - break; - case Slic3r::GUI::AMSAction::AMS_ACTION_UNLOAD: - m_button_extrusion_cali->Enable(); - m_button_extruder_feed->Disable(); - m_button_extruder_back->Enable(); - break; - case Slic3r::GUI::AMSAction::AMS_ACTION_PRINTING: - m_button_extrusion_cali->Disable(); - m_button_extruder_feed->Disable(); - m_button_extruder_back->Disable(); - break; - case Slic3r::GUI::AMSAction::AMS_ACTION_NORMAL: - m_button_extrusion_cali->Enable(); - m_button_extruder_feed->Enable(); - m_button_extruder_back->Enable(); - break; - case Slic3r::GUI::AMSAction::AMS_ACTION_CALI: - m_button_extrusion_cali->Enable(); - m_button_extruder_feed->Disable(); - m_button_extruder_back->Disable(); - break; - case Slic3r::GUI::AMSAction::AMS_ACTION_NOAMS: - if (support_virtual_tray) - m_button_extrusion_cali->Enable(); - else - m_button_extrusion_cali->Disable(); - m_button_extruder_feed->Enable(); - m_button_extruder_back->Enable(); - break; - default: break; - } + if (button_status[ActionButton::ACTION_BTN_LOAD]) m_button_extruder_feed->Enable(); + else m_button_extruder_feed->Disable(); + + if (button_status[ActionButton::ACTION_BTN_UNLOAD]) m_button_extruder_back->Enable(); + else m_button_extruder_back->Disable(); } void AMSControl::EnterNoneAMSMode(bool support_vt_load) diff --git a/src/slic3r/GUI/Widgets/AMSControl.hpp b/src/slic3r/GUI/Widgets/AMSControl.hpp index 7d3b9353a..9f65a31f7 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.hpp +++ b/src/slic3r/GUI/Widgets/AMSControl.hpp @@ -35,6 +35,13 @@ namespace Slic3r { namespace GUI { +enum ActionButton { + ACTION_BTN_CALI = 0, + ACTION_BTN_LOAD = 1, + ACTION_BTN_UNLOAD = 2, + ACTION_BTN_COUNT = 3 +}; + enum class AMSRoadMode : int { AMS_ROAD_MODE_LEFT, AMS_ROAD_MODE_LEFT_RIGHT, @@ -524,7 +531,7 @@ public: wxColour GetCanColour(std::string amsid, std::string canid); bool m_is_none_ams_mode{false}; - void SetActionState(AMSAction action, bool support_virtual_tray = true); + void SetActionState(bool button_status[]); void EnterNoneAMSMode(bool support_vt_load = false); void ExitNoneAMSMode();