From 3925ceb9f4cf90f0255aabb82b93be16b1a0591a Mon Sep 17 00:00:00 2001 From: tao wang Date: Thu, 17 Nov 2022 21:23:52 +0800 Subject: [PATCH] ENH:add humidity display/surplus material Change-Id: I1a04df257c9b09fef7ff06cfa192644478a30716 --- resources/images/ams_humidity_0.svg | 11 ++ resources/images/ams_humidity_1.svg | 12 +++ resources/images/ams_humidity_2.svg | 12 +++ resources/images/ams_humidity_3.svg | 12 +++ resources/images/ams_humidity_4.svg | 12 +++ src/slic3r/GUI/DeviceManager.cpp | 14 ++- src/slic3r/GUI/DeviceManager.hpp | 1 + src/slic3r/GUI/Widgets/AMSControl.cpp | 140 ++++++++++++++++++++++---- src/slic3r/GUI/Widgets/AMSControl.hpp | 35 +++++-- 9 files changed, 218 insertions(+), 31 deletions(-) create mode 100644 resources/images/ams_humidity_0.svg create mode 100644 resources/images/ams_humidity_1.svg create mode 100644 resources/images/ams_humidity_2.svg create mode 100644 resources/images/ams_humidity_3.svg create mode 100644 resources/images/ams_humidity_4.svg diff --git a/resources/images/ams_humidity_0.svg b/resources/images/ams_humidity_0.svg new file mode 100644 index 000000000..9d31af6d0 --- /dev/null +++ b/resources/images/ams_humidity_0.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/resources/images/ams_humidity_1.svg b/resources/images/ams_humidity_1.svg new file mode 100644 index 000000000..0bc84fcf7 --- /dev/null +++ b/resources/images/ams_humidity_1.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/resources/images/ams_humidity_2.svg b/resources/images/ams_humidity_2.svg new file mode 100644 index 000000000..780dd0f0e --- /dev/null +++ b/resources/images/ams_humidity_2.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/resources/images/ams_humidity_3.svg b/resources/images/ams_humidity_3.svg new file mode 100644 index 000000000..398599dcc --- /dev/null +++ b/resources/images/ams_humidity_3.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/resources/images/ams_humidity_4.svg b/resources/images/ams_humidity_4.svg new file mode 100644 index 000000000..a6d5860e5 --- /dev/null +++ b/resources/images/ams_humidity_4.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 8e8e713b2..db6708467 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -334,7 +334,7 @@ MachineObject::MachineObject(NetworkAgent* agent, std::string name, std::string ams_insert_flag = false; ams_power_on_flag = false; ams_support_use_ams = false; - ams_humidity = -1; + ams_humidity = 5; /* signals */ wifi_signal = ""; @@ -2531,6 +2531,18 @@ int MachineObject::parse_json(std::string payload) } if (!curr_ams) continue; + if (it->contains("humidity")) { + std::string humidity = (*it)["humidity"].get(); + + try { + curr_ams->humidity = atoi(humidity.c_str()); + } + catch (...) { + ; + } + } + + if (it->contains("tray")) { std::set tray_id_set; for (auto it = curr_ams->trayList.begin(); it != curr_ams->trayList.end(); it++) { diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index d2342a6f9..d9cdea0f0 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -210,6 +210,7 @@ public: id = ams_id; } std::string id; + int humidity = 5; bool startup_read_opt{true}; bool tray_read_opt{false}; bool is_exists{false}; diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index e0f45aa5e..a5ebc754e 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -58,6 +58,7 @@ bool AMSinfo::parse_ams_info(Ams *ams) { if (!ams) return false; this->ams_id = ams->id; + this->ams_humidity = ams->humidity; cans.clear(); for (int i = 0; i < 4; i++) { auto it = ams->trayList.find(std::to_string(i)); @@ -79,6 +80,9 @@ bool AMSinfo::parse_ams_info(Ams *ams) } else { info.material_state = AMSCanType::AMS_CAN_TYPE_THIRDBRAND; } + + info.material_remain = it->second->remain < 0 ? 100 :it->second->remain; + } else { info.can_id = it->second->id; info.material_name = ""; @@ -521,6 +525,10 @@ void AMSLib::render(wxDC &dc) temp_text_colour = AMS_CONTROL_GRAY800; } + if (m_info.material_remain < 50) { + temp_text_colour = AMS_CONTROL_GRAY800; + } + //if (!wxWindow::IsEnabled()) { //temp_text_colour = AMS_CONTROL_DISABLE_TEXT_COLOUR; //} @@ -568,11 +576,16 @@ void AMSLib::render(wxDC &dc) void AMSLib::doRender(wxDC &dc) { - wxSize size = GetSize(); - auto tmp_lib_colour = m_info.material_colour; + wxSize size = GetSize(); + auto tmp_lib_colour = m_info.material_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); + if (tmp_lib_colour.GetLuminance() < 0.5) { temp_bitmap_third = m_bitmap_editable_light; temp_bitmap_brand = m_bitmap_readonly_light; @@ -581,6 +594,11 @@ void AMSLib::doRender(wxDC &dc) 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 (!wxWindow::IsEnabled()) { //tmp_lib_colour = AMS_CONTROL_DISABLE_COLOUR; //} @@ -598,11 +616,11 @@ void AMSLib::doRender(wxDC &dc) dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); dc.SetBrush(wxBrush(tmp_lib_colour)); - if (m_radius == 0) { - dc.DrawRectangle(0, 0, size.x, size.y); - } else { - dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4), size.x - FromDIP(8), size.y - FromDIP(8), m_radius); - } + /* if (m_radius == 0) { + dc.DrawRectangle(0, 0, size.x, size.y); + } else { + dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4), size.x - FromDIP(8), size.y - FromDIP(8), m_radius); + }*/ } if (!m_selected && m_hover) { @@ -610,26 +628,54 @@ void AMSLib::doRender(wxDC &dc) dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); if (m_radius == 0) { dc.DrawRectangle(0, 0, size.x, size.y); - } else { + } + else { dc.DrawRoundedRectangle(FromDIP(1), FromDIP(1), size.x - FromDIP(1), size.y - FromDIP(1), m_radius); } dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); dc.SetBrush(wxBrush(tmp_lib_colour)); - if (m_radius == 0) { + /* if (m_radius == 0) { dc.DrawRectangle(0, 0, size.x, size.y); } else { dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4), size.x - FromDIP(8), size.y - FromDIP(8), m_radius); - } + }*/ } else { dc.SetPen(wxPen(tmp_lib_colour, 1, wxSOLID)); dc.SetBrush(wxBrush(tmp_lib_colour)); - if (m_radius == 0) { + /*if (m_radius == 0) { dc.DrawRectangle(0, 0, size.x, size.y); } else { dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4), size.x - FromDIP(8), size.y - FromDIP(8), m_radius); + }*/ + } + + //draw remain + int height = size.y - FromDIP(8); + int curr_height = height * float(m_info.material_remain * 1.0 / 100.0); + + if (curr_height < FromDIP(6)) { + curr_height = FromDIP(6); + } + + int top = height - curr_height; + dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4) + top, size.x - FromDIP(8), curr_height, m_radius); + + if (top > 2) { + dc.DrawRectangle(FromDIP(4), FromDIP(4) + top, size.x - FromDIP(8), FromDIP(2)); + 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(4), FromDIP(4) + top, size.x - FromDIP(4), FromDIP(4) + top); } } + + + + //border + dc.SetPen(wxPen(wxColour(130, 130, 128), 1, wxSOLID)); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4), size.x - FromDIP(8), size.y - FromDIP(8), m_radius); // edit icon if (m_info.material_state != AMSCanType::AMS_CAN_TYPE_EMPTY && m_info.material_state != AMSCanType::AMS_CAN_TYPE_NONE) @@ -696,6 +742,12 @@ AMSRoad::AMSRoad(wxWindow *parent, wxWindowID id, Caninfo info, int canindex, in m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_LEFT; } + ams_humidity_0 = ScalableBitmap(this, "ams_humidity_0", 18); + ams_humidity_1 = ScalableBitmap(this, "ams_humidity_1", 18); + ams_humidity_2 = ScalableBitmap(this, "ams_humidity_2", 18); + ams_humidity_3 = ScalableBitmap(this, "ams_humidity_3", 18); + ams_humidity_4 = ScalableBitmap(this, "ams_humidity_4", 18); + create(parent, id, pos, size); Bind(wxEVT_PAINT, &AMSRoad::paintEvent, this); wxWindow::SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); @@ -703,8 +755,9 @@ AMSRoad::AMSRoad(wxWindow *parent, wxWindowID id, Caninfo info, int canindex, in void AMSRoad::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) { wxWindow::Create(parent, id, pos, size); } -void AMSRoad::Update(Caninfo info, int canindex, int maxcan) +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) { @@ -822,6 +875,27 @@ void AMSRoad::doRender(wxDC &dc) 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 == 5) { + dc.DrawBitmap(ams_humidity_0.bmp(), wxPoint(size.x - ams_humidity_0.GetBmpSize().x - FromDIP(4), size.y - ams_humidity_0.GetBmpSize().y - FromDIP(8))); + } + else if (m_amsinfo.ams_humidity == 4) { + dc.DrawBitmap(ams_humidity_1.bmp(), wxPoint(size.x - ams_humidity_0.GetBmpSize().x - FromDIP(4), size.y - ams_humidity_0.GetBmpSize().y - FromDIP(8))); + } + else if (m_amsinfo.ams_humidity == 3) { + dc.DrawBitmap(ams_humidity_2.bmp(), wxPoint(size.x - ams_humidity_0.GetBmpSize().x - FromDIP(4), size.y - ams_humidity_0.GetBmpSize().y - FromDIP(8))); + } + else if (m_amsinfo.ams_humidity == 2) { + dc.DrawBitmap(ams_humidity_3.bmp(), wxPoint(size.x - ams_humidity_0.GetBmpSize().x - FromDIP(4), size.y - ams_humidity_0.GetBmpSize().y - FromDIP(8))); + } + else if (m_amsinfo.ams_humidity == 1) { + dc.DrawBitmap(ams_humidity_4.bmp(), wxPoint(size.x - ams_humidity_0.GetBmpSize().x - FromDIP(4), size.y - ams_humidity_0.GetBmpSize().y - FromDIP(8))); + } + else { + dc.DrawBitmap(ams_humidity_0.bmp(), wxPoint(size.x - ams_humidity_0.GetBmpSize().x - FromDIP(4), size.y - ams_humidity_0.GetBmpSize().y - FromDIP(8))); + } + } } void AMSRoad::UpdatePassRoad(int tag_index, AMSPassRoadType type, AMSPassRoadSTEP step) {} @@ -886,13 +960,19 @@ AMSItem::AMSItem() {} AMSItem::AMSItem(wxWindow *parent, wxWindowID id, AMSinfo amsinfo, const wxSize cube_size, const wxPoint &pos, const wxSize &size) : AMSItem() { + + ams_humidity_0 = ScalableBitmap(this, "ams_humidity_0", 18); + ams_humidity_1 = ScalableBitmap(this, "ams_humidity_1", 18); + ams_humidity_2 = ScalableBitmap(this, "ams_humidity_2", 18); + ams_humidity_3 = ScalableBitmap(this, "ams_humidity_3", 18); + ams_humidity_4 = ScalableBitmap(this, "ams_humidity_4", 18); + m_amsinfo = amsinfo; m_cube_size = cube_size; create(parent, id, pos, size); Bind(wxEVT_PAINT, &AMSItem::paintEvent, this); Bind(wxEVT_ENTER_WINDOW, &AMSItem::OnEnterWindow, this); Bind(wxEVT_LEAVE_WINDOW, &AMSItem::OnLeaveWindow, this); - // Bind(wxEVT_LEFT_DOWN, &AMSItem::OnSelected, this); } void AMSItem::Open() @@ -1025,12 +1105,30 @@ void AMSItem::doRender(wxDC &dc) dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); dc.DrawLine(left, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, left, ((size.y - AMS_ITEM_CUBE_SIZE.y) / 2) + AMS_ITEM_CUBE_SIZE.y); - left += m_space; - dc.SetFont(::Label::Body_13); - dc.SetTextForeground(AMS_CONTROL_GRAY800); - auto tsize = dc.GetTextExtent("00% RH"); - auto text = wxString::Format("%d%% RH", m_humidity); - dc.DrawText(text, wxPoint(left, (size.y - tsize.y) / 2)); + left += m_space + m_space / 2; + /* dc.SetFont(::Label::Body_13); + dc.SetTextForeground(AMS_CONTROL_GRAY800); + auto tsize = dc.GetTextExtent("00% RH"); + auto text = wxString::Format("%d%% RH", m_humidity);*/ + + if (m_amsinfo.ams_humidity == 5) { + dc.DrawBitmap(ams_humidity_0.bmp(), wxPoint(left, (size.y - ams_humidity_0.GetBmpSize().y) / 2)); + } + else if (m_amsinfo.ams_humidity == 4) { + dc.DrawBitmap(ams_humidity_1.bmp(), wxPoint(left, (size.y - ams_humidity_1.GetBmpSize().y) / 2)); + } + else if (m_amsinfo.ams_humidity == 3) { + dc.DrawBitmap(ams_humidity_2.bmp(), wxPoint(left, (size.y - ams_humidity_2.GetBmpSize().y) / 2)); + } + else if (m_amsinfo.ams_humidity == 2) { + dc.DrawBitmap(ams_humidity_3.bmp(), wxPoint(left, (size.y - ams_humidity_3.GetBmpSize().y) / 2)); + } + else if (m_amsinfo.ams_humidity == 1) { + dc.DrawBitmap(ams_humidity_4.bmp(), wxPoint(left, (size.y - ams_humidity_4.GetBmpSize().y) / 2)); + } + else { + dc.DrawBitmap(ams_humidity_0.bmp(), wxPoint(left, (size.y - ams_humidity_0.GetBmpSize().y) / 2)); + } } auto border_colour = AMS_CONTROL_BRAND_COLOUR; @@ -1107,7 +1205,7 @@ void AmsCans::Update(AMSinfo info) for (auto i = 0; i < m_can_road_list.GetCount(); i++) { CanRoads *road = m_can_road_list[i]; if (i < m_can_count) { - road->canRoad->Update(info.cans[i], i, m_can_count); + road->canRoad->Update(m_info, info.cans[i], i, m_can_count); road->canRoad->Show(); } else { road->canRoad->Hide(); @@ -1902,7 +2000,7 @@ void AMSControl::SwitchAms(std::string ams_id) //item->amsItem->HideHumidity(); } m_sizer_top->Layout(); - // m_panel_top->Fit(); + m_panel_top->Fit(); } for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { diff --git a/src/slic3r/GUI/Widgets/AMSControl.hpp b/src/slic3r/GUI/Widgets/AMSControl.hpp index 5694b076d..8041754d4 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.hpp +++ b/src/slic3r/GUI/Widgets/AMSControl.hpp @@ -21,6 +21,7 @@ #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)) @@ -94,7 +95,7 @@ enum FilamentStep { #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(150), FromDIP(27)) +#define AMS_ITEM_HUMIDITY_SIZE wxSize(FromDIP(120), FromDIP(27)) #define AMS_CAN_LIB_SIZE wxSize(FromDIP(58), FromDIP(80)) #define AMS_CAN_ROAD_SIZE wxSize(FromDIP(66), FromDIP(60)) #define AMS_CAN_ITEM_HEIGHT_SIZE FromDIP(27) @@ -111,18 +112,19 @@ struct Caninfo wxString material_name; wxColour material_colour = {*wxWHITE}; AMSCanType material_state; + int material_remain = 100; }; struct AMSinfo { public: - std::string ams_id; - std::vector cans; - - std::string current_can_id; - AMSPassRoadSTEP current_step; - AMSAction current_action; - int curreent_filamentstep; + 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 parse_ams_info(Ams *ams); }; @@ -268,6 +270,7 @@ public: 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}; @@ -277,7 +280,15 @@ public: double m_radius = {4}; wxColour m_road_def_color; wxColour m_road_color; - void Update(Caninfo info, int canindex, int maxcan); + void Update(AMSinfo amsinfo, Caninfo info, int canindex, int maxcan); + + ScalableBitmap ams_humidity_0; + ScalableBitmap ams_humidity_1; + ScalableBitmap ams_humidity_2; + ScalableBitmap ams_humidity_3; + ScalableBitmap ams_humidity_4; + bool m_show_humidity = { false }; + int m_humidity = { 0 }; void SetPassRoadColour(wxColour col); void SetMode(AMSRoadMode mode); @@ -313,7 +324,13 @@ public: void HideHumidity(); void SetHumidity(int humidity); virtual bool Enable(bool enable = true); + AMSinfo m_amsinfo; + ScalableBitmap ams_humidity_0; + ScalableBitmap ams_humidity_1; + ScalableBitmap ams_humidity_2; + ScalableBitmap ams_humidity_3; + ScalableBitmap ams_humidity_4; protected: wxSize m_cube_size;