diff --git a/resources/config.json b/resources/config.json
index 20489ed325..c69e70b33b 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 0000000000..a1138c5e6e
--- /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 0000000000..d46126623d
--- /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 0000000000..0c95675d13
--- /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 0000000000..76bb1f417b
--- /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 2b8f551e89..390d897629 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 06fadaa82a..7606a172ff 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 f890dc2be6..9a35bde598 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 6c2b1ae0a9..213341fd91 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 7f45a65ce2..57d5fcd874 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 9da96621b5..8326abc12e 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 3a1763118e..c54cc26c47 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 be3f1108f8..7150c8653a 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 f966cd8c02..74de27c1cc 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 8b1015b452..6ddb3ee55d 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 43ab5efb2b..8d23033bd7 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 950601b925..e13faf5602 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;