From b78fa4c11c4a11bec5f4b35ea477005d32651dbb Mon Sep 17 00:00:00 2001 From: tao wang Date: Fri, 5 Jul 2024 17:06:56 +0800 Subject: [PATCH] ENH:refactoring the modules of amscontrol JIRA:[amscontrol 2.0] Change-Id: Ica66500506cfe89f2eac3ae0a58fb7ff30d1da9a --- resources/images/ams_drying.svg | 10 + resources/images/ams_ext_image.svg | 5 + resources/images/ext_ams_item.svg | 3 + resources/images/ext_image.svg | 7 + resources/images/four_slot_ams_item.svg | 4 + resources/images/left_nozzle.svg | 16 + resources/images/right_nozzle.svg | 16 + resources/images/single_nozzle.svg | 14 + resources/images/single_slot_ams_item.svg | 4 + src/slic3r/CMakeLists.txt | 2 + src/slic3r/GUI/AMSMaterialsSetting.cpp | 3 +- .../GUI/CalibrationWizardPresetPage.cpp | 12 +- .../GUI/CalibrationWizardPresetPage.hpp | 2 +- src/slic3r/GUI/StatusPanel.cpp | 59 +- src/slic3r/GUI/StatusPanel.hpp | 2 +- src/slic3r/GUI/Widgets/AMSControl.cpp | 2329 ++++++++---- src/slic3r/GUI/Widgets/AMSControl.hpp | 735 +--- src/slic3r/GUI/Widgets/AMSItem.cpp | 3228 +++++++++++++++++ src/slic3r/GUI/Widgets/AMSItem.hpp | 728 ++++ 19 files changed, 5860 insertions(+), 1319 deletions(-) create mode 100644 resources/images/ams_drying.svg create mode 100644 resources/images/ams_ext_image.svg create mode 100644 resources/images/ext_ams_item.svg create mode 100644 resources/images/ext_image.svg create mode 100644 resources/images/four_slot_ams_item.svg create mode 100644 resources/images/left_nozzle.svg create mode 100644 resources/images/right_nozzle.svg create mode 100644 resources/images/single_nozzle.svg create mode 100644 resources/images/single_slot_ams_item.svg create mode 100644 src/slic3r/GUI/Widgets/AMSItem.cpp create mode 100644 src/slic3r/GUI/Widgets/AMSItem.hpp diff --git a/resources/images/ams_drying.svg b/resources/images/ams_drying.svg new file mode 100644 index 000000000..e6f9fb9f6 --- /dev/null +++ b/resources/images/ams_drying.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/resources/images/ams_ext_image.svg b/resources/images/ams_ext_image.svg new file mode 100644 index 000000000..299f4cb94 --- /dev/null +++ b/resources/images/ams_ext_image.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/images/ext_ams_item.svg b/resources/images/ext_ams_item.svg new file mode 100644 index 000000000..f05222c7f --- /dev/null +++ b/resources/images/ext_ams_item.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/ext_image.svg b/resources/images/ext_image.svg new file mode 100644 index 000000000..e506134f1 --- /dev/null +++ b/resources/images/ext_image.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/resources/images/four_slot_ams_item.svg b/resources/images/four_slot_ams_item.svg new file mode 100644 index 000000000..2973eaecf --- /dev/null +++ b/resources/images/four_slot_ams_item.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/left_nozzle.svg b/resources/images/left_nozzle.svg new file mode 100644 index 000000000..e59b05124 --- /dev/null +++ b/resources/images/left_nozzle.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/resources/images/right_nozzle.svg b/resources/images/right_nozzle.svg new file mode 100644 index 000000000..5fb901f9e --- /dev/null +++ b/resources/images/right_nozzle.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/resources/images/single_nozzle.svg b/resources/images/single_nozzle.svg new file mode 100644 index 000000000..bca4c92c8 --- /dev/null +++ b/resources/images/single_nozzle.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/resources/images/single_slot_ams_item.svg b/resources/images/single_slot_ams_item.svg new file mode 100644 index 000000000..d194b85a2 --- /dev/null +++ b/resources/images/single_slot_ams_item.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 0bcca3b71..68b54b17b 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -58,6 +58,8 @@ set(SLIC3R_GUI_SOURCES GUI/Widgets/TempInput.hpp GUI/Widgets/AMSControl.cpp GUI/Widgets/AMSControl.hpp + GUI/Widgets/AMSItem.cpp + GUI/Widgets/AMSItem.hpp GUI/Widgets/FanControl.cpp GUI/Widgets/FanControl.hpp GUI/Widgets/Scrollbar.cpp diff --git a/src/slic3r/GUI/AMSMaterialsSetting.cpp b/src/slic3r/GUI/AMSMaterialsSetting.cpp index 6b9774d8c..b41e7aab5 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.cpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.cpp @@ -584,9 +584,10 @@ void AMSMaterialsSetting::on_select_ok(wxCommandEvent &event) } else { //todo + tar_tray = 0; } - obj->command_ams_filament_settings(255, tar_tray, ams_filament_id, ams_setting_id, std::string(col_buf), m_filament_type, nozzle_temp_min_int, nozzle_temp_max_int); + obj->command_ams_filament_settings(ams_id, tar_tray, ams_filament_id, ams_setting_id, std::string(col_buf), m_filament_type, nozzle_temp_min_int, nozzle_temp_max_int); } else { obj->command_ams_filament_settings(ams_id, tray_id, ams_filament_id, ams_setting_id, std::string(col_buf), m_filament_type, nozzle_temp_min_int, nozzle_temp_max_int); diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp index e68bf9ee0..1fa5ee7d1 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp @@ -626,12 +626,12 @@ void CalibrationPresetPage::create_filament_list_panel(wxWindow* parent) auto ams_items_sizer = new wxBoxSizer(wxHORIZONTAL); for (int i = 0; i < 4; i++) { AMSinfo temp_info = AMSinfo{ std::to_string(i), std::vector{} }; - auto amsitem = new AMSItem(m_multi_ams_panel, wxID_ANY, temp_info); + auto amsitem = new AMSPreview(m_multi_ams_panel, wxID_ANY, temp_info); amsitem->Bind(wxEVT_LEFT_DOWN, [this, amsitem](wxMouseEvent& e) { on_switch_ams(amsitem->m_amsinfo.ams_id); e.Skip(); }); - m_ams_item_list.push_back(amsitem); + m_ams_preview_list.push_back(amsitem); ams_items_sizer->Add(amsitem, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(6)); } multi_ams_sizer->Add(ams_items_sizer, 0); @@ -914,8 +914,8 @@ void CalibrationPresetPage::on_select_tray(wxCommandEvent& event) void CalibrationPresetPage::on_switch_ams(std::string ams_id) { - for (auto i = 0; i < m_ams_item_list.size(); i++) { - AMSItem* item = m_ams_item_list[i]; + for (auto i = 0; i < m_ams_preview_list.size(); i++) { + AMSPreview* item = m_ams_preview_list[i]; if (item->m_amsinfo.ams_id == ams_id) { item->OnSelected(); } @@ -1711,8 +1711,8 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) } } - for (auto i = 0; i < m_ams_item_list.size(); i++) { - AMSItem* item = m_ams_item_list[i]; + for (auto i = 0; i < m_ams_preview_list.size(); i++) { + AMSPreview* item = m_ams_preview_list[i]; if (ams_info.size() > 1) { if (i < ams_info.size()) { item->Update(ams_info[i]); diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.hpp b/src/slic3r/GUI/CalibrationWizardPresetPage.hpp index 15b46f236..bfa742fb0 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.hpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.hpp @@ -293,7 +293,7 @@ protected: FilamentComboBox* m_virtual_tray_comboBox; - std::vector m_ams_item_list; + std::vector m_ams_preview_list; // for update filament combobox, key : tray_id std::map filament_ams_list; diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index 5d6f228ce..1675b0838 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -851,6 +851,9 @@ StatusBasePanel::StatusBasePanel(wxWindow *parent, wxWindowID id, const wxPoint : wxScrolledWindow(parent, id, pos, size, wxHSCROLL | wxVSCROLL) { this->SetScrollRate(5, 5); + Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) return; + obj = dev->get_selected_machine(); init_bitmaps(); @@ -1155,7 +1158,7 @@ wxBoxSizer *StatusBasePanel::create_temp_axis_group(wxWindow *parent) content_sizer->Add(extruder_sizer, 0, wxEXPAND | wxTOP | wxBOTTOM, FromDIP(12)); box->SetSizer(content_sizer); - sizer->Add(box, 0, wxEXPAND | wxALL, FromDIP(9)); + sizer->Add(box, 0, wxEXPAND | wxALL, FromDIP(0)); return sizer; } @@ -1566,7 +1569,7 @@ wxBoxSizer *StatusBasePanel::create_ams_group(wxWindow *parent) m_ams_control = new AMSControl(m_ams_control_box, wxID_ANY); //m_ams_control->SetMinSize(wxSize(FromDIP(510), FromDIP(286))); m_ams_control->SetDoubleBuffered(true); - sizer_box->Add(m_ams_control, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, FromDIP(10)); + sizer_box->Add(m_ams_control, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, FromDIP(3)); m_ams_control_box->SetBackgroundColour(*wxWHITE); m_ams_control_box->SetSizer(sizer_box); @@ -1592,6 +1595,7 @@ void StatusBasePanel::show_ams_group(bool show) } } + void StatusPanel::update_camera_state(MachineObject* obj) { if (!obj) return; @@ -1752,6 +1756,7 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co Bind(EVT_AMS_ON_SELECTED, &StatusPanel::on_ams_selected, this); Bind(EVT_AMS_ON_FILAMENT_EDIT, &StatusPanel::on_filament_edit, this); Bind(EVT_VAMS_ON_FILAMENT_EDIT, &StatusPanel::on_ext_spool_edit, this); + //Bind(EVT_VAMS_ON_FILAMENT_EDIT, &StatusPanel::on_filament_edit, this); Bind(EVT_AMS_GUIDE_WIKI, &StatusPanel::on_ams_guide, this); Bind(EVT_AMS_RETRY, &StatusPanel::on_ams_retry, this); Bind(EVT_FAN_CHANGED, &StatusPanel::on_fan_changed, this); @@ -2620,14 +2625,37 @@ void StatusPanel::update_ams(MachineObject *obj) if (m_filament_setting_dlg) m_filament_setting_dlg->update(); std::vector ams_info; + ams_info.clear(); for (auto ams = obj->amsList.begin(); ams != obj->amsList.end(); ams++) { AMSinfo info; info.ams_id = ams->first; - if (ams->second->is_exists && info.parse_ams_info(obj, ams->second, obj->ams_calibrate_remain_flag, obj->is_support_ams_humidity)) ams_info.push_back(info); + if (ams->second->is_exists && info.parse_ams_info(obj, ams->second, obj->ams_calibrate_remain_flag, obj->is_support_ams_humidity)) { + ams_info.push_back(info); + } } + std::vector ext_info; + ext_info.clear(); + for (auto slot : obj->vt_slot) { + AMSinfo info; + info.ReadExtInfo(slot); + ext_info.push_back(info); + } + std::string dev_id = obj->dev_id; + //if (obj->ams_exist_bits != last_ams_exist_bits || obj->tray_exist_bits != last_tray_exist_bits || obj->tray_is_bbl_bits != last_tray_is_bbl_bits || + // obj->tray_read_done_bits != last_read_done_bits || obj->ams_version != last_ams_version) { + // m_ams_control->UpdateAms(ams_info, false); + // // select current ams + // //if (!obj->m_ams_id.empty()) m_ams_control->SwitchAms(obj->m_ams_id); + + // last_tray_exist_bits = obj->tray_exist_bits; + // last_ams_exist_bits = obj->ams_exist_bits; + // last_tray_is_bbl_bits = obj->tray_is_bbl_bits; + // last_read_done_bits = obj->tray_read_done_bits; + // last_ams_version = obj->ams_version; + //} // must select a current can - m_ams_control->UpdateAms(ams_info, false); + m_ams_control->UpdateAms(ams_info, ext_info, dev_id, false); last_tray_exist_bits = obj->tray_exist_bits; last_ams_exist_bits = obj->ams_exist_bits; @@ -3676,9 +3704,17 @@ void StatusPanel::on_filament_edit(wxCommandEvent &event) if (obj) { m_filament_setting_dlg->obj = obj; - std::string ams_id = m_ams_control->GetCurentAms(); + std::string ams_id; int ams_id_int = 0; int tray_id_int = 0; + int tray_id = event.GetInt(); + if (tray_id == VIRTUAL_TRAY_MAIN_ID || tray_id == VIRTUAL_TRAY_DEPUTY_ID) { + ams_id = std::to_string(tray_id); + } + else{ + ams_id = std::to_string(tray_id / 4); + } + if (ams_id.compare(std::to_string(VIRTUAL_TRAY_MAIN_ID)) == 0) { tray_id_int = VIRTUAL_TRAY_MAIN_ID; m_filament_setting_dlg->ams_id = ams_id_int; @@ -3690,10 +3726,10 @@ void StatusPanel::on_filament_edit(wxCommandEvent &event) m_filament_setting_dlg->Move(wxPoint(current_position_x, current_position_y)); m_filament_setting_dlg->Popup(wxEmptyString, wxEmptyString, wxEmptyString, wxEmptyString, k_val, n_val); } else { - std::string tray_id = event.GetString().ToStdString(); // m_ams_control->GetCurrentCan(ams_id); + //std::string tray_id = event.GetString().ToStdString(); // m_ams_control->GetCurrentCan(ams_id); try { - ams_id_int = atoi(ams_id.c_str()); - tray_id_int = atoi(tray_id.c_str()); + ams_id_int = tray_id / 4; + tray_id_int = tray_id % 4; m_filament_setting_dlg->ams_id = ams_id_int; m_filament_setting_dlg->tray_id = tray_id_int; @@ -3703,9 +3739,9 @@ void StatusPanel::on_filament_edit(wxCommandEvent &event) std::string temp_min; wxString k_val; wxString n_val; - auto it = obj->amsList.find(ams_id); + auto it = obj->amsList.find(std::to_string(ams_id_int)); if (it != obj->amsList.end()) { - auto tray_it = it->second->trayList.find(tray_id); + auto tray_it = it->second->trayList.find(std::to_string(tray_id)); if (tray_it != it->second->trayList.end()) { k_val = wxString::Format("%.3f", tray_it->second->k); n_val = wxString::Format("%.3f", tray_it->second->n); @@ -3758,7 +3794,10 @@ void StatusPanel::on_ext_spool_edit(wxCommandEvent &event) current_position_y = current_position_y + m_filament_setting_dlg->GetSize().GetHeight() > drect ? drect - m_filament_setting_dlg->GetSize().GetHeight() : current_position_y; if (obj) { + int tray_id = event.GetInt(); + int ams_id = tray_id / 4; m_filament_setting_dlg->obj = obj; + m_filament_setting_dlg->ams_id = ams_id; try { m_filament_setting_dlg->tray_id = VIRTUAL_TRAY_MAIN_ID; std::string sn_number; diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp index 9cdcbf607..69556320c 100644 --- a/src/slic3r/GUI/StatusPanel.hpp +++ b/src/slic3r/GUI/StatusPanel.hpp @@ -440,6 +440,7 @@ public: ~StatusBasePanel(); + MachineObject* obj{ nullptr }; void init_bitmaps(); wxBoxSizer *create_monitoring_page(); wxBoxSizer *create_machine_control_page(wxWindow *parent); @@ -647,7 +648,6 @@ public: STATE_COUNT = 4 }; - MachineObject *obj {nullptr}; BBLSubTask * last_subtask{nullptr}; std::string last_profile_id; std::string last_task_id; diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index 4c2af1a7b..ffff4c7df 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -2410,190 +2410,216 @@ void AmsCans::show_sn_value(bool show) Description:AMSControl **************************************************/ // WX_DEFINE_OBJARRAY(AmsItemsHash); +#define AMS_CANS_SIZE wxSize(FromDIP(284), -1) +#define AMS_CANS_WINDOW_SIZE wxSize(FromDIP(264), -1) AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) : wxSimplebook(parent, wxID_ANY, pos, size) , m_Humidity_tip_popup(AmsHumidityTipPopup(this)) , m_ams_introduce_popup(AmsIntroducePopup(this)) { + Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (dev) { + MachineObject *obj = dev->get_selected_machine(); + parse_object(obj); + } + SetBackgroundColour(*wxWHITE); // normal mode - //Freeze(); + Freeze(); wxBoxSizer *m_sizer_body = new wxBoxSizer(wxVERTICAL); - m_amswin = new wxWindow(this, wxID_ANY, wxDefaultPosition, wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); + m_amswin = new wxWindow(this, wxID_ANY); m_amswin->SetBackgroundColour(*wxWHITE); - - // top - ams tag - m_simplebook_amsitems = new wxSimplebook(m_amswin, wxID_ANY); - m_simplebook_amsitems->SetSize(wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); - m_simplebook_amsitems->SetMinSize(wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); - auto m_sizer_amsitems = new wxBoxSizer(wxHORIZONTAL); - m_simplebook_amsitems->SetSizer(m_sizer_amsitems); - m_simplebook_amsitems->Layout(); - m_sizer_amsitems->Fit(m_simplebook_amsitems); - - m_panel_top = new wxPanel(m_simplebook_amsitems, wxID_ANY, wxDefaultPosition, wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); - m_sizer_top = new wxBoxSizer(wxHORIZONTAL); - m_panel_top->SetSizer(m_sizer_top); - m_panel_top->Layout(); - m_sizer_top->Fit(m_panel_top); - - auto m_panel_top_empty = new wxPanel(m_simplebook_amsitems, wxID_ANY, wxDefaultPosition, wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); - auto m_sizer_top_empty = new wxBoxSizer(wxHORIZONTAL); - m_panel_top_empty->SetSizer(m_sizer_top_empty); - m_panel_top_empty->Layout(); - m_sizer_top_empty->Fit(m_panel_top_empty); - - m_simplebook_amsitems->AddPage(m_panel_top_empty, wxEmptyString, false); - m_simplebook_amsitems->AddPage(m_panel_top, wxEmptyString, false); + //m_amswin->SetBackgroundColour(wxColour(0x00CED1)); + m_amswin->SetSize(wxSize(FromDIP(578), -1)); + m_amswin->SetMinSize(wxSize(FromDIP(578), -1)); - wxBoxSizer *m_sizer_bottom = new wxBoxSizer(wxHORIZONTAL); - wxBoxSizer *m_sizer_left = new wxBoxSizer(wxVERTICAL); + m_sizer_ams_items = new wxBoxSizer(wxHORIZONTAL); + + /*right items*/ + m_panel_items_left = new wxPanel(m_amswin, wxID_ANY); + m_panel_items_left->SetSize(AMS_ITEMS_PANEL_SIZE); + m_panel_items_left->SetMinSize(AMS_ITEMS_PANEL_SIZE); + //m_panel_items_left->SetBackgroundColour(0x4169E1); + m_panel_items_left->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); + m_sizer_items_left = new wxBoxSizer(wxHORIZONTAL); + m_panel_items_left->SetSizer(m_sizer_items_left); + m_panel_items_left->Layout(); + //m_sizer_items_left->Fit(m_panel_items_left); + + /*right items*/ + m_panel_items_right = new wxPanel(m_amswin, wxID_ANY); + m_panel_items_right->SetSize(AMS_ITEMS_PANEL_SIZE); + m_panel_items_right->SetMinSize(AMS_ITEMS_PANEL_SIZE); + //m_panel_items_right->SetBackgroundColour(0x4169E1); + m_panel_items_right->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); + m_sizer_items_right = new wxBoxSizer(wxHORIZONTAL); + m_panel_items_right->SetSizer(m_sizer_items_right); + m_panel_items_right->Layout(); + //m_sizer_items_right->Fit(m_panel_items_right); + + /*m_sizer_ams_items->Add(m_panel_items_left, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(5)); + m_sizer_ams_items->Add(m_panel_items_right, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(5));*/ + m_sizer_ams_items->Add(m_panel_items_left, 0, wxLEFT, FromDIP(5)); + m_sizer_ams_items->Add(m_panel_items_right, 0, wxLEFT, FromDIP(5)); + + //m_panel_items_right->Hide(); + + //m_sizer_ams_body = new wxBoxSizer(wxHORIZONTAL); + + m_sizer_ams_body = new wxBoxSizer(wxHORIZONTAL); //ams tip - m_sizer_ams_tips = new wxBoxSizer(wxHORIZONTAL); - m_ams_tip = new Label(m_amswin, _L("AMS")); - m_ams_tip->SetFont(::Label::Body_12); - m_ams_tip->SetBackgroundColour(*wxWHITE); - m_img_amsmapping_tip = new wxStaticBitmap(m_amswin, wxID_ANY, create_scaled_bitmap("enable_ams", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); - m_img_amsmapping_tip->SetBackgroundColour(*wxWHITE); +// m_sizer_ams_tips = new wxBoxSizer(wxHORIZONTAL); +// m_ams_tip = new Label(m_amswin, _L("AMS")); +// m_ams_tip->SetFont(::Label::Body_12); +// m_ams_tip->SetBackgroundColour(*wxWHITE); +// m_img_amsmapping_tip = new wxStaticBitmap(m_amswin, wxID_ANY, create_scaled_bitmap("enable_ams", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); +// m_img_amsmapping_tip->SetBackgroundColour(*wxWHITE); +// +// m_sizer_ams_tips->Add(m_ams_tip, 0, wxTOP, FromDIP(5)); +// m_sizer_ams_tips->Add(m_img_amsmapping_tip, 0, wxALL, FromDIP(3)); +// +// m_img_amsmapping_tip->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { +// wxPoint img_pos = m_img_amsmapping_tip->ClientToScreen(wxPoint(0, 0)); +// wxPoint popup_pos(img_pos.x, img_pos.y + m_img_amsmapping_tip->GetRect().height); +// m_ams_introduce_popup.set_mode(true); +// m_ams_introduce_popup.Position(popup_pos, wxSize(0, 0)); +// m_ams_introduce_popup.Popup(); +// +//#ifdef __WXMSW__ +// wxCommandEvent close_event(EVT_CLEAR_SPEED_CONTROL); +// wxPostEvent(this, close_event); +//#endif // __WXMSW__ +// }); +// m_img_amsmapping_tip->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) { +// m_ams_introduce_popup.Dismiss(); +// }); +// +// + - m_sizer_ams_tips->Add(m_ams_tip, 0, wxTOP, FromDIP(5)); - m_sizer_ams_tips->Add(m_img_amsmapping_tip, 0, wxALL, FromDIP(3)); + //ams area + /*m_panel_left_ams_area = new StaticBox(m_amswin, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); + m_panel_left_ams_area->SetMaxSize(AMS_CANS_SIZE); + m_panel_left_ams_area->SetMinSize(AMS_CANS_SIZE); + m_panel_left_ams_area->SetCornerRadius(FromDIP(10)); + m_panel_left_ams_area->SetBackgroundColor(StateColor(std::pair(AMS_CONTROL_DEF_BLOCK_BK_COLOUR, StateColor::Normal))); - m_img_amsmapping_tip->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { - wxPoint img_pos = m_img_amsmapping_tip->ClientToScreen(wxPoint(0, 0)); - wxPoint popup_pos(img_pos.x, img_pos.y + m_img_amsmapping_tip->GetRect().height); - m_ams_introduce_popup.set_mode(true); - m_ams_introduce_popup.Position(popup_pos, wxSize(0, 0)); - m_ams_introduce_popup.Popup(); + m_panel_right_ams_area = new StaticBox(m_amswin, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); + m_panel_right_ams_area->SetMaxSize(AMS_CANS_SIZE); + m_panel_right_ams_area->SetMinSize(AMS_CANS_SIZE); + m_panel_right_ams_area->SetCornerRadius(FromDIP(10)); + m_panel_right_ams_area->SetBackgroundColor(StateColor(std::pair(AMS_CONTROL_DEF_BLOCK_BK_COLOUR, StateColor::Normal)));*/ -#ifdef __WXMSW__ - wxCommandEvent close_event(EVT_CLEAR_SPEED_CONTROL); - wxPostEvent(this, close_event); -#endif // __WXMSW__ - }); - m_img_amsmapping_tip->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) { - m_ams_introduce_popup.Dismiss(); - }); + m_sizer_ams_area_left = new wxBoxSizer(wxHORIZONTAL); + m_sizer_ams_area_right = new wxBoxSizer(wxHORIZONTAL); + m_sizer_down_road = new wxBoxSizer(wxHORIZONTAL); + m_simplebook_ams_left = new wxSimplebook(m_amswin, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); + m_simplebook_ams_left->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); + m_sizer_ams_area_left->Add(m_simplebook_ams_left, 0, wxLEFT | wxRIGHT, FromDIP(10)); - //backup tips - m_ams_backup_tip = new Label(m_amswin, _L("Auto Refill")); - m_ams_backup_tip->SetFont(::Label::Head_12); - m_ams_backup_tip->SetForegroundColour(wxColour(0x00AE42)); - m_ams_backup_tip->SetBackgroundColour(*wxWHITE); - m_img_ams_backup = new wxStaticBitmap(m_amswin, wxID_ANY, create_scaled_bitmap("automatic_material_renewal", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); - m_img_ams_backup->SetBackgroundColour(*wxWHITE); + m_simplebook_ams_right = new wxSimplebook(m_amswin, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); + m_simplebook_ams_right->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); + m_sizer_ams_area_right->Add(m_simplebook_ams_right, 0, wxLEFT | wxRIGHT, FromDIP(10)); - m_sizer_ams_tips->Add(0, 0, 1, wxEXPAND, 0); - m_sizer_ams_tips->Add(m_img_ams_backup, 0, wxALL, FromDIP(3)); - m_sizer_ams_tips->Add(m_ams_backup_tip, 0, wxTOP, FromDIP(5)); + m_panel_down_road = new wxPanel(m_amswin, wxID_ANY, wxDefaultPosition, AMS_DOWN_ROAD_SIZE, 0); + m_panel_down_road->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); - m_ams_backup_tip->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); - m_img_ams_backup->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); - - m_ams_backup_tip->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); - m_img_ams_backup->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); - - m_ams_backup_tip->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {post_event(SimpleEvent(EVT_AMS_FILAMENT_BACKUP)); }); - m_img_ams_backup->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {post_event(SimpleEvent(EVT_AMS_FILAMENT_BACKUP)); }); - - - //ams cans - m_panel_can = new StaticBox(m_amswin, wxID_ANY, wxDefaultPosition, AMS_CANS_SIZE, wxBORDER_NONE); - m_panel_can->SetMinSize(AMS_CANS_SIZE); - m_panel_can->SetCornerRadius(FromDIP(10)); - m_panel_can->SetBackgroundColor(StateColor(std::pair(AMS_CONTROL_DEF_BLOCK_BK_COLOUR, StateColor::Normal))); - - m_sizer_cans = new wxBoxSizer(wxHORIZONTAL); - - m_simplebook_ams = new wxSimplebook(m_panel_can, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); - m_simplebook_ams->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); - m_sizer_cans->Add(m_simplebook_ams, 0, wxLEFT | wxLEFT, FromDIP(10)); + m_down_road = new AMSRoadDownPart(m_panel_down_road, wxID_ANY, wxDefaultPosition, AMS_DOWN_ROAD_SIZE); + m_sizer_down_road->Add(m_panel_down_road, 0, wxALIGN_CENTER, 0); // ams mode - m_simplebook_generic_cans = new wxSimplebook(m_simplebook_ams, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); - m_simplebook_generic_cans->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); + //m_simplebook_ams_left = new wxSimplebook(m_simplebook_ams_left, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); + //m_simplebook_ams_left->SetBackgroundColour(*wxGREEN); + //m_simplebook_ams_left->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); + //m_simplebook_ams_right = new wxSimplebook(m_simplebook_ams_right, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); + m_simplebook_ams_right->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); - // none ams mode - m_none_ams_panel = new wxPanel(m_simplebook_ams, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); - m_none_ams_panel->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); - - auto m_tip_none_ams = new wxStaticText(m_none_ams_panel, wxID_ANY, _L("AMS not connected"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL); - m_tip_none_ams->SetMinSize(wxSize(AMS_CANS_SIZE.x - FromDIP(20), -1)); - m_tip_none_ams->SetFont(::Label::Head_16); - m_tip_none_ams->SetForegroundColour(AMS_CONTROL_DISABLE_COLOUR); - - wxBoxSizer *sizer_ams_panel_v = new wxBoxSizer(wxVERTICAL); - wxBoxSizer *sizer_ams_panel_h = new wxBoxSizer(wxHORIZONTAL); - - sizer_ams_panel_v->Add(m_tip_none_ams, 0, wxALIGN_CENTER, 0); - sizer_ams_panel_h->Add(sizer_ams_panel_v, 0, wxALIGN_CENTER, 0); - - m_none_ams_panel->SetSizer(sizer_ams_panel_h); - m_none_ams_panel->Layout(); //extra ams mode - m_simplebook_extra_cans = new wxSimplebook(m_simplebook_ams, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); - m_simplebook_extra_cans->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); + //m_simplebook_extra_cans_left = new wxSimplebook(m_simplebook_ams_left, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); + //m_simplebook_extra_cans_left->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); + // m_simplebook_extra_cans_right = new wxSimplebook(m_simplebook_ams_right, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); + //m_simplebook_extra_cans_right->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); - m_simplebook_ams->AddPage(m_none_ams_panel, wxEmptyString, false); - m_simplebook_ams->AddPage(m_simplebook_generic_cans, wxEmptyString, false); - m_simplebook_ams->AddPage(m_simplebook_extra_cans, wxEmptyString, false); + //m_simplebook_ams_left->AddPage(m_simplebook_ams_left, wxEmptyString, false); + //m_simplebook_ams_left->AddPage(m_simplebook_extra_cans_left, wxEmptyString, false); + //m_simplebook_ams_right->AddPage(m_simplebook_ams_right, wxEmptyString, false); + //m_simplebook_ams_right->AddPage(m_simplebook_extra_cans_right, wxEmptyString, false); - m_panel_can->SetSizer(m_sizer_cans); - m_panel_can->Layout(); - m_sizer_cans->Fit(m_panel_can); + m_sizer_ams_area_left->Layout(); + m_sizer_ams_area_right->Layout(); - m_sizer_left->Add(m_sizer_ams_tips, 0, wxEXPAND, 0); - m_sizer_left->Add(m_panel_can, 1, wxEXPAND, 0); - wxBoxSizer *m_sizer_left_bottom = new wxBoxSizer(wxHORIZONTAL); - wxBoxSizer *sizer_sextruder = new wxBoxSizer(wxVERTICAL); + m_sizer_ams_option = new wxBoxSizer(wxHORIZONTAL); + m_sizer_option_left = new wxBoxSizer(wxHORIZONTAL); + m_sizer_option_mid = new wxBoxSizer(wxHORIZONTAL); + m_sizer_option_right = new wxBoxSizer(wxHORIZONTAL); - auto extruder_pane = new wxPanel(m_amswin, wxID_ANY, wxDefaultPosition, AMS_EXTRUDER_SIZE); - - extruder_pane->SetSizer(sizer_sextruder); - extruder_pane->Layout(); - - m_extruder = new AMSextruder(extruder_pane, wxID_ANY, wxDefaultPosition, AMS_EXTRUDER_SIZE); - sizer_sextruder->Add(m_extruder, 0, wxALIGN_CENTER, 0); - - m_sizer_left_bottom->Add(extruder_pane, 0, wxALL,0); - - //m_sizer_left_bottom->Add(0, 0, 0, wxEXPAND, 0); + /*m_sizer_option_left->SetMinSize( wxSize( AMS_CANS_SIZE.x,-1 ) ); + m_sizer_option_right->SetMinSize( wxSize( AMS_CANS_SIZE.x,-1 ) );*/ + /*m_sizer_option_left->SetMinSize(wxSize(FromDIP(239), -1)); + m_sizer_option_right->SetMinSize(wxSize(FromDIP(239), -1));*/ + m_sizer_option_left->SetMinSize(wxSize(FromDIP(180), -1)); + //m_sizer_option_right->SetMinSize(wxSize(FromDIP(120), -1)); StateColor btn_bg_green(std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Disabled), - std::pair(wxColour(27, 136, 68), StateColor::Pressed), - std::pair(wxColour(61, 203, 115), StateColor::Hovered), - std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); + std::pair(wxColour(27, 136, 68), StateColor::Pressed), + std::pair(wxColour(61, 203, 115), StateColor::Hovered), + std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); StateColor btn_bg_white(std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Disabled), - std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Pressed), - std::pair(AMS_CONTROL_DEF_BLOCK_BK_COLOUR, StateColor::Hovered), - std::pair(AMS_CONTROL_WHITE_COLOUR, StateColor::Normal)); + std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Pressed), + std::pair(AMS_CONTROL_DEF_BLOCK_BK_COLOUR, StateColor::Hovered), + std::pair(AMS_CONTROL_WHITE_COLOUR, StateColor::Normal)); - StateColor btn_bd_green(std::pair(wxColour(255,255,254), StateColor::Disabled), - std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Enabled)); + StateColor btn_bd_green(std::pair(wxColour(255, 255, 254), StateColor::Disabled), + std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Enabled)); - StateColor btn_bd_white(std::pair(wxColour(255,255,254), StateColor::Disabled), - std::pair(wxColour(38, 46, 48), StateColor::Enabled)); + StateColor btn_bd_white(std::pair(wxColour(255, 255, 254), StateColor::Disabled), + std::pair(wxColour(38, 46, 48), StateColor::Enabled)); - StateColor btn_text_green(std::pair(wxColour(255,255,254), StateColor::Disabled), - std::pair(wxColour(255,255,254), StateColor::Enabled)); + StateColor btn_text_green(std::pair(wxColour(255, 255, 254), StateColor::Disabled), + std::pair(wxColour(255, 255, 254), StateColor::Enabled)); StateColor btn_text_white(std::pair(wxColour(255, 255, 254), StateColor::Disabled), - std::pair(wxColour(38, 46, 48), StateColor::Enabled)); - - m_button_area = new wxWindow(m_amswin, wxID_ANY); - m_button_area->SetBackgroundColour(m_amswin->GetBackgroundColour()); + std::pair(wxColour(38, 46, 48), StateColor::Enabled)); - wxBoxSizer *m_sizer_button = new wxBoxSizer(wxVERTICAL); - wxBoxSizer *m_sizer_button_area = new wxBoxSizer(wxHORIZONTAL); + /*option left*/ + m_button_auto_refill = new Button(m_amswin, _L("Auto-refill")); + m_button_auto_refill->SetBackgroundColor(btn_bg_white); + m_button_auto_refill->SetBorderColor(btn_bd_white); + m_button_auto_refill->SetTextColor(btn_text_white); + m_button_auto_refill->SetFont(Label::Body_13); + // m_img_ams_backup = new wxStaticBitmap(m_amswin, wxID_ANY, create_scaled_bitmap("automatic_material_renewal", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); + // m_img_ams_backup->SetBackgroundColour(*wxWHITE); + // m_img_ams_backup->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); + // m_img_ams_backup->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); + // m_img_ams_backup->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {post_event(SimpleEvent(EVT_AMS_FILAMENT_BACKUP)); }); + m_sizer_option_left->Add(m_button_auto_refill, 0, wxLEFT, 0); - m_button_extruder_feed = new Button(m_button_area, _L("Load")); + m_button_ams_setting_normal = ScalableBitmap(this, "ams_setting_normal", 24); + m_button_ams_setting_hover = ScalableBitmap(this, "ams_setting_hover", 24); + m_button_ams_setting_press = ScalableBitmap(this, "ams_setting_press", 24); + + m_button_ams_setting = new wxStaticBitmap(m_amswin, wxID_ANY, m_button_ams_setting_normal.bmp(), wxDefaultPosition, wxSize(FromDIP(24), FromDIP(24))); + m_button_ams_setting->SetBackgroundColour(m_amswin->GetBackgroundColour()); + m_sizer_option_left->Add(m_button_ams_setting, 0, wxLEFT, FromDIP(5)); + + + /*option mid*/ + m_extruder = new AMSextruder(m_amswin, wxID_ANY, wxDefaultPosition, AMS_EXTRUDER_SIZE); + m_sizer_option_mid->Add( m_extruder, 0, wxALIGN_CENTER, 0 ); + + + /*option right*/ + + + + m_button_extruder_feed = new Button(m_amswin, _L("Load")); m_button_extruder_feed->SetFont(Label::Body_13); m_button_extruder_feed->SetBackgroundColor(btn_bg_green); @@ -2612,7 +2638,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons if (wxGetApp().app_config->get("language") == "uk_UA") m_button_extruder_feed->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "pt_BR") m_button_extruder_feed->SetLabel("Load"); - m_button_extruder_back = new Button(m_button_area, _L("Unload")); + m_button_extruder_back = new Button(m_amswin, _L("Unload")); m_button_extruder_back->SetBackgroundColor(btn_bg_white); m_button_extruder_back->SetBorderColor(btn_bd_white); m_button_extruder_back->SetTextColor(btn_text_white); @@ -2629,119 +2655,132 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons if (wxGetApp().app_config->get("language") == "uk_UA") m_button_extruder_back->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "pt_BR") m_button_extruder_back->SetLabel("Unload"); - m_sizer_button_area->Add(0, 0, 1, wxEXPAND, 0); - m_sizer_button_area->Add(m_button_extruder_back, 0, wxLEFT, FromDIP(6)); - m_sizer_button_area->Add(m_button_extruder_feed, 0, wxLEFT, FromDIP(6)); - m_sizer_button->Add(m_sizer_button_area, 0, 1, wxEXPAND, 0); + //m_sizer_option_right->Add(0, 0, 1, wxEXPAND, 0); + m_sizer_option_right->Add(m_button_extruder_back, 0, wxLEFT, FromDIP(60)); + m_sizer_option_right->Add(m_button_extruder_feed, 0, wxLEFT, FromDIP(5)); - m_button_area->SetSizer(m_sizer_button); - m_button_area->Layout(); - m_button_area->Fit(); - m_sizer_left_bottom->Add(0, 0, 1, wxEXPAND, 0); - m_sizer_left_bottom->Add(m_button_area, 0, wxEXPAND | wxTOP, FromDIP(18)); - m_sizer_left->Add(m_sizer_left_bottom, 0, wxEXPAND, 0); + m_sizer_ams_option->Add(m_sizer_option_left, 0, wxEXPAND, 0); + //m_sizer_ams_option->Add(m_sizer_option_mid, 1, wxEXPAND, 0); + m_sizer_ams_option->Add(m_sizer_option_mid, 1, wxEXPAND, 0); + //m_sizer_ams_option->Add(m_sizer_option_right, 0, wxEXPAND, 0); + m_sizer_ams_option->Add(m_sizer_option_right, 0, wxLEFT, 0); + //virtual ams - m_panel_virtual = new StaticBox(m_amswin, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); - m_panel_virtual->SetBackgroundColor(StateColor(std::pair(AMS_CONTROL_DEF_BLOCK_BK_COLOUR, StateColor::Normal))); - m_panel_virtual->SetMinSize(wxSize(AMS_CAN_LIB_SIZE.x + FromDIP(16), AMS_CANS_SIZE.y)); - m_panel_virtual->SetMaxSize(wxSize(AMS_CAN_LIB_SIZE.x + FromDIP(16), AMS_CANS_SIZE.y)); + //m_panel_virtual = new StaticBox(m_amswin, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); + //m_panel_virtual->SetBackgroundColor(StateColor(std::pair(AMS_CONTROL_DEF_BLOCK_BK_COLOUR, StateColor::Normal))); + //m_panel_virtual->SetMinSize(wxSize(AMS_CAN_LIB_SIZE.x + FromDIP(16), AMS_CANS_SIZE.y)); + //m_panel_virtual->SetMaxSize(wxSize(AMS_CAN_LIB_SIZE.x + FromDIP(16), AMS_CANS_SIZE.y)); - m_vams_info.material_state = AMSCanType::AMS_CAN_TYPE_VIRTUAL; - m_vams_info.can_id = wxString::Format("%d", VIRTUAL_TRAY_MAIN_ID).ToStdString(); + //m_vams_info.material_state = AMSCanType::AMS_CAN_TYPE_VIRTUAL; + //m_vams_info.can_id = wxString::Format("%d", VIRTUAL_TRAY_MAIN_ID).ToStdString(); - auto vams_panel = new wxWindow(m_panel_virtual, wxID_ANY); - vams_panel->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); + //auto vams_panel = new wxWindow(m_panel_virtual, wxID_ANY); + //vams_panel->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); - m_vams_lib = new AMSLib(vams_panel, m_vams_info); - m_vams_road = new AMSRoad(vams_panel, wxID_ANY, m_vams_info, -1, -1, wxDefaultPosition, AMS_CAN_ROAD_SIZE); + //m_vams_lib = new AMSLib(vams_panel, m_vams_info); + //m_vams_road = new AMSRoad(vams_panel, wxID_ANY, m_vams_info, -1, -1, wxDefaultPosition, AMS_CAN_ROAD_SIZE); - m_vams_lib->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { - //clear all selected - m_current_ams = m_vams_info.can_id; - m_vams_lib->OnSelected(); + //m_vams_lib->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { + // //clear all selected + // m_current_ams = m_vams_info.can_id; + // m_vams_lib->OnSelected(); - SwitchAms(m_current_ams); - for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { - AmsCansWindow* cans = m_ams_cans_list[i]; - cans->amsCans->SelectCan(m_current_ams); - } + // SwitchAms(m_current_ams); + // for (auto i = 0; i < m_ams_item_list.GetCount(); i++) { + // AmsCansWindow* cans = m_ams_item_list[i]; + // cans->amsCans->SelectCan(m_current_ams); + // } - e.Skip(); - }); + // e.Skip(); + // }); - Bind(EVT_AMS_UNSELETED_VAMS, [this](wxCommandEvent& e) { - /*if (m_current_ams == e.GetString().ToStdString()) { - return; - }*/ - m_current_ams = e.GetString().ToStdString(); - SwitchAms(m_current_ams); - m_vams_lib->UnSelected(); - e.Skip(); - }); + //Bind(EVT_AMS_UNSELETED_VAMS, [this](wxCommandEvent& e) { + // /*if (m_current_ams == e.GetString().ToStdString()) { + // return; + // }*/ + // m_current_ams = e.GetString().ToStdString(); + // SwitchAms(m_current_ams); + // m_vams_lib->UnSelected(); + // e.Skip(); + //}); - wxBoxSizer* m_vams_top_sizer = new wxBoxSizer(wxVERTICAL); + //wxBoxSizer* m_vams_top_sizer = new wxBoxSizer(wxVERTICAL); - m_vams_top_sizer->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(14)); - m_vams_top_sizer->Add(0, 0, 0, wxEXPAND | wxTOP, AMS_REFRESH_SIZE.y); - m_vams_top_sizer->Add(m_vams_lib, 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, FromDIP(4)); - m_vams_top_sizer->Add(m_vams_road, 0, wxALL, 0); + //m_vams_top_sizer->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(14)); + //m_vams_top_sizer->Add(0, 0, 0, wxEXPAND | wxTOP, AMS_REFRESH_SIZE.y); + //m_vams_top_sizer->Add(m_vams_lib, 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, FromDIP(4)); + //m_vams_top_sizer->Add(m_vams_road, 0, wxALL, 0); + //Bind(EVT_AMS_UNSELETED_VAMS, [this](wxCommandEvent& e) { + // /*if (m_current_ams == e.GetString().ToStdString()) { + // return; + // }*/ + // m_current_ams = e.GetString().ToStdString(); + // SwitchAms(m_current_ams); + // m_vams_lib->UnSelected(); + // e.Skip(); + //}); - //extra road + ////extra road - vams_panel->SetSizer(m_vams_top_sizer); - vams_panel->Layout(); - vams_panel->Fit(); + //vams_panel->SetSizer(m_vams_top_sizer); + //vams_panel->Layout(); + //vams_panel->Fit(); - wxBoxSizer* m_sizer_vams_panel = new wxBoxSizer(wxVERTICAL); + //wxBoxSizer* m_sizer_vams_panel = new wxBoxSizer(wxVERTICAL); - m_sizer_vams_panel->Add(vams_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0); - m_panel_virtual->SetSizer(m_sizer_vams_panel); - m_panel_virtual->Layout(); - m_panel_virtual->Fit(); + //m_sizer_vams_panel->Add(vams_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0); + //m_panel_virtual->SetSizer(m_sizer_vams_panel); + //m_panel_virtual->Layout(); + //m_panel_virtual->Fit(); - m_vams_sizer = new wxBoxSizer(wxVERTICAL); - m_sizer_vams_tips = new wxBoxSizer(wxHORIZONTAL); + //m_vams_sizer = new wxBoxSizer(wxVERTICAL); + //m_sizer_vams_tips = new wxBoxSizer(wxHORIZONTAL); - auto m_vams_tip = new wxStaticText(m_amswin, wxID_ANY, _L("Ext Spool"), wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); - m_vams_tip->SetMaxSize(wxSize(FromDIP(66), -1)); - m_vams_tip->SetFont(::Label::Body_12); - m_vams_tip->SetBackgroundColour(*wxWHITE); - m_img_vams_tip = new wxStaticBitmap(m_amswin, wxID_ANY, create_scaled_bitmap("enable_ams", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); - m_img_vams_tip->SetBackgroundColour(*wxWHITE); - m_img_vams_tip->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { - wxPoint img_pos = m_img_vams_tip->ClientToScreen(wxPoint(0, 0)); - wxPoint popup_pos(img_pos.x, img_pos.y + m_img_vams_tip->GetRect().height); - m_ams_introduce_popup.set_mode(false); - m_ams_introduce_popup.Position(popup_pos, wxSize(0, 0)); - m_ams_introduce_popup.Popup(); +// auto m_vams_tip = new wxStaticText(m_amswin, wxID_ANY, _L("Ext Spool"), wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); +// m_vams_tip->SetMaxSize(wxSize(FromDIP(66), -1)); +// m_vams_tip->SetFont(::Label::Body_12); +// m_vams_tip->SetBackgroundColour(*wxWHITE); +// m_img_vams_tip = new wxStaticBitmap(m_amswin, wxID_ANY, create_scaled_bitmap("enable_ams", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); +// m_img_vams_tip->SetBackgroundColour(*wxWHITE); +// m_img_vams_tip->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { +// wxPoint img_pos = m_img_vams_tip->ClientToScreen(wxPoint(0, 0)); +// wxPoint popup_pos(img_pos.x, img_pos.y + m_img_vams_tip->GetRect().height); +// m_ams_introduce_popup.set_mode(false); +// m_ams_introduce_popup.Position(popup_pos, wxSize(0, 0)); +// m_ams_introduce_popup.Popup(); +// +//#ifdef __WXMSW__ +// wxCommandEvent close_event(EVT_CLEAR_SPEED_CONTROL); +// wxPostEvent(this, close_event); +//#endif // __WXMSW__ +// }); +// +// m_img_vams_tip->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) { +// m_ams_introduce_popup.Dismiss(); +// }); +// +// m_sizer_vams_tips->Add(m_vams_tip, 0, wxTOP, FromDIP(5)); +// m_sizer_vams_tips->Add(m_img_vams_tip, 0, wxALL, FromDIP(3)); -#ifdef __WXMSW__ - wxCommandEvent close_event(EVT_CLEAR_SPEED_CONTROL); - wxPostEvent(this, close_event); -#endif // __WXMSW__ - }); + //m_vams_extra_road = new AMSVirtualRoad(m_amswin, wxID_ANY); + //m_vams_extra_road->SetMinSize(wxSize(m_panel_virtual->GetSize().x + FromDIP(16), -1)); - m_img_vams_tip->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) { - m_ams_introduce_popup.Dismiss(); - }); - - m_sizer_vams_tips->Add(m_vams_tip, 0, wxTOP, FromDIP(5)); - m_sizer_vams_tips->Add(m_img_vams_tip, 0, wxALL, FromDIP(3)); - - m_vams_extra_road = new AMSVirtualRoad(m_amswin, wxID_ANY); - m_vams_extra_road->SetMinSize(wxSize(m_panel_virtual->GetSize().x + FromDIP(16), -1)); - - m_vams_sizer->Add(m_sizer_vams_tips, 0, wxALIGN_CENTER, 0); - m_vams_sizer->Add(m_panel_virtual, 0, wxALIGN_CENTER, 0); - m_vams_sizer->Add(m_vams_extra_road, 1, wxEXPAND, 0); + //m_vams_sizer->Add(m_sizer_vams_tips, 0, wxALIGN_CENTER, 0); + //m_vams_sizer->Add(m_panel_virtual, 0, wxALIGN_CENTER, 0); + //m_vams_sizer->Add(m_vams_extra_road, 1, wxEXPAND, 0); //Right + /* + addaddaddaddaddaaddaddaddadd + */ + + /* wxBoxSizer *m_sizer_right = new wxBoxSizer(wxVERTICAL); m_simplebook_right = new wxSimplebook(m_amswin, wxID_ANY); m_simplebook_right->SetMinSize(wxSize(AMS_STEP_SIZE.x, AMS_STEP_SIZE.y + FromDIP(19))); @@ -2792,13 +2831,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_simplebook_right->AddPage(m_filament_vt_load_step, wxEmptyString, false); - m_button_ams_setting_normal = ScalableBitmap(this, "ams_setting_normal", 24); - m_button_ams_setting_hover = ScalableBitmap(this, "ams_setting_hover", 24); - m_button_ams_setting_press = ScalableBitmap(this, "ams_setting_press", 24); - wxBoxSizer *m_sizer_right_bottom = new wxBoxSizer(wxHORIZONTAL); - m_button_ams_setting = new wxStaticBitmap(m_amswin, wxID_ANY, m_button_ams_setting_normal.bmp(), wxDefaultPosition, wxSize(FromDIP(24), FromDIP(24))); - m_button_ams_setting->SetBackgroundColour(m_amswin->GetBackgroundColour()); m_button_guide = new Button(m_amswin, _L("Guide")); m_button_guide->SetFont(Label::Body_13); @@ -2811,7 +2844,6 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons if (wxGetApp().app_config->get("language") == "sv_SE") m_button_guide->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "cs_CZ") m_button_guide->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "uk_UA") m_button_guide->SetFont(Label::Body_9); - if (wxGetApp().app_config->get("language") == "pt_BR") m_button_guide->SetLabel("Guide"); m_button_guide->SetCornerRadius(FromDIP(12)); m_button_guide->SetBorderColor(btn_bd_white); @@ -2832,7 +2864,6 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons if (wxGetApp().app_config->get("language") == "sv_SE") m_button_retry->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "cs_CZ") m_button_retry->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "uk_UA") m_button_retry->SetFont(Label::Body_9); - if (wxGetApp().app_config->get("language") == "pt_BR") m_button_retry->SetLabel("Retry"); m_button_retry->SetCornerRadius(FromDIP(12)); m_button_retry->SetBorderColor(btn_bd_white); @@ -2843,101 +2874,44 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_sizer_right_bottom->Add(m_button_ams_setting, 0); m_sizer_right_bottom->Add(m_button_guide, 0, wxLEFT, FromDIP(10)); m_sizer_right_bottom->Add(m_button_retry, 0, wxLEFT, FromDIP(10)); - m_sizer_right->Add(m_sizer_right_bottom, 0, wxEXPAND | wxTOP, FromDIP(20)); + m_sizer_right->Add(m_sizer_right_bottom, 0, wxEXPAND | wxTOP, FromDIP(20));*/ - m_sizer_bottom->Add(m_vams_sizer, 0, wxEXPAND, 0); - m_sizer_bottom->Add(m_sizer_left, 0, wxEXPAND, 0); - m_sizer_bottom->Add(0, 0, 0, wxLEFT, FromDIP(15)); - m_sizer_bottom->Add(m_sizer_right, 0, wxEXPAND, FromDIP(0)); + /* + addaddaddaddaddaaddaddaddadd + */ - m_sizer_body->Add(m_simplebook_amsitems, 0, wxEXPAND, 0); - m_sizer_body->Add(0, 0, 1, wxEXPAND | wxTOP, FromDIP(18)); - m_sizer_body->Add(m_sizer_bottom, 0, wxEXPAND | wxLEFT, FromDIP(6)); + m_sizer_ams_body->Add(m_sizer_ams_area_left, wxLEFT|wxRIGHT, FromDIP(5)); + //m_sizer_ams_body->Add(0, 0, 0, wxLEFT, FromDIP(15)); + m_sizer_ams_body->Add(m_sizer_ams_area_right, wxLEFT|wxRIGHT, FromDIP(5)); + + //m_sizer_ams_body->Add(m_sizer_right, 0, wxEXPAND, FromDIP(0)); + + m_sizer_body->Add(m_sizer_ams_items, 0, wxALIGN_CENTER, 0); + m_sizer_body->Add(0, 0, 1, wxEXPAND | wxTOP, FromDIP(10)); + m_sizer_body->Add(m_sizer_ams_body, 0, wxALIGN_CENTER, 0); + m_sizer_body->Add(m_sizer_down_road, 0, wxALIGN_CENTER, 0); + //m_sizer_body->Add(m_sizer_ams_body, 0, wxEXPAND, 0); + //m_sizer_body->Add(m_sizer_ams_option, 0, wxEXPAND, 0); + m_sizer_body->Add(m_sizer_ams_option, 0, wxALIGN_CENTER, 0); - init_scaled_buttons(); m_amswin->SetSizer(m_sizer_body); m_amswin->Layout(); m_amswin->Fit(); - //Thaw(); + Thaw(); SetSize(m_amswin->GetSize()); SetMinSize(m_amswin->GetSize()); - // calibration mode - m_simplebook_calibration = new wxSimplebook(this, wxID_ANY, wxDefaultPosition, m_amswin->GetSize(), wxTAB_TRAVERSAL); - auto m_in_calibration_panel = new wxWindow(m_simplebook_calibration, wxID_ANY, wxDefaultPosition, m_amswin->GetSize(), wxTAB_TRAVERSAL); - m_in_calibration_panel->SetBackgroundColour(AMS_CONTROL_WHITE_COLOUR); - wxBoxSizer *sizer_calibration_h = new wxBoxSizer(wxHORIZONTAL); - wxBoxSizer *sizer_calibration_v = new wxBoxSizer(wxVERTICAL); - auto thumbnail = new wxStaticBitmap(m_in_calibration_panel, wxID_ANY, create_scaled_bitmap("ams_icon", nullptr, 126), wxDefaultPosition, wxDefaultSize); - m_text_calibration_percent = new wxStaticText(m_in_calibration_panel, wxID_ANY, wxT("0%"), wxDefaultPosition, wxDefaultSize, 0); - m_text_calibration_percent->SetFont(::Label::Head_16); - m_text_calibration_percent->SetForegroundColour(AMS_CONTROL_BRAND_COLOUR); - auto m_text_calibration_tip = new wxStaticText(m_in_calibration_panel, wxID_ANY, _L("Calibrating AMS..."), wxDefaultPosition, wxDefaultSize, 0); - m_text_calibration_tip->SetFont(::Label::Body_14); - m_text_calibration_tip->SetForegroundColour(AMS_CONTROL_GRAY700); - sizer_calibration_v->Add(thumbnail, 0, wxALIGN_CENTER, 0); - sizer_calibration_v->Add(0, 0, 0, wxTOP, FromDIP(16)); - sizer_calibration_v->Add(m_text_calibration_percent, 0, wxALIGN_CENTER, 0); - sizer_calibration_v->Add(0, 0, 0, wxTOP, FromDIP(8)); - sizer_calibration_v->Add(m_text_calibration_tip, 0, wxALIGN_CENTER, 0); - sizer_calibration_h->Add(sizer_calibration_v, 1, wxALIGN_CENTER, 0); - m_in_calibration_panel->SetSizer(sizer_calibration_h); - m_in_calibration_panel->Layout(); - - auto m_calibration_err_panel = new wxWindow(m_simplebook_calibration, wxID_ANY, wxDefaultPosition, m_amswin->GetSize(), wxTAB_TRAVERSAL); - m_calibration_err_panel->SetBackgroundColour(AMS_CONTROL_WHITE_COLOUR); - wxBoxSizer *sizer_err_calibration_h = new wxBoxSizer(wxHORIZONTAL); - wxBoxSizer *sizer_err_calibration_v = new wxBoxSizer(wxVERTICAL); - m_hyperlink = new wxHyperlinkCtrl(m_calibration_err_panel, wxID_ANY, wxEmptyString, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); - m_hyperlink->SetVisitedColour(wxColour(31, 142, 234)); - auto m_tip_calibration_err = new wxStaticText(m_calibration_err_panel, wxID_ANY, _L("A problem occurred during calibration. Click to view the solution."), wxDefaultPosition, - wxDefaultSize, 0); - m_tip_calibration_err->SetFont(::Label::Body_14); - m_tip_calibration_err->SetForegroundColour(AMS_CONTROL_GRAY700); - - wxBoxSizer *sizer_button = new wxBoxSizer(wxHORIZONTAL); - - auto m_button_calibration_again = new Button(m_calibration_err_panel, _L("Calibrate again")); - m_button_calibration_again->SetBackgroundColor(btn_bg_green); - m_button_calibration_again->SetBorderColor(AMS_CONTROL_BRAND_COLOUR); - m_button_calibration_again->SetTextColor(AMS_CONTROL_WHITE_COLOUR); - m_button_calibration_again->SetMinSize(AMS_CONTRO_CALIBRATION_BUTTON_SIZE); - m_button_calibration_again->SetCornerRadius(FromDIP(12)); - m_button_calibration_again->Bind(wxEVT_LEFT_DOWN, &AMSControl::on_clibration_again_click, this); - - sizer_button->Add(m_button_calibration_again, 0, wxALL, 5); - - auto m_button_calibration_cancel = new Button(m_calibration_err_panel, _L("Cancel calibration")); - m_button_calibration_cancel->SetBackgroundColor(btn_bg_white); - m_button_calibration_cancel->SetBorderColor(AMS_CONTROL_GRAY700); - m_button_calibration_cancel->SetTextColor(AMS_CONTROL_GRAY800); - m_button_calibration_cancel->SetMinSize(AMS_CONTRO_CALIBRATION_BUTTON_SIZE); - m_button_calibration_cancel->SetCornerRadius(FromDIP(12)); - m_button_calibration_cancel->Bind(wxEVT_LEFT_DOWN, &AMSControl::on_clibration_cancel_click, this); - sizer_button->Add(m_button_calibration_cancel, 0, wxALL, 5); - - sizer_err_calibration_v->Add(m_hyperlink, 0, wxALIGN_CENTER, 0); - sizer_err_calibration_v->Add(0, 0, 0, wxTOP, FromDIP(6)); - sizer_err_calibration_v->Add(m_tip_calibration_err, 0, wxALIGN_CENTER, 0); - sizer_err_calibration_v->Add(0, 0, 0, wxTOP, FromDIP(8)); - sizer_err_calibration_v->Add(sizer_button, 0, wxALIGN_CENTER | wxTOP, FromDIP(18)); - sizer_err_calibration_h->Add(sizer_err_calibration_v, 1, wxALIGN_CENTER, 0); - m_calibration_err_panel->SetSizer(sizer_err_calibration_h); - m_calibration_err_panel->Layout(); - - m_simplebook_calibration->AddPage(m_in_calibration_panel, wxEmptyString, false); - m_simplebook_calibration->AddPage(m_calibration_err_panel, wxEmptyString, false); AddPage(m_amswin, wxEmptyString, false); - AddPage(m_simplebook_calibration, wxEmptyString, false); UpdateStepCtrl(false); m_button_extruder_feed->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AMSControl::on_filament_load), NULL, this); m_button_extruder_back->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AMSControl::on_filament_unload), NULL, this); + m_button_auto_refill->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AMSControl::auto_refill), NULL, this); m_button_ams_setting->Bind(wxEVT_ENTER_WINDOW, [this](wxMouseEvent& e) { m_button_ams_setting->SetBitmap(m_button_ams_setting_hover.bmp()); @@ -2971,16 +2945,16 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons }); - m_button_guide->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { - post_event(wxCommandEvent(EVT_AMS_GUIDE_WIKI)); - }); - m_button_retry->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { - post_event(wxCommandEvent(EVT_AMS_RETRY)); - }); + /* m_button_guide->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { + post_event(wxCommandEvent(EVT_AMS_GUIDE_WIKI)); + }); + m_button_retry->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { + post_event(wxCommandEvent(EVT_AMS_RETRY)); + });*/ - CreateAms(); - SetSelection(0); - EnterNoneAMSMode(); + //CreateAms(); + //CreateAmsNew(); + //EnterNoneAMSMode(); } @@ -2989,12 +2963,9 @@ void AMSControl::on_retry() post_event(wxCommandEvent(EVT_AMS_RETRY)); } -void AMSControl::init_scaled_buttons() -{ - m_button_extruder_feed->SetMinSize(wxSize(-1, FromDIP(24))); - m_button_extruder_feed->SetCornerRadius(FromDIP(12)); - m_button_extruder_back->SetMinSize(wxSize(-1, FromDIP(24))); - m_button_extruder_back->SetCornerRadius(FromDIP(12)); +AMSControl::~AMSControl() { + /*m_simplebook_ams_left->DeleteAllPages(); + m_simplebook_ams_right->DeleteAllPages();*/ } std::string AMSControl::GetCurentAms() { return m_current_ams; } @@ -3003,16 +2974,17 @@ std::string AMSControl::GetCurentShowAms() { return m_current_show_ams; } std::string AMSControl::GetCurrentCan(std::string amsid) { std::string current_can; - for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { - AmsCansWindow *ams = m_ams_cans_list[i]; - if (ams->amsCans->m_info.ams_id == amsid) { - current_can = ams->amsCans->GetCurrentCan(); + for (auto ams_item : m_ams_item_list) { + AmsItem* item = ams_item.second; + if (item->m_info.ams_id == amsid) { + current_can = item->GetCurrentCan(); return current_can; } } return current_can; } + wxColour AMSControl::GetCanColour(std::string amsid, std::string canid) { wxColour col = *wxWHITE; @@ -3039,18 +3011,16 @@ void AMSControl::SetActionState(bool button_status[]) void AMSControl::EnterNoneAMSMode() { - m_vams_lib->m_ams_model = m_ext_model; + //m_vams_lib->m_ams_model = m_ext_model; if(m_is_none_ams_mode == AMSModel::NO_AMS) return; - m_panel_top->Hide(); - m_simplebook_amsitems->Hide(); - m_simplebook_amsitems->SetSelection(0); + m_panel_items_left->Hide(); - m_simplebook_ams->SetSelection(0); + m_simplebook_ams_left->SetSelection(0); m_extruder->no_ams_mode(true); - m_button_ams_setting->Hide(); - m_button_guide->Hide(); - m_button_extruder_feed->Show(); - m_button_extruder_back->Show(); + //m_button_ams_setting->Hide(); + //m_button_guide->Hide(); + //m_button_extruder_feed->Show(); + //m_button_extruder_back->Show(); ShowFilamentTip(false); m_amswin->Layout(); @@ -3061,27 +3031,25 @@ void AMSControl::EnterNoneAMSMode() void AMSControl::EnterGenericAMSMode() { - m_vams_lib->m_ams_model = m_ext_model; + //m_vams_lib->m_ams_model = m_ext_model; if(m_is_none_ams_mode == AMSModel::GENERIC_AMS) return; - m_panel_top->Show(); - m_simplebook_amsitems->Show(); - m_simplebook_amsitems->SetSelection(1); + //m_panel_items_left->Show(); - m_vams_lib->m_ams_model = AMSModel::GENERIC_AMS; - m_ams_tip->SetLabel(_L("AMS")); - m_img_vams_tip->SetBitmap(create_scaled_bitmap("enable_ams", this, 16)); - m_img_vams_tip->Enable(); - m_img_amsmapping_tip->SetBitmap(create_scaled_bitmap("enable_ams", this, 16)); - m_img_amsmapping_tip->Enable(); + //m_vams_lib->m_ams_model = AMSModel::GENERIC_AMS; + //m_ams_tip->SetLabel(_L("AMS")); + //m_img_vams_tip->SetBitmap(create_scaled_bitmap("enable_ams", this, 16)); + //m_img_vams_tip->Enable(); + //m_img_amsmapping_tip->SetBitmap(create_scaled_bitmap("enable_ams", this, 16)); + //m_img_amsmapping_tip->Enable(); - m_simplebook_ams->SetSelection(1); + //m_simplebook_ams_left->SetSelection(0); m_extruder->no_ams_mode(false); - m_button_ams_setting->Show(); + /*m_button_ams_setting->Show(); m_button_guide->Show(); m_button_retry->Show(); m_button_extruder_feed->Show(); m_button_extruder_back->Show(); - ShowFilamentTip(true); + ShowFilamentTip(true);*/ m_amswin->Layout(); m_amswin->Fit(); Layout(); @@ -3090,28 +3058,26 @@ void AMSControl::EnterGenericAMSMode() void AMSControl::EnterExtraAMSMode() { - m_vams_lib->m_ams_model = m_ext_model; + //m_vams_lib->m_ams_model = m_ext_model; if(m_is_none_ams_mode == AMSModel::EXTRA_AMS) return; - m_panel_top->Hide(); - m_simplebook_amsitems->Show(); - m_simplebook_amsitems->SetSelection(1); + m_panel_items_left->Hide(); - m_vams_lib->m_ams_model = AMSModel::EXTRA_AMS; - m_ams_tip->SetLabel(wxEmptyString); - m_img_vams_tip->SetBitmap(create_scaled_bitmap("enable_ams_disable", this, 16)); - m_img_vams_tip->Disable(); - m_img_amsmapping_tip->SetBitmap(create_scaled_bitmap("enable_ams_disable", this, 16)); - m_img_amsmapping_tip->Disable(); + //m_vams_lib->m_ams_model = AMSModel::EXTRA_AMS; + //m_ams_tip->SetLabel(wxEmptyString); + //m_img_vams_tip->SetBitmap(create_scaled_bitmap("enable_ams_disable", this, 16)); + //m_img_vams_tip->Disable(); + //m_img_amsmapping_tip->SetBitmap(create_scaled_bitmap("enable_ams_disable", this, 16)); + //m_img_amsmapping_tip->Disable(); - m_simplebook_ams->SetSelection(2); + m_simplebook_ams_left->SetSelection(2); m_extruder->no_ams_mode(false); - m_button_ams_setting->Show(); + /*m_button_ams_setting->Show(); m_button_guide->Show(); m_button_retry->Show(); m_button_extruder_feed->Show(); m_button_extruder_back->Show(); - ShowFilamentTip(true); + ShowFilamentTip(true);*/ m_amswin->Layout(); m_amswin->Fit(); Layout(); @@ -3120,48 +3086,23 @@ void AMSControl::EnterExtraAMSMode() } -void AMSControl::EnterCalibrationMode(bool read_to_calibration) -{ - SetSelection(1); - if (read_to_calibration) - m_simplebook_calibration->SetSelection(0); - else - m_simplebook_calibration->SetSelection(1); -} - -void AMSControl::ExitcClibrationMode() { SetSelection(0); } - -void AMSControl::SetClibrationpercent(int percent) { m_text_calibration_percent->SetLabelText(wxString::Format("%d%%", percent)); } - -void AMSControl::SetClibrationLink(wxString link) -{ - m_hyperlink->SetLabel(link); - m_hyperlink->SetURL(link); - m_hyperlink->Refresh(); - m_hyperlink->Update(); -} - void AMSControl::PlayRridLoading(wxString amsid, wxString canid) { - AmsCansHash::iterator iter = m_ams_cans_list.begin(); - auto count_item_index = 0; + auto iter = m_ams_item_list.find(amsid.ToStdString()); - for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { - AmsCansWindow *cans = m_ams_cans_list[i]; - if (cans->amsCans->m_info.ams_id == amsid) { cans->amsCans->PlayRridLoading(canid); } - iter++; + if (iter != m_ams_item_list.end()) { + AmsItem* cans = iter->second; + cans->PlayRridLoading(canid); } } void AMSControl::StopRridLoading(wxString amsid, wxString canid) { - AmsCansHash::iterator iter = m_ams_cans_list.begin(); - auto count_item_index = 0; + auto iter = m_ams_item_list.find(amsid.ToStdString()); - for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { - AmsCansWindow *cans = m_ams_cans_list[i]; - if (cans->amsCans->m_info.ams_id == amsid) { cans->amsCans->StopRridLoading(canid); } - iter++; + if (iter != m_ams_item_list.end()) { + AmsItem* cans = iter->second; + cans->StopRridLoading(canid); } } @@ -3177,14 +3118,15 @@ void AMSControl::msw_rescale() m_button_extruder_feed->SetMinSize(wxSize(-1, FromDIP(24))); m_button_extruder_back->SetMinSize(wxSize(-1, FromDIP(24))); + m_button_auto_refill->SetMinSize(wxSize(-1, FromDIP(24))); m_button_ams_setting->SetMinSize(wxSize(FromDIP(25), FromDIP(24))); m_button_guide->SetMinSize(wxSize(-1, FromDIP(24))); m_button_retry->SetMinSize(wxSize(-1, FromDIP(24))); m_vams_lib->msw_rescale(); - for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { - AmsCansWindow *cans = m_ams_cans_list[i]; - cans->amsCans->msw_rescale(); + + for (auto ams_item : m_ams_item_list) { + ams_item.second->msw_rescale(); } Layout(); @@ -3193,7 +3135,7 @@ void AMSControl::msw_rescale() void AMSControl::UpdateStepCtrl(bool is_extrusion) { - wxString FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_COUNT] = { + /*wxString FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_COUNT] = { _L("Idling..."), _L("Heat the nozzle"), _L("Cut filament"), @@ -3253,37 +3195,379 @@ void AMSControl::UpdateStepCtrl(bool is_extrusion) m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CHECK_POSITION]); m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CUT_FILAMENT]); m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PULL_CURR_FILAMENT]); - } + }*/ } +void AMSControl::UpdatePassRoad(string ams_id, AMSPassRoadType type, AMSPassRoadSTEP step) { + bool left = false; + int len = -1; + for (auto id : m_item_ids[0]) + { + if (ams_id == id) + { + left = true; + break; + } + } + if (m_ams_item_list[ams_id]->m_info.cans.size() == 4) + { + len = 133; + } + else + { + for (auto pairId : pair_id) + { + if (pairId.first == ams_id) { + len = 72; + break; + } + if (pairId.second == ams_id) + { + len = 188; + break; + } + } + } + if (len == -1) + { + if (left) + { + len = 213; + } + else + { + len = 72; + } + } + + //std::vector m_item_nums = { 0, 0 }; + //std::vector> m_item_ids = { {},{} }; +} + + void AMSControl::CreateAms() { - auto caninfo0_0 = Caninfo{"def_can_0", (""), *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; - auto caninfo0_1 = Caninfo{"def_can_1", (""), *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; - auto caninfo0_2 = Caninfo{"def_can_2", (""), *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; - auto caninfo0_3 = Caninfo{"def_can_3", (""), *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; + auto caninfo0_0 = Caninfo{"def_can_0", (""), *wxWHITE, AMSCanType::AMS_CAN_TYPE_VIRTUAL}; + auto caninfo0_1 = Caninfo{"def_can_1", (""), *wxWHITE, AMSCanType::AMS_CAN_TYPE_VIRTUAL }; + auto caninfo0_2 = Caninfo{"def_can_2", (""), *wxWHITE, AMSCanType::AMS_CAN_TYPE_VIRTUAL }; + auto caninfo0_3 = Caninfo{"def_can_3", (""), *wxWHITE, AMSCanType::AMS_CAN_TYPE_VIRTUAL }; - AMSinfo ams1 = AMSinfo{"0", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}}; - AMSinfo ams2 = AMSinfo{"1", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}}; - AMSinfo ams3 = AMSinfo{"2", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}}; - AMSinfo ams4 = AMSinfo{"3", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}}; - std::vector ams_info{ams1, ams2, ams3, ams4}; + auto caninfo1_0 = Caninfo{ "def_can_0", (""), *wxWHITE, AMSCanType::AMS_CAN_TYPE_VIRTUAL }; + auto caninfo1_1 = Caninfo{ "def_can_1", (""), *wxWHITE, AMSCanType::AMS_CAN_TYPE_VIRTUAL }; + auto caninfo1_2 = Caninfo{ "def_can_2", (""), *wxWHITE, AMSCanType::AMS_CAN_TYPE_VIRTUAL }; + auto caninfo1_3 = Caninfo{ "def_can_3", (""), *wxWHITE, AMSCanType::AMS_CAN_TYPE_VIRTUAL }; + + AMSinfo ams1 = AMSinfo{"0", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}, 0}; + AMSinfo ams2 = AMSinfo{"1", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}, 0 }; + AMSinfo ams3 = AMSinfo{"2", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}, 0 }; + AMSinfo ams4 = AMSinfo{"3", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}, 0 }; + + AMSinfo ams5 = AMSinfo{ "4", std::vector{caninfo1_0, caninfo1_1, caninfo1_2, caninfo1_3}, 1 }; + AMSinfo ams6 = AMSinfo{ "5", std::vector{caninfo1_0, caninfo1_1, caninfo1_2, caninfo1_3}, 1 }; + AMSinfo ams7 = AMSinfo{ "6", std::vector{caninfo1_0, caninfo1_1, caninfo1_2, caninfo1_3}, 1 }; + AMSinfo ams8 = AMSinfo{ "7", std::vector{caninfo1_0, caninfo1_1, caninfo1_2, caninfo1_3}, 1 }; + std::vector ams_info{ams1, ams2, ams3, ams4, ams5, ams6, ams7, ams8 }; std::vector::iterator it; Freeze(); for (it = ams_info.begin(); it != ams_info.end(); it++) { - AddAmsItems(*it); + AddAmsPreview(*it, AMSModel::GENERIC_AMS); AddAms(*it); - AddExtraAms(*it); + //AddExtraAms(*it); m_ams_info.push_back(*it); } - - m_sizer_top->Layout(); + if (m_single_nozzle_no_ams) + { + m_simplebook_ams_left->Hide(); + } + else { + m_sizer_items_left->Layout(); + m_sizer_items_right->Layout(); + } Thaw(); } + +void AMSControl::ClearAms() { + m_simplebook_ams_right->DeleteAllPages(); + m_simplebook_ams_left->DeleteAllPages(); + m_simplebook_ams_right->DestroyChildren(); + m_simplebook_ams_left->DestroyChildren(); + m_simplebook_ams_right->Layout(); + m_simplebook_ams_left->Layout(); + m_simplebook_ams_right->Refresh(); + m_simplebook_ams_left->Refresh(); + + m_ams_item_list.clear(); + m_sizer_items_right->Clear(); + m_sizer_items_left->Clear(); +} + +void AMSControl::CreateAmsNew() +{ + /*m_ams_item_list.clear(); + m_ams_generic_item_list.clear(); + m_ams_extra_item_list.clear();*/ + AMSRoadShowMode left_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_SINGLE; + AMSRoadShowMode right_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_SINGLE; + bool first_left_page = true, first_right_page = true; + + std::vector single_info_left; + std::vector single_info_right; + + Freeze(); + for (auto ams_info = m_ams_info.begin(); ams_info != m_ams_info.end(); ams_info++) + { + + if (first_left_page && ams_info->nozzle_id == 1) { + first_left_page = false; + left_init_mode = ams_info->cans.size() == 4 ? AMSRoadShowMode::AMS_ROAD_MODE_FOUR : AMSRoadShowMode::AMS_ROAD_MODE_SINGLE; + } + if (ams_info->cans.size() == 4) + { + if (first_right_page && ams_info->nozzle_id == 0) { + first_right_page = false; + right_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_FOUR; + } + if (first_left_page && ams_info->nozzle_id == 1) { + first_left_page = false; + left_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_FOUR; + } + AddAmsPreview(*ams_info, ams_info->ams_type); + AddAms(*ams_info); + } + else if (ams_info->cans.size() == 1) + { + AddAmsPreview(*ams_info, ams_info->ams_type); + if (ams_info->nozzle_id == 0) + { + single_info_right.push_back(*ams_info); + if (single_info_right.size() == 2) + { + if (first_right_page) { + first_right_page = false; + right_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_DOUBLE; + } + AddAms(single_info_right); + pair_id.push_back(std::make_pair(single_info_right[0].ams_id, single_info_right[1].ams_id)); + single_info_right.clear(); + } + } + else if (ams_info->nozzle_id == 1) + { + single_info_left.push_back(*ams_info); + if (single_info_left.size() == 2) + { + if (first_left_page) { + first_left_page = false; + left_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_DOUBLE; + } + AddAms(single_info_left); + pair_id.push_back(std::make_pair(single_info_left[0].ams_id, single_info_left[1].ams_id)); + single_info_left.clear(); + } + } + } + } + if (m_ext_info.size() <= 1) { + BOOST_LOG_TRIVIAL(trace) << "vt_slot empty!"; + return; + } + AMSinfo ext_info; + for (auto info : m_ext_info){ + if (info.ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID)){ + ext_info = info; + } + } + single_info_right.push_back(ext_info); + //wait add + if (single_info_right.size() == 2) + { + if (first_right_page) { + first_right_page = false; + right_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_DOUBLE; + } + pair_id.push_back(std::make_pair(single_info_right[0].ams_id, single_info_right[1].ams_id)); + } + AddAmsPreview(ext_info, AMSModel::NO_AMS); + AddAms(single_info_right); + single_info_right.clear(); + + for (auto info : m_ext_info) { + if (info.ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { + ext_info = info; + } + } + single_info_left.push_back(ext_info); + //wait add + if (single_info_left.size() == 2) + { + if (first_left_page) { + first_left_page = false; + left_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_DOUBLE; + } + pair_id.push_back(std::make_pair(single_info_left[0].ams_id, single_info_left[1].ams_id)); + } + AddAmsPreview(ext_info, AMSModel::NO_AMS); + AddAms(single_info_left); + single_info_left.clear(); + + if (m_nozzle_num <= 1) + { + m_simplebook_ams_left->Hide(); + m_panel_items_left->Hide(); + } + else if(m_nozzle_num > 1) { + m_sizer_items_left->Layout(); + m_sizer_items_right->Layout(); + m_simplebook_ams_left->Show(); + m_panel_items_left->Show(); + m_simplebook_ams_right->Show(); + m_panel_items_right->Show(); + m_simplebook_ams_left->SetSelection(0); + m_simplebook_ams_right->SetSelection(0); + m_down_road->UpdateLeft(2, left_init_mode); + m_down_road->UpdateRight(2, right_init_mode); + } + m_extruder->update(2); + //Refresh(); + //Freeze(); + Thaw(); +} + +void AMSControl::CreateAmsSingleNozzle() +{ + std::vectorm_item_nums{0,0}; + std::vector single_info; + + Freeze(); + + bool left = true; + AMSRoadShowMode left_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_NONE; + AMSRoadShowMode right_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_NONE; + for (auto ams_info = m_ams_info.begin(); ams_info != m_ams_info.end(); ams_info++){ + if (ams_info->cans.size() == 4){ + if (m_item_nums[0] <= m_item_nums[1]){ + if (m_item_nums[0] == 0) left_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_FOUR; + left = true; + m_item_ids[0].push_back(ams_info->ams_id); + m_item_nums[0]++; + } + else{ + if (m_item_nums[1] == 0) right_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_FOUR; + left = false; + m_item_ids[1].push_back(ams_info->ams_id); + m_item_nums[1]++; + } + AddAmsPreview(*ams_info, ams_info->ams_type); + AddAms(*ams_info, left); + //AddExtraAms(*ams_info); + } + else if (ams_info->cans.size() == 1){ + AddAmsPreview(*ams_info, ams_info->ams_type); + single_info.push_back(*ams_info); + if (single_info.size() == 2){ + if (m_item_nums[0] <= m_item_nums[1]){ + if (m_item_nums[0] == 0) left_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_DOUBLE; + left = true; + m_item_ids[0].push_back(single_info[0].ams_id); + m_item_ids[0].push_back(single_info[1].ams_id); + m_item_nums[0]++; + } + else{ + if (m_item_nums[1] == 0) right_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_DOUBLE; + left = false; + m_item_ids[1].push_back(single_info[0].ams_id); + m_item_ids[1].push_back(single_info[1].ams_id); + m_item_nums[1]++; + } + pair_id.push_back(std::make_pair(single_info[0].ams_id, single_info[1].ams_id)); + AddAms(single_info, left); + single_info.clear(); + } + } + } + //ext_info.cans[0].material_colour = + if (m_ext_info.size() <= 0){ + BOOST_LOG_TRIVIAL(trace) << "vt_slot empty!"; + return; + } + single_info.push_back(m_ext_info[0]); + if (m_item_nums[0] <= m_item_nums[1]){ + if (m_item_nums[0] == 0){ + if (single_info.size() == 2){ + left_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_DOUBLE; + } + else{ + left_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_SINGLE; + } + } + left = true; + for (auto it : single_info){ + m_item_ids[0].push_back(it.ams_id); + } + m_item_nums[0]++; + + } + else{ + if (m_item_nums[1] == 0){ + if (single_info.size() == 2){ + right_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_DOUBLE; + } + else{ + right_init_mode = AMSRoadShowMode::AMS_ROAD_MODE_SINGLE; + } + } + left = false; + for (auto it : single_info){ + m_item_ids[1].push_back(it.ams_id); + } + m_item_nums[1]++; + } + //wait add + if (single_info.size() == 2){ + pair_id.push_back(std::make_pair(single_info[0].ams_id, single_info[1].ams_id)); + } + AddAmsPreview(m_ext_info[0], AMSModel::NO_AMS); + AddAms(single_info, left); + + m_panel_items_left->Hide(); + if (!m_item_nums[0] || !m_item_nums[1]){ + /*m_simplebook_ams_right->Hide(); + m_panel_items_right->Hide();*/ + //m_simplebook_ams_left->Hide(); + m_simplebook_ams_right->Hide(); + m_panel_items_right->Hide(); + m_simplebook_ams_left->SetSelection(0); + m_down_road->UpdateLeft(1, left_init_mode); + m_down_road->UpdateRight(1, right_init_mode); + } + else { + m_sizer_items_left->Layout(); + if (m_item_nums[0] <= 1 && m_item_nums[1] <= 1){ + m_panel_items_right->Hide(); + } + else{ + m_panel_items_right->Show(); + } + /*m_simplebook_ams_left->Show(); + m_simplebook_ams_right->Show();*/ + m_simplebook_ams_left->Show(); + m_simplebook_ams_right->Show(); + + m_simplebook_ams_left->SetSelection(0); + m_simplebook_ams_right->SetSelection(0); + m_down_road->UpdateLeft(1, left_init_mode); + m_down_road->UpdateRight(1, right_init_mode); + } + m_extruder->update(1); + //Refresh(); + Thaw(); +} + + void AMSControl::Reset() { - auto caninfo0_0 = Caninfo{"0", "", *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; + /*auto caninfo0_0 = Caninfo{"0", "", *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; auto caninfo0_1 = Caninfo{"1", "", *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; auto caninfo0_2 = Caninfo{"2", "", *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; auto caninfo0_3 = Caninfo{"3", "", *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; @@ -3294,43 +3578,47 @@ void AMSControl::Reset() AMSinfo ams4 = AMSinfo{"3", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}}; std::vector ams_info{ams1, ams2, ams3, ams4}; - std::vector::iterator it; - UpdateAms(ams_info, true); + std::vector::iterator it;*/ + + /*Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (dev) { + MachineObject* obj = dev->get_selected_machine(); + parse_object(obj); + } + + UpdateAms(m_ams_info, true); m_current_show_ams = ""; m_current_ams = ""; - m_current_senect = ""; + m_current_select = "";*/ } void AMSControl::show_noams_mode() { show_vams(true); - m_sizer_ams_tips->Show(true); + //m_sizer_ams_tips->Show(true); - if (m_ams_model == AMSModel::NO_AMS) { + /*if (m_ams_model == AMSModel::NO_AMS) { EnterNoneAMSMode(); } else if(m_ams_model == AMSModel::GENERIC_AMS){ EnterGenericAMSMode(); } else if (m_ams_model == AMSModel::EXTRA_AMS) { EnterExtraAMSMode(); - } + }*/ + EnterGenericAMSMode(); } void AMSControl::show_auto_refill(bool show) { - if (m_auto_reill_show != show) { - m_ams_backup_tip->Show(show); - m_img_ams_backup->Show(show); - m_amswin->Layout(); - m_amswin->Fit(); - m_auto_reill_show = show; - } + //m_img_ams_backup->Show(show); + m_amswin->Layout(); + m_amswin->Fit(); } void AMSControl::show_vams(bool show) { - m_panel_virtual->Show(show); - m_vams_sizer->Show(show); - m_vams_extra_road->Show(show); + //m_panel_virtual->Show(show); + //m_vams_sizer->Show(show); + //m_vams_extra_road->Show(show); m_extruder->has_ams(show); show_vams_kn_value(show); Layout(); @@ -3346,48 +3634,41 @@ void AMSControl::show_vams(bool show) void AMSControl::show_vams_kn_value(bool show) { - m_vams_lib->show_kn_value(show); + //m_vams_lib->show_kn_value(show); } void AMSControl::update_vams_kn_value(AmsTray tray, MachineObject* obj) { - auto last_k_value = m_vams_info.k; - auto last_n_value = m_vams_info.n; - - m_vams_lib->m_obj = obj; - if (obj->cali_version >= 0) { - float k_value = 0; - float n_value = 0; - CalibUtils::get_pa_k_n_value_by_cali_idx(obj, tray.cali_idx, k_value, n_value); - m_vams_info.k = k_value; - m_vams_info.n = n_value; - m_vams_lib->m_info.k = k_value; - m_vams_lib->m_info.n = n_value; - } - else { // the remaining printer types - m_vams_info.k = tray.k; - m_vams_info.n = tray.n; - m_vams_lib->m_info.k = tray.k; - m_vams_lib->m_info.n = tray.n; - } - - m_vams_info.material_name = tray.get_display_filament_type(); - m_vams_info.material_colour = tray.get_color(); - m_vams_info.cali_idx = tray.cali_idx; - m_vams_info.filament_id = tray.setting_id; - m_vams_lib->m_info.material_name = tray.get_display_filament_type(); - m_vams_lib->m_info.material_colour = tray.get_color(); - m_vams_lib->m_info.cali_idx = tray.cali_idx; - m_vams_lib->m_info.filament_id = tray.setting_id; - - if (last_k_value != m_vams_info.k || last_n_value != m_vams_info.n) { - m_vams_lib->Refresh(); - } + //m_vams_lib->m_obj = obj; + //if (obj->cali_version >= 0) { + // float k_value = 0; + // float n_value = 0; + // CalibUtils::get_pa_k_n_value_by_cali_idx(obj, tray.cali_idx, k_value, n_value); + // m_vams_info.k = k_value; + // m_vams_info.n = n_value; + // m_vams_lib->m_info.k = k_value; + // m_vams_lib->m_info.n = n_value; + //} + //else { // the remaining printer types + // m_vams_info.k = tray.k; + // m_vams_info.n = tray.n; + // m_vams_lib->m_info.k = tray.k; + // m_vams_lib->m_info.n = tray.n; + //} + //m_vams_info.material_name = tray.get_display_filament_type(); + //m_vams_info.material_colour = tray.get_color(); + //m_vams_lib->m_info.material_name = tray.get_display_filament_type(); + //auto col= tray.get_color(); + //if (col.Alpha() != 0 && col.Alpha() != 255 && col.Alpha() != 254 && m_vams_lib->m_info.material_colour != col) { + // m_vams_lib->transparent_changed = true; + //} + //m_vams_lib->m_info.material_colour = tray.get_color(); + //m_vams_lib->Refresh(); } void AMSControl::reset_vams() { - m_vams_lib->m_info.k = 0; + /*m_vams_lib->m_info.k = 0; m_vams_lib->m_info.n = 0; m_vams_lib->m_info.material_name = wxEmptyString; m_vams_lib->m_info.material_colour = AMS_CONTROL_WHITE_COLOUR; @@ -3395,196 +3676,731 @@ void AMSControl::reset_vams() m_vams_lib->m_info.filament_id = ""; m_vams_info.material_name = wxEmptyString; m_vams_info.material_colour = AMS_CONTROL_WHITE_COLOUR; - m_vams_info.cali_idx = -1; - m_vams_info.filament_id = ""; - m_vams_lib->Refresh(); + m_vams_lib->Refresh();*/ } -void AMSControl::UpdateAms(std::vector info, bool is_reset) +void AMSControl::ReadExtInfo(MachineObject* obj) { + m_ext_info.clear(); + if (!obj){ + return; + } + AMSinfo ext_info; + for (auto slot : obj->vt_slot){ + ext_info.ams_id = slot.id; + Caninfo can; + can.can_id = std::to_string(0); + can.material_name = slot.filament_setting_id; + ext_info.cans.push_back(can); + if (slot.id == std::to_string(VIRTUAL_TRAY_MAIN_ID)){ + ext_info.nozzle_id = 0; + } + else{ + ext_info.nozzle_id = 1; + } + ext_info.cans[0].material_state = AMSCanType::AMS_CAN_TYPE_VIRTUAL; + ext_info.cans[0].material_colour = slot.decode_color(slot.color); + ext_info.cans[0].material_remain = slot.remain; + ext_info.cans[0].material_name = slot.type; + + m_ext_info.push_back(ext_info); + } +} + +void AMSControl::UpdateAms(std::vector ams_info, std::vectorext_info, std::string dev_id, bool is_reset, bool test) { - std::string curr_ams_id = GetCurentAms(); - std::string curr_can_id = GetCurrentCan(curr_ams_id); + if (!test){ + std::string curr_ams_id = GetCurentAms(); + std::string curr_can_id = GetCurrentCan(curr_ams_id); - m_button_area->Layout(); - m_button_area->Fit(); + int nozzle_num = ext_info.size(); - // update item - - if (m_ams_model == AMSModel::GENERIC_AMS){ - m_ams_cans_list = m_ams_generic_cans_list; - } - else if (m_ams_model == AMSModel::EXTRA_AMS) { - m_ams_cans_list = m_ams_extra_cans_list; - } - - if (m_ams_info.size() != info.size()) { - if (info.size() > 1) { - m_simplebook_amsitems->Show(); - m_amswin->Layout(); - m_amswin->Fit(); - SetSize(m_amswin->GetSize()); - SetMinSize(m_amswin->GetSize()); - } else { - m_simplebook_amsitems->Hide(); - m_amswin->Layout(); - m_amswin->Fit(); - SetSize(m_amswin->GetSize()); - SetMinSize(m_amswin->GetSize()); + // update item + bool fresh = false; + if (m_ams_info.size() == ams_info.size() && m_nozzle_num == nozzle_num && m_dev_id == dev_id){ + for (int i = 0; i < m_ams_info.size(); i++){ + if (m_ams_info[i].ams_id != ams_info[i].ams_id){ + fresh = true; + } + } } - } - - m_ams_info = info; - - for (auto i = 0; i < m_ams_item_list.GetCount(); i++) { - AmsItems *item = m_ams_item_list[i]; - if (i < info.size() && info.size() > 1) { - item->amsItem->Update(m_ams_info[i]); - item->amsItem->Open(); - } else { - item->amsItem->Close(); + else{ + fresh = true; } + m_ams_info.clear(); + m_ams_info = ams_info; + m_ext_info.clear(); + m_ext_info = ext_info; + m_nozzle_num = nozzle_num; + m_dev_id = dev_id; + if (fresh){ + //m_ams_generic_item_list.clear(); + for (auto it : m_ams_preview_list){ + delete it.second; + } + m_ams_preview_list.clear(); + ClearAms(); + m_left_page_index = 0; + m_right_page_index = 0; + if (m_nozzle_num >= 2){ + CreateAmsNew(); + }else{ + /*m_panel_items_right->ClearBackground(); + m_panel_items_left->ClearBackground();*/ + m_item_ids = { {}, {} }; + pair_id.clear(); + CreateAmsSingleNozzle(); + } + /*m_amswin->Layout(); + m_amswin->Fit(); + */ + SetSize(wxSize(FromDIP(578), -1)); + SetMinSize(wxSize(FromDIP(578), -1)); + + + } + // update cans + + for (auto ams_item : m_ams_item_list) { + std::string ams_id = ams_item.second->m_info.ams_id; + AmsItem* cans = ams_item.second; + if (cans->m_info.ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || cans->m_info.ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)){ + for (auto ifo : m_ext_info) { + if (ifo.ams_id == ams_id) { + cans->m_info = ifo; + cans->Update(ifo); + cans->show_sn_value(m_ams_model == AMSModel::EXTRA_AMS ? false : true); + } + } + } + else{ + for (auto ifo : m_ams_info) { + if (ifo.ams_id == ams_id) { + cans->m_info = ifo; + cans->Update(ifo); + cans->show_sn_value(m_ams_model == AMSModel::EXTRA_AMS ? false : true); + } + } + } + } + + if (m_current_show_ams.empty() && !is_reset) { + if (ext_info.size() > 0) { + SwitchAms(ext_info[0].ams_id); + } + } + + //m_simplebook_ams_left->SetSelection(m_simplebook_ams_left->m_first); } + else + { + static bool first_time = true; + static std::vectorams_info; + int nozzle_num = 2; + if (first_time) + { + auto caninfo0_0 = Caninfo{ "def_can_0", (""), *wxRED, AMSCanType::AMS_CAN_TYPE_VIRTUAL }; + auto caninfo0_1 = Caninfo{ "def_can_1", (""), *wxGREEN, AMSCanType::AMS_CAN_TYPE_VIRTUAL }; + auto caninfo0_2 = Caninfo{ "def_can_2", (""), *wxBLUE, AMSCanType::AMS_CAN_TYPE_VIRTUAL }; + auto caninfo0_3 = Caninfo{ "def_can_3", (""), *wxYELLOW, AMSCanType::AMS_CAN_TYPE_VIRTUAL }; - // update cans - for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { - AmsCansWindow *cans = m_ams_cans_list[i]; + auto caninfo1_0 = Caninfo{ "def_can_0", (""), wxColour(255, 255, 0), AMSCanType::AMS_CAN_TYPE_VIRTUAL }; + auto caninfo1_1 = Caninfo{ "def_can_1", (""), wxColour(255, 0, 255), AMSCanType::AMS_CAN_TYPE_VIRTUAL }; + auto caninfo1_2 = Caninfo{ "def_can_2", (""), wxColour(0, 255, 255), AMSCanType::AMS_CAN_TYPE_VIRTUAL }; + auto caninfo1_3 = Caninfo{ "def_can_3", (""), wxColour(200, 80, 150), AMSCanType::AMS_CAN_TYPE_VIRTUAL }; - for (auto ifo : m_ams_info) { - if (ifo.ams_id == cans->amsIndex) { - cans->amsCans->m_info = ifo; - cans->amsCans->Update(ifo); - cans->amsCans->show_sn_value(m_ams_model == AMSModel::EXTRA_AMS?false:true); + AMSinfo ams1 = AMSinfo{ "0", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}, 0 }; + AMSinfo ams2 = AMSinfo{ "1", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}, 0 }; + AMSinfo ams3 = AMSinfo{ "2", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}, 0 }; + AMSinfo ams4 = AMSinfo{ "3", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}, 0 }; + + AMSinfo singleams1 = AMSinfo{ "0", std::vector{caninfo0_0}, 0 }; + AMSinfo singleams2 = AMSinfo{ "1", std::vector{caninfo0_1}, 0 }; + AMSinfo singleams3 = AMSinfo{ "2", std::vector{caninfo0_2}, 0 }; + AMSinfo singleams4 = AMSinfo{ "3", std::vector{caninfo0_3}, 0 }; + + AMSinfo ams5 = AMSinfo{ "4", std::vector{caninfo1_0, caninfo1_1, caninfo1_2, caninfo1_3}, 1 }; + AMSinfo ams6 = AMSinfo{ "5", std::vector{caninfo1_0, caninfo1_1, caninfo1_2, caninfo1_3}, 1 }; + AMSinfo ams7 = AMSinfo{ "6", std::vector{caninfo1_0, caninfo1_1, caninfo1_2, caninfo1_3}, 1 }; + AMSinfo ams8 = AMSinfo{ "7", std::vector{caninfo1_0, caninfo1_1, caninfo1_2, caninfo1_3}, 1 }; + + AMSinfo singleams5 = AMSinfo{ "4", std::vector{caninfo1_0}, 1 }; + AMSinfo singleams6 = AMSinfo{ "5", std::vector{caninfo1_1}, 1 }; + AMSinfo singleams7 = AMSinfo{ "6", std::vector{caninfo1_2}, 1 }; + AMSinfo singleams8 = AMSinfo{ "7", std::vector{caninfo1_3}, 1 }; + std::vectorgeneric_ams = { ams1, ams2, ams3, ams4, ams5, ams6, ams7, ams8 }; + std::vectorsingle_ams = { singleams1, singleams2, singleams3, singleams4, singleams5, singleams6, singleams7, singleams8 }; + ams_info = { ams1, singleams1, ams3, singleams3, ams5, singleams5, ams7, singleams7 }; + first_time = false; + } + + Freeze(); + + // update item + bool fresh = false; + if (m_ams_info.size() == ams_info.size() && m_nozzle_num == nozzle_num){ + for (int i = 0; i < m_ams_info.size(); i++) + { + if (m_ams_info[i].ams_id != ams_info[i].ams_id){ + fresh = true; + } + } + } + else{ + fresh = true; + } + m_ams_info.clear(); + m_ams_info = ams_info; + m_ext_info.clear(); + m_ext_info.push_back(ext_info[0]); + m_ext_info.push_back(ext_info[0]); + m_ext_info[0].ams_id = std::to_string(VIRTUAL_TRAY_MAIN_ID); + m_ext_info[1].ams_id = std::to_string(VIRTUAL_TRAY_DEPUTY_ID); + m_nozzle_num = nozzle_num; + if (fresh){ + + for (auto it : m_ams_preview_list) { + delete it.second; + } + m_ams_preview_list.clear(); + ClearAms(); + m_left_page_index = 0; + m_right_page_index = 0; + if (m_nozzle_num >= 2) { + CreateAmsNew(); + } + else { + /*m_panel_items_right->ClearBackground(); + m_panel_items_left->ClearBackground();*/ + m_item_ids = { {}, {} }; + pair_id.clear(); + CreateAmsSingleNozzle(); + } + /*m_amswin->Layout(); + m_amswin->Fit(); + */ + SetSize(wxSize(FromDIP(578), -1)); + SetMinSize(wxSize(FromDIP(578), -1)); + } + Thaw(); + + // update cans + + for (auto ams_item : m_ams_item_list) { + std::string ams_id = ams_item.first; + AmsItem* cans = ams_item.second; + if (atoi(cans->m_info.ams_id.c_str()) >= VIRTUAL_TRAY_DEPUTY_ID) { + for (auto ifo : m_ext_info) { + if (ifo.ams_id == ams_id) { + cans->m_info = ifo; + cans->Update(ifo); + cans->show_sn_value(m_ams_model == AMSModel::EXTRA_AMS ? false : true); + } + } + } + else { + for (auto ifo : m_ams_info) { + if (ifo.ams_id == ams_id) { + cans->m_info = ifo; + cans->Update(ifo); + cans->show_sn_value(m_ams_model == AMSModel::EXTRA_AMS ? false : true); + } + } + } + } + + if (m_current_show_ams.empty() && !is_reset) { + if (ams_info.size() > 0) { + SwitchAms(ams_info[0].ams_id); } } } - if ( m_current_show_ams.empty() && !is_reset ) { - if (info.size() > 0) { - SwitchAms(info[0].ams_id); - } - } - if (m_ams_model == AMSModel::NO_AMS && !m_vams_lib->is_selected()) { - m_vams_lib->OnSelected(); - } } -void AMSControl::AddAmsItems(AMSinfo info) +void AMSControl::AddAmsPreview(AMSinfo info, AMSModel type) { - auto amsitem = new AMSItem(m_panel_top, wxID_ANY, info); - amsitem->Bind(wxEVT_LEFT_DOWN, [this, amsitem](wxMouseEvent& e) { - SwitchAms(amsitem->m_amsinfo.ams_id); + AMSPreview *ams_prv = nullptr; + + if (info.nozzle_id == 0) + { + ams_prv = new AMSPreview(m_panel_items_right, wxID_ANY, info, type); + m_sizer_items_right->Add(ams_prv, 0, wxALIGN_CENTER | wxRIGHT, 6); + } + else if (info.nozzle_id == 1) + { + ams_prv = new AMSPreview(m_panel_items_left, wxID_ANY, info, type); + m_sizer_items_left->Add(ams_prv, 0, wxALIGN_CENTER | wxRIGHT, 6); + } + ams_prv->Bind(wxEVT_LEFT_DOWN, [this, ams_prv](wxMouseEvent& e) { + SwitchAms(ams_prv->m_amsinfo.ams_id); e.Skip(); }); - AmsItems* item = new AmsItems(); - item->amsIndex = info.ams_id; - item->amsItem = amsitem; + m_ams_preview_list[info.ams_id] = ams_prv; - m_ams_item_list.Add(item); - m_sizer_top->Add(amsitem, 0, wxALIGN_CENTER | wxRIGHT, 6); } -void AMSControl::AddAms(AMSinfo info) +void AMSControl::AddAms(AMSinfo info, bool left) { - AmsCansWindow* canswin = new AmsCansWindow(); - auto amscans = new AmsCans(m_simplebook_generic_cans, info, AMSModel::GENERIC_AMS); + AmsItem* ams_item; + if (m_nozzle_num > 1) + { + if (info.nozzle_id == 0) + { + ams_item = new AmsItem(m_simplebook_ams_right, info, info.ams_type); + //m_simplebook_ams_right->RemovePage(m_right_page_index); + m_simplebook_ams_right->InsertPage(m_right_page_index, ams_item, wxEmptyString, true); + ams_item->m_selection = m_right_page_index; + m_right_page_index++; + } + else if (info.nozzle_id == 1) + { + ams_item = new AmsItem(m_simplebook_ams_left, info, info.ams_type); + //m_simplebook_ams_left->RemovePage(m_left_page_index); + m_simplebook_ams_left->InsertPage(m_left_page_index, ams_item, wxEmptyString, true); + ams_item->m_selection = m_left_page_index; + m_left_page_index++; + } + } + else if (m_nozzle_num == 1) + { + if (left) + { + ams_item = new AmsItem(m_simplebook_ams_left, info, info.ams_type); + //m_simplebook_ams_left->RemovePage(m_left_page_index); + m_simplebook_ams_left->InsertPage(m_left_page_index, ams_item, wxEmptyString, true); + ams_item->m_selection = m_left_page_index; + m_left_page_index++; + } + else { + ams_item = new AmsItem(m_simplebook_ams_right, info, info.ams_type); + //m_simplebook_ams_right->RemovePage(m_right_page_index); + m_simplebook_ams_right->InsertPage(m_right_page_index, ams_item, wxEmptyString, true); + ams_item->m_selection = m_right_page_index; + m_right_page_index++; + //if (m_item_nums[1] == 1) m_simplebook_ams_right->SetSelection(m_simplebook_ams_left->GetSelection()); + } + } + m_ams_item_list[info.ams_id] = ams_item; + m_simplebook_ams_left->Layout(); + m_simplebook_ams_right->Layout(); + m_simplebook_ams_left->Refresh(); + m_simplebook_ams_right->Refresh(); - canswin->amsIndex = info.ams_id; - canswin->amsCans = amscans; - m_ams_generic_cans_list.Add(canswin); - - m_simplebook_generic_cans->AddPage(amscans, wxEmptyString, false); - amscans->m_selection = m_simplebook_generic_cans->GetPageCount() - 1; } -void AMSControl::AddExtraAms(AMSinfo info) -{ - AmsCansWindow* canswin = new AmsCansWindow(); - auto amscans = new AmsCans(m_simplebook_extra_cans, info, AMSModel::EXTRA_AMS); +//void AMSControl::AddExtraAms(AMSinfo info) +//{ +// auto ams_item = new AmsItem(m_simplebook_extra_cans_left, info, AMSModel::EXTRA_AMS); +// m_ams_item_list[info.ams_id] = ams_item; +// +// if (info.nozzle_id == 1) +// { +// m_simplebook_extra_cans_left->AddPage(ams_item, wxEmptyString, false); +// ams_item->m_selection = m_simplebook_extra_cans_left->GetPageCount() - 1; +// } +// else if (info.nozzle_id == 0) +// { +// m_simplebook_extra_cans_right->AddPage(ams_item, wxEmptyString, false); +// ams_item->m_selection = m_simplebook_extra_cans_right->GetPageCount() - 1; +// } +// +//} - canswin->amsIndex = info.ams_id; - canswin->amsCans = amscans; - m_ams_extra_cans_list.Add(canswin); +void AMSControl::AddAms(std::vectorsingle_info, bool left) { + AmsItem* ams_item; + AMSModel mode; + wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL); + + if (single_info.size() == 0){ + return; + } + else if (single_info.size() == 1){ + mode = AMSModel::NO_AMS; + int w = 30; + if (m_nozzle_num == 2) + { + if (single_info[0].nozzle_id == 0) + { + wxPanel* book_panel = new wxPanel(m_simplebook_ams_right); + book_panel->SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); + ams_item = new AmsItem(book_panel, single_info[0], mode); + sizer->Add(ams_item, 0, wxLEFT, FromDIP(30)); + book_panel->SetSize(wxSize(FromDIP(264), FromDIP(150))); + book_panel->SetMinSize(wxSize(FromDIP(264), FromDIP(150))); + book_panel->SetSizer(sizer); + book_panel->Layout(); + book_panel->Fit(); + //m_simplebook_ams_right->RemovePage(m_right_page_index); + m_simplebook_ams_right->InsertPage(m_right_page_index, book_panel, wxEmptyString, true); + ams_item->m_selection = m_right_page_index; + m_right_page_index++; + } + else if (single_info[0].nozzle_id == 1) + { + wxPanel* book_panel = new wxPanel(m_simplebook_ams_left); + book_panel->SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); + ams_item = new AmsItem(book_panel, single_info[0], mode); + sizer->Add(ams_item, 0, wxLEFT, FromDIP(30)); + book_panel->SetSize(wxSize(FromDIP(264), FromDIP(150))); + book_panel->SetMinSize(wxSize(FromDIP(264), FromDIP(150))); + book_panel->SetSizer(sizer); + book_panel->Layout(); + book_panel->Fit(); + //m_simplebook_ams_left->RemovePage(m_left_page_index); + m_simplebook_ams_left->InsertPage(m_left_page_index, book_panel, wxEmptyString, true); + ams_item->m_selection = m_left_page_index; + m_left_page_index++; + } + } + else if (m_nozzle_num == 1) + { + if (!left) + { + wxPanel* book_panel = new wxPanel(m_simplebook_ams_right); + book_panel->SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); + ams_item = new AmsItem(book_panel, single_info[0], mode); + sizer->Add(ams_item, 0, wxLEFT, FromDIP(30)); + book_panel->SetSize(wxSize(FromDIP(264), FromDIP(150))); + book_panel->SetMinSize(wxSize(FromDIP(264), FromDIP(150))); + book_panel->SetSizer(sizer); + book_panel->Layout(); + book_panel->Fit(); + //m_simplebook_ams_right->RemovePage(m_right_page_index); + m_simplebook_ams_right->InsertPage(m_right_page_index, book_panel, wxEmptyString, true); + ams_item->m_selection = m_right_page_index; + m_right_page_index++; + } + else + { + wxPanel* book_panel = new wxPanel(m_simplebook_ams_left); + book_panel->SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); + ams_item = new AmsItem(book_panel, single_info[0], mode); + sizer->Add(ams_item, 0, wxLEFT, FromDIP(30)); + book_panel->SetSize(wxSize(FromDIP(264), FromDIP(150))); + book_panel->SetMinSize(wxSize(FromDIP(264), FromDIP(150))); + book_panel->SetSizer(sizer); + book_panel->Layout(); + book_panel->Fit(); + //m_simplebook_ams_left->RemovePage(m_left_page_index); + m_simplebook_ams_left->InsertPage(m_left_page_index, book_panel, wxEmptyString, true); + ams_item->m_selection = m_left_page_index; + m_left_page_index++; + } + } + + ams_item->SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); + m_ams_item_list[single_info[0].ams_id] = ams_item; + } + else if (single_info.size() == 2) + { + AmsItem* ext_item; + wxBoxSizer* book_sizer = new wxBoxSizer(wxVERTICAL); + if (single_info[1].ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || single_info[1].ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) + { + mode = AMSModel::NO_AMS; + } + else + { + mode = AMSModel::SINGLE_AMS; + } + if (m_nozzle_num == 2) + { + if (single_info[1].nozzle_id == 0) + { + wxPanel* book_panel = new wxPanel(m_simplebook_ams_right); + book_panel->SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); + book_panel->SetSize(wxSize(FromDIP(264), FromDIP(150))); + book_panel->SetMinSize(wxSize(FromDIP(264), FromDIP(150))); + ams_item = new AmsItem(book_panel, single_info[0], AMSModel::SINGLE_AMS); + ext_item = new AmsItem(book_panel, single_info[1], mode); + book_sizer->Add(ams_item); + book_sizer->Add(ext_item); + book_panel->SetSizer(book_sizer); + book_panel->Layout(); + book_panel->Fit(); + //m_simplebook_ams_right->RemovePage(m_right_page_index); + m_simplebook_ams_right->InsertPage(m_right_page_index, book_panel, wxEmptyString, true); + ams_item->m_selection = m_right_page_index; + ext_item->m_selection = m_right_page_index; + m_right_page_index++; + } + else if (single_info[1].nozzle_id == 1) + { + wxPanel* book_panel = new wxPanel(m_simplebook_ams_left); + book_panel->SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); + book_panel->SetSize(wxSize(FromDIP(264), FromDIP(150))); + book_panel->SetMinSize(wxSize(FromDIP(264), FromDIP(150))); + ams_item = new AmsItem(book_panel, single_info[0], AMSModel::SINGLE_AMS); + ext_item = new AmsItem(book_panel, single_info[1], mode); + book_sizer->Add(ams_item); + book_sizer->Add(ext_item); + book_panel->SetSizer(book_sizer); + //m_simplebook_ams_left->RemovePage(m_left_page_index); + m_simplebook_ams_left->InsertPage(m_left_page_index, book_panel, wxEmptyString, true); + ams_item->m_selection = m_left_page_index; + ext_item->m_selection = m_left_page_index; + m_left_page_index++; + } + } + else { + if (!left) + { + wxPanel* book_panel = new wxPanel(m_simplebook_ams_right); + book_panel->SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); + book_panel->SetSize(wxSize(FromDIP(264), FromDIP(150))); + book_panel->SetMinSize(wxSize(FromDIP(264), FromDIP(150))); + ams_item = new AmsItem(book_panel, single_info[0], AMSModel::SINGLE_AMS); + ext_item = new AmsItem(book_panel, single_info[1], mode); + book_sizer->Add(ams_item); + book_sizer->Add(ext_item); + book_panel->SetSizer(book_sizer); + book_panel->Layout(); + book_panel->Fit(); + //m_simplebook_ams_right->RemovePage(m_right_page_index); + m_simplebook_ams_right->InsertPage(m_right_page_index, book_panel, wxEmptyString, true); + ams_item->m_selection = m_right_page_index; + ext_item->m_selection = m_right_page_index; + m_right_page_index++; + } + else + { + wxPanel* book_panel = new wxPanel(m_simplebook_ams_left); + book_panel->SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); + book_panel->SetSize(wxSize(FromDIP(264), FromDIP(150))); + book_panel->SetMinSize(wxSize(FromDIP(264), FromDIP(150))); + ams_item = new AmsItem(book_panel, single_info[0], AMSModel::SINGLE_AMS); + ext_item = new AmsItem(book_panel, single_info[1], mode); + book_sizer->Add(ams_item); + book_sizer->Add(ext_item); + book_panel->SetSizer(book_sizer); + //m_simplebook_ams_left->RemovePage(m_left_page_index); + m_simplebook_ams_left->InsertPage(m_left_page_index, book_panel, wxEmptyString, true); + ams_item->m_selection = m_left_page_index; + ext_item->m_selection = m_left_page_index; + m_left_page_index++; + } + } + + m_ams_item_list[single_info[0].ams_id] = ams_item; + m_ams_item_list[single_info[1].ams_id] = ext_item; + } + m_simplebook_ams_left->Layout(); + m_simplebook_ams_right->Layout(); + m_simplebook_ams_left->Refresh(); + m_simplebook_ams_right->Refresh(); +} + +//void AMSControl::AddExtAms(int ams_id) { +// if (m_ams_item_list.find(std::to_string(ams_id)) != m_ams_item_list.end()) +// { +// //mode = AMSModel::EXTRA_AMS; +// AmsItem* ams_item; +// AMSinfo ext_info; +// +// if (ams_id == VIRTUAL_TRAY_MAIN_ID) +// { +// ext_info.ams_id = std::to_string(VIRTUAL_TRAY_MAIN_ID); +// ext_info.nozzle_id = 0; +// ams_item = new AmsItem(m_simplebook_ams_right, ext_info, AMSModel::EXTRA_AMS); +// m_simplebook_ams_right->AddPage(ams_item, wxEmptyString, false); +// ams_item->m_selection = m_simplebook_ams_right->GetPageCount() - 1; +// } +// else if (ams_id == VIRTUAL_TRAY_DEPUTY_ID) +// { +// ext_info.ams_id = std::to_string(VIRTUAL_TRAY_DEPUTY_ID); +// ext_info.nozzle_id = 1; +// ams_item = new AmsItem(m_simplebook_ams_left, ext_info, AMSModel::EXTRA_AMS); +// m_simplebook_ams_left->AddPage(ams_item, wxEmptyString, false); +// ams_item->m_selection = m_simplebook_ams_left->GetPageCount() - 1; +// } +// m_ams_generic_item_list[std::to_string(ams_id)] = ams_item; +// } +//} + +void AMSControl::AddAmsPreview(std::vectorsingle_info) { - m_simplebook_extra_cans->AddPage(amscans, wxEmptyString, false); - amscans->m_selection = m_simplebook_extra_cans->GetPageCount() - 1; } void AMSControl::SwitchAms(std::string ams_id) { if(ams_id == m_current_show_ams){return;} - if (ams_id != std::to_string(VIRTUAL_TRAY_MAIN_ID)) { + if (m_current_show_ams != ams_id) { + m_current_show_ams = ams_id; + m_extruder->OnAmsLoading(false); + } + + /*if (ams_id != std::to_string(VIRTUAL_TRAY_MAIN_ID)) { if (m_current_show_ams != ams_id) { m_current_show_ams = ams_id; m_extruder->OnAmsLoading(false); } - } + }*/ - for (auto i = 0; i < m_ams_item_list.GetCount(); i++) { - AmsItems *item = m_ams_item_list[i]; - if (item->amsItem->m_amsinfo.ams_id == m_current_show_ams) { - item->amsItem->OnSelected(); - m_current_senect = ams_id; - - //bool ready_selected = false; - //for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { - // AmsCansWindow* ams = m_ams_cans_list[i]; - // if (ams->amsCans->m_info.ams_id == ams_id) { - // //ams->amsCans->SetDefSelectCan(); - // //m_vams_lib->OnSelected(); - // if () { - - // } - // } - //} + for (auto prv_it : m_ams_preview_list) { + AMSPreview* prv = prv_it.second; + if (prv->m_amsinfo.ams_id == m_current_show_ams) { + prv->OnSelected(); + m_current_select = ams_id; bool ready_selected = false; - for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { - AmsCansWindow* ams = m_ams_cans_list[i]; - if (ams->amsCans->m_info.ams_id == ams_id) { - for (auto lib : ams->amsCans->m_can_lib_list) { - if (lib->canLib->is_selected()) { + for (auto item_it : m_ams_item_list) { + AmsItem* item = item_it.second; + if (item->m_info.ams_id == ams_id) { + for (auto lib_it : item->m_can_lib_list) { + AMSLib* lib = lib_it.second; + if (lib->is_selected()) { ready_selected = true; } } } } - if (!ready_selected) { - m_current_ams = std::to_string(VIRTUAL_TRAY_MAIN_ID); - m_vams_lib->OnSelected(); - } - else { - m_current_ams = ams_id; - m_vams_lib->UnSelected(); - } + //if (!ready_selected) { + // m_current_ams = std::to_string(VIRTUAL_TRAY_MAIN_ID); + // //m_vams_lib->OnSelected(); + //} + //else { + // m_current_ams = ams_id; + // //m_vams_lib->UnSelected(); + //} + m_current_ams = ams_id; } else { - item->amsItem->UnSelected(); + prv->UnSelected(); } - m_sizer_top->Layout(); - m_panel_top->Fit(); + + if (prv->m_amsinfo.nozzle_id == 1) { + m_sizer_items_left->Layout(); + m_panel_items_left->Fit(); + } + else if (prv->m_amsinfo.nozzle_id == 0) + { + m_sizer_items_right->Layout(); + m_panel_items_right->Fit(); + } + } - for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { - AmsCansWindow *cans = m_ams_cans_list[i]; - if (cans->amsCans->m_info.ams_id == ams_id) { + for (auto ams_item : m_ams_item_list) { + AmsItem* item = ams_item.second; + if (item->m_info.ams_id == ams_id) { + + /*if (m_ams_model == AMSModel::GENERIC_AMS) { + if (item->m_info.nozzle_id == 1) + { + m_simplebook_ams_left->SetSelection(item->m_selection); + } + else if (item->m_info.nozzle_id == 0) + { + m_simplebook_ams_right->SetSelection(item->m_selection); + } + + }*/ + if (m_nozzle_num == 2) { + if (item->m_info.nozzle_id == 1) + { + m_simplebook_ams_left->SetSelection(item->m_selection); + if (item->m_info.cans.size() == 4) + { + m_down_road->UpdateLeft(m_nozzle_num, AMSRoadShowMode::AMS_ROAD_MODE_FOUR); + } + else { + AMSRoadShowMode mode = AMSRoadShowMode::AMS_ROAD_MODE_SINGLE; + for (auto it : pair_id) + { + if (it.first == ams_id || it.second == ams_id) + { + mode = AMSRoadShowMode::AMS_ROAD_MODE_DOUBLE; + break; + } + } + m_down_road->UpdateLeft(m_nozzle_num, mode); + } + + } + else if (item->m_info.nozzle_id == 0) + { + m_simplebook_ams_right->SetSelection(item->m_selection); + if (item->m_info.cans.size() == 4) + { + m_down_road->UpdateRight(m_nozzle_num, AMSRoadShowMode::AMS_ROAD_MODE_FOUR); + } + else { + AMSRoadShowMode mode = AMSRoadShowMode::AMS_ROAD_MODE_SINGLE; + for (auto it : pair_id) + { + if (it.first == ams_id || it.second == ams_id) + { + mode = AMSRoadShowMode::AMS_ROAD_MODE_DOUBLE; + break; + } + } + m_down_road->UpdateRight(m_nozzle_num, mode); + } + } - if (m_ams_model == AMSModel::GENERIC_AMS) { - m_simplebook_generic_cans->SetSelection(cans->amsCans->m_selection); } - else if (m_ams_model == AMSModel::EXTRA_AMS) { - m_simplebook_extra_cans->SetSelection(cans->amsCans->m_selection); + else if (m_nozzle_num == 1) { + for (auto id : m_item_ids[0]) + { + if (id == item->m_info.ams_id) + { + m_simplebook_ams_left->SetSelection(item->m_selection); + if (item->m_info.cans.size() == 4) + { + m_down_road->UpdateLeft(m_nozzle_num, AMSRoadShowMode::AMS_ROAD_MODE_FOUR); + } + else { + AMSRoadShowMode mode = AMSRoadShowMode::AMS_ROAD_MODE_SINGLE; + for (auto it : pair_id) + { + if (it.first == ams_id || it.second == ams_id) + { + mode = AMSRoadShowMode::AMS_ROAD_MODE_DOUBLE; + break; + } + } + m_down_road->UpdateLeft(m_nozzle_num, mode); + } + + } + + } + for (auto id : m_item_ids[1]) + { + if (id == item->m_info.ams_id) + { + m_simplebook_ams_right->SetSelection(item->m_selection); + + if (item->m_info.cans.size() == 4) + { + m_down_road->UpdateRight(m_nozzle_num, AMSRoadShowMode::AMS_ROAD_MODE_FOUR); + } + else { + AMSRoadShowMode mode = AMSRoadShowMode::AMS_ROAD_MODE_SINGLE; + for (auto it : pair_id) + { + if (it.first == ams_id || it.second == ams_id) + { + mode = AMSRoadShowMode::AMS_ROAD_MODE_DOUBLE; + break; + } + } + m_down_road->UpdateRight(m_nozzle_num, mode); + } + + } + } } } } - // update extruder - //m_extruder->OnAmsLoading(false); + //update extruder for (auto i = 0; i < m_ams_info.size(); i++) { if (m_ams_info[i].ams_id == m_current_ams) { switch (m_ams_info[i].current_step) { @@ -3601,7 +4417,7 @@ void AMSControl::SwitchAms(std::string ams_id) } void AMSControl::SetFilamentStep(int item_idx, FilamentStepType f_type) -{ +{/* wxString FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_COUNT] = { _L("Idling..."), _L("Heat the nozzle"), @@ -3669,12 +4485,12 @@ void AMSControl::SetFilamentStep(int item_idx, FilamentStepType f_type) else { m_filament_load_step->Idle(); } - } + }*/ } void AMSControl::ShowFilamentTip(bool hasams) { - m_simplebook_right->SetSelection(0); + //m_simplebook_right->SetSelection(0); if (hasams) { m_tip_right_top->Show(); m_tip_load_info->SetLabelText(_L("Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically load or unload filaments.")); @@ -3691,18 +4507,19 @@ void AMSControl::ShowFilamentTip(bool hasams) bool AMSControl::Enable(bool enable) { - for (auto i = 0; i < m_ams_item_list.GetCount(); i++) { - AmsItems *item = m_ams_item_list[i]; - item->amsItem->Enable(enable); + for (auto prv_it : m_ams_preview_list) { + AMSPreview* prv = prv_it.second; + prv->Enable(enable); } - for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { - AmsCansWindow *cans = m_ams_cans_list[i]; - cans->amsCans->Enable(enable); + for (auto item_it : m_ams_item_list) { + AmsItem* item = item_it.second; + item->Enable(enable); } m_button_extruder_feed->Enable(enable); m_button_extruder_back->Enable(enable); + m_button_auto_refill->Enable(enable); m_button_ams_setting->Enable(enable); m_filament_load_step->Enable(enable); @@ -3711,6 +4528,10 @@ bool AMSControl::Enable(bool enable) void AMSControl::SetExtruder(bool on_off, bool is_vams, std::string ams_now, wxColour col) { + AmsItem* item = nullptr; + if (m_ams_item_list.find(ams_now) != m_ams_item_list.end()){ + item = m_ams_item_list[ams_now]; + } if (m_ams_model == AMSModel::GENERIC_AMS || m_ext_model == AMSModel::GENERIC_AMS ) { if (!on_off) { m_extruder->TurnOff(); @@ -3720,15 +4541,17 @@ void AMSControl::SetExtruder(bool on_off, bool is_vams, std::string ams_now, wxC } else { m_extruder->TurnOn(col); - - if (ams_now != GetCurentShowAms()) { - m_extruder->OnAmsLoading(false, col); - } else { - m_extruder->OnAmsLoading(true, col); + if (item){ + if (ams_now != GetCurentShowAms()) { + m_extruder->OnAmsLoading(false, item->m_info.nozzle_id, col); + } + else { + m_extruder->OnAmsLoading(true, item->m_info.nozzle_id, col); + } } } - if (is_vams && on_off) { + /*if (is_vams && on_off) { m_extruder->OnAmsLoading(false); m_vams_extra_road->OnVamsLoading(true, col); m_extruder->OnVamsLoading(true, col); @@ -3738,96 +4561,261 @@ void AMSControl::SetExtruder(bool on_off, bool is_vams, std::string ams_now, wxC m_vams_extra_road->OnVamsLoading(false); m_extruder->OnVamsLoading(false); m_vams_road->OnVamsLoading(false); - } + }*/ } else if (m_ams_model == AMSModel::EXTRA_AMS || m_ext_model == AMSModel::EXTRA_AMS) { - if (!is_vams && !on_off) { + if (!on_off) { m_extruder->TurnOff(); - m_extruder->OnVamsLoading(false); - m_vams_extra_road->OnVamsLoading(false); - m_vams_road->OnVamsLoading(false); + m_extruder->OnAmsLoading(false); + /*m_vams_extra_road->OnVamsLoading(false); + m_vams_road->OnVamsLoading(false);*/ } else { m_extruder->TurnOn(col); - } - - if (is_vams && on_off) { - m_vams_extra_road->OnVamsLoading(true, col); - m_extruder->OnVamsLoading(true, col); - m_vams_road->OnVamsLoading(true, col); - } - else { - m_vams_extra_road->OnVamsLoading(false); - m_extruder->OnVamsLoading(false); - m_vams_road->OnVamsLoading(false); + m_extruder->OnAmsLoading(true, item->m_info.nozzle_id, col); } } } +//void AMSControl::SetAmsStep(std::string ams_id, std::string canid, AMSPassRoadType type, AMSPassRoadSTEP step) +//{ +// AmsItem *cans = nullptr; +// auto cansit = m_ams_item_list.find(ams_id); +// bool notfound = true; +// +// +// if (cansit != m_ams_item_list.end()) { +// cans = cansit->second; +// } +// else { +// notfound = false; +// } +// +// +// +// if (ams_id != m_last_ams_id || m_last_tray_id != canid) { +// SetAmsStep(m_last_ams_id, m_last_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); +// //m_down_road->UpdatePassRoad(m_last_ams_id, m_last_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); +// m_vams_extra_road->OnVamsLoading(false); +// m_extruder->OnVamsLoading(false); +// m_vams_road->OnVamsLoading(false); +// } +// +// if (notfound) return; +// if (cans == nullptr) return; +// +// +// m_last_ams_id = ams_id; +// m_last_tray_id = canid; +// +// +// if (m_ams_model == AMSModel::GENERIC_AMS) { +// if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { +// //cans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); +// m_extruder->OnAmsLoading(false); +// } +// +// if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1) { +// //cans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); +// m_extruder->OnAmsLoading(false); +// } +// +// if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2) { +// //cans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); +// //cans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); +// if (m_current_show_ams == ams_id) { +// m_extruder->OnAmsLoading(true, cans->GetTagColr(canid)); +// } +// } +// +// if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3) { +// //cans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); +// //cans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); +// //cans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_3); +// m_extruder->OnAmsLoading(true, cans->GetTagColr(canid)); +// } +// } +// else if (m_ams_model == AMSModel::EXTRA_AMS) { +// //cans->SetAmsStepExtra(canid, type, step); +// if (step != AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { +// m_extruder->OnAmsLoading(true, cans->GetTagColr(canid)); +// } +// else { +// m_extruder->OnAmsLoading(false); +// } +// } +// +// for (auto i = 0; i < m_ams_info.size(); i++) { +// if (m_ams_info[i].ams_id == ams_id) { +// m_ams_info[i].current_step = step; +// m_ams_info[i].current_can_id = canid; +// } +// } +//} + + void AMSControl::SetAmsStep(std::string ams_id, std::string canid, AMSPassRoadType type, AMSPassRoadSTEP step) { - AmsCansWindow *cans = nullptr; - bool notfound = true; + AmsItem* ams = nullptr; + auto amsit = m_ams_item_list.find(ams_id); + bool notfound = false; - for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { - cans = m_ams_cans_list[i]; - if (cans->amsCans->m_info.ams_id == ams_id) { - notfound = false; - break; - } + + if (amsit != m_ams_item_list.end()) { + ams = amsit->second; + } + else { + notfound = true; } - - if (ams_id != m_last_ams_id || m_last_tray_id != canid) { - SetAmsStep(m_last_ams_id, m_last_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); - m_vams_extra_road->OnVamsLoading(false); - m_extruder->OnVamsLoading(false); - m_vams_road->OnVamsLoading(false); - } + //if (ams_id != m_last_ams_id || m_last_tray_id != canid) { + // m_down_road->UpdatePassRoad(m_last_ams_id, true, -1, ams->m_info, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + // m_down_road->UpdatePassRoad(m_last_ams_id, false, -1, ams->m_info, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + // //m_down_road->UpdatePassRoad(m_last_ams_id, m_last_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + // //m_vams_extra_road->OnVamsLoading(false); + // m_extruder->OnVamsLoading(false); + // //m_vams_road->OnVamsLoading(false); + //} if (notfound) return; - if (cans == nullptr) return; + if (ams == nullptr) return; m_last_ams_id = ams_id; m_last_tray_id = canid; + auto model = AMSModel::EXTRA_AMS; - if (m_ams_model == AMSModel::GENERIC_AMS) { + bool left = false; + for (auto id : m_item_ids[0]){ + if (id == ams_id){ + left = true; + break; + } + } + int length = -1; + + + if (ams->m_info.cans.size() == 4){ + length = left ? 135 : 149; + model = ams->m_info.ams_type; + } + else if (ams->m_info.cans.size() == 1){ + for (auto it : pair_id){ + if (it.first == ams_id){ + length = left ? 150 : 50; + break; + } + else if (it.second == ams_id){ + length = left ? 50 : 150; + break; + } + } + model = AMSModel::SINGLE_AMS; + } + if (model == AMSModel::EXTRA_AMS){ + length = left ? 150 : 50; + } + + + if (model == AMSModel::GENERIC_AMS || model == AMSModel::N3F_AMS || model == AMSModel::EXTRA_AMS) { if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { - cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + //cans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + m_down_road->UpdatePassRoad(canid, true, -1, ams->m_info, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + m_down_road->UpdatePassRoad(canid, false, -1, ams->m_info, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + ams->SetAmsStep(ams_id, canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); m_extruder->OnAmsLoading(false); } if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1) { - cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); + m_down_road->UpdatePassRoad(canid, left, length, ams->m_info, AMSPassRoadSTEP::AMS_ROAD_STEP_1); + ams->SetAmsStep(ams_id, canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); m_extruder->OnAmsLoading(false); } if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2) { - cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); - cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); - if (m_current_show_ams == ams_id) { m_extruder->OnAmsLoading(true, cans->amsCans->GetTagColr(canid)); } + m_down_road->UpdatePassRoad(canid, left, length, ams->m_info, AMSPassRoadSTEP::AMS_ROAD_STEP_2); + ams->SetAmsStep(ams_id, canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); + if (m_current_show_ams == ams_id) { + m_extruder->OnAmsLoading(true, ams->m_info.nozzle_id, ams->GetTagColr(canid)); + } } if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3) { - cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); - cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); - cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_3); - m_extruder->OnAmsLoading(true, cans->amsCans->GetTagColr(canid)); + m_down_road->UpdatePassRoad(canid, left, length, ams->m_info, AMSPassRoadSTEP::AMS_ROAD_STEP_3); + ams->SetAmsStep(ams_id, canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_3); + m_extruder->OnAmsLoading(true, ams->m_info.nozzle_id, ams->GetTagColr(canid)); } } - else if (m_ams_model == AMSModel::EXTRA_AMS) { - cans->amsCans->SetAmsStepExtra(canid, type, step); - if (step != AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { - m_extruder->OnAmsLoading(true, cans->amsCans->GetTagColr(canid)); - } - else { + else if(model == AMSModel::NO_AMS || model == AMSModel::SINGLE_AMS) { + if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { + //cans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + m_down_road->UpdatePassRoad(canid, true, -1, ams->m_info, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + m_down_road->UpdatePassRoad(canid, false, -1, ams->m_info, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + ams->SetAmsStep(ams_id, canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); m_extruder->OnAmsLoading(false); } + + if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1) { + m_down_road->UpdatePassRoad(canid, left, length, ams->m_info, AMSPassRoadSTEP::AMS_ROAD_STEP_1); + ams->SetAmsStep(ams_id, canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); + m_extruder->OnAmsLoading(false); + } + + if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2) { + m_down_road->UpdatePassRoad(canid, left, length, ams->m_info, AMSPassRoadSTEP::AMS_ROAD_STEP_2); + ams->SetAmsStep(ams_id, canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); + if (m_current_show_ams == ams_id) { + m_extruder->OnAmsLoading(true, ams->m_info.nozzle_id, ams->GetTagColr(canid)); + } + } + + if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3) { + m_down_road->UpdatePassRoad(canid, left, length, ams->m_info, AMSPassRoadSTEP::AMS_ROAD_STEP_3); + ams->SetAmsStep(ams_id, canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_3); + m_extruder->OnAmsLoading(true, ams->m_info.nozzle_id, ams->GetTagColr(canid)); + } } + //if (m_ams_model == AMSModel::GENERIC_AMS) { + // if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { + // //cans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + // m_down_road->UpdatePassRoad(canid, true, -1, ams->m_info, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + // m_down_road->UpdatePassRoad(canid, false, -1, ams->m_info, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + // m_extruder->OnAmsLoading(false); + // } + + // if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1) { + // //cans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); + // m_extruder->OnAmsLoading(false); + // } + + // if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2) { + // //cans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); + // //cans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); + // if (m_current_show_ams == ams_id) { + // m_extruder->OnAmsLoading(true, cans->GetTagColr(canid)); + // } + // } + + // if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3) { + // //cans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); + // //cans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); + // //cans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_3); + // m_extruder->OnAmsLoading(true, cans->GetTagColr(canid)); + // } + //} + //else if (m_ams_model == AMSModel::EXTRA_AMS) { + // //cans->SetAmsStepExtra(canid, type, step); + // if (step != AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { + // m_extruder->OnAmsLoading(true, cans->GetTagColr(canid)); + // } + // else { + // m_extruder->OnAmsLoading(false); + // } + //} + for (auto i = 0; i < m_ams_info.size(); i++) { if (m_ams_info[i].ams_id == ams_id) { - m_ams_info[i].current_step = step; + m_ams_info[i].current_step = step; m_ams_info[i].current_can_id = canid; } } @@ -3859,6 +4847,11 @@ void AMSControl::on_filament_unload(wxCommandEvent &event) post_event(SimpleEvent(EVT_AMS_UNLOAD)); } +void AMSControl::auto_refill(wxCommandEvent& event) +{ + post_event(SimpleEvent(EVT_AMS_FILAMENT_BACKUP)); +} + void AMSControl::on_ams_setting_click(wxMouseEvent &event) { for (auto i = 0; i < m_ams_info.size(); i++) { @@ -3867,6 +4860,20 @@ void AMSControl::on_ams_setting_click(wxMouseEvent &event) post_event(SimpleEvent(EVT_AMS_SETTINGS)); } +void AMSControl::parse_object(MachineObject* obj) { + if (!obj || obj->amsList.size() == 0) + { + return; + } + m_ams_info.clear(); + for (auto ams : obj->amsList) + { + AMSinfo info; + info.parse_ams_info(obj, ams.second); + m_ams_info.push_back(info); + } +} + void AMSControl::on_clibration_again_click(wxMouseEvent &event) { post_event(SimpleEvent(EVT_AMS_CLIBRATION_AGAIN)); } void AMSControl::on_clibration_cancel_click(wxMouseEvent &event) { post_event(SimpleEvent(EVT_AMS_CLIBRATION_CANCEL)); } diff --git a/src/slic3r/GUI/Widgets/AMSControl.hpp b/src/slic3r/GUI/Widgets/AMSControl.hpp index 22ed4ee5c..12e00a9b5 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.hpp +++ b/src/slic3r/GUI/Widgets/AMSControl.hpp @@ -5,6 +5,7 @@ #include "StaticBox.hpp" #include "StepCtrl.hpp" #include "Button.hpp" +#include "AMSItem.hpp" #include "../DeviceManager.hpp" #include "slic3r/GUI/Event.hpp" #include "slic3r/GUI/AmsMappingPopup.hpp" @@ -13,652 +14,117 @@ #include #include -#define AMS_CONTROL_BRAND_COLOUR wxColour(0, 174, 66) -#define AMS_CONTROL_GRAY700 wxColour(107, 107, 107) -#define AMS_CONTROL_GRAY800 wxColour(50, 58, 61) -#define AMS_CONTROL_GRAY500 wxColour(172, 172, 172) -#define AMS_CONTROL_DISABLE_COLOUR wxColour(206, 206, 206) -#define AMS_CONTROL_DISABLE_TEXT_COLOUR wxColour(144, 144, 144) -#define AMS_CONTROL_WHITE_COLOUR wxColour(255, 255, 255) -#define AMS_CONTROL_BLACK_COLOUR wxColour(0, 0, 0) -#define AMS_CONTROL_DEF_BLOCK_BK_COLOUR wxColour(238, 238, 238) -#define AMS_CONTROL_DEF_LIB_BK_COLOUR wxColour(248, 248, 248) -#define AMS_EXTRUDER_DEF_COLOUR wxColour(234, 234, 234) -#define AMS_CONTROL_MAX_COUNT 4 -#define AMS_CONTRO_CALIBRATION_BUTTON_SIZE wxSize(FromDIP(150), FromDIP(28)) - -// enum AMSRoadMode{ -// AMS_ROAD_MODE_LEFT, -// AMS_ROAD_MODE_LEFT_RIGHT, -// AMS_ROAD_MODE_END, -//}; namespace Slic3r { namespace GUI { -enum AMSModel { - NO_AMS = 0, - GENERIC_AMS = 1, - EXTRA_AMS = 2 -}; - -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, - AMS_ROAD_MODE_END, - AMS_ROAD_MODE_END_ONLY, - AMS_ROAD_MODE_NONE, - AMS_ROAD_MODE_NONE_ANY_ROAD, - AMS_ROAD_MODE_VIRTUAL_TRAY -}; - -enum class AMSPassRoadMode : int { - AMS_ROAD_MODE_NONE, - AMS_ROAD_MODE_LEFT, - AMS_ROAD_MODE_LEFT_RIGHT, - AMS_ROAD_MODE_END_TOP, - AMS_ROAD_MODE_END_RIGHT, - AMS_ROAD_MODE_END_BOTTOM, -}; - -enum class AMSAction : int { - AMS_ACTION_NONE, - AMS_ACTION_LOAD, - AMS_ACTION_UNLOAD, - AMS_ACTION_CALI, - AMS_ACTION_PRINTING, - AMS_ACTION_NORMAL, - AMS_ACTION_NOAMS, -}; - -enum class AMSPassRoadSTEP : int { - AMS_ROAD_STEP_NONE, - AMS_ROAD_STEP_1, // lib -> extrusion - AMS_ROAD_STEP_2, // extrusion->buffer - AMS_ROAD_STEP_3, // extrusion - - AMS_ROAD_STEP_COMBO_LOAD_STEP1, - AMS_ROAD_STEP_COMBO_LOAD_STEP2, - AMS_ROAD_STEP_COMBO_LOAD_STEP3, -}; - -enum class AMSPassRoadType : int { - AMS_ROAD_TYPE_NONE, - AMS_ROAD_TYPE_LOAD, - AMS_ROAD_TYPE_UNLOAD, -}; - -enum class AMSCanType : int { - AMS_CAN_TYPE_NONE, - AMS_CAN_TYPE_BRAND, - AMS_CAN_TYPE_THIRDBRAND, - AMS_CAN_TYPE_EMPTY, - AMS_CAN_TYPE_VIRTUAL, -}; - -enum FilamentStep { - STEP_IDLE, - STEP_HEAT_NOZZLE, - STEP_CUT_FILAMENT, - STEP_PULL_CURR_FILAMENT, - STEP_PUSH_NEW_FILAMENT, - STEP_PURGE_OLD_FILAMENT, - STEP_FEED_FILAMENT, - STEP_CONFIRM_EXTRUDED, - STEP_CHECK_POSITION, - STEP_COUNT, -}; - -enum FilamentStepType { - STEP_TYPE_LOAD = 0, - STEP_TYPE_UNLOAD = 1, - STEP_TYPE_VT_LOAD = 2, -}; - -#define AMS_ITEM_CUBE_SIZE wxSize(FromDIP(14), FromDIP(14)) -#define AMS_ITEM_SIZE wxSize(FromDIP(82), FromDIP(27)) -#define AMS_ITEM_HUMIDITY_SIZE wxSize(FromDIP(120), FromDIP(27)) -#define AMS_CAN_LIB_SIZE wxSize(FromDIP(58), FromDIP(75)) -#define AMS_CAN_ROAD_SIZE wxSize(FromDIP(66), FromDIP(70)) -#define AMS_CAN_ITEM_HEIGHT_SIZE FromDIP(27) -#define AMS_CANS_SIZE wxSize(FromDIP(284), FromDIP(196)) -#define AMS_CANS_WINDOW_SIZE wxSize(FromDIP(264), FromDIP(196)) -#define AMS_STEP_SIZE wxSize(FromDIP(172), FromDIP(196)) -#define AMS_REFRESH_SIZE wxSize(FromDIP(30), FromDIP(30)) -#define AMS_EXTRUDER_SIZE wxSize(FromDIP(86), FromDIP(72)) -#define AMS_EXTRUDER_BITMAP_SIZE wxSize(FromDIP(36), FromDIP(55)) - -struct Caninfo -{ - std::string can_id; - wxString material_name; - wxColour material_colour = {*wxWHITE}; - AMSCanType material_state; - int ctype=0; - int material_remain = 100; - int cali_idx = -1; - std::string filament_id; - float k = 0.0f; - float n = 0.0f; - std::vector material_cols; - - bool operator==(const Caninfo &other) const - { - return can_id == other.can_id && - material_name == other.material_name && - material_colour == other.material_colour && - material_state == other.material_state && - ctype == other.ctype && - material_remain == other.material_remain && - cali_idx == other.cali_idx && - filament_id == other.filament_id && - k == other.k && - n == other.n && - material_cols == other.material_cols; - } -}; - -struct AMSinfo -{ -public: - std::string ams_id; - std::vector cans; - std::string current_can_id; - AMSPassRoadSTEP current_step; - AMSAction current_action; - int curreent_filamentstep; - int ams_humidity = 0; - - bool operator==(const AMSinfo &other) const - { - return ams_id == other.ams_id && cans == other.cans && - current_can_id == other.current_can_id && current_step == other.current_step && current_action == other.current_action && - curreent_filamentstep == other.curreent_filamentstep && ams_humidity == other.ams_humidity; - } - - bool parse_ams_info(MachineObject* obj, Ams *ams, bool remain_flag = false, bool humidity_flag = false); -}; - -/************************************************* -Description:AMSrefresh -**************************************************/ -#define AMS_REFRESH_PLAY_LOADING_TIMER 100 -class AMSrefresh : public wxWindow -{ -public: - AMSrefresh(); - AMSrefresh(wxWindow *parent, wxString number, Caninfo info, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); - AMSrefresh(wxWindow *parent, int number, Caninfo info, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); - ~AMSrefresh(); - void PlayLoading(); - void StopLoading(); - void create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size); - void on_timer(wxTimerEvent &event); - void OnEnterWindow(wxMouseEvent &evt); - void OnLeaveWindow(wxMouseEvent &evt); - void OnClick(wxMouseEvent &evt); - void post_event(wxCommandEvent &&event); - void paintEvent(wxPaintEvent &evt); - void Update(std::string ams_id, Caninfo info); - void msw_rescale(); - void set_disable_mode(bool disable) { m_disable_mode = disable; } - Caninfo m_info; - - -protected: - wxTimer *m_playing_timer= {nullptr}; - int m_rotation_angle = 0; - bool m_play_loading = {false}; - bool m_selected = {false}; - - std::string m_ams_id; - std::string m_can_id; - - ScalableBitmap m_bitmap_normal; - ScalableBitmap m_bitmap_selected; - ScalableBitmap m_bitmap_ams_rfid_0; - ScalableBitmap m_bitmap_ams_rfid_1; - ScalableBitmap m_bitmap_ams_rfid_2; - ScalableBitmap m_bitmap_ams_rfid_3; - ScalableBitmap m_bitmap_ams_rfid_4; - ScalableBitmap m_bitmap_ams_rfid_5; - ScalableBitmap m_bitmap_ams_rfid_6; - ScalableBitmap m_bitmap_ams_rfid_7; - std::vector m_rfid_bitmap_list; - - wxString m_refresh_id; - wxBoxSizer * m_size_body; - virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); - - bool m_disable_mode{ false }; -}; - -/************************************************* -Description:AMSextruder -**************************************************/ -class AMSextruderImage: public wxWindow -{ -public: - void TurnOn(wxColour col); - void TurnOff(); - void msw_rescale(); - void paintEvent(wxPaintEvent &evt); - - void render(wxDC &dc); - bool m_turn_on = {false}; - wxColour m_colour; - ScalableBitmap m_ams_extruder; - void doRender(wxDC &dc); - AMSextruderImage(wxWindow *parent, wxWindowID id, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); - ~AMSextruderImage(); -}; - - -class AMSextruder : public wxWindow -{ -public: - void TurnOn(wxColour col); - void TurnOff(); - void create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size); - void OnVamsLoading(bool load, wxColour col = AMS_CONTROL_GRAY500); - void OnAmsLoading(bool load, wxColour col = AMS_CONTROL_GRAY500); - void paintEvent(wxPaintEvent& evt); - void render(wxDC& dc); - void doRender(wxDC& dc); - void msw_rescale(); - void has_ams(bool hams) {m_has_vams = hams; Refresh();}; - void no_ams_mode(bool mode) {m_none_ams_mode = mode; Refresh();}; - - bool m_none_ams_mode{true}; - bool m_has_vams{false}; - bool m_vams_loading{false}; - bool m_ams_loading{false}; - wxColour m_current_colur; - - wxBoxSizer * m_bitmap_sizer{nullptr}; - wxPanel * m_bitmap_panel{nullptr}; - AMSextruderImage *m_amsSextruder{nullptr}; - ScalableBitmap monitor_ams_extruder; - AMSextruder(wxWindow *parent, wxWindowID id, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); - ~AMSextruder(); -}; - -class AMSVirtualRoad : public wxWindow -{ -public: - AMSVirtualRoad(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); - ~AMSVirtualRoad(); - -private: - bool m_has_vams{ true }; - bool m_vams_loading{ false }; - wxColour m_current_color; - -public: - void OnVamsLoading(bool load, wxColour col = AMS_CONTROL_GRAY500); - void SetHasVams(bool hvams) { m_has_vams = hvams; }; - void create(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size); - void paintEvent(wxPaintEvent& evt); - void render(wxDC& dc); - void doRender(wxDC& dc); - void msw_rescale(); -}; - -/************************************************* -Description:AMSLib -**************************************************/ -class AMSLib : public wxWindow -{ -public: - AMSLib(wxWindow *parent, Caninfo info); - void create(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); -public: - wxColour GetLibColour(); - Caninfo m_info; - MachineObject* m_obj = {nullptr}; - int m_can_index = 0; - AMSModel m_ams_model; - - void Update(Caninfo info, bool refresh = true); - void UnableSelected() { m_unable_selected = true; }; - void EableSelected() { m_unable_selected = false; }; - void OnSelected(); - void UnSelected(); - bool is_selected() {return m_selected;}; - void post_event(wxCommandEvent &&event); - void show_kn_value(bool show) { m_show_kn = show; }; - void support_cali(bool sup) { m_support_cali = sup; Refresh(); }; - virtual bool Enable(bool enable = true); - void set_disable_mode(bool disable) { m_disable_mode = disable; } - void msw_rescale(); - void on_pass_road(bool pass); - -protected: - wxStaticBitmap *m_edit_bitmp = {nullptr}; - wxStaticBitmap *m_edit_bitmp_light = {nullptr}; - ScalableBitmap m_bitmap_editable; - ScalableBitmap m_bitmap_editable_light; - ScalableBitmap m_bitmap_readonly; - ScalableBitmap m_bitmap_readonly_light; - ScalableBitmap m_bitmap_transparent; - - ScalableBitmap m_bitmap_extra_tray_left; - ScalableBitmap m_bitmap_extra_tray_right; - - ScalableBitmap m_bitmap_extra_tray_left_hover; - ScalableBitmap m_bitmap_extra_tray_right_hover; - - ScalableBitmap m_bitmap_extra_tray_left_selected; - ScalableBitmap m_bitmap_extra_tray_right_selected; - - bool m_unable_selected = {false}; - bool m_enable = {false}; - bool m_selected = {false}; - bool m_hover = {false}; - bool m_show_kn = {false}; - bool m_support_cali = {false}; - bool transparent_changed = {false}; - - double m_radius = {4}; - wxColour m_border_color; - wxColour m_road_def_color; - wxColour m_lib_color; - bool m_disable_mode{ false }; - bool m_pass_road{false}; - - void on_enter_window(wxMouseEvent &evt); - void on_leave_window(wxMouseEvent &evt); - void on_left_down(wxMouseEvent &evt); - void paintEvent(wxPaintEvent &evt); - void render(wxDC &dc); - void render_extra_text(wxDC& dc); - void render_generic_text(wxDC& dc); - void doRender(wxDC& dc); - void render_extra_lib(wxDC& dc); - void render_generic_lib(wxDC& dc); -}; - -/************************************************* -Description:AMSRoad -**************************************************/ -class AMSRoad : public wxWindow -{ -public: - AMSRoad(); - AMSRoad(wxWindow *parent, wxWindowID id, Caninfo info, int canindex, int maxcan, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); - void create(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); - -public: - AMSinfo m_amsinfo; - Caninfo m_info; - int m_canindex = {0}; - AMSRoadMode m_rode_mode = {AMSRoadMode::AMS_ROAD_MODE_LEFT_RIGHT}; - std::vector m_pass_rode_mode = {AMSPassRoadMode::AMS_ROAD_MODE_NONE}; - bool m_selected = {false}; - int m_passroad_width = {6}; - double m_radius = {4}; - wxColour m_road_def_color; - wxColour m_road_color; - void Update(AMSinfo amsinfo, Caninfo info, int canindex, int maxcan); - - std::vector ams_humidity_img; - - - int m_humidity = { 0 }; - bool m_show_humidity = { false }; - bool m_vams_loading{false}; - AMSModel m_ams_model; - - void OnVamsLoading(bool load, wxColour col = AMS_CONTROL_GRAY500); - void SetPassRoadColour(wxColour col); - void SetMode(AMSRoadMode mode); - void OnPassRoad(std::vector prord_list); - void UpdatePassRoad(int tag_index, AMSPassRoadType type, AMSPassRoadSTEP step); - - void paintEvent(wxPaintEvent &evt); - void render(wxDC &dc); - void doRender(wxDC &dc); -}; - -/************************************************* -Description:AMSItem -**************************************************/ - -class AMSItem : public wxWindow -{ -public: - AMSItem(); - AMSItem(wxWindow *parent, wxWindowID id, AMSinfo amsinfo, const wxSize cube_size = wxSize(14, 14), const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); - - bool m_open = {false}; - void Open(); - void Close(); - - void Update(AMSinfo amsinfo); - void create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size); - void OnEnterWindow(wxMouseEvent &evt); - void OnLeaveWindow(wxMouseEvent &evt); - void OnSelected(); - void UnSelected(); - virtual bool Enable(bool enable = true); - - AMSinfo m_amsinfo; - -protected: - wxSize m_cube_size; - wxColour m_background_colour = {AMS_CONTROL_DEF_BLOCK_BK_COLOUR}; - int m_padding = {7}; - int m_space = {5}; - bool m_hover = {false}; - bool m_selected = {false}; - ScalableBitmap* m_ts_bitmap_cube; - - void paintEvent(wxPaintEvent &evt); - void render(wxDC &dc); - void doRender(wxDC &dc); - virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); -}; - -/************************************************* -Description:AmsCans -**************************************************/ -class Canrefreshs -{ -public: - wxString canID; - AMSrefresh *canrefresh; -}; - -class CanLibs -{ -public: - wxString canID; - AMSLib * canLib; -}; - -class CanRoads -{ -public: - wxString canID; - AMSRoad *canRoad; -}; - -WX_DEFINE_ARRAY(Canrefreshs *, CanrefreshsHash); -WX_DEFINE_ARRAY(CanLibs *, CanLibsHash); -WX_DEFINE_ARRAY(CanRoads *, CansRoadsHash); - -class AmsCans : public wxWindow -{ -public: - AmsCans(); - AmsCans(wxWindow *parent, AMSinfo info, AMSModel model); - - void Update(AMSinfo info); - void create(wxWindow *parent); - void AddCan(Caninfo caninfo, int canindex, int maxcan, wxBoxSizer* sizer); - void SetDefSelectCan(); - void SelectCan(std::string canid); - void PlayRridLoading(wxString canid); - void StopRridLoading(wxString canid); - void msw_rescale(); - void show_sn_value(bool show); - void SetAmsStepExtra(wxString canid, AMSPassRoadType type, AMSPassRoadSTEP step); - void SetAmsStep(wxString canid, AMSPassRoadType type, AMSPassRoadSTEP step); - void SetAmsStep(std::string can_id); - void paintEvent(wxPaintEvent& evt); - void render(wxDC& dc); - void doRender(wxDC& dc); - wxColour GetTagColr(wxString canid); - std::string GetCurrentCan(); - -public: - ScalableBitmap m_bitmap_extra_framework; - int m_canlib_selection = { -1 }; - int m_selection = { 0 }; - int m_can_count = { 0 }; - AMSModel m_ams_model; - std::string m_canlib_id; - - std::string m_road_canid; - wxColour m_road_colour; - - CanLibsHash m_can_lib_list; - CansRoadsHash m_can_road_list; - CanrefreshsHash m_can_refresh_list; - AMSinfo m_info; - wxBoxSizer * sizer_can = {nullptr}; - wxBoxSizer * sizer_can_middle = {nullptr}; - wxBoxSizer * sizer_can_left = {nullptr}; - wxBoxSizer * sizer_can_right = {nullptr}; - AMSPassRoadSTEP m_step = {AMSPassRoadSTEP ::AMS_ROAD_STEP_NONE}; -}; - -/************************************************* -Description:AMSControl -**************************************************/ -class AmsCansWindow -{ -public: - wxString amsIndex; - AmsCans *amsCans; - bool m_disable_mode{ false }; - - void set_disable_mode(bool disable) { - m_disable_mode = disable; - for (auto can_lib : amsCans->m_can_lib_list) { - can_lib->canLib->set_disable_mode(disable); - } - for (auto can_refresh : amsCans->m_can_refresh_list) { - can_refresh->canrefresh->set_disable_mode(disable); - } - } -}; - -class AmsItems -{ -public: - wxString amsIndex; - AMSItem *amsItem; -}; - -class AMSextruders -{ -public: - wxString amsIndex; - AMSextruder *amsextruder; -}; - -WX_DEFINE_ARRAY(AmsCansWindow *, AmsCansHash); -WX_DEFINE_ARRAY(AmsItems *, AmsItemsHash); -WX_DEFINE_ARRAY(AMSextruders *, AMSextrudersHash); - class AMSControl : public wxSimplebook { public: AMSControl(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); + ~AMSControl(); void on_retry(); - void init_scaled_buttons(); protected: std::string m_current_ams; + std::string m_current_slot; std::string m_current_show_ams; std::map m_ams_selection; - - AmsItemsHash m_ams_item_list; + + std::map m_ams_preview_list; std::vector m_ams_info; - AmsCansHash m_ams_cans_list; - AmsCansHash m_ams_generic_cans_list; - AmsCansHash m_ams_extra_cans_list; + std::vector m_ext_info; + std::map m_ams_item_list; + //std::map m_ams_generic_item_list; + //std::map m_ams_extra_item_list; + //std::map m_ams_list; + + int m_nozzle_num = 1; + std::string m_dev_id; + std::vector> m_item_ids{ {}, {} }; + std::vector> pair_id; + + AMSextruder *m_extruder{nullptr}; + AMSRoadDownPart* m_down_road{ nullptr }; + + /*items*/ + wxBoxSizer* m_sizer_ams_items{nullptr}; + wxWindow* m_panel_items_left {nullptr}; + wxWindow* m_panel_items_right{nullptr}; + wxBoxSizer* m_sizer_items_left{nullptr}; + wxBoxSizer* m_sizer_items_right{nullptr}; + + /*ams */ + wxBoxSizer *m_sizer_ams_body{nullptr}; + wxBoxSizer* m_sizer_ams_area_left{nullptr}; + wxBoxSizer* m_sizer_ams_area_right{nullptr}; + wxBoxSizer* m_sizer_down_road{ nullptr }; + + /*option*/ + wxBoxSizer *m_sizer_ams_option{nullptr}; + wxBoxSizer* m_sizer_option_left{nullptr}; + wxBoxSizer* m_sizer_option_mid{nullptr}; + wxBoxSizer* m_sizer_option_right{nullptr}; - AMSextruder *m_extruder = {nullptr}; AmsIntroducePopup m_ams_introduce_popup; - wxSimplebook *m_simplebook_right = {nullptr}; - wxSimplebook *m_simplebook_calibration = {nullptr}; - wxSimplebook *m_simplebook_amsitems = {nullptr}; - wxSimplebook *m_simplebook_ams = {nullptr}; + //wxSimplebook *m_simplebook_right{nullptr}; + wxSimplebook *m_simplebook_ams_left{nullptr}; + wxSimplebook *m_simplebook_ams_right{ nullptr }; + wxPanel *m_panel_down_road{ nullptr }; + int m_left_page_index = 0; + int m_right_page_index = 0; - wxSimplebook *m_simplebook_generic_cans= {nullptr}; - wxSimplebook *m_simplebook_extra_cans = {nullptr}; + //wxSimplebook* m_simplebook_generic_cans_left{ nullptr }; + //wxSimplebook* m_simplebook_extra_cans_left {nullptr}; + //wxSimplebook* m_simplebook_generic_cans_right{ nullptr }; + //wxSimplebook* m_simplebook_extra_cans_right{ nullptr }; - wxSimplebook *m_simplebook_bottom = {nullptr}; + wxSimplebook *m_simplebook_bottom{nullptr}; - wxStaticText *m_tip_right_top = {nullptr}; - Label *m_tip_load_info = {nullptr}; - wxStaticText *m_text_calibration_percent = {nullptr}; - wxWindow * m_none_ams_panel = {nullptr}; - wxWindow * m_panel_top = {nullptr}; - wxWindow * m_amswin = {nullptr}; - wxBoxSizer* m_vams_sizer = {nullptr}; - wxBoxSizer* m_sizer_vams_tips = {nullptr}; + wxStaticText *m_tip_right_top{nullptr}; + Label *m_tip_load_info{nullptr}; + wxWindow * m_amswin{nullptr}; + wxBoxSizer* m_vams_sizer{nullptr}; + wxBoxSizer* m_sizer_vams_tips{nullptr}; - bool m_auto_reill_show = {false}; - Label* m_ams_backup_tip = {nullptr}; - Label* m_ams_tip = {nullptr}; + Label* m_ams_tip {nullptr}; Caninfo m_vams_info; - StaticBox* m_panel_virtual = {nullptr}; - AMSLib* m_vams_lib = {nullptr}; - AMSRoad* m_vams_road = {nullptr}; - AMSVirtualRoad* m_vams_extra_road = {nullptr}; + StaticBox* m_panel_virtual {nullptr}; + AMSLib* m_vams_lib {nullptr}; + AMSRoad* m_vams_road {nullptr}; + AMSVirtualRoad* m_vams_extra_road {nullptr}; - StaticBox * m_panel_can = {nullptr}; - wxBoxSizer *m_sizer_top = {nullptr}; - wxBoxSizer *m_sizer_cans = {nullptr}; - wxBoxSizer *m_sizer_right_tip = {nullptr}; - wxBoxSizer* m_sizer_ams_tips = {nullptr}; - ::StepIndicator *m_filament_load_step = {nullptr}; - ::StepIndicator *m_filament_unload_step = {nullptr}; - ::StepIndicator *m_filament_vt_load_step = {nullptr}; - Button *m_button_extruder_feed = {nullptr}; - Button *m_button_extruder_back = {nullptr}; - wxStaticBitmap* m_button_ams_setting = {nullptr}; - wxStaticBitmap* m_img_ams_backup = {nullptr}; - wxStaticBitmap* m_img_amsmapping_tip = {nullptr}; - wxStaticBitmap* m_img_vams_tip = {nullptr}; + + wxBoxSizer *m_sizer_right_tip {nullptr}; + wxBoxSizer* m_sizer_ams_tips {nullptr}; + + ::StepIndicator *m_filament_load_step {nullptr}; + ::StepIndicator *m_filament_unload_step {nullptr}; + ::StepIndicator *m_filament_vt_load_step {nullptr}; + + Button *m_button_extruder_feed {nullptr}; + Button *m_button_extruder_back {nullptr}; + Button *m_button_auto_refill{ nullptr }; + wxStaticBitmap* m_button_ams_setting {nullptr}; + wxStaticBitmap* m_img_ams_backup {nullptr}; + wxStaticBitmap* m_img_amsmapping_tip {nullptr}; + wxStaticBitmap* m_img_vams_tip {nullptr}; ScalableBitmap m_button_ams_setting_normal; ScalableBitmap m_button_ams_setting_hover; ScalableBitmap m_button_ams_setting_press; - Button *m_button_guide = {nullptr}; - Button *m_button_retry = {nullptr}; - wxWindow* m_button_area = {nullptr}; + Button *m_button_guide {nullptr}; + Button *m_button_retry {nullptr}; - wxHyperlinkCtrl *m_hyperlink = {nullptr}; AmsHumidityTipPopup m_Humidity_tip_popup; - std::string m_last_ams_id; - std::string m_last_tray_id; + std::string m_last_ams_id = "-1"; + std::string m_last_tray_id = "-1"; public: std::string GetCurentAms(); @@ -669,6 +135,7 @@ public: AMSModel m_ams_model{AMSModel::NO_AMS}; AMSModel m_ext_model{AMSModel::NO_AMS}; AMSModel m_is_none_ams_mode{AMSModel::NO_AMS}; + bool m_single_nozzle_no_ams = { true }; void SetAmsModel(AMSModel mode, AMSModel ext_mode) {m_ams_model = mode; m_ext_model = ext_mode;}; @@ -677,12 +144,6 @@ public: void EnterGenericAMSMode(); void EnterExtraAMSMode(); - void EnterCalibrationMode(bool read_to_calibration); - void ExitcClibrationMode(); - - void SetClibrationpercent(int percent); - void SetClibrationLink(wxString link); - void PlayRridLoading(wxString amsid, wxString canid); void StopRridLoading(wxString amsid, wxString canid); @@ -690,11 +151,22 @@ public: void ShowFilamentTip(bool hasams = true); void UpdateStepCtrl(bool is_extrusion_exist); + void UpdatePassRoad(string ams_id, AMSPassRoadType type, AMSPassRoadSTEP step); void CreateAms(); - void UpdateAms(std::vector info, bool is_reset = true); - void AddAms(AMSinfo info); - void AddAmsItems(AMSinfo info); - void AddExtraAms(AMSinfo info); + void CreateAmsNew(); + void CreateAmsSingleNozzle(); + void ClearAms(); + void UpdateAms(std::vector ams_info, std::vector ext_info, std::string dev_id, bool is_reset = true, bool test = false); + void ReadExtInfo(MachineObject* obj); + + void AddAms(AMSinfo info, bool left = true); + //void AddExtAms(int ams_id); + void AddAmsPreview(AMSinfo info, AMSModel type); + //void AddExtraAms(AMSinfo info); + + void AddAms(std::vectorsingle_info, bool left = true); + void AddAmsPreview(std::vectorsingle_info); + //void AddExtraAms(std::vectorsingle_info); void SetExtruder(bool on_off, bool is_vams, std::string ams_now, wxColour col); void SetAmsStep(std::string ams_id, std::string canid, AMSPassRoadType type, AMSPassRoadSTEP step); void SwitchAms(std::string ams_id); @@ -702,6 +174,7 @@ public: void msw_rescale(); void on_filament_load(wxCommandEvent &event); void on_filament_unload(wxCommandEvent &event); + void auto_refill(wxCommandEvent& event); void on_ams_setting_click(wxMouseEvent &event); void on_extrusion_cali(wxCommandEvent &event); void on_ams_setting_click(wxCommandEvent &event); @@ -719,28 +192,12 @@ public: void post_event(wxEvent&& event); virtual bool Enable(bool enable = true); + void parse_object(MachineObject* obj); public: - std::string m_current_senect; + std::string m_current_select; }; -wxDECLARE_EVENT(EVT_AMS_EXTRUSION_CALI, wxCommandEvent); -wxDECLARE_EVENT(EVT_AMS_LOAD, SimpleEvent); -wxDECLARE_EVENT(EVT_AMS_UNLOAD, SimpleEvent); -wxDECLARE_EVENT(EVT_AMS_SETTINGS, SimpleEvent); -wxDECLARE_EVENT(EVT_AMS_FILAMENT_BACKUP, SimpleEvent); -wxDECLARE_EVENT(EVT_AMS_REFRESH_RFID, wxCommandEvent); -wxDECLARE_EVENT(EVT_AMS_ON_SELECTED, wxCommandEvent); -wxDECLARE_EVENT(EVT_AMS_ON_FILAMENT_EDIT, wxCommandEvent); -wxDECLARE_EVENT(EVT_VAMS_ON_FILAMENT_EDIT, wxCommandEvent); -wxDECLARE_EVENT(EVT_AMS_CLIBRATION_AGAIN, wxCommandEvent); -wxDECLARE_EVENT(EVT_AMS_CLIBRATION_CANCEL, wxCommandEvent); -wxDECLARE_EVENT(EVT_AMS_GUIDE_WIKI, wxCommandEvent); -wxDECLARE_EVENT(EVT_AMS_RETRY, wxCommandEvent); -wxDECLARE_EVENT(EVT_AMS_SHOW_HUMIDITY_TIPS, wxCommandEvent); -wxDECLARE_EVENT(EVT_AMS_UNSELETED_VAMS, wxCommandEvent); -wxDECLARE_EVENT(EVT_CLEAR_SPEED_CONTROL, wxCommandEvent); - }} // namespace Slic3r::GUI #endif // !slic3r_GUI_amscontrol_hpp_ diff --git a/src/slic3r/GUI/Widgets/AMSItem.cpp b/src/slic3r/GUI/Widgets/AMSItem.cpp new file mode 100644 index 000000000..cb4c4e007 --- /dev/null +++ b/src/slic3r/GUI/Widgets/AMSItem.cpp @@ -0,0 +1,3228 @@ +#include "AMSItem.hpp" +#include "Label.hpp" +#include "../BitmapCache.hpp" +#include "../I18N.hpp" +#include "../GUI_App.hpp" + +#include +#include + +#include + +#include "CalibUtils.hpp" + + + +namespace Slic3r { namespace GUI { + + static const wxColour AMS_TRAY_DEFAULT_COL = wxColour(255, 255, 255); + wxDEFINE_EVENT(EVT_AMS_EXTRUSION_CALI, wxCommandEvent); + wxDEFINE_EVENT(EVT_AMS_LOAD, SimpleEvent); + wxDEFINE_EVENT(EVT_AMS_UNLOAD, SimpleEvent); + wxDEFINE_EVENT(EVT_AMS_SETTINGS, SimpleEvent); + wxDEFINE_EVENT(EVT_AMS_FILAMENT_BACKUP, SimpleEvent); + wxDEFINE_EVENT(EVT_AMS_REFRESH_RFID, wxCommandEvent); + wxDEFINE_EVENT(EVT_AMS_ON_SELECTED, wxCommandEvent); + wxDEFINE_EVENT(EVT_AMS_ON_FILAMENT_EDIT, wxCommandEvent); + wxDEFINE_EVENT(EVT_VAMS_ON_FILAMENT_EDIT, wxCommandEvent); + wxDEFINE_EVENT(EVT_AMS_CLIBRATION_AGAIN, wxCommandEvent); + wxDEFINE_EVENT(EVT_AMS_CLIBRATION_CANCEL, wxCommandEvent); + wxDEFINE_EVENT(EVT_AMS_GUIDE_WIKI, wxCommandEvent); + wxDEFINE_EVENT(EVT_AMS_RETRY, wxCommandEvent); + wxDEFINE_EVENT(EVT_AMS_SHOW_HUMIDITY_TIPS, wxCommandEvent); + wxDEFINE_EVENT(EVT_AMS_UNSELETED_VAMS, wxCommandEvent); + wxDEFINE_EVENT(EVT_CLEAR_SPEED_CONTROL, wxCommandEvent); + + +#define AMS_CANS_SIZE wxSize(FromDIP(284), -1) +//#define AMS_CANS_WINDOW_SIZE wxSize(FromDIP(264), 144) +//#define AMS_SINGLE_CAN_SIZE wxSize(FromDIP(78), 144) +#define AMS_CANS_WINDOW_SIZE wxSize(FromDIP(264), 174) +#define AMS_SINGLE_CAN_SIZE wxSize(FromDIP(78), 174) +bool AMSinfo::parse_ams_info(MachineObject *obj, Ams *ams, bool remain_flag, bool humidity_flag) +{ + if (!ams) return false; + this->ams_id = ams->id; + + if (ams->type == 1 || ams->type == 3){ + this->ams_humidity = ams->humidity; + } + else{ + this->ams_humidity = -1; + } + this->ams_type = AMSModel(ams->type); + /*if (humidity_flag) { + this->ams_humidity = ams->humidity; + } + else { + this->ams_humidity = -1; + }*/ + + nozzle_id = ams->nozzle; + cans.clear(); + for (int i = 0; i < 4; i++) { + auto it = ams->trayList.find(std::to_string(i)); + Caninfo info; + // tray is exists + if (it != ams->trayList.end() && it->second->is_exists) { + if (it->second->is_tray_info_ready()) { + info.can_id = it->second->id; + info.ctype = it->second->ctype; + info.material_name = it->second->get_display_filament_type(); + if (!it->second->color.empty()) { + info.material_colour = AmsTray::decode_color(it->second->color); + } else { + // set to white by default + info.material_colour = AMS_TRAY_DEFAULT_COL; + } + + for (std::string cols:it->second->cols) { + info.material_cols.push_back(AmsTray::decode_color(cols)); + } + + if (MachineObject::is_bbl_filament(it->second->tag_uid)) { + info.material_state = AMSCanType::AMS_CAN_TYPE_BRAND; + } else { + info.material_state = AMSCanType::AMS_CAN_TYPE_THIRDBRAND; + } + + if (!MachineObject::is_bbl_filament(it->second->tag_uid) || !remain_flag) { + info.material_remain = 100; + } else { + info.material_remain = it->second->remain < 0 ? 0 : it->second->remain; + info.material_remain = it->second->remain > 100 ? 100 : info.material_remain; + } + + + } else { + info.can_id = it->second->id; + info.material_name = ""; + info.ctype = 0; + info.material_colour = AMS_TRAY_DEFAULT_COL; + info.material_state = AMSCanType::AMS_CAN_TYPE_THIRDBRAND; + wxColour(255, 255, 255); + } + + if (it->second->is_tray_info_ready() && obj->cali_version >= 0) { + CalibUtils::get_pa_k_n_value_by_cali_idx(obj, it->second->cali_idx, info.k, info.n); + } + else { + info.k = it->second->k; + info.n = it->second->n; + } + } else { + info.can_id = i; + info.material_state = AMSCanType::AMS_CAN_TYPE_EMPTY; + } + cans.push_back(info); + } + return true; +} + +void AMSinfo::ReadExtInfo(AmsTray tray) { + this->ams_id = tray.id; + Caninfo can; + can.can_id = std::to_string(0); + can.material_name = tray.filament_setting_id; + this->cans.push_back(can); + if (tray.id == std::to_string(VIRTUAL_TRAY_MAIN_ID)) { + this->nozzle_id = 0; + } + else { + this->nozzle_id = 1; + } + this->cans[0].material_state = AMSCanType::AMS_CAN_TYPE_VIRTUAL; + this->cans[0].material_colour = tray.decode_color(tray.color); + this->cans[0].material_remain = tray.remain; + this->cans[0].material_name = tray.type; +} + +/************************************************* +Description:AMSExtText +**************************************************/ + +AMSExtText::AMSExtText(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size) +{ + wxWindow::Create(parent, id, pos, AMS_REFRESH_SIZE); + SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); + + Bind(wxEVT_PAINT, &AMSExtText::paintEvent, this); + SetSize(AMS_REFRESH_SIZE); + SetMinSize(AMS_REFRESH_SIZE); +} + +AMSExtText::~AMSExtText() {} + +void AMSExtText::msw_rescale() +{ + Refresh(); +} + +void AMSExtText::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void AMSExtText::render(wxDC& dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 }); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void AMSExtText::doRender(wxDC& dc) +{ + auto size = GetSize(); + + dc.SetPen(wxPen(AMS_CONTROL_GRAY800, 2, wxSOLID)); + auto tsize = dc.GetMultiLineTextExtent(_L("Ext")); + dc.SetFont(Label::Body_13); + dc.SetTextForeground(AMS_CONTROL_GRAY800); + wxPoint pot(FromDIP((size.x - tsize.x) / 2), FromDIP((size.y - tsize.y) / 2)); + dc.DrawText(_L("Ext"), pot); +} + + +/************************************************* +Description:AMSrefresh +**************************************************/ + +AMSrefresh::AMSrefresh() { SetFont(Label::Body_10);} + +AMSrefresh::AMSrefresh(wxWindow *parent, wxString number, Caninfo info, const wxPoint &pos, const wxSize &size) : AMSrefresh() +{ + m_info = info; + m_can_id = number.ToStdString(); + create(parent, wxID_ANY, pos, size); +} + +AMSrefresh::AMSrefresh(wxWindow *parent, int number, Caninfo info, const wxPoint &pos, const wxSize &size) : AMSrefresh() +{ + m_info = info; + m_can_id = wxString::Format("%d", number).ToStdString(); + create(parent, wxID_ANY, pos, size); +} + + AMSrefresh::~AMSrefresh() + { + if (m_playing_timer) { + m_playing_timer->Stop(); + delete m_playing_timer; + m_playing_timer = nullptr; + } + } + +void AMSrefresh::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) +{ + wxWindow::Create(parent, id, pos, size, wxBORDER_NONE); + SetBackgroundColour(wxColour(240, 240, 240)); + + Bind(wxEVT_TIMER, &AMSrefresh::on_timer, this); + Bind(wxEVT_PAINT, &AMSrefresh::paintEvent, this); + Bind(wxEVT_ENTER_WINDOW, &AMSrefresh::OnEnterWindow, this); + Bind(wxEVT_LEAVE_WINDOW, &AMSrefresh::OnLeaveWindow, this); + Bind(wxEVT_LEFT_DOWN, &AMSrefresh::OnClick, this); + + m_bitmap_normal = ScalableBitmap(this, "ams_refresh_normal", 25); + m_bitmap_selected = ScalableBitmap(this, "ams_refresh_selected", 25); + + m_bitmap_ams_rfid_0 = ScalableBitmap(this, "ams_rfid_0", 25); + m_bitmap_ams_rfid_1 = ScalableBitmap(this, "ams_rfid_1", 25); + m_bitmap_ams_rfid_2 = ScalableBitmap(this, "ams_rfid_2", 25); + m_bitmap_ams_rfid_3 = ScalableBitmap(this, "ams_rfid_3", 25); + m_bitmap_ams_rfid_4 = ScalableBitmap(this, "ams_rfid_4", 25); + m_bitmap_ams_rfid_5 = ScalableBitmap(this, "ams_rfid_5", 25); + m_bitmap_ams_rfid_6 = ScalableBitmap(this, "ams_rfid_6", 25); + m_bitmap_ams_rfid_7 = ScalableBitmap(this, "ams_rfid_7", 25); + + m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_0); + m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_1); + m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_2); + m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_3); + m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_4); + m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_5); + m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_6); + m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_7); + + m_playing_timer = new wxTimer(); + m_playing_timer->SetOwner(this); + wxPostEvent(this, wxTimerEvent()); + + SetSize(AMS_REFRESH_SIZE); + SetMinSize(AMS_REFRESH_SIZE); + SetMaxSize(AMS_REFRESH_SIZE); +} + +void AMSrefresh::on_timer(wxTimerEvent &event) +{ + //if (m_rotation_angle >= m_rfid_bitmap_list.size()) { + // m_rotation_angle = 0; + //} else { + // m_rotation_angle++; + //} + Refresh(); +} + +void AMSrefresh::PlayLoading() +{ + if (m_play_loading | m_disable_mode) return; + m_play_loading = true; + //m_rotation_angle = 0; + m_playing_timer->Start(AMS_REFRESH_PLAY_LOADING_TIMER); + Refresh(); +} + +void AMSrefresh::StopLoading() +{ + if (!m_play_loading | m_disable_mode) return; + m_playing_timer->Stop(); + m_play_loading = false; + Refresh(); +} + +void AMSrefresh::OnEnterWindow(wxMouseEvent &evt) +{ + m_selected = true; + Refresh(); +} + +void AMSrefresh::OnLeaveWindow(wxMouseEvent &evt) +{ + m_selected = false; + Refresh(); +} + +void AMSrefresh::OnClick(wxMouseEvent &evt) { + post_event(wxCommandEvent(EVT_AMS_REFRESH_RFID)); +} + +void AMSrefresh::post_event(wxCommandEvent &&event) +{ + if (m_disable_mode) + return; + event.SetString(m_info.can_id); + event.SetEventObject(m_parent); + wxPostEvent(m_parent, event); + event.Skip(); +} + +void AMSrefresh::paintEvent(wxPaintEvent &evt) +{ + wxSize size = GetSize(); + wxPaintDC dc(this); + + auto colour = StateColor::darkModeColorFor(AMS_CONTROL_GRAY700); + if (!wxWindow::IsEnabled()) { colour = AMS_CONTROL_GRAY500; } + + auto pot = wxPoint((size.x - m_bitmap_selected.GetBmpSize().x) / 2, (size.y - m_bitmap_selected.GetBmpSize().y) / 2); + + if (!m_disable_mode) { + if (!m_play_loading) { + dc.DrawBitmap(m_selected ? m_bitmap_selected.bmp() : m_bitmap_normal.bmp(), pot); + } + else { + /* m_bitmap_rotation = ScalableBitmap(this, "ams_refresh_normal", 30); + auto image = m_bitmap_rotation.bmp().ConvertToImage(); + wxPoint offset; + auto loading_img = image.Rotate(m_rotation_angle, wxPoint(image.GetWidth() / 2, image.GetHeight() / 2), true, &offset); + ScalableBitmap loading_bitmap; + loading_bitmap.bmp() = wxBitmap(loading_img); + dc.DrawBitmap(loading_bitmap.bmp(), offset.x , offset.y);*/ + m_rotation_angle++; + if (m_rotation_angle >= m_rfid_bitmap_list.size()) { + m_rotation_angle = 0; + } + if (m_rfid_bitmap_list.size() <= 0)return; + dc.DrawBitmap(m_rfid_bitmap_list[m_rotation_angle].bmp(), pot); + } + } + + dc.SetPen(wxPen(colour)); + dc.SetBrush(wxBrush(colour)); + dc.SetFont(Label::Body_11); + //dc.SetTextForeground(colour); + auto tsize = dc.GetTextExtent(m_refresh_id); + pot = wxPoint((size.x - tsize.x) / 2, (size.y - tsize.y) / 2); + dc.DrawText(m_refresh_id, pot); +} + +void AMSrefresh::Update(std::string ams_id, Caninfo info) +{ + m_ams_id = ams_id; + m_info = info; + + if (!m_ams_id.empty() && !m_can_id.empty()) { + auto aid = atoi(m_ams_id.c_str()); + auto tid = atoi(m_can_id.c_str()); + auto tray_id = aid * 4 + tid; + m_refresh_id = wxGetApp().transition_tridid(tray_id); + } + StopLoading(); +} + +void AMSrefresh::msw_rescale() { + m_bitmap_normal = ScalableBitmap(this, "ams_refresh_normal", 25); + m_bitmap_selected = ScalableBitmap(this, "ams_refresh_selected", 25); + m_bitmap_ams_rfid_0 = ScalableBitmap(this, "ams_rfid_0", 25); + m_bitmap_ams_rfid_1 = ScalableBitmap(this, "ams_rfid_1", 25); + m_bitmap_ams_rfid_2 = ScalableBitmap(this, "ams_rfid_2", 25); + m_bitmap_ams_rfid_3 = ScalableBitmap(this, "ams_rfid_3", 25); + m_bitmap_ams_rfid_4 = ScalableBitmap(this, "ams_rfid_4", 25); + m_bitmap_ams_rfid_5 = ScalableBitmap(this, "ams_rfid_5", 25); + m_bitmap_ams_rfid_6 = ScalableBitmap(this, "ams_rfid_6", 25); + m_bitmap_ams_rfid_7 = ScalableBitmap(this, "ams_rfid_7", 25); + + m_rfid_bitmap_list.clear(); + m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_0); + m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_1); + m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_2); + m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_3); + m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_4); + m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_5); + m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_6); + m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_7); +} + +void AMSrefresh::DoSetSize(int x, int y, int width, int height, int sizeFlags) +{ + wxWindow::DoSetSize(x, y, width, height, sizeFlags); +} + +/************************************************* +Description:AMSextruder +**************************************************/ +void AMSextruderImage::OnAmsLoading(bool load, wxColour col) +{ + m_ams_loading = load; + m_colour = col; + Refresh(); +} + +void AMSextruderImage::TurnOff() +{ + m_colour = AMS_EXTRUDER_DEF_COLOUR; + Refresh(); +} + +void AMSextruderImage::msw_rescale() +{ + //m_ams_extruder.SetSize(AMS_EXTRUDER_BITMAP_SIZE); + //auto image = m_ams_extruder.ConvertToImage(); + m_ams_extruder = ScalableBitmap(this, m_file_name, 13); + Refresh(); +} + +void AMSextruderImage::paintEvent(wxPaintEvent &evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void AMSextruderImage::render(wxDC &dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({0, 0}, size, &dc, {0, 0}); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void AMSextruderImage::doRender(wxDC &dc) +{ + auto size = GetSize(); + //dc.DrawRectangle(0, FromDIP(5), size.x, size.y - FromDIP(5) - FromDIP(2)); + if (m_show_state){ + if (m_ams_loading) { + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush(m_colour); + dc.DrawRectangle(FromDIP(3), FromDIP(10), FromDIP(size.x - 6), FromDIP(size.y - 20)); + } + dc.DrawBitmap(m_ams_extruder.bmp(), wxPoint((size.x - m_ams_extruder.GetBmpSize().x) / 2, (size.y - m_ams_extruder.GetBmpSize().y) / 2)); + } +} + + +AMSextruderImage::AMSextruderImage(wxWindow *parent, wxWindowID id, string file_name, const wxPoint &pos, const wxSize &size) +{ + wxWindow::Create(parent, id, pos, AMS_EXTRUDER_BITMAP_SIZE); + SetBackgroundColour(*wxWHITE); + + m_ams_extruder = ScalableBitmap(this, file_name,36); + m_file_name = file_name; + SetSize(AMS_EXTRUDER_BITMAP_SIZE); + SetMinSize(AMS_EXTRUDER_BITMAP_SIZE); + SetMaxSize(AMS_EXTRUDER_BITMAP_SIZE); + + + Bind(wxEVT_PAINT, &AMSextruderImage::paintEvent, this); +} + +AMSextruderImage::~AMSextruderImage() {} + + + + +/************************************************* +Description:AMSExtImage upon ext lib +**************************************************/ + +AMSExtImage::AMSExtImage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size) +{ + wxWindow::Create(parent, id, pos, AMS_HUMIDITY_SIZE); + SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); + + m_ams_ext = ScalableBitmap(this, "ams_ext_image", 25); + /*SetSize(wxSize(FromDIP(78), FromDIP(50))); + SetMinSize(wxSize(FromDIP(78), FromDIP(50))); + SetMaxSize(wxSize(FromDIP(78), FromDIP(50)));*/ + + Bind(wxEVT_PAINT, &AMSExtImage::paintEvent, this); +} + +AMSExtImage::~AMSExtImage() {} + +void AMSExtImage::msw_rescale() +{ + //m_ams_extruder.SetSize(AMS_EXTRUDER_BITMAP_SIZE); + //auto image = m_ams_extruder.ConvertToImage(); + m_ams_ext = ScalableBitmap(this, "ams_ext_image", 25); + Refresh(); +} + +void AMSExtImage::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void AMSExtImage::render(wxDC& dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 }); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void AMSExtImage::doRender(wxDC& dc) +{ + auto size = GetSize(); + dc.SetPen(*wxTRANSPARENT_PEN); + //dc.DrawRectangle(0, FromDIP(5), size.x, size.y - FromDIP(5) - FromDIP(2)); + dc.DrawBitmap(m_ams_ext.bmp(), wxPoint(FromDIP((size.x - m_ams_ext.GetBmpSize().x) / 2), FromDIP(0))); +} + + +//Ams Extruder +AMSextruder::AMSextruder(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) { create(parent, id, pos, size); } + + AMSextruder::~AMSextruder() {} + + void AMSextruder::TurnOn(wxColour col) + { + //m_left_extruder->TurnOn(col); + } + +void AMSextruder::TurnOff() +{ + m_left_extruder->TurnOff(); +} + +void AMSextruder::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) +{ + //wxWindow::Create(parent, id, pos, AMS_EXTRUDER_SIZE, wxBORDER_NONE); + wxWindow::Create(parent, id, pos, wxSize(FromDIP(29), FromDIP(37)), wxBORDER_NONE); + //SetBackgroundColour(AMS_CONTROL_WHITE_COLOUR); + SetBackgroundColour(*wxWHITE); + + wxBoxSizer *m_sizer_body = new wxBoxSizer(wxVERTICAL); + + m_bitmap_sizer = new wxBoxSizer(wxHORIZONTAL); + + m_left_extruder = new AMSextruderImage(this, wxID_ANY, "left_nozzle"); + m_left_extruder->update(true); + m_right_extruder = new AMSextruderImage(this, wxID_ANY, "right_nozzle"); + + m_bitmap_sizer->Add(m_left_extruder, 0, wxLEFT, 0); + m_bitmap_sizer->Add(m_right_extruder, 0, wxLEFT, 2); + SetSizer(m_bitmap_sizer); + + Bind(wxEVT_PAINT, &AMSextruder::paintEvent, this); + Layout(); +} + +void AMSextruder::OnVamsLoading(bool load, wxColour col) +{ + m_vams_loading = load; + if (load)m_current_colur = col; + Refresh(); +} + +void AMSextruder::OnAmsLoading(bool load, int nozzle_id, wxColour col /*= AMS_CONTROL_GRAY500*/) +{ + m_ams_loading = load; + if (load)m_current_colur = col; + if (nozzle_id == 0){ + m_left_extruder->OnAmsLoading(load, col); + m_right_extruder->OnAmsLoading(false, col); + } + else{ + m_right_extruder->OnAmsLoading(load, col); + m_left_extruder->OnAmsLoading(false, col); + } + Refresh(); +} + +void AMSextruder::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void AMSextruder::render(wxDC& dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 }); + + { + wxGCDC dc2(memdc); + //doRender(dc2); + } + if (m_nozzle_num >= 2) { + m_right_extruder->update(true); + } + else { + m_right_extruder->update(false); + } + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif + +} + +void AMSextruder::doRender(wxDC& dc) +{ + //m_current_colur = + wxSize size = GetSize(); + /*dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 2, wxSOLID)); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));*/ + + /*if (!m_none_ams_mode) { + dc.DrawLine(size.x / 2, -1, size.x / 2, size.y * 0.6 - 1); + }*/ + /*if (m_has_vams) { + dc.DrawRoundedRectangle(-size.x / 2, size.y * 0.1, size.x, size.y, 4); + + if (m_vams_loading) { + + if (m_current_colur.Alpha() == 0) { dc.SetPen(wxPen(*wxWHITE, 6, wxSOLID)); } + else { dc.SetPen(wxPen(m_current_colur, 6, wxSOLID)); } + dc.DrawRoundedRectangle(-size.x / 2, size.y * 0.1, size.x, size.y, 4); + + if ((m_current_colur == *wxWHITE || m_current_colur.Alpha() == 0) && !wxGetApp().dark_mode()) { + dc.SetPen(wxPen(AMS_CONTROL_DEF_BLOCK_BK_COLOUR, 1, wxSOLID)); + dc.DrawRoundedRectangle(-size.x / 2 - FromDIP(3), size.y * 0.1 + FromDIP(3), size.x, size.y, 3); + dc.DrawRoundedRectangle(-size.x / 2 + FromDIP(3), size.y * 0.1 - FromDIP(3), size.x, size.y, 5); + } + } + + if (m_ams_loading && !m_none_ams_mode) { + if (m_current_colur.Alpha() == 0) {dc.SetPen(wxPen(*wxWHITE, 6, wxSOLID));} + else {dc.SetPen(wxPen(m_current_colur, 6, wxSOLID));} + dc.DrawLine(size.x / 2, -1, size.x / 2, size.y * 0.6 - 1); + + if ((m_current_colur == *wxWHITE || m_current_colur.Alpha() == 0) && !wxGetApp().dark_mode()) { + dc.SetPen(wxPen(AMS_CONTROL_DEF_BLOCK_BK_COLOUR, 1, wxSOLID)); + dc.DrawLine(size.x / 2 - FromDIP(4), -1, size.x / 2 - FromDIP(3), size.y * 0.6 - 1); + dc.DrawLine(size.x / 2 + FromDIP(3), -1, size.x / 2 + FromDIP(3), size.y * 0.6 - 1); + } + } + } + else { + if (m_ams_loading) { + if (m_current_colur.Alpha() == 0) { dc.SetPen(wxPen(*wxWHITE, 6, wxSOLID)); } + else { dc.SetPen(wxPen(m_current_colur, 6, wxSOLID)); } + dc.DrawLine(size.x / 2, -1, size.x / 2, size.y * 0.6 - 1); + + if ((m_current_colur == *wxWHITE || m_current_colur.Alpha() == 0) && !wxGetApp().dark_mode()) { + dc.SetPen(wxPen(AMS_CONTROL_DEF_BLOCK_BK_COLOUR, 1, wxSOLID)); + dc.DrawLine(size.x / 2 - FromDIP(4), -1, size.x / 2 - FromDIP(3), size.y * 0.6 - 1); + dc.DrawLine(size.x / 2 + FromDIP(3), -1, size.x / 2 + FromDIP(3), size.y * 0.6 - 1); + } + } + }*/ + +} + +void AMSextruder::msw_rescale() +{ + //m_amsSextruder->msw_rescale(); + m_left_extruder->msw_rescale(); + m_right_extruder->msw_rescale(); + Layout(); + Update(); + Refresh(); +} + +/************************************************* +Description:AMSVirtualRoad +**************************************************/ + +AMSVirtualRoad::AMSVirtualRoad(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size) { create(parent, id, pos, size); } + +AMSVirtualRoad::~AMSVirtualRoad() {} + +void AMSVirtualRoad::OnVamsLoading(bool load, wxColour col) +{ + /*m_vams_loading = load; + if (load)m_current_color = col; + Refresh();*/ +} + +void AMSVirtualRoad::create(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size) +{ + wxWindow::Create(parent, id, pos, wxDefaultSize, wxBORDER_NONE); + SetBackgroundColour(AMS_CONTROL_WHITE_COLOUR); + Layout(); + Bind(wxEVT_PAINT, &AMSVirtualRoad::paintEvent, this); +} + +void AMSVirtualRoad::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void AMSVirtualRoad::render(wxDC& dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 }); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void AMSVirtualRoad::doRender(wxDC& dc) +{ + if (!m_has_vams) return; + + wxSize size = GetSize(); + if (m_vams_loading) { + if (m_current_color.Alpha() == 0) { dc.SetPen(wxPen(*wxWHITE, 6, wxSOLID)); } + else { dc.SetPen(wxPen(m_current_color, 6, wxSOLID)); } + } + else { + dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 2, wxSOLID)); + } + + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + dc.DrawRoundedRectangle(size.x / 2, -size.y / 1.1 + FromDIP(1), size.x, size.y, 4); + + if ((m_current_color == *wxWHITE || m_current_color.Alpha() == 0) && !wxGetApp().dark_mode()) { + dc.SetPen(wxPen(AMS_CONTROL_DEF_BLOCK_BK_COLOUR, 1, wxSOLID)); + dc.DrawRoundedRectangle(size.x / 2 - FromDIP(3), -size.y / 1.1 + FromDIP(4), size.x, size.y, 5); + dc.DrawRoundedRectangle(size.x / 2 + FromDIP(3), -size.y / 1.1 - FromDIP(2), size.x, size.y, 3); + } +} + + +void AMSVirtualRoad::msw_rescale() +{ + Layout(); + Update(); + Refresh(); +} + + +/************************************************* +Description:AMSLib +**************************************************/ +AMSLib::AMSLib(wxWindow *parent, std::string ams_idx, Caninfo info) +{ + m_border_color = (wxColour(130, 130, 128)); + m_road_def_color = AMS_CONTROL_GRAY500; + wxWindow::SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); + create(parent); + + Bind(wxEVT_PAINT, &AMSLib::paintEvent, this); + Bind(wxEVT_ENTER_WINDOW, &AMSLib::on_enter_window, this); + Bind(wxEVT_LEAVE_WINDOW, &AMSLib::on_leave_window, this); + Bind(wxEVT_LEFT_DOWN, &AMSLib::on_left_down, this); + + Update(info, ams_idx, false); +} + +AMSLib::~AMSLib() +{ +} + +void AMSLib::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) +{ + wxWindow::Create(parent, id, pos, size); + + SetSize(AMS_CAN_LIB_SIZE); + SetMinSize(AMS_CAN_LIB_SIZE); + SetMaxSize(AMS_CAN_LIB_SIZE); + + auto m_sizer_body = new wxBoxSizer(wxVERTICAL); + + wxBoxSizer *m_sizer_edit = new wxBoxSizer(wxHORIZONTAL); + + m_bitmap_editable = ScalableBitmap(this, "ams_editable", 14); + m_bitmap_editable_light = ScalableBitmap(this, "ams_editable_light", 14); + m_bitmap_readonly = ScalableBitmap(this, "ams_readonly", 14); + m_bitmap_readonly_light = ScalableBitmap(this, "ams_readonly_light", 14); + m_bitmap_transparent = ScalableBitmap(this, "transparent_ams_lib", 68); + m_bitmap_transparent_def = ScalableBitmap(this, "transparent_ams_lib", 68); + + m_bitmap_extra_tray_left = ScalableBitmap(this, "extra_ams_tray_left", 80); + m_bitmap_extra_tray_right = ScalableBitmap(this, "extra_ams_tray_right", 80); + + m_bitmap_extra_tray_left_hover = ScalableBitmap(this, "extra_ams_tray_left_hover", 80); + m_bitmap_extra_tray_right_hover = ScalableBitmap(this, "extra_ams_tray_right_hover", 80); + + m_bitmap_extra_tray_left_selected = ScalableBitmap(this, "extra_ams_tray_left_selected", 80); + m_bitmap_extra_tray_right_selected = ScalableBitmap(this, "extra_ams_tray_right_selected", 80); + + + m_sizer_body->Add(0, 0, 1, wxEXPAND, 0); + m_sizer_body->Add(m_sizer_edit, 0, wxALIGN_CENTER, 0); + m_sizer_body->Add(0, 0, 0, wxBOTTOM, GetSize().y * 0.12); + SetSizer(m_sizer_body); + Layout(); +} + +void AMSLib::on_enter_window(wxMouseEvent &evt) +{ + m_hover = true; + Refresh(); +} + +void AMSLib::on_leave_window(wxMouseEvent &evt) +{ + m_hover = false; + Refresh(); +} + +void AMSLib::on_left_down(wxMouseEvent &evt) +{ + if (m_info.material_state != AMSCanType::AMS_CAN_TYPE_EMPTY && m_info.material_state != AMSCanType::AMS_CAN_TYPE_NONE) { + auto size = GetSize(); + auto pos = evt.GetPosition(); + if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_THIRDBRAND || m_info.material_state == AMSCanType::AMS_CAN_TYPE_BRAND || + m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL) { + + auto left = FromDIP(10); + auto right = size.x - FromDIP(10); + auto top = 0; + auto bottom = 0; + + if (m_ams_model == AMSModel::GENERIC_AMS) { + top = (size.y - FromDIP(15) - m_bitmap_editable_light.GetBmpSize().y); + bottom = size.y - FromDIP(15); + } + else if (m_ams_model == AMSModel::EXTRA_AMS) { + top = (size.y - FromDIP(20) - m_bitmap_editable_light.GetBmpSize().y); + bottom = size.y - FromDIP(20); + } + + if (pos.x >= left && pos.x <= right && pos.y >= top && top <= bottom) { + if (m_selected) { + if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL) { + post_event(wxCommandEvent(EVT_VAMS_ON_FILAMENT_EDIT)); + } + else { + post_event(wxCommandEvent(EVT_AMS_ON_FILAMENT_EDIT)); + } + } else { + BOOST_LOG_TRIVIAL(trace) << "current amslib is not selected"; + } + } + } + } +} + + +void AMSLib::paintEvent(wxPaintEvent &evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void AMSLib::render(wxDC &dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({0, 0}, size, &dc, {0, 0}); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif + + // text + /*if (m_ams_model == AMSModel::GENERIC_AMS) { + render_generic_text(dc); + } + else if (m_ams_model == AMSModel::EXTRA_AMS) { + render_extra_text(dc); + }*/ + render_generic_text(dc); +} + +void AMSLib::render_extra_text(wxDC& dc) +{ + auto tmp_lib_colour = m_info.material_colour; + + change_the_opacity(tmp_lib_colour); + auto temp_text_colour = AMS_CONTROL_GRAY800; + + if (tmp_lib_colour.GetLuminance() < 0.6) { + temp_text_colour = AMS_CONTROL_WHITE_COLOUR; + } + else { + temp_text_colour = AMS_CONTROL_GRAY800; + } + + if (m_info.material_remain < 50) { + temp_text_colour = AMS_CONTROL_GRAY800; + } + + if (tmp_lib_colour.Alpha() == 0) { + temp_text_colour = AMS_CONTROL_GRAY800; + } + + dc.SetFont(::Label::Body_13); + dc.SetTextForeground(temp_text_colour); + + auto libsize = GetSize(); + if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_THIRDBRAND + || m_info.material_state == AMSCanType::AMS_CAN_TYPE_BRAND + || m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL) { + + if (m_info.material_name.empty()) { + auto tsize = dc.GetMultiLineTextExtent("?"); + auto pot = wxPoint(0, 0); + pot = wxPoint((libsize.x - tsize.x) / 2 + FromDIP(2), (libsize.y - tsize.y) / 2 - FromDIP(5)); + dc.DrawText(L("?"), pot); + } + else { + auto tsize = dc.GetMultiLineTextExtent(m_info.material_name); + std::vector split_char_arr = { " ", "-" }; + bool has_split = false; + std::string has_split_char = " "; + + for (std::string split_char : split_char_arr) { + if (m_info.material_name.find(split_char) != std::string::npos) { + has_split = true; + has_split_char = split_char; + } + } + + + if (has_split) { + dc.SetFont(::Label::Body_10); + auto line_top = m_info.material_name.substr(0, m_info.material_name.find(has_split_char)); + auto line_bottom = m_info.material_name.substr(m_info.material_name.find(has_split_char)); + + auto line_top_tsize = dc.GetMultiLineTextExtent(line_top); + auto line_bottom_tsize = dc.GetMultiLineTextExtent(line_bottom); + + auto pot_top = wxPoint((libsize.x - line_top_tsize.x) / 2 + FromDIP(3), (libsize.y - line_top_tsize.y) / 2 - line_top_tsize.y); + dc.DrawText(line_top, pot_top); + + auto pot_bottom = wxPoint((libsize.x - line_bottom_tsize.x) / 2 + FromDIP(3), (libsize.y - line_bottom_tsize.y) / 2); + dc.DrawText(line_bottom, pot_bottom); + + + } + else { + dc.SetFont(::Label::Body_10); + auto pot = wxPoint(0, 0); + if (m_obj ) { + pot = wxPoint((libsize.x - tsize.x) / 2 + FromDIP(6), (libsize.y - tsize.y) / 2 - FromDIP(5)); + } + dc.DrawText(m_info.material_name, pot); + } + } + } + + if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_EMPTY) { + auto tsize = dc.GetMultiLineTextExtent(_L("/")); + auto pot = wxPoint((libsize.x - tsize.x) / 2 + FromDIP(2), (libsize.y - tsize.y) / 2 + FromDIP(3)); + dc.DrawText(_L("/"), pot); + } +} + +void AMSLib::render_generic_text(wxDC &dc) +{ + bool show_k_value = true; + if (m_obj && (m_obj->cali_version >= 0) && (abs(m_info.k - 0) < 1e-3)) { + show_k_value = false; + } + + auto tmp_lib_colour = m_info.material_colour; + change_the_opacity(tmp_lib_colour); + + auto temp_text_colour = AMS_CONTROL_GRAY800; + + if (tmp_lib_colour.GetLuminance() < 0.6) { + temp_text_colour = AMS_CONTROL_WHITE_COLOUR; + } + else { + temp_text_colour = AMS_CONTROL_GRAY800; + } + + if (m_info.material_remain < 50) { + temp_text_colour = AMS_CONTROL_GRAY800; + } + + if (tmp_lib_colour.Alpha() == 0) { + temp_text_colour = AMS_CONTROL_GRAY800; + } + + dc.SetFont(::Label::Body_13); + dc.SetTextForeground(temp_text_colour); + auto alpha = m_info.material_colour.Alpha(); + if (alpha != 0 && alpha != 255 && alpha != 254) { + dc.SetTextForeground(*wxBLACK); + } + + auto libsize = GetSize(); + if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_THIRDBRAND + || m_info.material_state == AMSCanType::AMS_CAN_TYPE_BRAND + || m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL) { + + if (m_info.material_name.empty() /*&& m_info.material_state != AMSCanType::AMS_CAN_TYPE_VIRTUAL*/) { + auto tsize = dc.GetMultiLineTextExtent("?"); + auto pot = wxPoint(0, 0); + + if (m_obj && show_k_value) { + pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 - FromDIP(9)); + } + else { + pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 + FromDIP(3)); + } + dc.DrawText(L("?"), pot); + + } + else { + auto tsize = dc.GetMultiLineTextExtent(m_info.material_name); + std::vector split_char_arr = { " ", "-" }; + bool has_split = false; + std::string has_split_char = " "; + + for (std::string split_char : split_char_arr) { + if (m_info.material_name.find(split_char) != std::string::npos) { + has_split = true; + has_split_char = split_char; + } + } + + + if (has_split) { + dc.SetFont(::Label::Body_12); + + auto line_top = m_info.material_name.substr(0, m_info.material_name.find(has_split_char)); + auto line_bottom = m_info.material_name.substr(m_info.material_name.find(has_split_char)); + + auto line_top_tsize = dc.GetMultiLineTextExtent(line_top); + auto line_bottom_tsize = dc.GetMultiLineTextExtent(line_bottom); + + if (!m_show_kn) { + auto pot_top = wxPoint((libsize.x - line_top_tsize.x) / 2, (libsize.y - line_top_tsize.y) / 2 - line_top_tsize.y + FromDIP(6)); + dc.DrawText(line_top, pot_top); + + + auto pot_bottom = wxPoint((libsize.x - line_bottom_tsize.x) / 2, (libsize.y - line_bottom_tsize.y) / 2 + FromDIP(4)); + dc.DrawText(line_bottom, pot_bottom); + } + else { + auto pot_top = wxPoint((libsize.x - line_top_tsize.x) / 2, (libsize.y - line_top_tsize.y) / 2 - line_top_tsize.y - FromDIP(6)); + dc.DrawText(line_top, pot_top); + + auto pot_bottom = wxPoint((libsize.x - line_bottom_tsize.x) / 2, (libsize.y - line_bottom_tsize.y) / 2 - FromDIP(8)); + dc.DrawText(line_bottom, pot_bottom); + } + + + } + else { + auto pot = wxPoint(0, 0); + if (m_obj && show_k_value) { + pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 - FromDIP(9)); + } else { + pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 + FromDIP(3)); + } + dc.DrawText(m_info.material_name, pot); + } + } + + //draw k&n + if (m_obj && show_k_value) { + if (m_show_kn) { + wxString str_k = wxString::Format("K %1.3f", m_info.k); + wxString str_n = wxString::Format("N %1.3f", m_info.n); + dc.SetFont(::Label::Body_11); + auto tsize = dc.GetMultiLineTextExtent(str_k); + auto pot_k = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 - FromDIP(9) + tsize.y); + dc.DrawText(str_k, pot_k); + } + } + } + + if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_EMPTY) { + auto tsize = dc.GetMultiLineTextExtent(_L("Empty")); + auto pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 + FromDIP(3)); + dc.DrawText(_L("Empty"), pot); + } +} + +void AMSLib::doRender(wxDC &dc) +{ + /*if (m_ams_model == AMSModel::GENERIC_AMS) { + render_generic_lib(dc); + } + else if (m_ams_model == AMSModel::EXTRA_AMS) { + render_extra_lib(dc); + }*/ + render_generic_lib(dc); +} + +void AMSLib::render_extra_lib(wxDC& dc) +{ + wxSize size = GetSize(); + + ScalableBitmap tray_bitmap = m_can_index <= 1 ? m_bitmap_extra_tray_left : m_bitmap_extra_tray_right; + ScalableBitmap tray_bitmap_hover = m_can_index <= 1 ? m_bitmap_extra_tray_left_hover : m_bitmap_extra_tray_right_hover; + ScalableBitmap tray_bitmap_selected = m_can_index <= 1 ? m_bitmap_extra_tray_left_selected : m_bitmap_extra_tray_right_selected; + + + auto tmp_lib_colour = m_info.material_colour; + change_the_opacity(tmp_lib_colour); + + auto temp_bitmap_third = m_bitmap_editable_light; + auto temp_bitmap_brand = m_bitmap_readonly_light; + + //draw road + + + dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 2, wxSOLID)); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + + if (m_pass_road) { + dc.SetPen(wxPen(m_info.material_colour, 6, wxSOLID)); + } + + if (m_can_index == 0 || m_can_index == 3) { + dc.DrawLine(size.x / 2, size.y / 2, size.x / 2, size.y); + } + else { + dc.DrawLine(size.x / 2, size.y / 2, size.x / 2, 0); + } + + + //draw def background + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(AMS_CONTROL_DEF_LIB_BK_COLOUR)); + dc.DrawRoundedRectangle(FromDIP(10), FromDIP(10), size.x - FromDIP(20), size.y - FromDIP(20), 0); + + if (tmp_lib_colour.GetLuminance() < 0.6) { + temp_bitmap_third = m_bitmap_editable_light; + temp_bitmap_brand = m_bitmap_readonly_light; + } + else { + temp_bitmap_third = m_bitmap_editable; + temp_bitmap_brand = m_bitmap_readonly; + } + + if (m_info.material_remain < 50) { + temp_bitmap_third = m_bitmap_editable; + temp_bitmap_brand = m_bitmap_readonly; + } + + if (tmp_lib_colour.Alpha() == 0) { + temp_bitmap_third = m_bitmap_editable; + temp_bitmap_brand = m_bitmap_readonly; + } + + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + if (m_info.material_cols.size() > 1) { + int left = FromDIP(10); + int gwidth = std::round(size.x / (m_info.material_cols.size() - 1)); + //gradient + if (m_info.ctype == 0) { + for (int i = 0; i < m_info.material_cols.size() - 1; i++) { + auto rect = wxRect(left, FromDIP(10), size.x - FromDIP(20), size.y - FromDIP(20)); + dc.GradientFillLinear(rect, m_info.material_cols[i], m_info.material_cols[i + 1], wxEAST); + left += gwidth; + } + } + else { + int cols_size = m_info.material_cols.size(); + for (int i = 0; i < cols_size; i++) { + dc.SetBrush(wxBrush(m_info.material_cols[i])); + float x = FromDIP(10) + ((float)size.x - FromDIP(20)) * i / cols_size; + dc.DrawRoundedRectangle(x, FromDIP(10), ((float)size.x - FromDIP(20)) / cols_size, size.y - FromDIP(20), 0); + } + dc.SetBrush(wxBrush(tmp_lib_colour)); + } + } + else { + dc.SetBrush(wxBrush(tmp_lib_colour)); + dc.DrawRoundedRectangle(FromDIP(10), FromDIP(10), size.x - FromDIP(20), size.y - FromDIP(20), 0); + } + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(tmp_lib_colour)); + if (!m_disable_mode) { + // edit icon + if (m_info.material_state != AMSCanType::AMS_CAN_TYPE_EMPTY && m_info.material_state != AMSCanType::AMS_CAN_TYPE_NONE) + { + if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_THIRDBRAND || m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL) + dc.DrawBitmap(temp_bitmap_third.bmp(), (size.x - temp_bitmap_third.GetBmpSize().x) / 2 + FromDIP(2), (size.y - FromDIP(18) - temp_bitmap_third.GetBmpSize().y)); + if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_BRAND) + dc.DrawBitmap(temp_bitmap_brand.bmp(), (size.x - temp_bitmap_brand.GetBmpSize().x) / 2 + FromDIP(2), (size.y - FromDIP(18) - temp_bitmap_brand.GetBmpSize().y)); + } + } + + // selected & hover + if (m_selected) { + dc.DrawBitmap(tray_bitmap_selected.bmp(), (size.x - tray_bitmap_selected.GetBmpSize().x) / 2, (size.y - tray_bitmap_selected.GetBmpSize().y) / 2); + } + else if (!m_selected && m_hover) { + dc.DrawBitmap(tray_bitmap_hover.bmp(), (size.x - tray_bitmap_hover.GetBmpSize().x) / 2, (size.y - tray_bitmap_hover.GetBmpSize().y) / 2); + } + else { + dc.DrawBitmap(tray_bitmap.bmp(), (size.x - tray_bitmap.GetBmpSize().x) / 2, (size.y - tray_bitmap.GetBmpSize().y) / 2); + } +} + + +void AMSLib::render_generic_lib(wxDC &dc) +{ + wxSize size = GetSize(); + auto tmp_lib_colour = m_info.material_colour; + change_the_opacity(tmp_lib_colour); + + auto temp_bitmap_third = m_bitmap_editable_light; + auto temp_bitmap_brand = m_bitmap_readonly_light; + + //draw def background + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(AMS_CONTROL_DEF_LIB_BK_COLOUR)); + //dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4), size.x - FromDIP(8), size.y - FromDIP(8), m_radius); + //dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4), size.x - FromDIP(8), size.y - FromDIP(m_radius - 2), m_radius); + dc.DrawRoundedRectangle(FromDIP(2), FromDIP(2), FromDIP(size.x - 4), FromDIP(size.y - 3), m_radius); + + if (tmp_lib_colour.GetLuminance() < 0.6) { + temp_bitmap_third = m_bitmap_editable_light; + temp_bitmap_brand = m_bitmap_readonly_light; + } + else { + temp_bitmap_third = m_bitmap_editable; + temp_bitmap_brand = m_bitmap_readonly; + } + + if (m_info.material_remain < 50) { + temp_bitmap_third = m_bitmap_editable; + temp_bitmap_brand = m_bitmap_readonly; + } + + if (tmp_lib_colour.Alpha() == 0) { + temp_bitmap_third = m_bitmap_editable; + temp_bitmap_brand = m_bitmap_readonly; + } + + // selected + if (m_selected) { + dc.SetPen(wxPen(tmp_lib_colour, 2, wxSOLID)); + if (tmp_lib_colour.Alpha() == 0) { + dc.SetPen(wxPen(wxColour(tmp_lib_colour.Red(), tmp_lib_colour.Green(), tmp_lib_colour.Blue(), 128), 2, wxSOLID)); + } + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + if (m_radius == 0) { + dc.DrawRectangle(0, 0, size.x, size.y); + } + else { + dc.DrawRoundedRectangle(0, 0, size.x, size.y, m_radius); + } + + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(tmp_lib_colour)); + } + + if (!m_selected && m_hover) { + dc.SetPen(wxPen(AMS_CONTROL_BRAND_COLOUR, 2, wxSOLID)); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + if (m_radius == 0) { + dc.DrawRectangle(0, 0, size.x, size.y); + } + else { + dc.DrawRoundedRectangle(0, 0, size.x, size.y, m_radius); + } + + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(tmp_lib_colour)); + } + else { + dc.SetPen(wxPen(tmp_lib_colour, 1, wxSOLID)); + dc.SetBrush(wxBrush(tmp_lib_colour)); + } + + + //draw remain + auto alpha = m_info.material_colour.Alpha(); + int height = size.y; + int curr_height = height * float(m_info.material_remain * 1.0 / 100.0); + dc.SetFont(::Label::Body_13); + + int top = height - curr_height; + + if (m_ams_model == NO_AMS){ + dc.SetPen(wxPen(wxTRANSPARENT)); + dc.SetBrush(wxBrush(m_info.material_colour)); + dc.DrawRectangle(FromDIP(2), FromDIP(2), FromDIP(size.x - 4), FromDIP(size.y - 2)); + + if (!m_disable_mode) { + // edit icon + if (m_info.material_state != AMSCanType::AMS_CAN_TYPE_EMPTY && m_info.material_state != AMSCanType::AMS_CAN_TYPE_NONE) + { + if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_THIRDBRAND || m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL) + dc.DrawBitmap(temp_bitmap_third.bmp(), (size.x - temp_bitmap_third.GetBmpSize().x) / 2, (size.y - FromDIP(10) - temp_bitmap_third.GetBmpSize().y)); + if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_BRAND) + dc.DrawBitmap(temp_bitmap_brand.bmp(), (size.x - temp_bitmap_brand.GetBmpSize().x) / 2, (size.y - FromDIP(10) - temp_bitmap_brand.GetBmpSize().y)); + } + } + } + + if (curr_height >= FromDIP(6)) { + + //transparent + if (alpha == 0) { + dc.DrawBitmap(m_bitmap_transparent_def.bmp(), FromDIP(4), FromDIP(4)); + } + else if (alpha != 255 && alpha != 254) { + if (transparent_changed) { + std::string rgb = (tmp_lib_colour.GetAsString(wxC2S_HTML_SYNTAX)).ToStdString(); + if (rgb.size() == 9) { + //delete alpha value + rgb = rgb.substr(0, rgb.size() - 2); + } + float alpha_f = 0.7 * tmp_lib_colour.Alpha() / 255.0; + std::vector replace; + replace.push_back(rgb); + std::string fill_replace = "fill-opacity=\"" + std::to_string(alpha_f); + replace.push_back(fill_replace); + m_bitmap_transparent = ScalableBitmap(this, "transparent_ams_lib", 68, false, false, true, replace); + transparent_changed = false; + + } + dc.DrawBitmap(m_bitmap_transparent.bmp(), FromDIP(4), FromDIP(4)); + } + //gradient + if (m_info.material_cols.size() > 1) { + int left = 2; + float total_width = size.x - 4; + int gwidth = std::round(total_width / (m_info.material_cols.size() - 1)); + //gradient + if (m_info.ctype == 0) { + for (int i = 0; i < m_info.material_cols.size() - 1; i++) { + + if ((left + gwidth) > (size.x)) { + gwidth = (size.x) - left; + } + + auto rect = wxRect(left, height - curr_height, gwidth, curr_height); + dc.GradientFillLinear(rect, m_info.material_cols[i], m_info.material_cols[i + 1], wxEAST); + left += gwidth; + } + } + else { + //multicolour + gwidth = std::round(total_width / m_info.material_cols.size()); + for (int i = 0; i < m_info.material_cols.size(); i++) { + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(m_info.material_cols[i])); + if (i == 0 || i == m_info.material_cols.size() - 1) { +#ifdef __APPLE__ + dc.DrawRoundedRectangle(left + gwidth * i, height - curr_height, gwidth, curr_height, m_radius); +#else + dc.DrawRoundedRectangle(left + gwidth * i, height - curr_height, gwidth, curr_height, m_radius - 1); +#endif + //add rectangle + int dr_gwidth = std::round(gwidth * 0.6); + if (i == 0) { + dc.DrawRectangle(left + gwidth - dr_gwidth, height - curr_height, dr_gwidth, curr_height); + } + else { + dc.DrawRectangle(left + gwidth*i, height - curr_height, dr_gwidth, curr_height); + } + } + else { + dc.DrawRectangle(left + gwidth * i, height - curr_height, gwidth, curr_height); + } + } + //reset pen and brush + if (m_selected || m_hover) { + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(tmp_lib_colour)); + } + else { + dc.SetPen(wxPen(tmp_lib_colour, 1, wxSOLID)); + dc.SetBrush(wxBrush(tmp_lib_colour)); + } + } + } + else { + auto brush = dc.GetBrush(); + if (alpha != 0 && alpha != 255 && alpha != 254) dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); +#ifdef __APPLE__ + dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4) + top, size.x - FromDIP(8), curr_height, m_radius); +#else + dc.DrawRoundedRectangle(FromDIP(2), top, FromDIP(size.x - 4), curr_height, m_radius - 1); +#endif + dc.SetBrush(brush); + } + } + + if (top > 2) { + if (curr_height >= FromDIP(6)) { + dc.DrawRectangle(FromDIP(2), top, FromDIP(size.x - 4), FromDIP(2)); + if (alpha != 255 && alpha != 254) { + dc.SetPen(wxPen(*wxWHITE)); + dc.SetBrush(wxBrush(*wxWHITE)); +#ifdef __APPLE__ + dc.DrawRoundedRectangle(FromDIP(2), FromDIP(1) , size.x - FromDIP(4), top, m_radius); +#else + dc.DrawRoundedRectangle(FromDIP(2), FromDIP(1) , FromDIP(size.x - 4), top, m_radius - 1); +#endif + } + if (tmp_lib_colour.Red() > 238 && tmp_lib_colour.Green() > 238 && tmp_lib_colour.Blue() > 238) { + dc.SetPen(wxPen(wxColour(130, 129, 128), 1, wxSOLID)); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + dc.DrawLine(FromDIP(2), top, FromDIP(size.x - 4), top); + } + } + else { + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + if (tmp_lib_colour.Red() > 238 && tmp_lib_colour.Green() > 238 && tmp_lib_colour.Blue() > 238) { + dc.SetPen(wxPen(wxColour(130, 129, 128), 2, wxSOLID)); + } + else { + dc.SetPen(wxPen(tmp_lib_colour, 2, wxSOLID)); + } + +#ifdef __APPLE__ + dc.DrawLine(FromDIP(5), FromDIP(4) + height - FromDIP(2), size.x - FromDIP(5), FromDIP(4) + height - FromDIP(2)); + dc.DrawLine(FromDIP(6), FromDIP(4) + height - FromDIP(1), size.x - FromDIP(6), FromDIP(4) + height - FromDIP(1)); +#else + dc.DrawLine(FromDIP(2), FromDIP(0 + height), FromDIP(size.x - 4), FromDIP(height)); + dc.DrawLine(FromDIP(2), height, FromDIP(size.x - 4), height); +#endif + } + } + + //border + dc.SetPen(wxPen(wxColour(130, 130, 128), 1, wxSOLID)); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); +#ifdef __APPLE__ + //dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4), size.x - FromDIP(7), size.y - FromDIP(7), m_radius); + dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4), size.x - FromDIP(7), size.y - FromDIP(m_radius - 1), m_radius); +#else + //dc.DrawRoundedRectangle(FromDIP(3), FromDIP(3), size.x - FromDIP(6), size.y - FromDIP(6), m_radius); + dc.DrawRoundedRectangle(FromDIP(1), FromDIP(1), FromDIP(size.x - 2), FromDIP(size.y - 1), m_radius); +#endif + + if (m_selected) { + dc.SetPen(wxPen(tmp_lib_colour, 2, wxSOLID)); + if (tmp_lib_colour.Alpha() == 0) { + dc.SetPen(wxPen(wxColour(tmp_lib_colour.Red(), tmp_lib_colour.Green(), tmp_lib_colour.Blue(), 128), 2, wxSOLID)); + } + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + if (m_radius == 0) { + dc.DrawRectangle(0, 0, size.x, size.y); + } + else { + dc.DrawRoundedRectangle(0, 0, size.x, size.y, m_radius); + } + + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(tmp_lib_colour)); + } + + if (!m_selected && m_hover) { + dc.SetPen(wxPen(AMS_CONTROL_BRAND_COLOUR, 2, wxSOLID)); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + if (m_radius == 0) { + dc.DrawRectangle(0, 0, size.x, size.y); + } + else { + dc.DrawRoundedRectangle(0, 0, size.x, size.y, m_radius); + } + + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(tmp_lib_colour)); + } + + if (!m_disable_mode) { + // edit icon + if (m_info.material_state != AMSCanType::AMS_CAN_TYPE_EMPTY && m_info.material_state != AMSCanType::AMS_CAN_TYPE_NONE) + { + if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_THIRDBRAND || m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL) + dc.DrawBitmap(temp_bitmap_third.bmp(), (size.x - temp_bitmap_third.GetBmpSize().x) / 2, (size.y - FromDIP(10) - temp_bitmap_third.GetBmpSize().y)); + if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_BRAND) + dc.DrawBitmap(temp_bitmap_brand.bmp(), (size.x - temp_bitmap_brand.GetBmpSize().x) / 2, (size.y - FromDIP(10) - temp_bitmap_brand.GetBmpSize().y)); + } + } +} + +void AMSLib::on_pass_road(bool pass) +{ + if (m_pass_road != pass) { + m_pass_road = pass; + Refresh(); + } +} + +void AMSLib::Update(Caninfo info, std::string ams_idx, bool refresh) +{ + DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) return; + if (dev->get_selected_machine() && dev->get_selected_machine() != m_obj) { + m_obj = dev->get_selected_machine(); + } + if (info.material_colour.Alpha() != 0 && info.material_colour.Alpha() != 255 && info.material_colour.Alpha() != 254 && m_info.material_colour != info.material_colour) { + transparent_changed = true; + } + m_info = info; + m_ams_id = ams_idx; + Layout(); + if (refresh) Refresh(); +} + +wxColour AMSLib::GetLibColour() { return m_info.material_colour; } + +void AMSLib::OnSelected() +{ + if (!wxWindow::IsEnabled()) return; + if (m_unable_selected) return; + + post_event(wxCommandEvent(EVT_AMS_ON_SELECTED)); + m_selected = true; + Refresh(); +} + +void AMSLib::post_event(wxCommandEvent &&event) +{ + int tray_id = atoi(m_ams_id.c_str()) * 4 + atoi(m_info.can_id.c_str()); + //event.SetString(m_info.can_id); + event.SetInt(tray_id); + event.SetEventObject(m_parent); + wxPostEvent(m_parent, event); + event.Skip(); +} + +void AMSLib::UnSelected() +{ + m_selected = false; + Refresh(); +} + +bool AMSLib::Enable(bool enable) { return wxWindow::Enable(enable); } + +void AMSLib::msw_rescale() +{ + //m_bitmap_transparent.msw_rescale(); + m_bitmap_transparent_def.msw_rescale(); + +} + +/************************************************* +Description:AMSRoad +**************************************************/ +AMSRoad::AMSRoad() : m_road_def_color(AMS_CONTROL_GRAY500), m_road_color(AMS_CONTROL_GRAY500) {} +AMSRoad::AMSRoad(wxWindow *parent, wxWindowID id, Caninfo info, int canindex, int maxcan, const wxPoint &pos, const wxSize &size) + : AMSRoad() +{ + m_info = info; + m_canindex = canindex; + // road type + auto mode = AMSRoadMode::AMS_ROAD_MODE_END; + if (m_canindex == 0 && maxcan == 1) { + m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_NONE; + } else if (m_canindex == 0 && maxcan > 1) { + m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_END; + } else if (m_canindex < (maxcan - 1)) { + m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_LEFT_RIGHT; + } else if (m_canindex == (maxcan - 1)) { + m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_LEFT; + } else if (m_canindex == -1 && maxcan == -1) { + m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_VIRTUAL_TRAY; + } + else { + m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_NONE_ANY_ROAD; + } + + for (int i = 1; i <= 5; i++) { + ams_humidity_img.push_back(ScalableBitmap(this, "hum_level" + std::to_string(i) + "_light", 32)); + } + + for (int i = 1; i <= 5; i++) { + ams_humidity_img.push_back(ScalableBitmap(this, "hum_level" + std::to_string(i) + "_dark", 32)); + } + if (m_rode_mode != AMSRoadMode::AMS_ROAD_MODE_VIRTUAL_TRAY) { + create(parent, id, pos, size); + } + else { + wxSize virtual_size(size.x - 1, size.y + 2); + create(parent, id, pos, virtual_size); + + } + + Bind(wxEVT_PAINT, &AMSRoad::paintEvent, this); + wxWindow::SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); + + Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) { + if (m_canindex == 3 && m_show_humidity) { + auto mouse_pos = ClientToScreen(e.GetPosition()); + auto rect = ClientToScreen(wxPoint(0, 0)); + + if (mouse_pos.x > rect.x + GetSize().x - FromDIP(40) && + mouse_pos.y > rect.y + GetSize().y - FromDIP(40)) { + wxCommandEvent show_event(EVT_AMS_SHOW_HUMIDITY_TIPS); + wxPostEvent(GetParent()->GetParent(), show_event); + +#ifdef __WXMSW__ + wxCommandEvent close_event(EVT_CLEAR_SPEED_CONTROL); + wxPostEvent(GetParent()->GetParent(), close_event); +#endif // __WXMSW__ + + } + } + }); +} + +void AMSRoad::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) { wxWindow::Create(parent, id, pos, size); } + +void AMSRoad::Update(AMSinfo amsinfo, Caninfo info, int canindex, int maxcan) +{ + m_amsinfo = amsinfo; + m_info = info; + m_canindex = canindex; + if (m_canindex == 0 && maxcan == 1) { + m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_END_ONLY; + } else if (m_canindex == 0 && maxcan > 1) { + m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_END; + } else if (m_canindex < (maxcan - 1)) { + m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_LEFT_RIGHT; + } else if (m_canindex == (maxcan - 1)) { + m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_LEFT; + } + m_pass_rode_mode.push_back(AMSPassRoadMode::AMS_ROAD_MODE_NONE); + Refresh(); +} + +void AMSRoad::OnVamsLoading(bool load, wxColour col /*= AMS_CONTROL_GRAY500*/) +{ + /*m_vams_loading = load; + if(load)m_road_color = col; + Refresh();*/ +} + +void AMSRoad::SetPassRoadColour(wxColour col) { m_road_color = col; } + +void AMSRoad::SetMode(AMSRoadMode mode) +{ + m_rode_mode = mode; + Refresh(); +} + +void AMSRoad::paintEvent(wxPaintEvent &evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void AMSRoad::render(wxDC &dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({0, 0}, size, &dc, {0, 0}); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void AMSRoad::doRender(wxDC &dc) +{ + wxSize size = GetSize(); + + dc.SetPen(wxPen(m_road_def_color, 2, wxSOLID)); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + // left mode + if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_LEFT) { dc.DrawRoundedRectangle(-10, -10, size.x / 2 + 10, size.y * 0.6 + 10, 4); } + + // left right mode + if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_LEFT_RIGHT) { + dc.DrawLine(size.x / 2, -1, size.x / 2, size.y * 0.6 - 1); + dc.DrawLine(0, size.y * 0.6 - 1, size.x, size.y * 0.6 - 1); + } + + // end mode + if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_END) { + dc.SetBrush(wxBrush(m_road_def_color)); + dc.DrawLine(size.x / 2, -1, size.x / 2, size.y * 0.6 - 1); + dc.DrawLine(size.x / 2, size.y * 0.6, size.x / 2, size.y); + dc.DrawLine(size.x / 2, size.y * 0.6 - 1, size.x, size.y * 0.6 - 1); + } + + // end mode only + if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_END_ONLY) { + dc.SetBrush(wxBrush(m_road_def_color)); + dc.DrawLine(size.x / 2, -1, size.x / 2, size.y * 0.6 - 1); + dc.DrawLine(size.x / 2, size.y * 0.6, size.x / 2, size.y); + } + + // end none + if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_NONE) { + dc.SetBrush(wxBrush(m_road_def_color)); + dc.DrawLine(size.x / 2, -1, size.x / 2, size.y * 0.6 - 1); + dc.DrawLine(size.x / 2, size.y * 0.6, size.x / 2, size.y); + // dc.DrawLine(size.x / 2, size.y * 0.6 - 1, size.x, size.y * 0.6 - 1); + } + + //virtual road + if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_VIRTUAL_TRAY) { + dc.SetBrush(wxBrush(m_road_def_color)); + dc.DrawLine(size.x / 2, -1, size.x / 2, size.y - 1); + } + + // mode none + // if (m_pass_rode_mode.size() == 1 && m_pass_rode_mode[0] == AMSPassRoadMode::AMS_ROAD_MODE_NONE) return; + + if (m_road_color.Alpha() == 0) {dc.SetPen(wxPen(*wxWHITE, m_passroad_width, wxSOLID));} + else {dc.SetPen(wxPen(m_road_color, m_passroad_width, wxSOLID));} + + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + + // left pass mode + for (auto pass_mode : m_pass_rode_mode) { + switch (pass_mode) { + case AMSPassRoadMode::AMS_ROAD_MODE_LEFT: dc.DrawRoundedRectangle(-10, -10, size.x / 2 + 10, size.y * 0.6 + 10, 4); break; + + case AMSPassRoadMode::AMS_ROAD_MODE_LEFT_RIGHT: dc.DrawLine(0, size.y * 0.6 - 1, size.x, size.y * 0.6 - 1); break; + + case AMSPassRoadMode::AMS_ROAD_MODE_END_TOP: dc.DrawLine(size.x / 2, -1, size.x / 2, size.y * 0.6 - 1); break; + + case AMSPassRoadMode::AMS_ROAD_MODE_END_BOTTOM: dc.DrawLine(size.x / 2, size.y * 0.6, size.x / 2, size.y); break; + + case AMSPassRoadMode::AMS_ROAD_MODE_END_RIGHT: dc.DrawLine(size.x / 2, size.y * 0.6 - 1, size.x, size.y * 0.6 - 1); break; + + default: break; + } + } + + if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_VIRTUAL_TRAY && m_vams_loading) { + dc.DrawLine(size.x / 2, -1, size.x / 2, size.y - 1); + } + + // end mode + if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_END || m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_END_ONLY) { + dc.SetPen(wxPen(m_road_def_color, 2, wxSOLID)); + dc.SetBrush(wxBrush(m_road_def_color)); + dc.DrawRoundedRectangle(size.x * 0.37 / 2, size.y * 0.6 - size.y / 6, size.x * 0.63, size.y / 3, m_radius); + } + + if (m_canindex == 3) { + + if (m_amsinfo.ams_humidity >= 1 && m_amsinfo.ams_humidity <= 5) {m_show_humidity = true;} + else {m_show_humidity = false;} + + if (m_amsinfo.ams_humidity >= 1 && m_amsinfo.ams_humidity <= 5) { + + int hum_index = m_amsinfo.ams_humidity - 1; + if (wxGetApp().dark_mode()) { + hum_index += 5; + } + + if (hum_index >= 0) { + dc.DrawBitmap(ams_humidity_img[hum_index].bmp(), wxPoint(size.x - FromDIP(33), size.y - FromDIP(33))); + } + } + else { + //to do ... + } + } +} + +void AMSRoad::UpdatePassRoad(int tag_index, AMSPassRoadType type, AMSPassRoadSTEP step) {} + +void AMSRoad::OnPassRoad(std::vector prord_list) +{ + // AMS_ROAD_MODE_NONE, AMS_ROAD_MODE_LEFT, AMS_ROAD_MODE_LEFT_RIGHT, AMS_ROAD_MODE_END_TOP, AMS_ROAD_MODE_END_BOTTOM, AMS_ROAD_MODE_END_RIGHT, + // AMS_ROAD_MODE_LEFT, AMS_ROAD_MODE_LEFT_RIGHT, AMS_ROAD_MODE_END, + + m_pass_rode_mode.clear(); + auto left_types = std::vector{AMSPassRoadMode::AMS_ROAD_MODE_NONE, AMSPassRoadMode::AMS_ROAD_MODE_LEFT}; + auto left_right_types = std::vector{AMSPassRoadMode::AMS_ROAD_MODE_NONE, AMSPassRoadMode::AMS_ROAD_MODE_LEFT, AMSPassRoadMode::AMS_ROAD_MODE_LEFT_RIGHT}; + auto end_types = std::vector{AMSPassRoadMode::AMS_ROAD_MODE_NONE, AMSPassRoadMode::AMS_ROAD_MODE_END_TOP, AMSPassRoadMode::AMS_ROAD_MODE_END_BOTTOM, + AMSPassRoadMode::AMS_ROAD_MODE_END_RIGHT}; + + // left + if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_LEFT) { + for (auto i = 0; i < prord_list.size(); i++) { + std::vector::iterator iter = std::find(left_types.begin(), left_types.end(), prord_list[i]); + if (iter != left_types.end()) m_pass_rode_mode.push_back(prord_list[i]); + + if (prord_list[i] == AMSPassRoadMode::AMS_ROAD_MODE_NONE) { + m_pass_rode_mode = std::vector{AMSPassRoadMode::AMS_ROAD_MODE_NONE}; + break; + } + } + } + + // left right + if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_LEFT_RIGHT) { + for (auto i = 0; i < prord_list.size(); i++) { + std::vector::iterator iter = std::find(left_right_types.begin(), left_right_types.end(), prord_list[i]); + if (iter != left_right_types.end()) m_pass_rode_mode.push_back(prord_list[i]); + + if (prord_list[i] == AMSPassRoadMode::AMS_ROAD_MODE_NONE) { + m_pass_rode_mode = std::vector{AMSPassRoadMode::AMS_ROAD_MODE_NONE}; + break; + } + } + } + + // left end + if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_END || m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_END_ONLY) { + for (auto i = 0; i < prord_list.size(); i++) { + std::vector::iterator iter = std::find(end_types.begin(), end_types.end(), prord_list[i]); + if (iter != end_types.end()) m_pass_rode_mode.push_back(prord_list[i]); + + if (prord_list[i] == AMSPassRoadMode::AMS_ROAD_MODE_NONE) { + m_pass_rode_mode = std::vector{AMSPassRoadMode::AMS_ROAD_MODE_NONE}; + break; + } + } + } +} + +/* + + +/************************************************* +Description:AMSRoadUpPart +**************************************************/ +AMSRoadUpPart::AMSRoadUpPart() : m_road_def_color(AMS_CONTROL_GRAY500), m_road_color(AMS_CONTROL_GRAY500) {} +AMSRoadUpPart::AMSRoadUpPart(wxWindow* parent, wxWindowID id, AMSinfo info, AMSModel model, const wxPoint& pos, const wxSize& size) + : AMSRoadUpPart() +{ + m_amsinfo = info; + // road type + auto mode = AMSRoadMode::AMS_ROAD_MODE_END; + m_ams_model = model; + + if (m_ams_model == AMSModel::GENERIC_AMS) + { + create(parent, id, pos, wxSize(FromDIP(264), FromDIP(34))); + } + else + { + create(parent, id, pos, wxSize(FromDIP(78), FromDIP(34))); + } + /*create(parent, id, pos, size); + this->SetMinSize(AMS_SINGLE_CAN_SIZE); + this->SetSize(AMS_SINGLE_CAN_SIZE);*/ + + + Bind(wxEVT_PAINT, &AMSRoadUpPart::paintEvent, this); + wxWindow::SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); + +} + +void AMSRoadUpPart::create(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size) { + wxWindow::Create(parent, id, pos, size); + SetSize(size); + SetMinSize(size); + SetMaxSize(size); + SetBackgroundColour(AMS_CONTROL_WHITE_COLOUR); + Layout(); + Fit(); + Refresh(); +} + +void AMSRoadUpPart::Update(AMSinfo amsinfo, Caninfo info) +{ + m_amsinfo = amsinfo; + m_info = info; + Refresh(); +} + +void AMSRoadUpPart::OnVamsLoading(bool load, wxColour col /*= AMS_CONTROL_GRAY500*/) +{ + /*m_vams_loading = load; + if(load)m_road_color = col; + Refresh();*/ +} + +void AMSRoadUpPart::SetPassRoadColour(wxColour col) { m_road_color = col; } + +void AMSRoadUpPart::SetMode(AMSRoadShowMode mode) +{ + m_road_mode = mode; + Refresh(); +} + +void AMSRoadUpPart::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void AMSRoadUpPart::render(wxDC& dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 }); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void AMSRoadUpPart::doRender(wxDC& dc) +{ + + wxSize size = GetSize(); + + //dc.SetPen(wxPen(m_road_def_color, 2, wxSOLID)); + dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 2, wxSOLID)); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + + if (m_ams_model == SINGLE_AMS || m_ams_model == NO_AMS){ + dc.DrawLine(FromDIP(size.x / 2), FromDIP(0), FromDIP(size.x / 2), FromDIP(size.y)); + if (m_load_step == AMSPassRoadSTEP::AMS_ROAD_STEP_2 || m_load_step == AMSPassRoadSTEP::AMS_ROAD_STEP_3){ + dc.SetPen(wxPen(m_amsinfo.cans[m_load_slot_index].material_colour, 4, wxSOLID)); + dc.DrawLine(FromDIP(size.x / 2), FromDIP(0), FromDIP(size.x / 2), FromDIP(size.y)); + } + } + else{ + int x_start = 38; + int x = x_start; + int width = 64; + for (int i = 0; i < 4; i++) + { + dc.DrawLine(FromDIP(x), FromDIP(0), FromDIP(x), FromDIP(21)); + x += width; + } + x -= width; + dc.DrawLine(FromDIP(x_start), FromDIP(21), FromDIP(x), FromDIP(21)); + dc.DrawLine(FromDIP(size.x / 2), FromDIP(21), FromDIP(size.x / 2), FromDIP(size.y)); + + dc.SetPen(wxPen(m_amsinfo.cans[m_load_slot_index].material_colour, 4, wxSOLID)); + auto temp = m_amsinfo; + if (m_load_step != AMSPassRoadSTEP::AMS_ROAD_STEP_NONE){ + if (m_amsinfo.cans.size() <= m_load_slot_index || m_load_slot_index < 0){ + BOOST_LOG_TRIVIAL(trace) << "up road render error"; + return; + } + x = x_start + m_load_slot_index * 64; + dc.DrawLine(FromDIP(x), FromDIP(0), FromDIP(x), FromDIP(21)); + if (x < size.x / 2){ + dc.DrawLine(FromDIP(x), FromDIP(21), FromDIP(size.x / 2), FromDIP(21)); + } + else { + dc.DrawLine(FromDIP(size.x / 2), FromDIP(21), FromDIP(x), FromDIP(21)); + } + if(m_load_step == AMSPassRoadSTEP::AMS_ROAD_STEP_2 || m_load_step == AMSPassRoadSTEP::AMS_ROAD_STEP_3){ + dc.DrawLine(FromDIP(size.x / 2), FromDIP(21), FromDIP(size.x / 2), FromDIP(size.y)); + } + } + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(wxColour(194, 194, 194))); + dc.DrawRectangle(FromDIP(size.x / 2 - 14), FromDIP(16), FromDIP(28), FromDIP(10)); + } + // left mode +} + +void AMSRoadUpPart::UpdatePassRoad(std::string ams_index, std::string slot_index, AMSPassRoadType type, AMSPassRoadSTEP step) { + m_load_ams_index = atoi(ams_index.c_str()); + m_load_slot_index = atoi(slot_index.c_str()); + m_load_step = step; +} + +void AMSRoadUpPart::OnPassRoad(std::vector prord_list) +{ + // AMS_ROAD_MODE_NONE, AMS_ROAD_MODE_LEFT, AMS_ROAD_MODE_LEFT_RIGHT, AMS_ROAD_MODE_END_TOP, AMS_ROAD_MODE_END_BOTTOM, AMS_ROAD_MODE_END_RIGHT, + // AMS_ROAD_MODE_LEFT, AMS_ROAD_MODE_LEFT_RIGHT, AMS_ROAD_MODE_END, + + //wait fill +} + + + +/************************************************* +Description:AMSRoadDownPart +**************************************************/ +AMSRoadDownPart::AMSRoadDownPart() : m_road_def_color(AMS_CONTROL_GRAY500), m_road_color(AMS_CONTROL_GRAY500) {} +AMSRoadDownPart::AMSRoadDownPart(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size) + : AMSRoadDownPart() +{ + /*m_info = info; + m_canindex = canindex;*/ + // road type + m_left_rode_mode = AMSRoadShowMode::AMS_ROAD_MODE_FOUR; + m_right_rode_mode = AMSRoadShowMode::AMS_ROAD_MODE_FOUR; + m_selected = false; + m_single_nozzle_no_ams = false; + + m_left_road_length = -1; + m_right_road_length = -1; + create(parent, id, pos, size); + this->SetMinSize(AMS_DOWN_ROAD_SIZE); + this->SetSize(AMS_DOWN_ROAD_SIZE); + + Bind(wxEVT_PAINT, &AMSRoadDownPart::paintEvent, this); + wxWindow::SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); + +} + +void AMSRoadDownPart::create(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size) { wxWindow::Create(parent, id, pos, size); } + +//void AMSRoadDownPart::Update(int nozzle_num, AMSRoadShowMode left_mode, AMSRoadShowMode right_mode, int left_len, int right_len) +//{ +// this->m_nozzle_num = nozzle_num; +// this->m_left_rode_mode = left_mode; +// this->m_right_rode_mode = right_mode; +// +// m_left_road_length = left_len; +// m_right_road_length = right_len; +// m_selected = false; +// +// Refresh(); +//} + + +void AMSRoadDownPart::UpdateLeft(int nozzle_num, AMSRoadShowMode mode) { + this->m_left_rode_mode = mode; + m_nozzle_num = nozzle_num; + if (m_left_rode_mode == AMSRoadShowMode::AMS_ROAD_MODE_NONE && m_left_rode_mode == AMSRoadShowMode::AMS_ROAD_MODE_NONE) + { + m_single_nozzle_no_ams = true; + } + Refresh(); +} +void AMSRoadDownPart::UpdateRight(int nozzle_num, AMSRoadShowMode mode) { + this->m_right_rode_mode = mode; + m_nozzle_num = nozzle_num; + if (m_left_rode_mode == AMSRoadShowMode::AMS_ROAD_MODE_NONE && m_left_rode_mode == AMSRoadShowMode::AMS_ROAD_MODE_NONE) + { + m_single_nozzle_no_ams = true; + } + Refresh(); +} + + +void AMSRoadDownPart::OnVamsLoading(bool load, wxColour col /*= AMS_CONTROL_GRAY500*/) +{ + /*m_vams_loading = load; + if(load)m_road_color = col; + Refresh();*/ +} + +void AMSRoadDownPart::SetPassRoadColour(wxColour col) { m_road_color = col; } + +//void AMSRoadDownPart::SetMode(AMSRoadDownPartMode mode) { +// +//} +void AMSRoadDownPart::SetShowMode(AMSRoadShowMode left_mode, AMSRoadShowMode right_mode) { + m_left_rode_mode = left_mode; + m_right_rode_mode = right_mode; +} + +void AMSRoadDownPart::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void AMSRoadDownPart::render(wxDC& dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 }); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void AMSRoadDownPart::doRender(wxDC& dc) +{ + wxSize size = GetSize(); + wxPoint left_nozzle_pos = wxPoint(FromDIP(size.x / 2 - 7), FromDIP(258)); + wxPoint right_nozzle_pos = wxPoint(FromDIP(size.x / 2 + 7), FromDIP(258)); + if (m_road_color.Alpha() == 0) { dc.SetPen(wxPen(*wxWHITE, m_passroad_width, wxSOLID)); } + else { dc.SetPen(wxPen(m_road_color, m_passroad_width, wxSOLID)); } + dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 2, wxSOLID)); + + if (m_left_rode_mode == AMSRoadShowMode::AMS_ROAD_MODE_NONE || m_right_rode_mode == AMSRoadShowMode::AMS_ROAD_MODE_NONE) + { + dc.DrawLine(FromDIP(left_nozzle_pos.x - 56), FromDIP(size.y / 2), FromDIP(left_nozzle_pos.x), FromDIP(size.y / 2)); + dc.DrawLine(FromDIP(left_nozzle_pos.x - 56), FromDIP(0), FromDIP(left_nozzle_pos.x - 56), FromDIP(size.y / 2)); + } + else{ + switch (m_left_rode_mode) + { + case AMSRoadShowMode::AMS_ROAD_MODE_FOUR: + dc.DrawLine(FromDIP(left_nozzle_pos.x - 135), FromDIP(size.y / 2), FromDIP(left_nozzle_pos.x), FromDIP(size.y / 2)); + dc.DrawLine(FromDIP(left_nozzle_pos.x - 135), 0, FromDIP(left_nozzle_pos.x - 135), FromDIP(size.y / 2)); + break; + case AMSRoadShowMode::AMS_ROAD_MODE_DOUBLE: + dc.DrawLine(left_nozzle_pos.x - 233, FromDIP(size.y / 2), FromDIP(left_nozzle_pos.x), FromDIP(size.y / 2)); + dc.DrawLine(FromDIP(left_nozzle_pos.x - 115), 0, FromDIP(left_nozzle_pos.x - 115), FromDIP(size.y / 2)); + dc.DrawLine(FromDIP(left_nozzle_pos.x - 223), 0, FromDIP(left_nozzle_pos.x - 223), FromDIP(size.y / 2)); + break; + case AMSRoadShowMode::AMS_ROAD_MODE_SINGLE: + dc.DrawLine(FromDIP(left_nozzle_pos.x - 198), FromDIP(size.y / 2), FromDIP(left_nozzle_pos.x), FromDIP(size.y / 2)); + dc.DrawLine(FromDIP(left_nozzle_pos.x - 198), 0, FromDIP(left_nozzle_pos.x - 198), FromDIP(size.y / 2)); + break; + default: + break; + } + + switch (m_right_rode_mode) + { + case AMSRoadShowMode::AMS_ROAD_MODE_FOUR: + dc.DrawLine(right_nozzle_pos.x, FromDIP(size.y / 2), FromDIP(right_nozzle_pos.x + 135), FromDIP(size.y / 2)); + dc.DrawLine(FromDIP(right_nozzle_pos.x + 135), 0, FromDIP(right_nozzle_pos.x + 135), FromDIP(size.y / 2)); + break; + case AMSRoadShowMode::AMS_ROAD_MODE_DOUBLE: + dc.DrawLine(right_nozzle_pos.x, FromDIP(size.y / 2), FromDIP(right_nozzle_pos.x + 223), FromDIP(size.y / 2)); + dc.DrawLine(FromDIP(right_nozzle_pos.x + 115), 0, FromDIP(right_nozzle_pos.x + 115), FromDIP(size.y / 2)); + dc.DrawLine(FromDIP(right_nozzle_pos.x + 223), 0, FromDIP(right_nozzle_pos.x + 223), FromDIP(size.y / 2)); + break; + case AMSRoadShowMode::AMS_ROAD_MODE_SINGLE: + dc.DrawLine(right_nozzle_pos.x, FromDIP(size.y / 2), FromDIP(right_nozzle_pos.x + 72), FromDIP(size.y / 2)); + dc.DrawLine(FromDIP(right_nozzle_pos.x + 72), 0, FromDIP(right_nozzle_pos.x + 72), FromDIP(size.y / 2)); + break; + default: + break; + } + } + + if (m_nozzle_num == 2){ + dc.DrawLine(FromDIP(left_nozzle_pos.x), FromDIP(size.y / 2), FromDIP(left_nozzle_pos.x), FromDIP(size.y)); + dc.DrawLine(FromDIP(right_nozzle_pos.x), FromDIP(size.y / 2), FromDIP(right_nozzle_pos.x), FromDIP(size.y)); + } + else{ + if (m_right_rode_mode != AMSRoadShowMode::AMS_ROAD_MODE_NONE){ + dc.DrawLine(FromDIP(left_nozzle_pos.x), FromDIP(size.y / 2), FromDIP(right_nozzle_pos.x), FromDIP(size.y / 2)); + } + dc.DrawLine(FromDIP(left_nozzle_pos.x), FromDIP(size.y / 2), FromDIP(left_nozzle_pos.x), FromDIP(size.y)); + } + + /*if (m_nozzle_mode == AMSRoadDownPartMode::AMS_ROAD_MODE_SINGLE) + { + dc.DrawLine(left_nozzle_pos.x, left_nozzle_pos.y, FromDIP(left_nozzle_pos.x + 30), left_nozzle_pos.y); + }*/ + //dc.SetBrush(wxBrush(*wxBLUE)); + if (m_pass_road_step == AMSPassRoadSTEP::AMS_ROAD_STEP_2 || m_pass_road_step == AMSPassRoadSTEP::AMS_ROAD_STEP_3){ + dc.SetPen(wxPen(m_amsinfo.cans[m_canindex].material_colour, 4, wxSOLID)); + if (m_left_road_length > 0){ + dc.DrawLine((FromDIP(left_nozzle_pos.x - m_left_road_length)), FromDIP(size.y / 2), FromDIP(left_nozzle_pos.x), FromDIP(size.y / 2)); + dc.DrawLine(FromDIP(left_nozzle_pos.x), FromDIP(size.y / 2), FromDIP(left_nozzle_pos.x), FromDIP(size.y)); + dc.DrawLine(FromDIP(left_nozzle_pos.x - m_left_road_length), FromDIP(0), FromDIP(left_nozzle_pos.x - m_left_road_length), FromDIP(size.y / 2)); + } + else if (m_right_road_length > 0){ + dc.DrawLine((FromDIP(left_nozzle_pos.x)), FromDIP(size.y / 2), FromDIP(left_nozzle_pos.x + m_right_road_length), FromDIP(size.y / 2)); + dc.DrawLine(FromDIP(left_nozzle_pos.x + m_right_road_length), FromDIP(0), FromDIP(left_nozzle_pos.x + m_right_road_length), FromDIP(size.y / 2)); + if (m_nozzle_num == 1){ + dc.DrawLine(FromDIP(left_nozzle_pos.x), FromDIP(size.y / 2), FromDIP(right_nozzle_pos.x), FromDIP(size.y / 2)); + dc.DrawLine(FromDIP(left_nozzle_pos.x), FromDIP(size.y / 2), FromDIP(left_nozzle_pos.x), FromDIP(size.y)); + } + else{ + dc.DrawLine(FromDIP(right_nozzle_pos.x), FromDIP(size.y / 2), FromDIP(right_nozzle_pos.x), FromDIP(size.y)); + } + } + } +} + +void AMSRoadDownPart::UpdatePassRoad(string can_id, bool left, int len, AMSinfo info, AMSPassRoadSTEP step) { + m_pass_road_step = step; + if (len == -1){ + m_left_road_length = -1; + m_right_road_length = -1; + return; + } + m_canindex = atoi(can_id.c_str()); + if (m_canindex == -1){ + return; + } + m_amsinfo = info; + m_left_road_length = left ? len : -1; + m_right_road_length = left ? -1 : len; + m_pass_road_step = step; +} + + +/************************************************* +Description:AMSPreview +**************************************************/ +AMSPreview::AMSPreview() {} + +AMSPreview::AMSPreview(wxWindow* parent, wxWindowID id, AMSinfo amsinfo, AMSModel itemType, const wxPoint& pos, const wxSize& size) : AMSPreview() +{ + if (itemType == AMSModel::GENERIC_AMS || itemType == AMSModel::EXTRA_AMS || itemType == AMSModel::N3F_AMS) { + create(parent, id, pos, AMS_ITEM_FOUR_SIZE); + } + else { + create(parent, id, pos, AMS_ITEM_SINGLE_SIZE); + } + m_amsinfo = amsinfo; + m_ams_item_type = itemType; + //create(parent, id, pos, AMS_PREVIEW_SIZE); + Bind(wxEVT_PAINT, &AMSPreview::paintEvent, this); + Bind(wxEVT_ENTER_WINDOW, &AMSPreview::OnEnterWindow, this); + Bind(wxEVT_LEAVE_WINDOW, &AMSPreview::OnLeaveWindow, this); +} + +void AMSPreview::Open() +{ + m_open = true; + Show(); +} + +void AMSPreview::Close() +{ + m_open = false; + Hide(); +} + +void AMSPreview::Update(AMSinfo amsinfo) +{ + m_amsinfo = amsinfo; +} + +void AMSPreview::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) +{ + m_ts_bitmap_cube = new ScalableBitmap(this, "ts_bitmap_cube", 14); + m_four_slot_bitmap = new ScalableBitmap(this, "four_slot_ams_item", FromDIP(26)); + m_single_slot_bitmap = new ScalableBitmap(this, "single_slot_ams_item", FromDIP(26)); + m_ext_bitmap = new ScalableBitmap(this, "ext_ams_item", FromDIP(24)); + wxWindow::Create(parent, id, pos, size); + SetMinSize(size); + SetMaxSize(size); + SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); + Refresh(); +} + +void AMSPreview::OnEnterWindow(wxMouseEvent &evt) +{ + // m_hover = true; + // Refresh(); +} + +void AMSPreview::OnLeaveWindow(wxMouseEvent &evt) +{ + // m_hover = false; + // Refresh(); +} + +void AMSPreview::OnSelected() +{ + if (!wxWindow::IsEnabled()) { return; } + m_selected = true; + Refresh(); +} + +void AMSPreview::UnSelected() +{ + m_selected = false; + Refresh(); +} + +bool AMSPreview::Enable(bool enable) { return wxWindow::Enable(enable); } + +void AMSPreview::paintEvent(wxPaintEvent &evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void AMSPreview::render(wxDC &dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({0, 0}, size, &dc, {0, 0}); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void AMSPreview::doRender(wxDC &dc) +{ + wxSize size = GetSize(); + dc.SetPen(wxPen(StateColor::darkModeColorFor(m_background_colour))); + dc.SetBrush(wxBrush(StateColor::darkModeColorFor(m_background_colour))); + dc.DrawRoundedRectangle(0, 0, size.x, size.y, 3); + + auto left = m_padding; + auto color = *wxWHITE; + //four slot + if (m_ams_item_type != AMSModel::NO_AMS && m_ams_item_type != AMSModel::SINGLE_AMS){ + for (std::vector::iterator iter = m_amsinfo.cans.begin(); iter != m_amsinfo.cans.end(); iter++) { + + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + + if (wxWindow::IsEnabled()) { + wxColour color = iter->material_colour; + change_the_opacity(color); + dc.SetBrush(wxBrush(color)); + } + else { + dc.SetBrush(AMS_CONTROL_DISABLE_COLOUR); + } + + if (iter->material_cols.size() > 1) { + int fleft = left; + float total_width = AMS_ITEM_CUBE_SIZE.x; + int gwidth = std::round(total_width / (iter->material_cols.size() - 1)); + if (iter->ctype == 0) { + for (int i = 0; i < iter->material_cols.size() - 1; i++) { + if ((fleft + gwidth) > (AMS_ITEM_CUBE_SIZE.x)) { + gwidth = (fleft + AMS_ITEM_CUBE_SIZE.x) - fleft; + } + + auto rect = wxRect(fleft, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, gwidth, AMS_ITEM_CUBE_SIZE.y); + dc.GradientFillLinear(rect, iter->material_cols[i], iter->material_cols[i + 1], wxEAST); + fleft += gwidth; + } + } + else { + int cols_size = iter->material_cols.size(); + for (int i = 0; i < cols_size; i++) { + dc.SetBrush(wxBrush(iter->material_cols[i])); + float x = left + total_width * i / cols_size; + dc.DrawRectangle(x, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, total_width / cols_size, AMS_ITEM_CUBE_SIZE.y); + } + } + } + else { + if (iter->material_colour.Alpha() == 0) { + dc.DrawBitmap(m_ts_bitmap_cube->bmp(), left, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2); + } + else { + wxRect rect(left, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, AMS_ITEM_CUBE_SIZE.x, AMS_ITEM_CUBE_SIZE.y); + if (iter->material_state == AMSCanType::AMS_CAN_TYPE_EMPTY) { + dc.SetPen(wxPen(wxColor(0, 0, 0))); + dc.DrawRoundedRectangle(rect, 3); + dc.DrawLine(rect.GetRight() - 1, rect.GetTop() + 1, rect.GetLeft() + 1, rect.GetBottom() - 1); + } + else { + dc.DrawRoundedRectangle(rect, 2); + } + } + } + left += m_space; + } + + auto pot = wxPoint((size.x - m_four_slot_bitmap->GetBmpSize().x) / 2, (size.y - m_four_slot_bitmap->GetBmpSize().y) / 2); + dc.DrawBitmap(m_four_slot_bitmap->bmp(), pot); + } + + //single slot + else { + auto iter = m_amsinfo.cans[0]; + if (iter.material_cols.size() > 1) + { + int fleft = (size.x - AMS_ITEM_CUBE_SIZE.x) / 2; + + float total_width = AMS_ITEM_CUBE_SIZE.x; + int gwidth = std::round(total_width / (iter.material_cols.size())); + if (iter.ctype == 0) { + for (int i = 0; i < iter.material_cols.size() - 1; i++) { + + if ((fleft + gwidth) > (AMS_ITEM_CUBE_SIZE.x)) { + gwidth = (fleft + AMS_ITEM_CUBE_SIZE.x) - fleft; + } + + auto rect = wxRect(fleft, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, gwidth, AMS_ITEM_CUBE_SIZE.y); + dc.GradientFillLinear(rect, iter.material_cols[i], iter.material_cols[i + 1], wxEAST); + fleft += gwidth; + } + } + else { + int cols_size = iter.material_cols.size(); + for (int i = 0; i < cols_size; i++) { + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(iter.material_cols[i])); + float x = (size.x - AMS_ITEM_CUBE_SIZE.x) / 2 + total_width * i / cols_size; + dc.DrawRectangle(x, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, total_width / cols_size, AMS_ITEM_CUBE_SIZE.y); + } + } + } + else { + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + if (iter.material_cols.size() > 0) + { + color = iter.material_cols[0]; + dc.SetBrush(color); + } + auto rect = wxRect((size.x - AMS_ITEM_CUBE_SIZE.x) / 2, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, AMS_ITEM_CUBE_SIZE.x, AMS_ITEM_CUBE_SIZE.y); + dc.DrawRoundedRectangle(rect, 0); + } + if (m_ams_item_type == AMSModel::SINGLE_AMS) { + auto pot = wxPoint((size.x - m_single_slot_bitmap->GetBmpSize().x) / 2, (size.y - m_single_slot_bitmap->GetBmpSize().y) / 2); + dc.DrawBitmap(m_single_slot_bitmap->bmp(), pot); + } + else { + auto pot = wxPoint((size.x - m_ext_bitmap->GetBmpSize().x) / 2, (size.y - m_ext_bitmap->GetBmpSize().y) / 2); + dc.DrawBitmap(m_ext_bitmap->bmp(), pot); + + if ((color == *wxWHITE || color.Alpha() == 0) && iter.material_cols.size() <= 1) { + dc.SetPen(wxPen(AMS_CONTROL_GRAY500)); + auto rect = wxRect(FromDIP((size.x - 6) / 2 - 1), FromDIP((size.y - 12) / 2 - 1), AMS_ITEM_CUBE_SIZE.x - FromDIP(1), AMS_ITEM_CUBE_SIZE.y - FromDIP(1)); + dc.DrawRoundedRectangle(rect, 3); + } + auto tsize = dc.GetMultiLineTextExtent(_L("Ext")); + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetFont(Label::Body_8); + dc.SetTextForeground(AMS_CONTROL_BLACK_COLOUR); + pot = wxPoint((size.x - tsize.x) / 2 + FromDIP(3), (size.y + 12) / 2 - FromDIP(1)); + dc.DrawText(_L("Ext"), pot); + } + } + + auto border_colour = AMS_CONTROL_BRAND_COLOUR; + if (!wxWindow::IsEnabled()) { border_colour = AMS_CONTROL_DISABLE_COLOUR; } + + if (m_hover) { + dc.SetPen(wxPen(border_colour, 2)); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + dc.DrawRoundedRectangle(1, 1, size.x - 1, size.y - 1, 3); + + } + + if (m_selected) { + dc.SetPen(wxPen(border_colour, 2)); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + dc.DrawRoundedRectangle(1, 1, size.x-1, size.y-1, 3); + } +} + +void AMSPreview::DoSetSize(int x, int y, int width, int height, int sizeFlags /*= wxSIZE_AUTO*/) { wxWindow::DoSetSize(x, y, width, height, sizeFlags); } + + + +/************************************************* +Description:AMSHumidity +**************************************************/ + +AMSHumidity::AMSHumidity() {} +AMSHumidity::AMSHumidity(wxWindow* parent, wxWindowID id, AMSinfo info, const wxPoint& pos, const wxSize& size) + : AMSHumidity() +{ + m_amsinfo = info; + // road type + + for (int i = 1; i <= 5; i++) { + ams_humidity_img.push_back(ScalableBitmap(this, "hum_level" + std::to_string(i) + "_light", 16)); + } + + for (int i = 1; i <= 5; i++) { + ams_humidity_img.push_back(ScalableBitmap(this, "hum_level" + std::to_string(i) + "_dark", 16)); + } + ams_sun_img = ScalableBitmap(this, "ams_drying", 16); + create(parent, id, pos, AMS_HUMIDITY_SIZE); + + Bind(wxEVT_PAINT, &AMSHumidity::paintEvent, this); + wxWindow::SetBackgroundColour(AMS_CONTROL_DEF_HUMIDITY_BK_COLOUR); + + Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) { + if (m_show_humidity) { + auto mouse_pos = ClientToScreen(e.GetPosition()); + auto rect = ClientToScreen(wxPoint(0, 0)); + + if (mouse_pos.x > rect.x && + mouse_pos.y > rect.y) { + wxCommandEvent show_event(EVT_AMS_SHOW_HUMIDITY_TIPS); + wxPostEvent(GetParent()->GetParent(), show_event); + +#ifdef __WXMSW__ + wxCommandEvent close_event(EVT_CLEAR_SPEED_CONTROL); + wxPostEvent(GetParent()->GetParent(), close_event); +#endif // __WXMSW__ + + } + } + }); +} + +void AMSHumidity::create(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size) { + wxWindow::Create(parent, id, pos, size); + SetMinSize(size); + SetMaxSize(size); + SetBackgroundColour(AMS_CONTROL_WHITE_COLOUR); + Refresh(); +} + + +void AMSHumidity::Update(AMSinfo amsinfo) +{ + m_amsinfo = amsinfo; + Refresh(); +} + + +void AMSHumidity::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void AMSHumidity::render(wxDC& dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 }); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void AMSHumidity::doRender(wxDC& dc) +{ + wxSize size = GetSize(); + + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(AMS_CONTROL_DEF_BLOCK_BK_COLOUR)); + // left mode + if (m_amsinfo.ams_humidity >= 1 && m_amsinfo.ams_humidity <= 5) { m_show_humidity = true; } + else { m_show_humidity = false; } + if (m_amsinfo.ams_humidity >= 1 && m_amsinfo.ams_humidity <= 5) { + + //background + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetBrush(wxBrush(AMS_CONTROL_DEF_HUMIDITY_BK_COLOUR)); + dc.DrawRoundedRectangle(0, 0, FromDIP(size.x), FromDIP(size.y), FromDIP(size.y / 2)); + + //hum image + int hum_idx = m_amsinfo.ams_humidity - 1; + if (wxGetApp().dark_mode()) { + hum_idx += 5; + } + auto hum_img = ams_humidity_img[hum_idx]; + auto pot = wxPoint(FromDIP(size.x * 0.1), FromDIP((size.y - hum_img.GetBmpSize().y) / 2)); + dc.DrawBitmap(hum_img.bmp(), pot); + + //percentage + wxString hum_percentage = _L(std::to_string(20 * (5 - m_amsinfo.ams_humidity + 1))); + auto tsize = dc.GetMultiLineTextExtent(hum_percentage); + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.SetFont(Label::Body_14); + dc.SetTextForeground(AMS_CONTROL_BLACK_COLOUR); + pot = wxPoint(FromDIP(size.x * 0.3), FromDIP((size.y - tsize.y) / 2)); + dc.DrawText(hum_percentage, pot); + + pot.x += FromDIP(tsize.x + 5); + pot.y += FromDIP(tsize.y / 2 - 4); + tsize = dc.GetMultiLineTextExtent(_L("%")); + dc.SetFont(Label::Body_12); + dc.DrawText(_L("%"), pot); + + //vertical line + dc.SetPen(wxPen(wxColour(194, 194, 194))); + dc.SetBrush(wxBrush(wxColour(194, 194, 194))); + //dc.DrawLine(FromDIP(GetSize().x * 0.64), FromDIP(GetSize().y / 2 - 10), FromDIP(GetSize().x * 0.64), FromDIP(GetSize().y / 2 + 10)); + dc.DrawLine(FromDIP(pot.x + tsize.x + 2), FromDIP(GetSize().y / 2 - 10), FromDIP(pot.x + tsize.x + 2), FromDIP(GetSize().y / 2 + 10)); + + //sun image + /*pot.x = FromDIP(size.x * 0.69); + pot.y = FromDIP((size.y - ams_sun_img.GetBmpHeight()) / 2);*/ + pot.x = pot.x + tsize.x + 4; + pot.y = FromDIP((size.y - ams_sun_img.GetBmpHeight()) / 2); + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + dc.DrawBitmap(ams_sun_img.bmp(), pot); + + } + else { + //to do ... + } + +} + + +/************************************************* +Description:AmsItem +**************************************************/ + +AmsItem::AmsItem() {} + +AmsItem::AmsItem(wxWindow *parent,AMSinfo info, AMSModel model) : AmsItem() +{ + m_bitmap_extra_framework = ScalableBitmap(this, "ams_extra_framework_mid", 40); + + SetDoubleBuffered(true); + m_ams_model = model; + m_info = info; + + if (m_ams_model == AMSModel::GENERIC_AMS){ + wxWindow::Create(parent, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE); + } + else{ + wxWindow::Create(parent, wxID_ANY, wxDefaultPosition, AMS_SINGLE_CAN_SIZE); + } + + create(parent); + SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); + Bind(wxEVT_PAINT, &AmsItem::paintEvent, this); +} + +AmsItem::~AmsItem() +{ +} + +void AmsItem::create(wxWindow *parent) +{ + Freeze(); + //if (m_ams_model == AMSModel::GENERIC_AMS) + if (true) { + sizer_can = new wxBoxSizer(wxHORIZONTAL); + sizer_item = new wxBoxSizer(wxVERTICAL); + auto it = m_info.cans.begin(); + for (; it != m_info.cans.end(); it++) { + AddCan(*it, m_can_count, m_info.cans.size(), sizer_can); + m_can_count++; + } + it = m_info.cans.begin(); + //auto road_panel = new wxWindow(this, wxID_ANY); + //auto road_panel = new wxPanel(this, wxID_ANY); + //road_panel->SetSize(AMS_CAN_ROAD_SIZE); + //road_panel->SetMinSize(AMS_CAN_ROAD_SIZE); + if (m_ams_model == AMSModel::GENERIC_AMS || m_ams_model == AMSModel::N3F_AMS){ + m_humidity = new AMSHumidity(this, wxID_ANY, m_info); + sizer_item->Add(m_humidity, 0, wxALIGN_CENTER_HORIZONTAL, 0); + } + else{ + if (m_ams_model == NO_AMS){ + auto ams_ext_image = new AMSExtImage(this, wxID_ANY); + sizer_item->Add(ams_ext_image, 0, wxALIGN_CENTER_HORIZONTAL, 0); + } + } + m_panel_road = new AMSRoadUpPart(this, wxID_ANY, m_info, m_ams_model); + + sizer_item->Add(sizer_can, 0, wxALIGN_CENTER_HORIZONTAL, 0); + sizer_item->Add(m_panel_road, 0, wxALIGN_CENTER_HORIZONTAL, 0); + + SetSizer(sizer_item); + } + + + Layout(); + Fit(); + Thaw(); + //Refresh(); +} + +void AmsItem::AddCan(Caninfo caninfo, int canindex, int maxcan, wxBoxSizer* sizer) +{ + + auto amscan = new wxWindow(this, wxID_ANY); + + amscan->SetSize(wxSize(52, 109)); + amscan->SetMinSize(wxSize(52, 109)); + + amscan->SetBackgroundColour(wxColour(240, 240, 240)); + + wxBoxSizer* m_sizer_ams = new wxBoxSizer(wxVERTICAL); + + AMSrefresh* m_panel_refresh; + AMSExtText* m_panel_text; + if (m_ams_model != AMSModel::NO_AMS) + { + m_panel_refresh = new AMSrefresh(amscan, m_can_count, caninfo); + m_can_refresh_list[caninfo.can_id] = m_panel_refresh; + } + else if (m_ams_model == AMSModel::NO_AMS){ + m_panel_text = new AMSExtText(amscan, wxID_ANY); + } + + auto m_panel_lib = new AMSLib(amscan, m_info.ams_id, caninfo); + + m_panel_lib->Bind(wxEVT_LEFT_DOWN, [this, canindex](wxMouseEvent& ev) { + m_canlib_selection = canindex; + // m_canlib_id = caninfo.can_id; + + for (auto lib_it : m_can_lib_list) { + AMSLib* lib = lib_it.second; + if (lib->m_can_index == m_canlib_selection) { + wxCommandEvent evt(EVT_AMS_UNSELETED_VAMS); + evt.SetString(m_info.ams_id); + wxPostEvent(GetParent()->GetParent(), evt); + lib->OnSelected(); + } + else { + lib->UnSelected(); + } + } + ev.Skip(); + }); + + + m_panel_lib->m_ams_model = m_ams_model; + m_panel_lib->m_info.can_id = caninfo.can_id; + m_panel_lib->m_can_index = canindex; + + //auto m_panel_road = new AMSRoad(amscan, wxID_ANY, caninfo, canindex, maxcan, wxDefaultPosition, AMS_CAN_ROAD_SIZE); + + if (m_ams_model != AMSModel::EXTRA_AMS && m_ams_model != AMSModel::NO_AMS) { + m_sizer_ams->Add(0, 0, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_sizer_ams->Add(m_panel_refresh, 0, wxALIGN_CENTER_HORIZONTAL | wxDOWN, 4); + m_sizer_ams->Add(m_panel_lib, 0, wxALIGN_CENTER_HORIZONTAL, 0); + } + else + { + if (m_ams_model == AMSModel::NO_AMS){ + m_sizer_ams->Add(0, 0, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_sizer_ams->Add(m_panel_text, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, 4); + m_sizer_ams->Add(m_panel_lib, 0, wxALIGN_CENTER_HORIZONTAL, 0); + } + } + + + amscan->SetSizer(m_sizer_ams); + amscan->Layout(); + amscan->Fit(); + + sizer->Add(amscan, 0, wxUP | wxLEFT | wxRIGHT, 5); + /*if (m_ams_model == AMSModel::GENERIC_AMS) { + sizer->Add(amscan, 0, wxALL, 0); + } + else if (m_ams_model == AMSModel::EXTRA_AMS) + { + if (canindex > 1) { + sizer->Prepend(amscan, 0, wxALL, 0); + } + else { + sizer->Add(amscan, 0, wxALL, 0); + } + }*/ + + m_can_lib_list[caninfo.can_id] = m_panel_lib; + //m_can_road_list[caninfo.can_id] = m_panel_road; +} + +void AmsItem::Update(AMSinfo info) +{ + m_info = info; + m_can_count = info.cans.size(); + + int i = 0; + for (auto refresh_it : m_can_refresh_list) { + AMSrefresh *refresh = refresh_it.second; + if (i < m_can_count) { + refresh->Update(info.ams_id, info.cans[i]); + refresh->Show(); + } else { + refresh->Hide(); + } + i++; + } + + i = 0; + for (auto lib_it : m_can_lib_list) { + AMSLib* lib = lib_it.second; + if (i < m_can_count) { + lib->Update(info.cans[i], info.ams_id); + lib->Show(); + } + else { + lib->Hide(); + } + i++; + } + + if (true || m_ams_model == AMSModel::GENERIC_AMS) { + /*m_panel_road->Update(m_info, info.cans[0]); + m_panel_road->Show();*/ + } + Layout(); +} + +void AmsItem::SetDefSelectCan() +{ + for (auto lib_it : m_can_lib_list) { + AMSLib* lib = lib_it.second; + m_canlib_selection =lib->m_can_index; + m_canlib_id = lib->m_info.can_id; + SelectCan(m_canlib_id); + break; + } +} + + +void AmsItem::SelectCan(std::string canid) +{ + for (auto lib_it : m_can_lib_list) { + AMSLib* lib = lib_it.second; + if (lib->m_info.can_id == canid) { + m_canlib_selection = lib->m_can_index; + } + } + + m_canlib_id = canid; + + for (auto lib_it : m_can_lib_list) { + AMSLib* lib = lib_it.second; + if (lib->m_info.can_id == m_canlib_id) { + wxCommandEvent evt(EVT_AMS_UNSELETED_VAMS); + evt.SetString(m_info.ams_id); + wxPostEvent(GetParent()->GetParent(), evt); + lib->OnSelected(); + } else { + lib->UnSelected(); + } + } +} + +wxColour AmsItem::GetTagColr(wxString canid) +{ + auto tag_colour = *wxWHITE; + for (auto lib_it : m_can_lib_list) { + AMSLib* lib = lib_it.second; + if (canid == lib->m_info.can_id) tag_colour = lib->GetLibColour(); + } + return tag_colour; +} + +void AmsItem::SetAmsStepExtra(wxString canid, AMSPassRoadType type, AMSPassRoadSTEP step) +{ + if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1) { + SetAmsStep(canid.ToStdString()); + }else if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2) { + SetAmsStep(canid.ToStdString()); + }else if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3) { + SetAmsStep(canid.ToStdString()); + }else if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { + SetAmsStep(""); + } +} + +void AmsItem::SetAmsStep(std::string amsid, std::string canid, AMSPassRoadType type, AMSPassRoadSTEP step) +{ + m_panel_road->UpdatePassRoad(amsid, canid, type, step); + +} + +//void AmsItem::SetAmsStep(wxString amsid, wxString canid, AMSPassRoadType type, AMSPassRoadSTEP step) +//{ +// +// if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { +// for (auto road_it : m_can_road_list) { +// AMSRoad* road = road_it.second; +// auto pr = std::vector{}; +// pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_NONE); +// road->OnPassRoad(pr); +// } +// +// return; +// } +// +// +// auto tag_can_index = -1; +// for (auto road_it : m_can_road_list) { +// AMSRoad* road = road_it.second; +// if (canid == road->m_info.can_id) { tag_can_index = road->m_canindex; } +// } +// if (tag_can_index == -1) return; +// +// // get colour +// auto tag_colour = *wxWHITE; +// for (auto lib_it : m_can_lib_list) { +// AMSLib* lib = lib_it.second; +// if (canid == lib->m_info.can_id) tag_colour = lib->GetLibColour(); +// } +// +// // unload +// if (type == AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD) { +// for (auto road_it : m_can_road_list) { +// AMSRoad* road = road_it.second; +// +// auto index = road->m_canindex; +// auto pr = std::vector{}; +// +// pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_END_BOTTOM); +// if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_2) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_END_BOTTOM); } +// +// if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_3) { +// if (index == tag_can_index && index > 0) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_LEFT); } +// if (index < tag_can_index && index > 0) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_LEFT_RIGHT); } +// if (index == 0 && tag_can_index == index) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_END_TOP); } +// if (index == 0 && tag_can_index > index) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_END_RIGHT); } +// } +// +// road->SetPassRoadColour(tag_colour); +// road->OnPassRoad(pr); +// } +// } +// +// // load +// if (type == AMSPassRoadType::AMS_ROAD_TYPE_LOAD) { +// for (auto road_it : m_can_road_list) { +// AMSRoad* road = road_it.second; +// +// auto index = road->m_canindex; +// auto pr = std::vector{}; +// +// if (index == tag_can_index && index > 0) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_LEFT); } +// if (index < tag_can_index && index > 0) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_LEFT_RIGHT); } +// if (index == 0 && tag_can_index == index) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_END_TOP); } +// if (index == 0 && tag_can_index > index) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_END_RIGHT); } +// +// if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_2) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_END_BOTTOM); } +// +// road->SetPassRoadColour(tag_colour); +// road->OnPassRoad(pr); +// } +// } +//} + +void AmsItem::SetAmsStep(std::string can_id) +{ + if (m_road_canid != can_id) { + m_road_canid = can_id; + Refresh(); + } +} + +void AmsItem::PlayRridLoading(wxString canid) +{ + for (auto refresh_it : m_can_refresh_list) { + AMSrefresh* refresh = refresh_it.second; + if (refresh->m_info.can_id == canid) { refresh->PlayLoading(); } + } +} + +std::string AmsItem::GetCurrentCan() +{ + if (m_canlib_selection < 0) + return ""; + + return wxString::Format("%d", m_canlib_selection).ToStdString(); +} + +void AmsItem::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void AmsItem::render(wxDC& dc) +{ + /*this->SetSize(AMS_CANS_WINDOW_SIZE); + this->SetMinSize(AMS_CANS_WINDOW_SIZE);*/ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 }); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void AmsItem::doRender(wxDC& dc) +{ + /*if (m_ams_model == AMSModel::GENERIC_AMS) + { + + this->SetSize(AMS_CANS_WINDOW_SIZE); + this->SetMinSize(AMS_CANS_WINDOW_SIZE); + } + else + { + this->SetSize(AMS_SINGLE_CAN_SIZE); + this->SetMinSize(AMS_SINGLE_CAN_SIZE); + }*/ + wxSize size = GetSize(); + //dc.DrawBitmap(m_bitmap_extra_framework.bmp(), (size.x - m_bitmap_extra_framework.GetBmpSize().x) / 2, (size.y - m_bitmap_extra_framework.GetBmpSize().y) / 2); + + //road for extra + /*if (m_ams_model == AMSModel::EXTRA_AMS) { + + auto end_top = size.x / 2 - FromDIP(99); + auto passroad_width = 6; + + for (auto lib_it : m_can_lib_list) { + AMSLib* lib = lib_it.second; + + if (m_road_canid.empty()) { + lib->on_pass_road(false); + } + else { + if (lib->m_info.can_id == m_road_canid) { + m_road_colour = lib->m_info.material_colour; + lib->on_pass_road(true); + } + } + } + + }*/ + + // A1 + // dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 2, wxSOLID)); + // dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + + // try + // { + // auto a1_top = size.y / 2 - FromDIP(4); + // auto a1_left = m_can_lib_list[0]->canLib->GetScreenPosition().x + m_can_lib_list[0]->canLib->GetSize().x / 2; + // auto local_pos1 = GetScreenPosition().x + GetSize().x / 2; + // a1_left = size.x / 2 + (a1_left - local_pos1); + // dc.DrawLine(a1_left, FromDIP(30), a1_left, a1_top); + // dc.DrawLine(a1_left, a1_top, end_top, a1_top); + + + // // A2 + // auto a2_top = size.y / 2 + FromDIP(8); + // auto a2_left = m_can_lib_list[1]->canLib->GetScreenPosition().x + m_can_lib_list[1]->canLib->GetSize().x / 2; + // auto local_pos2 = GetScreenPosition().x + GetSize().x / 2; + // a2_left = size.x / 2 + (a2_left - local_pos2); + // dc.DrawLine(a2_left, FromDIP(160), a2_left, a2_top); + // dc.DrawLine(a2_left, a2_top, end_top, a2_top); + + // // A3 + // auto a3_top = size.y / 2 + FromDIP(4); + // auto a3_left = m_can_lib_list[2]->canLib->GetScreenPosition().x + m_can_lib_list[2]->canLib->GetSize().x / 2; + // auto local_pos3 = GetScreenPosition().x + GetSize().x / 2; + // a3_left = size.x / 2 + (a3_left - local_pos3); + // dc.DrawLine(a3_left, FromDIP(160), a3_left, a3_top); + // dc.DrawLine(a3_left, a3_top, end_top, a3_top); + + + // // A4 + // auto a4_top = size.y / 2; + // auto a4_left = m_can_lib_list[3]->canLib->GetScreenPosition().x + m_can_lib_list[3]->canLib->GetSize().x / 2; + // auto local_pos4 = GetScreenPosition().x + GetSize().x / 2; + // a4_left = size.x / 2 + (a4_left - local_pos4); + // dc.DrawLine(a4_left, FromDIP(30), a4_left, a4_top); + // dc.DrawLine(a4_left, a4_top, end_top, a4_top); + + + // if (!m_road_canid.empty()) { + // if (m_road_canid == "0") { + // dc.SetPen(wxPen(m_road_colour, passroad_width, wxSOLID)); + // dc.DrawLine(a1_left, FromDIP(30), a1_left, a1_top); + // dc.DrawLine(a1_left, a1_top, end_top, a1_top); + // } + + // if (m_road_canid == "1") { + // dc.SetPen(wxPen(m_road_colour, passroad_width, wxSOLID)); + // dc.DrawLine(a2_left, FromDIP(160), a2_left, a2_top); + // dc.DrawLine(a2_left, a2_top, end_top, a2_top); + // } + + // if (m_road_canid == "2") { + // dc.SetPen(wxPen(m_road_colour, passroad_width, wxSOLID)); + // dc.DrawLine(a3_left, FromDIP(160), a3_left, a3_top); + // dc.DrawLine(a3_left, a3_top, end_top, a3_top); + // } + + // if (m_road_canid == "3") { + // dc.SetPen(wxPen(m_road_colour, passroad_width, wxSOLID)); + // dc.DrawLine(a4_left, FromDIP(30), a4_left, a4_top); + // dc.DrawLine(a4_left, a4_top, end_top, a4_top); + // } + // } + + // //to Extruder + // dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 2, wxSOLID)); + // dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + + // dc.DrawLine(end_top, a1_top, end_top, size.y); + + // if (!m_road_canid.empty()) { + // if (!m_road_canid.empty()) { + // if (m_road_canid == "0") { + // dc.SetPen(wxPen(m_road_colour, passroad_width, wxSOLID)); + // dc.DrawLine(end_top, a1_top, end_top, size.y); + // } + // else if (m_road_canid == "1") { + // dc.SetPen(wxPen(m_road_colour, passroad_width, wxSOLID)); + // dc.DrawLine(end_top, a2_top, end_top, size.y); + // } + // else if (m_road_canid == "2") { + // dc.SetPen(wxPen(m_road_colour, passroad_width, wxSOLID)); + // dc.DrawLine(end_top, a3_top, end_top, size.y); + // } + // else if (m_road_canid == "3") { + // dc.SetPen(wxPen(m_road_colour, passroad_width, wxSOLID)); + // dc.DrawLine(end_top, a4_top, end_top, size.y); + // } + // } + // } + // } + // catch (...){} + //} +} + +void AmsItem::StopRridLoading(wxString canid) +{ + for (auto refresh_it : m_can_refresh_list) { + AMSrefresh* refresh = refresh_it.second; + if (refresh->m_info.can_id == canid) { refresh->StopLoading(); } + } +} + +void AmsItem::msw_rescale() +{ + for (auto refresh_it : m_can_refresh_list) { + AMSrefresh* refresh = refresh_it.second; + refresh->msw_rescale(); + } + + for (auto lib_it : m_can_lib_list) { + AMSLib* lib = lib_it.second; + lib->msw_rescale(); + } +} + +void AmsItem::show_sn_value(bool show) +{ + for (auto lib_it : m_can_lib_list) { + AMSLib* lib = lib_it.second; + lib->show_kn_value(show); + } +} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Widgets/AMSItem.hpp b/src/slic3r/GUI/Widgets/AMSItem.hpp new file mode 100644 index 000000000..b5dfabb31 --- /dev/null +++ b/src/slic3r/GUI/Widgets/AMSItem.hpp @@ -0,0 +1,728 @@ +#ifndef slic3r_GUI_AMSITEM_hpp_ +#define slic3r_GUI_AMSITEM_hpp_ + +#include "../wxExtensions.hpp" +#include "StaticBox.hpp" +#include "StepCtrl.hpp" +#include "Button.hpp" +#include "../DeviceManager.hpp" +#include "slic3r/GUI/Event.hpp" +#include "slic3r/GUI/AmsMappingPopup.hpp" +#include +#include +#include +#include + + +#define AMS_CONTROL_BRAND_COLOUR wxColour(0, 174, 66) +#define AMS_CONTROL_GRAY700 wxColour(107, 107, 107) +#define AMS_CONTROL_GRAY800 wxColour(50, 58, 61) +#define AMS_CONTROL_GRAY500 wxColour(172, 172, 172) +#define AMS_CONTROL_DISABLE_COLOUR wxColour(206, 206, 206) +#define AMS_CONTROL_DISABLE_TEXT_COLOUR wxColour(144, 144, 144) +#define AMS_CONTROL_WHITE_COLOUR wxColour(255, 255, 255) +#define AMS_CONTROL_BLACK_COLOUR wxColour(0, 0, 0) +#define AMS_CONTROL_DEF_BLOCK_BK_COLOUR wxColour(238, 238, 238) +#define AMS_CONTROL_DEF_LIB_BK_COLOUR wxColour(248, 248, 248) +#define AMS_EXTRUDER_DEF_COLOUR wxColour(234, 234, 234) +#define AMS_CONTROL_MAX_COUNT 4 +#define AMS_CONTRO_CALIBRATION_BUTTON_SIZE wxSize(FromDIP(150), FromDIP(28)) +#define AMS_CONTROL_DEF_HUMIDITY_BK_COLOUR wxColour(238, 238, 238) + + +namespace Slic3r { namespace GUI { + +enum AMSModel { + NO_AMS = 0, //ext + GENERIC_AMS = 1, + EXTRA_AMS = 2, //ams-lite + N3F_AMS = 3, + SINGLE_AMS = 4 //n3s +}; + +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, + AMS_ROAD_MODE_END, + AMS_ROAD_MODE_END_ONLY, + AMS_ROAD_MODE_NONE, + AMS_ROAD_MODE_NONE_ANY_ROAD, + AMS_ROAD_MODE_VIRTUAL_TRAY +}; + +enum class AMSRoadDownPartLoad : int { + AMS_ROAD_MODE_LEFT, + AMS_ROAD_MODE_RIGHT, + AMS_ROAD_MODE_NONE +}; + +enum class AMSRoadShowMode : int { + AMS_ROAD_MODE_FOUR, + AMS_ROAD_MODE_DOUBLE, + AMS_ROAD_MODE_SINGLE, + AMS_ROAD_MODE_NONE +}; + +enum class AMSPassRoadMode : int { + AMS_ROAD_MODE_NONE, + AMS_ROAD_MODE_LEFT, + AMS_ROAD_MODE_LEFT_RIGHT, + AMS_ROAD_MODE_END_TOP, + AMS_ROAD_MODE_END_RIGHT, + AMS_ROAD_MODE_END_BOTTOM, +}; + +enum class AMSAction : int { + AMS_ACTION_NONE, + AMS_ACTION_LOAD, + AMS_ACTION_UNLOAD, + AMS_ACTION_CALI, + AMS_ACTION_PRINTING, + AMS_ACTION_NORMAL, + AMS_ACTION_NOAMS, +}; + +enum class AMSPassRoadSTEP : int { + AMS_ROAD_STEP_NONE = 0, + AMS_ROAD_STEP_1 = 1, // lib -> extrusion + AMS_ROAD_STEP_2 = 2, // extrusion->buffer + AMS_ROAD_STEP_3 = 4, // extrusion + + AMS_ROAD_STEP_COMBO_LOAD_STEP1, + AMS_ROAD_STEP_COMBO_LOAD_STEP2, + AMS_ROAD_STEP_COMBO_LOAD_STEP3, +}; + +enum class AMSPassRoadType : int { + AMS_ROAD_TYPE_NONE, + AMS_ROAD_TYPE_LOAD, + AMS_ROAD_TYPE_UNLOAD, +}; + +enum class AMSCanType : int { + AMS_CAN_TYPE_NONE, + AMS_CAN_TYPE_BRAND, + AMS_CAN_TYPE_THIRDBRAND, + AMS_CAN_TYPE_EMPTY, + AMS_CAN_TYPE_VIRTUAL, +}; + +enum FilamentStep { + STEP_IDLE, + STEP_HEAT_NOZZLE, + STEP_CUT_FILAMENT, + STEP_PULL_CURR_FILAMENT, + STEP_PUSH_NEW_FILAMENT, + STEP_PURGE_OLD_FILAMENT, + STEP_FEED_FILAMENT, + STEP_CONFIRM_EXTRUDED, + STEP_CHECK_POSITION, + STEP_COUNT, +}; + + +enum FilamentStepType { + STEP_TYPE_LOAD = 0, + STEP_TYPE_UNLOAD = 1, + STEP_TYPE_VT_LOAD = 2, +}; + +#define AMS_ITEM_CUBE_SIZE wxSize(FromDIP(8), FromDIP(14)) +#define AMS_PREVIEW_SIZE wxSize(FromDIP(82), FromDIP(27)) +#define AMS_ITEM_SIZE wxSize(FromDIP(78), FromDIP(184)) +#define AMS_ITEM_FOUR_SIZE wxSize(FromDIP(44), FromDIP(24)) +#define AMS_ITEM_SINGLE_SIZE wxSize(FromDIP(20), FromDIP(24)) +#define AMS_ITEM_HUMIDITY_SIZE wxSize(FromDIP(120), FromDIP(27)) +#define AMS_CAN_LIB_SIZE wxSize(FromDIP(52), FromDIP(80)) +#define AMS_CAN_ROAD_SIZE wxSize(FromDIP(264), FromDIP(50)) +#define AMS_ITEMS_PANEL_SIZE wxSize(FromDIP(264), FromDIP(27)) +//#define AMS_CANS_SIZE wxSize(FromDIP(284), FromDIP(184)) +//#define AMS_CANS_WINDOW_SIZE wxSize(FromDIP(264), FromDIP(196)) +#define AMS_STEP_SIZE wxSize(FromDIP(172), FromDIP(196)) +#define AMS_REFRESH_SIZE wxSize(FromDIP(25), FromDIP(25)) +#define AMS_EXTRUDER_SIZE wxSize(FromDIP(29), FromDIP(37)) +#define AMS_EXTRUDER_BITMAP_SIZE wxSize(FromDIP(13), FromDIP(37)) +#define AMS_BODY_SIZE wxSize(FromDIP(36), FromDIP(55)) +#define AMS_DOWN_ROAD_SIZE wxSize(FromDIP(568), FromDIP(10)) +#define AMS_HUMIDITY_SIZE wxSize(FromDIP(93), FromDIP(26)) + +struct Caninfo +{ + std::string can_id; + wxString material_name; + wxColour material_colour = {*wxWHITE}; + AMSCanType material_state; + int ctype=0; + int material_remain = 100; + float k = 0.0f; + float n = 0.0f; + std::vector material_cols; +}; + +struct AMSinfo +{ +public: + std::string ams_id; + std::vector cans; + int nozzle_id = 0; + std::string current_can_id; + AMSPassRoadSTEP current_step; + AMSAction current_action; + int curreent_filamentstep; + int ams_humidity = 0; + AMSModel ams_type = AMSModel::GENERIC_AMS; + + bool parse_ams_info(MachineObject* obj, Ams *ams, bool remain_flag = false, bool humidity_flag = false); + void ReadExtInfo(AmsTray tray); +}; + +/************************************************* +Description:AMSExtText +**************************************************/ + +class AMSExtText : public wxWindow +{ +public: + void msw_rescale(); + void paintEvent(wxPaintEvent& evt); + + void render(wxDC& dc); + void doRender(wxDC& dc); + AMSExtText(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + ~AMSExtText(); +}; + + +/************************************************* +Description:AMSrefresh +**************************************************/ +#define AMS_REFRESH_PLAY_LOADING_TIMER 100 +class AMSrefresh : public wxWindow +{ +public: + AMSrefresh(); + AMSrefresh(wxWindow *parent, wxString number, Caninfo info, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); + AMSrefresh(wxWindow *parent, int number, Caninfo info, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); + ~AMSrefresh(); + void PlayLoading(); + void StopLoading(); + void create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size); + void on_timer(wxTimerEvent &event); + void OnEnterWindow(wxMouseEvent &evt); + void OnLeaveWindow(wxMouseEvent &evt); + void OnClick(wxMouseEvent &evt); + void post_event(wxCommandEvent &&event); + void paintEvent(wxPaintEvent &evt); + void Update(std::string ams_id, Caninfo info); + void msw_rescale(); + void set_disable_mode(bool disable) { m_disable_mode = disable; } + Caninfo m_info; + + +protected: + wxTimer *m_playing_timer= {nullptr}; + int m_rotation_angle = 0; + bool m_play_loading = {false}; + bool m_selected = {false}; + + std::string m_ams_id; + std::string m_can_id; + + ScalableBitmap m_bitmap_normal; + ScalableBitmap m_bitmap_selected; + ScalableBitmap m_bitmap_ams_rfid_0; + ScalableBitmap m_bitmap_ams_rfid_1; + ScalableBitmap m_bitmap_ams_rfid_2; + ScalableBitmap m_bitmap_ams_rfid_3; + ScalableBitmap m_bitmap_ams_rfid_4; + ScalableBitmap m_bitmap_ams_rfid_5; + ScalableBitmap m_bitmap_ams_rfid_6; + ScalableBitmap m_bitmap_ams_rfid_7; + std::vector m_rfid_bitmap_list; + + wxString m_refresh_id; + wxBoxSizer * m_size_body; + virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); + + bool m_disable_mode{ false }; +}; + +/************************************************* +Description:AMSextruder +**************************************************/ +class AMSextruderImage: public wxWindow +{ +public: + void OnAmsLoading(bool load, wxColour col); + void TurnOff(); + void update(bool show_state) { m_show_state = show_state; }; + void msw_rescale(); + void paintEvent(wxPaintEvent &evt); + + void render(wxDC &dc); + bool m_show_state = {false}; + wxColour m_colour; + ScalableBitmap m_ams_extruder; + string m_file_name; + bool m_ams_loading{ false }; + void doRender(wxDC &dc); + AMSextruderImage(wxWindow *parent, wxWindowID id, string file_name, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); + ~AMSextruderImage(); +}; + +//AMSExtImage upon ext lib +class AMSExtImage : public wxWindow +{ +public: + void msw_rescale(); + void paintEvent(wxPaintEvent& evt); + + void render(wxDC& dc); + ScalableBitmap m_ams_ext; + void doRender(wxDC& dc); + AMSExtImage(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + ~AMSExtImage(); +}; + + +class AMSextruder : public wxWindow +{ +public: + void TurnOn(wxColour col); + void TurnOff(); + void create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size); + void OnVamsLoading(bool load, wxColour col = AMS_CONTROL_GRAY500); + void OnAmsLoading(bool load, int nozzle_id = 0, wxColour col = AMS_CONTROL_GRAY500); + void paintEvent(wxPaintEvent& evt); + void render(wxDC& dc); + void doRender(wxDC& dc); + void msw_rescale(); + void has_ams(bool hams) {m_has_vams = hams; Refresh();}; + void no_ams_mode(bool mode) {m_none_ams_mode = mode; Refresh();}; + void update(int nozzle_num) { m_nozzle_num = nozzle_num; }; + + bool m_none_ams_mode{true}; + bool m_has_vams{false}; + bool m_vams_loading{false}; + bool m_ams_loading{false}; + wxColour m_current_colur; + int m_nozzle_num{ 1 }; + + wxBoxSizer * m_bitmap_sizer{nullptr}; + wxPanel * m_bitmap_panel{nullptr}; + //AMSextruderImage *m_amsSextruder{nullptr}; + AMSextruderImage* m_left_extruder; + AMSextruderImage* m_right_extruder; + AMSextruder(wxWindow *parent, wxWindowID id, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); + ~AMSextruder(); +}; + +class AMSVirtualRoad : public wxWindow +{ +public: + AMSVirtualRoad(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + ~AMSVirtualRoad(); + +private: + bool m_has_vams{ true }; + bool m_vams_loading{ false }; + wxColour m_current_color; + +public: + void OnVamsLoading(bool load, wxColour col = AMS_CONTROL_GRAY500); + void SetHasVams(bool hvams) { m_has_vams = hvams; }; + void create(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size); + void paintEvent(wxPaintEvent& evt); + void render(wxDC& dc); + void doRender(wxDC& dc); + void msw_rescale(); +}; + +/************************************************* +Description:AMSLib +**************************************************/ +class AMSLib : public wxWindow +{ +public: + AMSLib(wxWindow *parent, std::string ams_idx, Caninfo info); + ~AMSLib(); + void create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); +public: + wxColour GetLibColour(); + Caninfo m_info; + MachineObject* m_obj = { nullptr }; + + std::string m_ams_id; + std::string m_slot_id; + + int m_can_index = 0; + bool transparent_changed = { false }; + AMSModel m_ams_model; + + void Update(Caninfo info, std::string ams_idx, bool refresh = true); + void UnableSelected() { m_unable_selected = true; }; + void EableSelected() { m_unable_selected = false; }; + void OnSelected(); + void UnSelected(); + bool is_selected() {return m_selected;}; + void post_event(wxCommandEvent &&event); + void show_kn_value(bool show) { m_show_kn = show; }; + void support_cali(bool sup) { m_support_cali = sup; Refresh(); }; + virtual bool Enable(bool enable = true); + void set_disable_mode(bool disable) { m_disable_mode = disable; } + void msw_rescale(); + void on_pass_road(bool pass); + +protected: + wxStaticBitmap *m_edit_bitmp = {nullptr}; + wxStaticBitmap *m_edit_bitmp_light = {nullptr}; + ScalableBitmap m_bitmap_editable; + ScalableBitmap m_bitmap_editable_light; + ScalableBitmap m_bitmap_readonly; + ScalableBitmap m_bitmap_readonly_light; + ScalableBitmap m_bitmap_transparent; + ScalableBitmap m_bitmap_transparent_def; + + ScalableBitmap m_bitmap_extra_tray_left; + ScalableBitmap m_bitmap_extra_tray_right; + + ScalableBitmap m_bitmap_extra_tray_left_hover; + ScalableBitmap m_bitmap_extra_tray_right_hover; + + ScalableBitmap m_bitmap_extra_tray_left_selected; + ScalableBitmap m_bitmap_extra_tray_right_selected; + + bool m_unable_selected = {false}; + bool m_enable = {false}; + bool m_selected = {false}; + bool m_hover = {false}; + bool m_show_kn = {false}; + bool m_support_cali = {false}; + + + double m_radius = {4}; + wxColour m_border_color; + wxColour m_road_def_color; + wxColour m_lib_color; + bool m_disable_mode{ false }; + bool m_pass_road{false}; + + void on_enter_window(wxMouseEvent &evt); + void on_leave_window(wxMouseEvent &evt); + void on_left_down(wxMouseEvent &evt); + void paintEvent(wxPaintEvent &evt); + void render(wxDC &dc); + void render_extra_text(wxDC& dc); + void render_generic_text(wxDC& dc); + void doRender(wxDC& dc); + void render_extra_lib(wxDC& dc); + void render_generic_lib(wxDC& dc); +}; + +/************************************************* +Description:AMSRoad +**************************************************/ +class AMSRoad : public wxWindow +{ +public: + AMSRoad(); + AMSRoad(wxWindow *parent, wxWindowID id, Caninfo info, int canindex, int maxcan, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); + void create(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); + +public: + AMSinfo m_amsinfo; + Caninfo m_info; + int m_canindex = {0}; + AMSRoadMode m_rode_mode = {AMSRoadMode::AMS_ROAD_MODE_LEFT_RIGHT}; + std::vector m_pass_rode_mode = {AMSPassRoadMode::AMS_ROAD_MODE_NONE}; + bool m_selected = {false}; + int m_passroad_width = {6}; + double m_radius = {4}; + wxColour m_road_def_color; + wxColour m_road_color; + void Update(AMSinfo amsinfo, Caninfo info, int canindex, int maxcan); + + std::vector ams_humidity_img; + + + int m_humidity = { 0 }; + bool m_show_humidity = { false }; + bool m_vams_loading{false}; + AMSModel m_ams_model; + + void OnVamsLoading(bool load, wxColour col = AMS_CONTROL_GRAY500); + void SetPassRoadColour(wxColour col); + void SetMode(AMSRoadMode mode); + void OnPassRoad(std::vector prord_list); + void UpdatePassRoad(int tag_index, AMSPassRoadType type, AMSPassRoadSTEP step); + + void paintEvent(wxPaintEvent &evt); + void render(wxDC &dc); + void doRender(wxDC &dc); +}; + + +/************************************************* +Description:AMSRoadUpPart +**************************************************/ +class AMSRoadUpPart : public wxWindow +{ +public: + AMSRoadUpPart(); + AMSRoadUpPart(wxWindow* parent, wxWindowID id, AMSinfo info, AMSModel mode, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + void create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + +public: + AMSinfo m_amsinfo; + Caninfo m_info; + int m_load_slot_index = { 0 }; + int m_load_ams_index = { 0 }; + //AMSRoadMode m_rode_mode = { AMSRoadMode::AMS_ROAD_MODE_LEFT_RIGHT }; + std::vector m_pass_rode_mode = { AMSPassRoadMode::AMS_ROAD_MODE_NONE }; + AMSRoadShowMode m_road_mode = { AMSRoadShowMode::AMS_ROAD_MODE_FOUR }; + AMSPassRoadSTEP m_load_step = { AMSPassRoadSTEP::AMS_ROAD_STEP_NONE }; + + bool m_selected = { false }; + int m_passroad_width = { 6 }; + double m_radius = { 4 }; + wxColour m_road_def_color; + wxColour m_road_color; + void Update(AMSinfo amsinfo, Caninfo info); + + std::vector ams_humidity_img; + + + int m_humidity = { 0 }; + bool m_show_humidity = { false }; + bool m_vams_loading{ false }; + AMSModel m_ams_model; + + void OnVamsLoading(bool load, wxColour col = AMS_CONTROL_GRAY500); + void SetPassRoadColour(wxColour col); + void SetMode(AMSRoadShowMode mode); + void OnPassRoad(std::vector prord_list); + void UpdatePassRoad(std::string ams_index, std::string slot_index, AMSPassRoadType type, AMSPassRoadSTEP step); + + void paintEvent(wxPaintEvent& evt); + void render(wxDC& dc); + void doRender(wxDC& dc); +}; + + +/************************************************* +Description:AMSRoadDownPart +**************************************************/ +class AMSRoadDownPart : public wxWindow +{ +public: + AMSRoadDownPart(); + AMSRoadDownPart(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + void create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + +public: + AMSinfo m_amsinfo; + Caninfo m_info; + int m_canindex = { 0 }; + int m_nozzle_num = { 1 }; + AMSRoadShowMode m_single_ext_rode_mode = { AMSRoadShowMode::AMS_ROAD_MODE_FOUR }; + AMSRoadShowMode m_left_rode_mode = { AMSRoadShowMode::AMS_ROAD_MODE_FOUR }; + AMSRoadShowMode m_right_rode_mode = { AMSRoadShowMode::AMS_ROAD_MODE_FOUR }; + bool m_selected = { false }; + bool m_single_nozzle_no_ams = { false }; + + int m_left_road_length = { -1 }; + int m_right_road_length = { -1 }; + int m_passroad_width = { 6 }; + double m_radius = { 4 }; + wxColour m_road_def_color; + AMSPassRoadType m_pass_road_type = { AMSPassRoadType::AMS_ROAD_TYPE_NONE }; + AMSPassRoadSTEP m_pass_road_step = { AMSPassRoadSTEP::AMS_ROAD_STEP_NONE }; + + wxColour m_road_color; + //void Update(AMSRoadDownPartMode nozzle, AMSRoadShowMode left_mode, AMSRoadShowMode right_mode, int left_len, int right_len); + void UpdateLeft(int nozzle_num, AMSRoadShowMode mode); + void UpdateRight(int nozzle_num, AMSRoadShowMode mode); + + std::vector ams_humidity_img; + + + int m_humidity = { 0 }; + bool m_show_humidity = { false }; + bool m_vams_loading{ false }; + + AMSModel m_ams_model; + + void OnVamsLoading(bool load, wxColour col = AMS_CONTROL_GRAY500); + void SetPassRoadColour(wxColour col); + void SetMode(AMSRoadDownPartLoad mode); + void SetShowMode(AMSRoadShowMode left_mode, AMSRoadShowMode right_mode); + void OnPassRoad(std::vector prord_list); + void UpdatePassRoad(string can_id, bool left, int len, AMSinfo info, AMSPassRoadSTEP step); + + void paintEvent(wxPaintEvent& evt); + void render(wxDC& dc); + void doRender(wxDC& dc); +}; + +/************************************************* +Description:AMSPreview +**************************************************/ + +class AMSPreview : public wxWindow +{ +public: + AMSPreview(); + AMSPreview(wxWindow *parent, wxWindowID id, AMSinfo amsinfo, AMSModel itemType = AMSModel::GENERIC_AMS, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + + bool m_open = {false}; + void Open(); + void Close(); + + void Update(AMSinfo amsinfo); + void create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size); + void OnEnterWindow(wxMouseEvent &evt); + void OnLeaveWindow(wxMouseEvent &evt); + void OnSelected(); + void UnSelected(); + virtual bool Enable(bool enable = true); + + AMSinfo m_amsinfo; + +protected: + wxSize m_cube_size; + wxColour m_background_colour = { AMS_CONTROL_DEF_LIB_BK_COLOUR }; + float m_padding = { 4.0 }; + float m_space = { 9.4 }; + bool m_hover = {false}; + bool m_selected = {false}; + AMSModel m_ams_item_type = AMSModel::GENERIC_AMS; + + ScalableBitmap* m_ts_bitmap_cube; + ScalableBitmap* m_four_slot_bitmap; + ScalableBitmap* m_single_slot_bitmap; + ScalableBitmap* m_ext_bitmap; + + void paintEvent(wxPaintEvent &evt); + void render(wxDC &dc); + void doRender(wxDC &dc); + virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); +}; + + +/************************************************* +Description:AMSHumidity +**************************************************/ +class AMSHumidity : public wxWindow +{ +public: + AMSHumidity(); + AMSHumidity(wxWindow* parent, wxWindowID id, AMSinfo info, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + void create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + +public: + AMSinfo m_amsinfo; + int m_canindex = { 0 }; + bool m_selected = { false }; + double m_radius = { 12 }; + void Update(AMSinfo amsinfo); + + std::vector ams_humidity_img; + ScalableBitmap ams_sun_img; + + + int m_humidity = { 0 }; + bool m_show_humidity = { false }; + bool m_vams_loading{ false }; + AMSModel m_ams_model; + + void paintEvent(wxPaintEvent& evt); + void render(wxDC& dc); + void doRender(wxDC& dc); +}; + + +/************************************************* +Description:AmsItem +**************************************************/ +class AmsItem : public wxWindow +{ +public: + AmsItem(); + AmsItem(wxWindow *parent, AMSinfo info, AMSModel model); + ~AmsItem(); + + void Update(AMSinfo info); + void create(wxWindow *parent); + void AddCan(Caninfo caninfo, int canindex, int maxcan, wxBoxSizer* sizer); + void SetDefSelectCan(); + void SelectCan(std::string canid); + void PlayRridLoading(wxString canid); + void StopRridLoading(wxString canid); + void msw_rescale(); + void show_sn_value(bool show); + void SetAmsStepExtra(wxString canid, AMSPassRoadType type, AMSPassRoadSTEP step); + void SetAmsStep(std::string amsid, std::string canid, AMSPassRoadType type, AMSPassRoadSTEP step); + void SetAmsStep(std::string can_id); + void paintEvent(wxPaintEvent& evt); + void render(wxDC& dc); + void doRender(wxDC& dc); + wxColour GetTagColr(wxString canid); + std::string GetCurrentCan(); + +public: + ScalableBitmap m_bitmap_extra_framework; + int m_canlib_selection = { -1 }; + int m_selection = { 0 }; + int m_can_count = { 0 }; + + AMSModel m_ams_model; + std::string m_canlib_id; + + std::string m_road_canid; + wxColour m_road_colour; + + std::map m_can_lib_list; + //std::map m_can_road_list; + AMSRoadUpPart* m_panel_road; + std::map m_can_refresh_list; + AMSHumidity* m_humidity; + + AMSinfo m_info; + wxBoxSizer * sizer_can = {nullptr}; + wxBoxSizer * sizer_humidity = { nullptr }; + wxBoxSizer * sizer_item = { nullptr }; + wxBoxSizer * sizer_can_middle = {nullptr}; + wxBoxSizer * sizer_can_left = {nullptr}; + wxBoxSizer * sizer_can_right = {nullptr}; + AMSPassRoadSTEP m_step = {AMSPassRoadSTEP ::AMS_ROAD_STEP_NONE}; +}; + +wxDECLARE_EVENT(EVT_AMS_EXTRUSION_CALI, wxCommandEvent); +wxDECLARE_EVENT(EVT_AMS_LOAD, SimpleEvent); +wxDECLARE_EVENT(EVT_AMS_UNLOAD, SimpleEvent); +wxDECLARE_EVENT(EVT_AMS_SETTINGS, SimpleEvent); +wxDECLARE_EVENT(EVT_AMS_FILAMENT_BACKUP, SimpleEvent); +wxDECLARE_EVENT(EVT_AMS_REFRESH_RFID, wxCommandEvent); +wxDECLARE_EVENT(EVT_AMS_ON_SELECTED, wxCommandEvent); +wxDECLARE_EVENT(EVT_AMS_ON_FILAMENT_EDIT, wxCommandEvent); +wxDECLARE_EVENT(EVT_AMS_CLIBRATION_AGAIN, wxCommandEvent); +wxDECLARE_EVENT(EVT_AMS_CLIBRATION_CANCEL, wxCommandEvent); +wxDECLARE_EVENT(EVT_AMS_GUIDE_WIKI, wxCommandEvent); +wxDECLARE_EVENT(EVT_AMS_RETRY, wxCommandEvent); +wxDECLARE_EVENT(EVT_AMS_SHOW_HUMIDITY_TIPS, wxCommandEvent); +wxDECLARE_EVENT(EVT_AMS_UNSELETED_VAMS, wxCommandEvent); +wxDECLARE_EVENT(EVT_CLEAR_SPEED_CONTROL, wxCommandEvent); +wxDECLARE_EVENT(EVT_VAMS_ON_FILAMENT_EDIT, wxCommandEvent); + + + +}} // namespace Slic3r::GUI + +#endif // !slic3r_GUI_amscontrol_hpp_