From 00e1c509479bdccaace79e1226f862689aeb73ad Mon Sep 17 00:00:00 2001 From: tao wang Date: Fri, 24 Mar 2023 16:08:20 +0800 Subject: [PATCH] NEW:AMS supports ams filament backup Change-Id: I0bc84f52bcd88dbbc1b9614b15474433c748cc14 --- resources/config.json | 23 +- .../images/automatic_material_renewal.svg | 5 + resources/images/replace_arrow_down.svg | 3 + resources/images/replace_arrow_left.svg | 3 + resources/images/replace_arrow_right.svg | 3 + src/slic3r/GUI/AmsMappingPopup.cpp | 378 ++++++++++++++++++ src/slic3r/GUI/AmsMappingPopup.hpp | 69 ++++ src/slic3r/GUI/DeviceManager.cpp | 15 + src/slic3r/GUI/DeviceManager.hpp | 2 + src/slic3r/GUI/SelectMachine.cpp | 39 +- src/slic3r/GUI/SelectMachine.hpp | 3 +- src/slic3r/GUI/StatusPanel.cpp | 10 + src/slic3r/GUI/StatusPanel.hpp | 4 +- src/slic3r/GUI/Widgets/AMSControl.cpp | 62 +-- src/slic3r/GUI/Widgets/AMSControl.hpp | 1 + src/slic3r/GUI/Widgets/Label.cpp | 2 + src/slic3r/GUI/Widgets/Label.hpp | 1 + 17 files changed, 585 insertions(+), 38 deletions(-) create mode 100644 resources/images/automatic_material_renewal.svg create mode 100644 resources/images/replace_arrow_down.svg create mode 100644 resources/images/replace_arrow_left.svg create mode 100644 resources/images/replace_arrow_right.svg diff --git a/resources/config.json b/resources/config.json index 20489ed32..c69e70b33 100644 --- a/resources/config.json +++ b/resources/config.json @@ -26,21 +26,22 @@ "ftp_folder" : "sdcard/", "printer_thumbnail_image": "printer_thumbnail_p1p" }, - { - "display_name": "Bambu Lab X1", - "func": { - "FUNC_EXTRUSION_CALI": false, - "FUNC_LOCAL_TUNNEL": false - }, - "camera_resolution":["720p","1080p"], - "model_id": "BL-P002", - "printer_type": "3DPrinter-X1", - "printer_thumbnail_image": "printer_thumbnail" + { + "display_name": "Bambu Lab X1", + "func": { + "FUNC_EXTRUSION_CALI": true, + "FUNC_LOCAL_TUNNEL": false }, + "camera_resolution": [ "720p", "1080p" ], + "model_id": "BL-P002", + "printer_type": "3DPrinter-X1", + "printer_thumbnail_image": "printer_thumbnail" + }, + { "display_name": "Bambu Lab X1 Carbon", "func": { - "FUNC_EXTRUSION_CALI": false, + "FUNC_EXTRUSION_CALI": true, "FUNC_LOCAL_TUNNEL": false }, "model_id": "BL-P001", diff --git a/resources/images/automatic_material_renewal.svg b/resources/images/automatic_material_renewal.svg new file mode 100644 index 000000000..a1138c5e6 --- /dev/null +++ b/resources/images/automatic_material_renewal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/images/replace_arrow_down.svg b/resources/images/replace_arrow_down.svg new file mode 100644 index 000000000..d46126623 --- /dev/null +++ b/resources/images/replace_arrow_down.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/replace_arrow_left.svg b/resources/images/replace_arrow_left.svg new file mode 100644 index 000000000..0c95675d1 --- /dev/null +++ b/resources/images/replace_arrow_left.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/replace_arrow_right.svg b/resources/images/replace_arrow_right.svg new file mode 100644 index 000000000..76bb1f417 --- /dev/null +++ b/resources/images/replace_arrow_right.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/slic3r/GUI/AmsMappingPopup.cpp b/src/slic3r/GUI/AmsMappingPopup.cpp index 2b8f551e8..390d89762 100644 --- a/src/slic3r/GUI/AmsMappingPopup.cpp +++ b/src/slic3r/GUI/AmsMappingPopup.cpp @@ -1107,4 +1107,382 @@ void MappingContainer::doRender(wxDC& dc) dc.DrawBitmap(ams_mapping_item_container, 0, 0); } +AmsReplaceMaterialDialog::AmsReplaceMaterialDialog(wxWindow* parent) + : DPIDialog(parent, wxID_ANY, _L("Filaments replace"), wxDefaultPosition, wxDefaultSize, wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX) +{ + SetBackgroundColour(*wxWHITE); + create(); + wxGetApp().UpdateDlgDarkUI(this); +} + +void AmsReplaceMaterialDialog::create() +{ + SetSize(wxSize(FromDIP(376), -1)); + SetMinSize(wxSize(FromDIP(376), -1)); + SetMaxSize(wxSize(FromDIP(376), -1)); + + // set icon for dialog + std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % resources_dir()).str(); + SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); + SetSizeHints(wxDefaultSize, wxDefaultSize); + + m_main_sizer = new wxBoxSizer(wxVERTICAL); + auto m_top_line = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); + m_top_line->SetBackgroundColour(wxColour(166, 169, 170)); + m_main_sizer->Add(m_top_line, 0, wxEXPAND, 0); + + + auto m_button_sizer = new wxBoxSizer(wxHORIZONTAL); + + 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)); + + StateColor btn_bd_white(std::pair(wxColour(255, 255, 254), StateColor::Disabled), + std::pair(wxColour(38, 46, 48), StateColor::Enabled)); + + StateColor btn_text_white(std::pair(wxColour(255, 255, 254), StateColor::Disabled), + std::pair(wxColour(38, 46, 48), StateColor::Enabled)); + + auto m_button_close = new Button(this, _L("Close")); + m_button_close->SetCornerRadius(FromDIP(11)); + m_button_close->SetBackgroundColor(btn_bg_white); + m_button_close->SetBorderColor(btn_bd_white); + m_button_close->SetTextColor(btn_text_white); + m_button_close->SetFont(Label::Body_13); + m_button_close->SetMinSize(wxSize(FromDIP(42), FromDIP(24))); + m_button_close->Bind(wxEVT_BUTTON, [this](auto& e) { + EndModal(wxCLOSE); + }); + + m_button_sizer->Add( 0, 0, 1, wxEXPAND, 0 ); + m_button_sizer->Add(m_button_close, 0, wxALIGN_CENTER, 0); + + + m_groups_sizer = new wxBoxSizer(wxVERTICAL); + m_main_sizer->Add(0,0,0, wxTOP, FromDIP(12)); + m_main_sizer->Add(m_groups_sizer,0,wxEXPAND|wxLEFT|wxRIGHT, FromDIP(16)); + m_main_sizer->Add(0,0,0, wxTOP, FromDIP(20)); + m_main_sizer->Add(m_button_sizer,0,wxEXPAND|wxLEFT|wxRIGHT, FromDIP(16)); + m_main_sizer->Add(0,0,0, wxTOP, FromDIP(20)); + + + CenterOnParent(); + SetSizer(m_main_sizer); + Layout(); + Fit(); +} + +std::vector AmsReplaceMaterialDialog::GetStatus(unsigned int status) +{ + std::vector listStatus; + bool current = false; + for (int i = 0; i < 16; i++) { + if (status & (1 << i)) { + current = true; + } + else { + current = false; + } + listStatus.push_back(current); + } + return listStatus; +} + +void AmsReplaceMaterialDialog::update_machine_obj(MachineObject* obj) +{ + if (obj) {m_obj = obj;} + else {return;} + + AmsTray* tray_list[4*4]; + for (auto i = 0; i < 4*4; i++) { + tray_list[i] = nullptr; + } + + try { + for (auto ams_info : obj->amsList) { + int ams_id_int = atoi(ams_info.first.c_str()) * 4; + + for (auto tray_info : ams_info.second->trayList) { + int tray_id_int = atoi(tray_info.first.c_str()); + tray_id_int = ams_id_int + tray_id_int; + tray_list[tray_id_int] = tray_info.second; + } + } + } + catch (...) {} + + //creat group + int group_index = 1; + for (int filam : m_obj->filam_bak) { + auto status_list = GetStatus(filam); + + wxColour group_color; + std::string group_material; + + //get color & material + for (auto i = 0; i < status_list.size(); i++) { + if (status_list[i] && tray_list[i] != nullptr) { + group_color = AmsTray::decode_color(tray_list[i]->color); + group_material = tray_list[i]->get_display_filament_type(); + } + } + + m_groups_sizer->Add(create_split_line(wxString::Format("%s%d", _L("Group"), group_index), group_color, group_material, status_list), 0, wxEXPAND, 0); + m_groups_sizer->Add(0, 0, 0, wxTOP, FromDIP(12)); + group_index++; + } + + Layout(); + Fit(); +} + +wxWindow* AmsReplaceMaterialDialog::create_split_line(wxString gname, wxColour col, wxString material, std::vector status_list) +{ + wxColour background_color = wxColour(0xF4F4F4); + + if (abs(col.Red() - background_color.Red()) <= 5 && + abs(col.Green() - background_color.Green()) <= 5 && + abs(col.Blue() - background_color.Blue()) <= 5) { + background_color = wxColour(0xE6E6E6); + } + + auto m_panel_group = new StaticBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); + m_panel_group->SetCornerRadius(FromDIP(4)); + m_panel_group->SetBackgroundColor(StateColor(std::pair(background_color, StateColor::Normal))); + + m_panel_group->SetSize(wxSize(FromDIP(344), -1)); + m_panel_group->SetMinSize(wxSize(FromDIP(344), -1)); + m_panel_group->SetMaxSize(wxSize(FromDIP(344), -1)); + + wxBoxSizer* group_sizer = new wxBoxSizer(wxVERTICAL); + + //group title + wxBoxSizer* title_sizer = new wxBoxSizer(wxHORIZONTAL); + auto group_name = new Label(m_panel_group, gname); + group_name->SetFont(::Label::Head_12); + + Button* material_info = new Button(m_panel_group, material); + material_info->SetFont(Label::Head_12); + material_info->SetCornerRadius(FromDIP(2)); + material_info->SetBorderColor(background_color); + + if (col.GetLuminance() < 0.5) + material_info->SetTextColor(*wxWHITE); + else + material_info->SetTextColor(0x6B6B6B); + + material_info->SetMinSize(wxSize(-1, FromDIP(24))); + material_info->SetBackgroundColor(col); + + + title_sizer->Add(group_name, 0, wxALIGN_CENTER, 0); + title_sizer->Add(0, 0, 0, wxLEFT, FromDIP(10)); + title_sizer->Add(material_info, 0, wxALIGN_CENTER, 0); + + + //group item + wxGridSizer* grid_Sizer = new wxGridSizer(0, 8, 0, 0); + + for (int i = 0; i < status_list.size(); i++) { + if (status_list[i]) { + AmsRMItem* amsitem = new AmsRMItem(m_panel_group, wxID_ANY, wxDefaultPosition, wxDefaultSize); + amsitem->set_color(col); + + //set current tray + if (!m_obj->m_tray_now.empty() && m_obj->m_tray_now == std::to_string(i)) { + amsitem->set_focus(true); + } + + amsitem->set_type(RMTYPE_NORMAL); + amsitem->set_index(wxGetApp().transition_tridid(i).ToStdString()); + amsitem->SetBackgroundColour(background_color); + grid_Sizer->Add(amsitem, 0, wxALIGN_CENTER | wxTOP | wxBottom, FromDIP(10)); + } + } + + //add the first tray + for (int i = 0; i < status_list.size(); i++) { + if (status_list[i]) { + AmsRMItem* amsitem = new AmsRMItem(m_panel_group, wxID_ANY, wxDefaultPosition, wxDefaultSize); + amsitem->set_color(col); + amsitem->set_type(RMTYPE_VIRTUAL); + amsitem->set_index(wxGetApp().transition_tridid(i).ToStdString()); + amsitem->SetBackgroundColour(background_color); + grid_Sizer->Add(amsitem, 0, wxALIGN_CENTER | wxTOP | wxBottom, FromDIP(10)); + break; + } + } + + group_sizer->Add(0, 0, 0, wxTOP, FromDIP(10)); + group_sizer->Add(title_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(12)); + group_sizer->Add(grid_Sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(12)); + group_sizer->Add(0, 0, 0, wxTOP, FromDIP(10)); + + m_panel_group->SetSizer(group_sizer); + m_panel_group->Layout(); + group_sizer->Fit(m_panel_group); + return m_panel_group; +} + +void AmsReplaceMaterialDialog::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + dc.SetPen(wxColour(0xAC, 0xAC, 0xAC)); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRoundedRectangle(0, 0, GetSize().x, GetSize().y, 0); +} + +void AmsReplaceMaterialDialog::on_dpi_changed(const wxRect& suggested_rect) +{ + +} + +AmsRMItem::AmsRMItem(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size) +{ + wxWindow::Create(parent, id, pos, size); + + SetSize(wxSize(FromDIP(42), FromDIP(32))); + SetMinSize(wxSize(FromDIP(42), FromDIP(32))); + SetMaxSize(wxSize(FromDIP(42), FromDIP(32))); + + SetBackgroundColour(*wxWHITE); + + Bind(wxEVT_PAINT, &AmsRMItem::paintEvent, this); +} + +void AmsRMItem::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void AmsRMItem::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 AmsRMItem::doRender(wxDC& dc) +{ + wxSize size = GetSize(); + + if (m_type == RMTYPE_NORMAL) { + dc.SetPen(wxPen(m_color, 2)); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + } + else { + dc.SetPen(wxPen(m_color, 2, wxSHORT_DASH)); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + } + + //top bottom line + dc.DrawLine(FromDIP(0), FromDIP(4), size.x - FromDIP(5), FromDIP(4)); + dc.DrawLine(FromDIP(0), size.y - FromDIP(4), size.x - FromDIP(5), size.y - FromDIP(4)); + + //left right line + dc.DrawLine(FromDIP(1), FromDIP(4), FromDIP(1), FromDIP(11)); + dc.DrawLine(FromDIP(1), FromDIP(22), FromDIP(1), size.y - FromDIP(4)); + + dc.DrawLine(size.x - FromDIP(5), FromDIP(4), size.x - FromDIP(5), FromDIP(11)); + dc.DrawLine(size.x - FromDIP(5), FromDIP(22), size.x - FromDIP(5), size.y - FromDIP(4)); + + //delta + dc.DrawLine(FromDIP(0), FromDIP(11), FromDIP(5), size.y / 2); + dc.DrawLine(FromDIP(0), FromDIP(22), FromDIP(5), size.y / 2); + + dc.DrawLine(size.x - FromDIP(5), FromDIP(11), size.x - FromDIP(1), size.y / 2); + dc.DrawLine(size.x - FromDIP(5), FromDIP(22), size.x - FromDIP(1), size.y / 2); + + + if (m_focus) { + dc.SetPen(wxPen(wxColour(0x00AE42), 2)); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawLine(FromDIP(0), FromDIP(1), size.x - FromDIP(5), FromDIP(1)); + dc.DrawLine(FromDIP(0), size.y - FromDIP(1), size.x - FromDIP(5), size.y - FromDIP(1)); + } + + if (m_selected) { + } + + auto tsize = dc.GetMultiLineTextExtent(m_index); + auto tpot = wxPoint((size.x - tsize.x) / 2 - FromDIP(2), (size.y - tsize.y) / 2 + FromDIP(2)); + dc.SetTextForeground(wxColour(0x6B6B6B)); + dc.SetFont(::Label::Head_12); + dc.DrawText(m_index, tpot); +} + +AmsRMArrow::AmsRMArrow(wxWindow* parent) +{ + + wxWindow::Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize); + SetBackgroundColour(*wxWHITE); + Bind(wxEVT_PAINT, &AmsRMArrow::paintEvent, this); + + m_bitmap_left = ScalableBitmap(this, "replace_arrow_left", 7); + m_bitmap_right = ScalableBitmap(this, "replace_arrow_right", 7); + m_bitmap_down = ScalableBitmap(this, "replace_arrow_down", 7); + + + SetSize(wxSize(FromDIP(16), FromDIP(32))); + SetMinSize(wxSize(FromDIP(16), FromDIP(32))); + SetMaxSize(wxSize(FromDIP(16), FromDIP(32))); +} + +void AmsRMArrow::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void AmsRMArrow::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 AmsRMArrow::doRender(wxDC& dc) +{ + wxSize size = GetSize(); + + dc.SetPen(wxPen(wxColour(0, 174, 66))); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + + + dc.SetPen(wxPen(wxColour(0xACACAC))); + dc.SetBrush(wxBrush(wxColour(0xACACAC))); + dc.DrawCircle(size.x / 2, size.y / 2, FromDIP(7)); +} + }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/AmsMappingPopup.hpp b/src/slic3r/GUI/AmsMappingPopup.hpp index 06fadaa82..7606a172f 100644 --- a/src/slic3r/GUI/AmsMappingPopup.hpp +++ b/src/slic3r/GUI/AmsMappingPopup.hpp @@ -239,6 +239,75 @@ public: }; +class AmsReplaceMaterialDialog : public DPIDialog +{ +public: + AmsReplaceMaterialDialog(wxWindow* parent); + ~AmsReplaceMaterialDialog() {}; + +public: + wxWindow* create_split_line(wxString gname, wxColour col, wxString material, std::vector status_list); + void create(); + void update_machine_obj(MachineObject* obj); + void on_left_down(wxMouseEvent& evt); + void paintEvent(wxPaintEvent& evt); + void on_dpi_changed(const wxRect &suggested_rect) override; + std::vector GetStatus(unsigned int status); + +public: + wxBoxSizer* m_main_sizer{nullptr}; + wxBoxSizer* m_groups_sizer{nullptr}; + + MachineObject* m_obj{nullptr}; +}; + + +enum RMTYPE { + RMTYPE_NORMAL = 0, + RMTYPE_VIRTUAL = 1, +}; + +class AmsRMItem : public wxWindow +{ +public: + AmsRMItem(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + ~AmsRMItem() {}; + +public: + void set_color(wxColour col) {m_color = col;}; + void set_type(RMTYPE type) {m_type = type;}; + void set_index(std::string index) {m_index = index;}; + void set_focus(bool focus) {m_focus = focus;}; + + void paintEvent(wxPaintEvent& evt); + void render(wxDC& dc); + void doRender(wxDC& dc); + +private: + RMTYPE m_type; + wxColour m_color; + std::string m_index; + bool m_focus = false; + bool m_selected = false; +}; + +class AmsRMArrow : public wxWindow +{ +public: + AmsRMArrow(wxWindow* parent); + ~AmsRMArrow() {}; + +public: + void paintEvent(wxPaintEvent& evt); + void render(wxDC& dc); + void doRender(wxDC& dc); + +private: + ScalableBitmap m_bitmap_left; + ScalableBitmap m_bitmap_right; + ScalableBitmap m_bitmap_down; +}; + wxDECLARE_EVENT(EVT_SET_FINISH_MAPPING, wxCommandEvent); }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index f890dc2be..9a35bde59 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -2673,6 +2673,21 @@ int MachineObject::parse_json(std::string payload) ; } + /*get filam_bak*/ + try { + if (jj.contains("filam_bak")) { + filam_bak.clear(); + if (jj["filam_bak"].is_array()) { + for (auto it = jj["filam_bak"].begin(); it != jj["filam_bak"].end(); it++) { + filam_bak.push_back(it.value().get()); + } + } + } + } + catch (...) { + ; + } + /* get fimware type */ try { if (jj.contains("lifecycle")) { diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 6c2b1ae0a..213341fd9 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -433,6 +433,8 @@ public: std::string get_printer_thumbnail_img_str(); std::string product_name; // set by iot service, get /user/print + std::vector filam_bak; + std::string bind_user_name; std::string bind_user_id; std::string bind_state; /* free | occupied */ diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 7f45a65ce..57d5fcd87 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -1197,8 +1197,28 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_sizer_prepare->Add(hyperlink_sizer, 0, wxALIGN_CENTER | wxALL, 5); + auto m_sizer_backup = new wxBoxSizer(wxHORIZONTAL); + auto m_ams_backup_tip = new Label(m_panel_prepare, _L("Ams filament backup")); + m_ams_backup_tip->SetFont(::Label::Head_12); + m_ams_backup_tip->SetForegroundColour(wxColour(0x00AE42)); + m_ams_backup_tip->SetBackgroundColour(*wxWHITE); + auto img_ams_backup = new wxStaticBitmap(m_panel_prepare, wxID_ANY, create_scaled_bitmap("automatic_material_renewal", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); + img_ams_backup->SetBackgroundColour(*wxWHITE); + + m_sizer_backup->Add(0, 0, 1, wxEXPAND, 0); + m_sizer_backup->Add(img_ams_backup, 0, wxALL, FromDIP(3)); + m_sizer_backup->Add(m_ams_backup_tip, 0, wxTOP, FromDIP(5)); + + m_ams_backup_tip->Bind(wxEVT_ENTER_WINDOW, [this, img_amsmapping_tip](auto& e) {SetCursor(wxCURSOR_HAND); }); + img_ams_backup->Bind(wxEVT_ENTER_WINDOW, [this, img_amsmapping_tip](auto& e) {SetCursor(wxCURSOR_HAND); }); + + m_ams_backup_tip->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); + img_ams_backup->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); + + m_ams_backup_tip->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {popup_filament_backup();}); + img_ams_backup->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {popup_filament_backup();}); + - m_sizer_pcont->Add(0, 0, 1, wxEXPAND, 0); m_button_ensure = new Button(m_panel_prepare, _L("Send")); m_button_ensure->SetBackgroundColor(btn_bg_enable); m_button_ensure->SetBorderColor(btn_bg_enable); @@ -1206,9 +1226,13 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_button_ensure->SetSize(SELECT_MACHINE_DIALOG_BUTTON_SIZE); m_button_ensure->SetMinSize(SELECT_MACHINE_DIALOG_BUTTON_SIZE); m_button_ensure->SetCornerRadius(FromDIP(12)); - m_button_ensure->Bind(wxEVT_BUTTON, &SelectMachineDialog::on_ok_btn, this); + + m_sizer_pcont->Add(m_sizer_backup, 0, wxEXPAND | wxBOTTOM, FromDIP(10)); + m_sizer_pcont->Add(0, 0, 1, wxEXPAND, 0); m_sizer_pcont->Add(m_button_ensure, 0, wxEXPAND | wxBOTTOM, FromDIP(10)); + + m_sizer_prepare->Add(m_sizer_pcont, 0, wxEXPAND, 0); m_panel_prepare->SetSizer(m_sizer_prepare); m_panel_prepare->Layout(); @@ -1335,6 +1359,17 @@ void SelectMachineDialog::check_fcous_state(wxWindow* window) } } +void SelectMachineDialog::popup_filament_backup() +{ + DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) return; + if (dev->get_selected_machine() && dev->get_selected_machine()->filam_bak.size() > 0) { + AmsReplaceMaterialDialog* m_replace_material_popup = new AmsReplaceMaterialDialog(this); + m_replace_material_popup->update_machine_obj(dev->get_selected_machine()); + m_replace_material_popup->ShowModal(); + } +} + wxWindow *SelectMachineDialog::create_ams_checkbox(wxString title, wxWindow *parent, wxString tooltip) { auto checkbox = new wxWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index 9da96621b..8326abc12 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -365,7 +365,8 @@ public: void check_focus(wxWindow* window); void check_fcous_state(wxWindow* window); - wxWindow *create_ams_checkbox(wxString title, wxWindow *parent, wxString tooltip); + void popup_filament_backup(); + wxWindow* create_ams_checkbox(wxString title, wxWindow* parent, wxString tooltip); wxWindow* create_item_checkbox(wxString title, wxWindow* parent, wxString tooltip, std::string param); void update_select_layout(MachineObject *obj); void prepare_mode(); diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index 3a1763118..c54cc26c4 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -1266,6 +1266,7 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co Bind(EVT_AMS_EXTRUSION_CALI, &StatusPanel::on_filament_extrusion_cali, this); Bind(EVT_AMS_LOAD, &StatusPanel::on_ams_load, this); Bind(EVT_AMS_UNLOAD, &StatusPanel::on_ams_unload, this); + Bind(EVT_AMS_FILAMENT_BACKUP, &StatusPanel::on_ams_filament_backup, this); Bind(EVT_AMS_SETTINGS, &StatusPanel::on_ams_setting_click, this); Bind(EVT_AMS_REFRESH_RFID, &StatusPanel::on_ams_refresh_rfid, this); Bind(EVT_AMS_ON_SELECTED, &StatusPanel::on_ams_selected, this); @@ -2651,6 +2652,15 @@ void StatusPanel::on_ams_unload(SimpleEvent &event) if (obj) { obj->command_ams_switch(255); } } +void StatusPanel::on_ams_filament_backup(SimpleEvent& event) +{ + if (obj && obj->filam_bak.size() > 0) { + AmsReplaceMaterialDialog* m_replace_material_popup = new AmsReplaceMaterialDialog(this); + m_replace_material_popup->update_machine_obj(obj); + m_replace_material_popup->ShowModal(); + } +} + void StatusPanel::on_ams_setting_click(SimpleEvent &event) { if (!m_ams_setting_dlg) m_ams_setting_dlg = new AMSSetting((wxWindow *) this, wxID_ANY); diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp index be3f1108f..7150c8653 100644 --- a/src/slic3r/GUI/StatusPanel.hpp +++ b/src/slic3r/GUI/StatusPanel.hpp @@ -277,6 +277,7 @@ protected: SecondaryCheckDialog* con_load_dlg = nullptr; SecondaryCheckDialog* ctrl_e_hint_dlg = nullptr; SecondaryCheckDialog* sdcard_hint_dlg = nullptr; + FanControlPopup* m_fan_control_popup{nullptr}; ExtrusionCalibration *m_extrusion_cali_dlg{nullptr}; @@ -340,7 +341,8 @@ protected: void on_ams_load(SimpleEvent &event); void on_ams_load_curr(); void on_ams_unload(SimpleEvent &event); - void on_ams_setting_click(SimpleEvent &event); + void on_ams_filament_backup(SimpleEvent& event); + void on_ams_setting_click(SimpleEvent& event); void on_filament_edit(wxCommandEvent &event); void on_ext_spool_edit(wxCommandEvent &event); void on_filament_extrusion_cali(wxCommandEvent &event); diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index f966cd8c0..74de27c1c 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -19,6 +19,7 @@ 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); @@ -1769,14 +1770,16 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons wxBoxSizer *m_sizer_bottom = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *m_sizer_left = new wxBoxSizer(wxVERTICAL); + //ams tip m_sizer_ams_tips = new wxBoxSizer(wxHORIZONTAL); - auto m_ams_tip = new wxStaticText(m_amswin, wxID_ANY, _L("AMS")); + auto m_ams_tip = new Label(m_amswin, _L("AMS")); m_ams_tip->SetFont(::Label::Body_12); m_ams_tip->SetBackgroundColour(*wxWHITE); auto img_amsmapping_tip = new wxStaticBitmap(m_amswin, wxID_ANY, create_scaled_bitmap("enable_ams", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); img_amsmapping_tip->SetBackgroundColour(*wxWHITE); - m_sizer_ams_tips->Add(m_ams_tip, 0, wxALIGN_CENTER, 0); - m_sizer_ams_tips->Add(img_amsmapping_tip, 0, wxALL, FromDIP(2)); + + m_sizer_ams_tips->Add(m_ams_tip, 0, wxTOP, FromDIP(5)); + m_sizer_ams_tips->Add(img_amsmapping_tip, 0, wxALL, FromDIP(3)); img_amsmapping_tip->Bind(wxEVT_ENTER_WINDOW, [this, img_amsmapping_tip](auto& e) { wxPoint img_pos = img_amsmapping_tip->ClientToScreen(wxPoint(0, 0)); @@ -1785,12 +1788,34 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_ams_introduce_popup.Position(popup_pos, wxSize(0, 0)); m_ams_introduce_popup.Popup(); }); - - img_amsmapping_tip->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) { + img_amsmapping_tip->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) { m_ams_introduce_popup.Dismiss(); }); + //backup tips + auto m_ams_backup_tip = new Label(m_amswin, _L("Ams filament backup")); + m_ams_backup_tip->SetFont(::Label::Head_12); + m_ams_backup_tip->SetForegroundColour(wxColour(0x00AE42)); + m_ams_backup_tip->SetBackgroundColour(*wxWHITE); + auto img_ams_backup = new wxStaticBitmap(m_amswin, wxID_ANY, create_scaled_bitmap("automatic_material_renewal", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); + img_ams_backup->SetBackgroundColour(*wxWHITE); + + m_sizer_ams_tips->Add( 0, 0, 1, wxEXPAND, 0 ); + m_sizer_ams_tips->Add(img_ams_backup, 0, wxALL, FromDIP(3)); + m_sizer_ams_tips->Add(m_ams_backup_tip, 0, wxTOP, FromDIP(5)); + + m_ams_backup_tip->Bind(wxEVT_ENTER_WINDOW, [this, img_amsmapping_tip](auto& e) {SetCursor(wxCURSOR_HAND);}); + img_ams_backup->Bind(wxEVT_ENTER_WINDOW, [this, img_amsmapping_tip](auto& e) {SetCursor(wxCURSOR_HAND);}); + + m_ams_backup_tip->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW);}); + 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));}); + 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)); @@ -1825,20 +1850,6 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_none_ams_panel->SetSizer(sizer_ams_panel_h); m_none_ams_panel->Layout(); - /*wxBoxSizer *sizer_ams_panel = new wxBoxSizer(wxHORIZONTAL); - AMSinfo none_ams = AMSinfo{ "0", std::vector{Caninfo{"0", wxEmptyString, *wxWHITE, AMSCanType::AMS_CAN_TYPE_EMPTY}} }; - auto amscans = new AmsCans(m_none_ams_panel, wxID_ANY, none_ams); - sizer_ams_panel->Add(amscans, 0, wxALL, 0); - sizer_ams_panel->Add(0, 0, 0, wxLEFT, 20); - auto m_tip_none_ams = new wxStaticText(m_none_ams_panel, wxID_ANY, _L("Click the pencil icon to edit the filament."), wxDefaultPosition, wxDefaultSize, 0); - m_tip_none_ams->Wrap(150); - m_tip_none_ams->SetFont(::Label::Body_13); - m_tip_none_ams->SetForegroundColour(AMS_CONTROL_GRAY500); - m_tip_none_ams->SetMinSize({150, -1}); - sizer_ams_panel->Add(m_tip_none_ams, 0, wxALIGN_CENTER, 0); - m_none_ams_panel->SetSizer(sizer_ams_panel); - m_none_ams_panel->Layout();*/ - m_simplebook_ams->AddPage(m_simplebook_cans, wxEmptyString, true); m_simplebook_ams->AddPage(m_none_ams_panel, wxEmptyString, false); @@ -1846,7 +1857,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_panel_can->Layout(); m_sizer_cans->Fit(m_panel_can); - m_sizer_left->Add(m_sizer_ams_tips, 0, wxALIGN_CENTER, 0); + 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); @@ -1888,6 +1899,9 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_button_area = new wxWindow(m_amswin, wxID_ANY); m_button_area->SetBackgroundColour(m_amswin->GetBackgroundColour()); + + + wxBoxSizer *m_sizer_button = new wxBoxSizer(wxVERTICAL); wxBoxSizer *m_sizer_button_area = new wxBoxSizer(wxHORIZONTAL); m_button_extrusion_cali = new Button(m_button_area, _L("Cali")); @@ -1914,7 +1928,9 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons 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_button_area->SetSizer(m_sizer_button_area); + m_sizer_button->Add(m_sizer_button_area, 0, 1, wxEXPAND, 0); + + m_button_area->SetSizer(m_sizer_button); m_button_area->Layout(); m_button_area->Fit(); @@ -2002,8 +2018,8 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_ams_introduce_popup.Dismiss(); }); - m_sizer_vams_tips->Add(m_vams_tip, 0, wxALIGN_CENTER, 0); - m_sizer_vams_tips->Add(img_vams_tip, 0, wxALL, FromDIP(2)); + m_sizer_vams_tips->Add(m_vams_tip, 0, wxTOP, FromDIP(5)); + m_sizer_vams_tips->Add(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)); diff --git a/src/slic3r/GUI/Widgets/AMSControl.hpp b/src/slic3r/GUI/Widgets/AMSControl.hpp index 8b1015b45..6ddb3ee55 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.hpp +++ b/src/slic3r/GUI/Widgets/AMSControl.hpp @@ -627,6 +627,7 @@ 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); diff --git a/src/slic3r/GUI/Widgets/Label.cpp b/src/slic3r/GUI/Widgets/Label.cpp index 43ab5efb2..8d23033bd 100644 --- a/src/slic3r/GUI/Widgets/Label.cpp +++ b/src/slic3r/GUI/Widgets/Label.cpp @@ -29,6 +29,7 @@ wxFont Label::Head_15; wxFont Label::Head_14; wxFont Label::Head_13; wxFont Label::Head_12; +wxFont Label::Head_11; wxFont Label::Head_10; wxFont Label::Body_16; @@ -62,6 +63,7 @@ void Label::initSysFont() Head_14 = Label::sysFont(14, true); Head_13 = Label::sysFont(13, true); Head_12 = Label::sysFont(12, true); + Head_11 = Label::sysFont(11, true); Head_10 = Label::sysFont(10, true); Body_16 = Label::sysFont(16, false); diff --git a/src/slic3r/GUI/Widgets/Label.hpp b/src/slic3r/GUI/Widgets/Label.hpp index 950601b92..e13faf560 100644 --- a/src/slic3r/GUI/Widgets/Label.hpp +++ b/src/slic3r/GUI/Widgets/Label.hpp @@ -33,6 +33,7 @@ public: static wxFont Head_14; static wxFont Head_13; static wxFont Head_12; + static wxFont Head_11; static wxFont Head_10; static wxFont Body_16;