diff --git a/src/slic3r/GUI/AMSSetting.cpp b/src/slic3r/GUI/AMSSetting.cpp index 41681556d..4baaf95c3 100644 --- a/src/slic3r/GUI/AMSSetting.cpp +++ b/src/slic3r/GUI/AMSSetting.cpp @@ -26,8 +26,7 @@ void AMSSetting::create() m_panel_body = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, -1), wxTAB_TRAVERSAL); m_panel_body->SetBackgroundColour(*wxWHITE); - wxBoxSizer *m_sizerl_body; - m_sizerl_body = new wxBoxSizer(wxVERTICAL); + wxBoxSizer *m_sizerl_body = new wxBoxSizer(wxVERTICAL); // checkbox area 1 @@ -46,8 +45,7 @@ void AMSSetting::create() m_title_Insert_material_auto_read->Wrap(AMS_SETTING_BODY_WIDTH); m_sizer_Insert_material->Add(m_title_Insert_material_auto_read, 1, wxALL | wxEXPAND, 0); - m_sizerl_body->Add(m_sizer_Insert_material, 0, wxEXPAND, 0); - m_sizerl_body->Add(0, 0, 0, wxTOP, 8); + wxBoxSizer *m_sizer_Insert_material_tip = new wxBoxSizer(wxHORIZONTAL); m_sizer_Insert_material_tip_inline = new wxBoxSizer(wxVERTICAL); @@ -89,31 +87,23 @@ void AMSSetting::create() m_sizer_Insert_material_tip_inline->Add(m_tip_Insert_material_line3, 0, wxEXPAND, 0); m_sizer_Insert_material_tip->Add(m_sizer_Insert_material_tip_inline, 1, wxALIGN_CENTER, 0); - m_sizerl_body->Add(m_sizer_Insert_material_tip, 0, wxEXPAND | wxLEFT, 18); + // checkbox area 2 - m_sizerl_body->Add(0, 0, 0, wxTOP, 15); wxBoxSizer *m_sizer_starting = new wxBoxSizer(wxHORIZONTAL); - m_checkbox_starting_auto_read = new ::CheckBox(m_panel_body); m_checkbox_starting_auto_read->Bind(wxEVT_TOGGLEBUTTON, &AMSSetting::on_starting_read, this); m_sizer_starting->Add(m_checkbox_starting_auto_read, 0, wxTOP, 1); - m_sizer_starting->Add(0, 0, 0, wxLEFT, 12); - - m_title_starting_auto_read = new wxStaticText(m_panel_body, wxID_ANY, _L("Power on update"), wxDefaultPosition, - wxDefaultSize, 0); + m_title_starting_auto_read = new wxStaticText(m_panel_body, wxID_ANY, _L("Power on update"), wxDefaultPosition,wxDefaultSize, 0); m_title_starting_auto_read->SetFont(::Label::Head_13); m_title_starting_auto_read->SetForegroundColour(AMS_SETTING_GREY800); m_title_starting_auto_read->Wrap(AMS_SETTING_BODY_WIDTH); m_sizer_starting->Add(m_title_starting_auto_read, 1, wxEXPAND, 0); - m_sizerl_body->Add(m_sizer_starting, 0, wxEXPAND|wxTOP, FromDIP(8)); - - m_sizerl_body->Add(0, 0, 0, wxTOP, 8); + wxBoxSizer *m_sizer_starting_tip = new wxBoxSizer(wxHORIZONTAL); - m_sizer_starting_tip->Add(0, 0, 0, wxLEFT, 10); // tip line @@ -136,51 +126,98 @@ void AMSSetting::create() m_tip_starting_line2->SetSize(wxSize(AMS_SETTING_BODY_WIDTH, -1)); m_tip_starting_line2->Wrap(AMS_SETTING_BODY_WIDTH); m_sizer_starting_tip_inline->Add(m_tip_starting_line2, 0, wxEXPAND,0); - m_sizer_starting_tip->Add(m_sizer_starting_tip_inline, 1, wxALIGN_CENTER, 0); - m_sizerl_body->Add(m_sizer_starting_tip, 0, wxLEFT, 18); + // checkbox area 3 + wxBoxSizer* m_sizer_remain = new wxBoxSizer(wxHORIZONTAL); + m_checkbox_remain = new ::CheckBox(m_panel_body); + m_checkbox_remain->Bind(wxEVT_TOGGLEBUTTON, &AMSSetting::on_remain, this); + m_sizer_remain->Add(m_checkbox_remain, 0, wxTOP, 1); + m_sizer_remain->Add(0, 0, 0, wxLEFT, 12); + m_title_remain = new wxStaticText(m_panel_body, wxID_ANY, _L("Update remaining capacity"), wxDefaultPosition, wxDefaultSize, 0); + m_title_remain->SetFont(::Label::Head_13); + m_title_remain->SetForegroundColour(AMS_SETTING_GREY800); + m_title_remain->Wrap(AMS_SETTING_BODY_WIDTH); + m_sizer_remain->Add(m_title_remain, 1, wxEXPAND, 0); - m_sizerl_body->Add(0, 0, 0, wxTOP, 6); + + + wxBoxSizer* m_sizer_remain_tip = new wxBoxSizer(wxHORIZONTAL); + m_sizer_remain_tip->Add(0, 0, 0, wxLEFT, 10); + + // tip line + m_sizer_remain_inline = new wxBoxSizer(wxVERTICAL); + + m_tip_remain_line1 = new wxStaticText(m_panel_body, wxID_ANY, + _L("The AMS will estimate Bambu filament's remaining capacity after the filament info is updated. During printing, remaining capacity will be updated automatically."), + wxDefaultPosition, wxDefaultSize, 0); + m_tip_remain_line1->SetFont(::Label::Body_13); + m_tip_remain_line1->SetForegroundColour(AMS_SETTING_GREY700); + m_tip_remain_line1->SetSize(wxSize(AMS_SETTING_BODY_WIDTH, -1)); + m_tip_remain_line1->Wrap(AMS_SETTING_BODY_WIDTH); + m_sizer_remain_inline->Add(m_tip_remain_line1, 0, wxEXPAND, 0); + m_sizer_remain_tip->Add(m_sizer_remain_inline, 1, wxALIGN_CENTER, 0); + + // checkbox area 4 + wxBoxSizer* m_sizer_switch_filament = new wxBoxSizer(wxHORIZONTAL); + m_checkbox_switch_filament = new ::CheckBox(m_panel_body); + m_checkbox_switch_filament->Bind(wxEVT_TOGGLEBUTTON, &AMSSetting::on_switch_filament, this); + m_sizer_switch_filament->Add(m_checkbox_switch_filament, 0, wxTOP, 1); + m_sizer_switch_filament->Add(0, 0, 0, wxLEFT, 12); + m_title_switch_filament = new wxStaticText(m_panel_body, wxID_ANY, _L("AMS auto switch filament"), wxDefaultPosition, wxDefaultSize, 0); + m_title_switch_filament->SetFont(::Label::Head_13); + m_title_switch_filament->SetForegroundColour(AMS_SETTING_GREY800); + m_title_switch_filament->Wrap(AMS_SETTING_BODY_WIDTH); + m_sizer_switch_filament->Add(m_title_switch_filament, 1, wxEXPAND, 0); + + + + wxBoxSizer* m_sizer_switch_filament_tip = new wxBoxSizer(wxHORIZONTAL); + m_sizer_switch_filament_tip->Add(0, 0, 0, wxLEFT, 10); + + // tip line + m_sizer_switch_filament_inline = new wxBoxSizer(wxVERTICAL); + + m_tip_switch_filament_line1 = new wxStaticText(m_panel_body, wxID_ANY, + _L("AMS switches to the same type of filament automatically when the current filament runs out."), + wxDefaultPosition, wxDefaultSize, 0); + m_tip_switch_filament_line1->SetFont(::Label::Body_13); + m_tip_switch_filament_line1->SetForegroundColour(AMS_SETTING_GREY700); + m_tip_switch_filament_line1->SetSize(wxSize(AMS_SETTING_BODY_WIDTH, -1)); + m_tip_switch_filament_line1->Wrap(AMS_SETTING_BODY_WIDTH); + m_sizer_switch_filament_inline->Add(m_tip_switch_filament_line1, 0, wxEXPAND, 0); + m_sizer_switch_filament_tip->Add(m_sizer_switch_filament_inline, 1, wxALIGN_CENTER, 0); + // panel img - m_panel_img = new wxPanel(m_panel_body, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + wxPanel* m_panel_img = new wxPanel(m_panel_body, wxID_ANY, wxDefaultPosition, wxDefaultSize); m_panel_img->SetBackgroundColour(AMS_SETTING_GREY200); - wxBoxSizer *m_sizer_img = new wxBoxSizer(wxVERTICAL); - auto img = new wxStaticBitmap(m_panel_img, wxID_ANY, create_scaled_bitmap("ams_icon", nullptr, 126), wxDefaultPosition, wxDefaultSize); m_sizer_img->Add(img, 0, wxALIGN_CENTER | wxTOP, 26); - m_sizer_img->Add(0, 0, 0, wxTOP, 18); - - /* wxBoxSizer *m_sizer_ams_img_tip = new wxBoxSizer(wxVERTICAL); - m_tip_ams_img = new wxStaticText(m_panel_img, wxID_ANY, _L("Click the automatic calibration button to enter the AMS initialization setup program"), wxDefaultPosition, - wxDefaultSize, 0); - m_tip_ams_img->SetFont(::Label::Body_13); - m_tip_ams_img->SetForegroundColour(AMS_SETTING_GREY700); - m_tip_ams_img->Wrap(AMS_SETTING_BODY_WIDTH); - m_sizer_ams_img_tip->Add(m_tip_ams_img, 0, wxALIGN_CENTER, 0); - - m_button_auto_demarcate = new Button(m_panel_img, _L("Auto Calibration")); - StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), - std::pair(wxColour(0, 174, 66), StateColor::Normal)); - m_button_auto_demarcate->SetBackgroundColor(btn_bg_green); - m_button_auto_demarcate->SetBorderColor(wxColour(0, 174, 66)); - m_button_auto_demarcate->SetTextColor(AMS_SETTING_GREY200); - m_button_auto_demarcate->SetMinSize(AMS_SETTING_BUTTON_SIZE); - m_button_auto_demarcate->SetCornerRadius(12); - m_button_auto_demarcate->Bind(wxEVT_LEFT_DOWN, &AMSSetting::on_select_ok, this); - - m_sizer_img->Add(m_sizer_ams_img_tip, 1, wxALIGN_CENTER, 0); - m_sizer_img->Add(0, 0, 0, wxTOP, 12); - m_sizer_img->Add(m_button_auto_demarcate, 0, wxALIGN_CENTER, 0); - m_sizer_img->Add(0, 0, 0, wxBOTTOM, 17);*/ - m_panel_img->SetSizer(m_sizer_img); m_panel_img->Layout(); m_sizer_img->Fit(m_panel_img); - m_sizerl_body->Add(0,0,0,wxTOP, FromDIP(5)); + + + m_sizerl_body->Add(m_sizer_Insert_material, 0, wxEXPAND, 0); + m_sizerl_body->Add(0, 0, 0, wxTOP, 8); + m_sizerl_body->Add(m_sizer_Insert_material_tip, 0, wxEXPAND | wxLEFT, 18); + m_sizerl_body->Add(0, 0, 0, wxTOP, 15); + m_sizerl_body->Add(m_sizer_starting, 0, wxEXPAND | wxTOP, FromDIP(8)); + m_sizerl_body->Add(0, 0, 0, wxTOP, 8); + m_sizerl_body->Add(m_sizer_starting_tip, 0, wxLEFT, 18); + m_sizerl_body->Add(0, 0, 0, wxTOP, 15); + m_sizerl_body->Add(m_sizer_remain, 0, wxEXPAND | wxTOP, FromDIP(8)); + m_sizerl_body->Add(0, 0, 0, wxTOP, 8); + m_sizerl_body->Add(m_sizer_remain_tip, 0, wxLEFT, 18); + m_sizerl_body->Add(0, 0, 0, wxTOP, 15); + m_sizerl_body->Add(m_sizer_switch_filament, 0, wxEXPAND | wxTOP, FromDIP(8)); + m_sizerl_body->Add(0, 0, 0, wxTOP, 8); + m_sizerl_body->Add(m_sizer_switch_filament_tip, 0, wxLEFT, 18); + m_sizerl_body->Add(0, 0, 0, wxTOP, 6); + m_sizerl_body->Add(0, 0, 0, wxTOP, FromDIP(5)); m_sizerl_body->Add(m_panel_img, 1, wxEXPAND | wxALL, FromDIP(5)); m_panel_body->SetSizer(m_sizerl_body); @@ -228,6 +265,17 @@ void AMSSetting::update_starting_read_mode(bool selected) Fit(); } +void AMSSetting::update_remain_mode(bool selected) +{ + m_checkbox_remain->SetValue(selected); +} + +void AMSSetting::update_switch_filament(bool selected) +{ + m_checkbox_switch_filament->SetValue(selected); +} + + void AMSSetting::on_select_ok(wxMouseEvent &event) { if (obj) { @@ -253,8 +301,9 @@ void AMSSetting::on_insert_material_read(wxCommandEvent &event) bool start_read_opt = m_checkbox_starting_auto_read->GetValue(); bool tray_read_opt = m_checkbox_Insert_material_auto_read->GetValue(); + bool remain_opt = m_checkbox_remain->GetValue(); - obj->command_ams_user_settings(ams_id, start_read_opt, tray_read_opt); + obj->command_ams_user_settings(ams_id, start_read_opt, tray_read_opt, remain_opt); m_sizer_Insert_material_tip_inline->Layout(); Layout(); @@ -278,8 +327,9 @@ void AMSSetting::on_starting_read(wxCommandEvent &event) bool start_read_opt = m_checkbox_starting_auto_read->GetValue(); bool tray_read_opt = m_checkbox_Insert_material_auto_read->GetValue(); + bool remain_opt = m_checkbox_remain->GetValue(); - obj->command_ams_user_settings(ams_id, start_read_opt, tray_read_opt); + obj->command_ams_user_settings(ams_id, start_read_opt, tray_read_opt, remain_opt); m_sizer_starting_tip_inline->Layout(); Layout(); @@ -288,6 +338,22 @@ void AMSSetting::on_starting_read(wxCommandEvent &event) event.Skip(); } +void AMSSetting::on_remain(wxCommandEvent& event) +{ + bool start_read_opt = m_checkbox_starting_auto_read->GetValue(); + bool tray_read_opt = m_checkbox_Insert_material_auto_read->GetValue(); + bool remain_opt = m_checkbox_remain->GetValue(); + obj->command_ams_user_settings(ams_id, start_read_opt, tray_read_opt, remain_opt); + event.Skip(); +} + +void AMSSetting::on_switch_filament(wxCommandEvent& event) +{ + bool switch_filament = m_checkbox_switch_filament->GetValue(); + obj->command_ams_switch_filament(switch_filament); + event.Skip(); +} + wxString AMSSetting::append_title(wxString text) { wxString lab; diff --git a/src/slic3r/GUI/AMSSetting.hpp b/src/slic3r/GUI/AMSSetting.hpp index fdb0950d5..7958fa1a0 100644 --- a/src/slic3r/GUI/AMSSetting.hpp +++ b/src/slic3r/GUI/AMSSetting.hpp @@ -29,9 +29,13 @@ public: void update_insert_material_read_mode(bool selected); void update_starting_read_mode(bool selected); - void on_select_ok(wxMouseEvent &event); + void update_remain_mode(bool selected); + void update_switch_filament(bool selected); + void on_select_ok(wxMouseEvent& event); void on_insert_material_read(wxCommandEvent &event); void on_starting_read(wxCommandEvent &event); + void on_remain(wxCommandEvent& event); + void on_switch_filament(wxCommandEvent& event); wxString append_title(wxString text); wxStaticText *append_text(wxString text); MachineObject *obj{nullptr}; @@ -47,16 +51,27 @@ protected: wxStaticText *m_tip_Insert_material_line1; wxStaticText *m_tip_Insert_material_line2; wxStaticText *m_tip_Insert_material_line3; + CheckBox * m_checkbox_starting_auto_read; wxStaticText *m_title_starting_auto_read; wxStaticText *m_tip_starting_line1; wxStaticText *m_tip_starting_line2; - wxPanel * m_panel_img; + + CheckBox * m_checkbox_remain; + wxStaticText *m_title_remain; + wxStaticText *m_tip_remain_line1; + + CheckBox* m_checkbox_switch_filament; + wxStaticText* m_title_switch_filament; + wxStaticText* m_tip_switch_filament_line1; + wxStaticText *m_tip_ams_img; Button * m_button_auto_demarcate; wxBoxSizer *m_sizer_Insert_material_tip_inline; wxBoxSizer *m_sizer_starting_tip_inline; + wxBoxSizer *m_sizer_remain_inline; + wxBoxSizer *m_sizer_switch_filament_inline; }; }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index db6708467..bff43f705 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -334,6 +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_calibrate_remain_flag = false; ams_humidity = 5; /* signals */ @@ -1142,7 +1143,14 @@ void MachineObject::parse_status(int flag) camera_recording = ((flag >> 5) & 0x1) != 0; ams_calibrate_remain_flag = ((flag >> 7) & 0x1) != 0; + + if (ams_print_option_count > 0) + ams_print_option_count--; + else { + ams_auto_switch_filament_flag = ((flag >> 10) & 0x1) != 0; + } } + PrintingSpeedLevel MachineObject::_parse_printing_speed_lvl(int lvl) { @@ -1496,6 +1504,20 @@ int MachineObject::command_set_printing_option(bool auto_recovery) return this->publish_json(j.dump()); } +int MachineObject::command_ams_switch_filament(bool switch_filament) +{ + json j; + j["print"]["command"] = "print_option"; + j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["print"]["auto_switch_filament"] = switch_filament; + + ams_auto_switch_filament_flag = switch_filament; + BOOST_LOG_TRIVIAL(trace) << "command_ams_filament_settings:" << switch_filament; + ams_print_option_count = HOLD_COUNT_MAX; + + return this->publish_json(j.dump()); +} + int MachineObject::command_axis_control(std::string axis, double unit, double value, int speed) { char cmd[256]; @@ -2488,6 +2510,9 @@ int MachineObject::parse_json(std::string payload) if (jj["ams"].contains("power_on_flag")) { ams_power_on_flag = jj["ams"]["power_on_flag"].get(); } + if (jj["ams"].contains("calibrate_remain_flag")) { + ams_calibrate_remain_flag = jj["ams"]["calibrate_remain_flag"].get(); + } } } if (ams_exist_bits != last_ams_exist_bits diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index d9cdea0f0..f4f11e5a3 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -187,7 +187,7 @@ public: bool is_bbl; bool is_exists = false; int hold_count = 0; - int remain; // filament remain: 0 ~ 100 + int remain = 0; // filament remain: 0 ~ 100 AmsRoadPosition road_position; AmsStep step_state; @@ -395,6 +395,7 @@ public: bool ams_insert_flag { false }; bool ams_power_on_flag { false }; bool ams_calibrate_remain_flag { false }; + bool ams_auto_switch_filament_flag { false }; bool ams_support_use_ams { false }; int ams_humidity; int ams_user_setting_hold_count = 0; @@ -540,6 +541,7 @@ public: int xcam_buildplate_marker_hold_count = 0; bool xcam_auto_recovery_step_loss{ false }; int xcam_auto_recovery_hold_count = 0; + int ams_print_option_count = 0; /* HMS */ std::vector hms_list; @@ -597,6 +599,7 @@ public: int command_ams_change_filament(int tray_id, int old_temp = 210, int new_temp = 210); int command_ams_user_settings(int ams_id, bool start_read_opt, bool tray_read_opt, bool remain_flag = false); int command_ams_user_settings(int ams_id, AmsOptionType op, bool value); + int command_ams_switch_filament(bool switch_filament); int command_ams_calibrate(int ams_id); int command_ams_filament_settings(int ams_id, int tray_id, std::string setting_id, std::string tray_color, std::string tray_type, int nozzle_temp_min, int nozzle_temp_max); int command_ams_select_tray(std::string tray_id); diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index 7a2033ad6..3ed682289 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -1656,6 +1656,8 @@ void StatusPanel::update_ams(MachineObject *obj) if (obj && m_ams_setting_dlg->IsShown()) { m_ams_setting_dlg->update_insert_material_read_mode(obj->ams_insert_flag); m_ams_setting_dlg->update_starting_read_mode(obj->ams_power_on_flag); + m_ams_setting_dlg->update_remain_mode(obj->ams_calibrate_remain_flag); + m_ams_setting_dlg->update_switch_filament(obj->ams_auto_switch_filament_flag); } } if (m_filament_setting_dlg) { m_filament_setting_dlg->obj = obj; } @@ -1686,7 +1688,7 @@ void StatusPanel::update_ams(MachineObject *obj) 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(ams->second)) ams_info.push_back(info); + if (ams->second->is_exists && info.parse_ams_info(ams->second, obj->ams_calibrate_remain_flag)) ams_info.push_back(info); } //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) { diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index dbdfaf097..97e430e29 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -54,7 +54,7 @@ static wxColour decode_color(const std::string &color) return wxColour(ret[0], ret[1], ret[2]); } -bool AMSinfo::parse_ams_info(Ams *ams) +bool AMSinfo::parse_ams_info(Ams *ams, bool remain_flag) { if (!ams) return false; this->ams_id = ams->id; @@ -81,8 +81,14 @@ bool AMSinfo::parse_ams_info(Ams *ams) info.material_state = AMSCanType::AMS_CAN_TYPE_THIRDBRAND; } - info.material_remain = it->second->remain < 0 ? 100 :it->second->remain; - info.material_remain = it->second->remain > 100 ? 100 :info.material_remain; + if (!remain_flag) { + info.material_remain = 100; + } + else { + info.material_remain = it->second->remain < 0 ? 100 : it->second->remain; + info.material_remain = it->second->remain > 100 ? 100 : info.material_remain; + } + } else { info.can_id = it->second->id; diff --git a/src/slic3r/GUI/Widgets/AMSControl.hpp b/src/slic3r/GUI/Widgets/AMSControl.hpp index 8041754d4..e962c350a 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.hpp +++ b/src/slic3r/GUI/Widgets/AMSControl.hpp @@ -126,7 +126,7 @@ public: int curreent_filamentstep; int ams_humidity = 0; - bool parse_ams_info(Ams *ams); + bool parse_ams_info(Ams *ams, bool remain_flag = false); }; /*************************************************