#include "AMSControl.hpp" #include "Label.hpp" #include "../BitmapCache.hpp" #include "../I18N.hpp" #include "../GUI_App.hpp" #include "slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h" #include #include #include #include "CalibUtils.hpp" namespace Slic3r { namespace GUI { /************************************************* Description:AMSControl **************************************************/ // WX_DEFINE_OBJARRAY(AmsItemsHash); AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) : wxSimplebook(parent, wxID_ANY, pos, size) , m_Humidity_tip_popup(AmsHumidityTipPopup(this)) , m_percent_humidity_dry_popup(new uiAmsPercentHumidityDryPopup(this)) , m_ams_introduce_popup(AmsIntroducePopup(this)) { SetBackgroundColour(*wxWHITE); // normal mode //Freeze(); wxBoxSizer *m_sizer_body = new wxBoxSizer(wxVERTICAL); m_amswin = new wxWindow(this, wxID_ANY, wxDefaultPosition, wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); m_amswin->SetBackgroundColour(*wxWHITE); // top - ams tag m_simplebook_amsitems = new wxSimplebook(m_amswin, wxID_ANY); m_simplebook_amsitems->SetSize(wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); m_simplebook_amsitems->SetMinSize(wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); auto m_sizer_amsitems = new wxBoxSizer(wxHORIZONTAL); m_simplebook_amsitems->SetSizer(m_sizer_amsitems); m_simplebook_amsitems->Layout(); m_sizer_amsitems->Fit(m_simplebook_amsitems); m_panel_top = new wxPanel(m_simplebook_amsitems, wxID_ANY, wxDefaultPosition, wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); m_sizer_top = new wxBoxSizer(wxHORIZONTAL); m_panel_top->SetSizer(m_sizer_top); m_panel_top->Layout(); m_sizer_top->Fit(m_panel_top); auto m_panel_top_empty = new wxPanel(m_simplebook_amsitems, wxID_ANY, wxDefaultPosition, wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); auto m_sizer_top_empty = new wxBoxSizer(wxHORIZONTAL); m_panel_top_empty->SetSizer(m_sizer_top_empty); m_panel_top_empty->Layout(); m_sizer_top_empty->Fit(m_panel_top_empty); m_simplebook_amsitems->AddPage(m_panel_top_empty, wxEmptyString, false); m_simplebook_amsitems->AddPage(m_panel_top, wxEmptyString, false); wxBoxSizer *m_sizer_bottom = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *m_sizer_left = new wxBoxSizer(wxVERTICAL); //ams tip m_sizer_ams_tips = new wxBoxSizer(wxHORIZONTAL); m_ams_tip = new Label(m_amswin, _L("AMS")); m_ams_tip->SetFont(::Label::Body_12); m_ams_tip->SetBackgroundColour(*wxWHITE); m_img_amsmapping_tip = new wxStaticBitmap(m_amswin, wxID_ANY, create_scaled_bitmap("enable_ams", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); m_img_amsmapping_tip->SetBackgroundColour(*wxWHITE); m_sizer_ams_tips->Add(m_ams_tip, 0, wxTOP, FromDIP(5)); m_sizer_ams_tips->Add(m_img_amsmapping_tip, 0, wxALL, FromDIP(3)); m_img_amsmapping_tip->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { wxPoint img_pos = m_img_amsmapping_tip->ClientToScreen(wxPoint(0, 0)); wxPoint popup_pos(img_pos.x, img_pos.y + m_img_amsmapping_tip->GetRect().height); m_ams_introduce_popup.set_mode(true); m_ams_introduce_popup.Position(popup_pos, wxSize(0, 0)); m_ams_introduce_popup.Popup(); #ifdef __WXMSW__ wxCommandEvent close_event(EVT_CLEAR_SPEED_CONTROL); wxPostEvent(this, close_event); #endif // __WXMSW__ }); m_img_amsmapping_tip->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) { m_ams_introduce_popup.Dismiss(); }); //backup tips m_ams_backup_tip = new Label(m_amswin, _L("Auto Refill")); m_ams_backup_tip->SetFont(::Label::Head_12); m_ams_backup_tip->SetForegroundColour(wxColour(0x009688)); m_ams_backup_tip->SetBackgroundColour(*wxWHITE); m_img_ams_backup = new wxStaticBitmap(m_amswin, wxID_ANY, create_scaled_bitmap("automatic_material_renewal", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); m_img_ams_backup->SetBackgroundColour(*wxWHITE); m_sizer_ams_tips->Add(0, 0, 1, wxEXPAND, 0); m_sizer_ams_tips->Add(m_img_ams_backup, 0, wxALL, FromDIP(3)); m_sizer_ams_tips->Add(m_ams_backup_tip, 0, wxTOP, FromDIP(5)); m_ams_backup_tip->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); m_img_ams_backup->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); m_ams_backup_tip->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); m_img_ams_backup->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); m_ams_backup_tip->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {post_event(SimpleEvent(EVT_AMS_FILAMENT_BACKUP)); }); m_img_ams_backup->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {post_event(SimpleEvent(EVT_AMS_FILAMENT_BACKUP)); }); //ams cans m_panel_can = new StaticBox(m_amswin, wxID_ANY, wxDefaultPosition, AMS_CANS_SIZE, wxBORDER_NONE); m_panel_can->SetMinSize(AMS_CANS_SIZE); m_panel_can->SetCornerRadius(FromDIP(10)); m_panel_can->SetBackgroundColor(StateColor(std::pair(AMS_CONTROL_DEF_LIB_BK_COLOUR, StateColor::Normal))); m_sizer_cans = new wxBoxSizer(wxHORIZONTAL); m_simplebook_ams = new wxSimplebook(m_panel_can, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); m_simplebook_ams->SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); m_sizer_cans->Add(m_simplebook_ams, 0, wxLEFT | wxLEFT, FromDIP(10)); // ams mode m_simplebook_generic_cans = new wxSimplebook(m_simplebook_ams, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); m_simplebook_generic_cans->SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); // none ams mode m_none_ams_panel = new wxPanel(m_simplebook_ams, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); m_none_ams_panel->SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); auto m_tip_none_ams = new wxStaticText(m_none_ams_panel, wxID_ANY, _L("AMS not connected"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL); m_tip_none_ams->SetMinSize(wxSize(AMS_CANS_SIZE.x - FromDIP(20), -1)); m_tip_none_ams->SetFont(::Label::Head_16); m_tip_none_ams->SetForegroundColour(AMS_CONTROL_DISABLE_COLOUR); wxBoxSizer *sizer_ams_panel_v = new wxBoxSizer(wxVERTICAL); wxBoxSizer *sizer_ams_panel_h = new wxBoxSizer(wxHORIZONTAL); sizer_ams_panel_v->Add(m_tip_none_ams, 0, wxALIGN_CENTER, 0); sizer_ams_panel_h->Add(sizer_ams_panel_v, 0, wxALIGN_CENTER, 0); m_none_ams_panel->SetSizer(sizer_ams_panel_h); m_none_ams_panel->Layout(); //extra ams mode m_simplebook_extra_cans = new wxSimplebook(m_simplebook_ams, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); m_simplebook_extra_cans->SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); m_simplebook_ams->AddPage(m_none_ams_panel, wxEmptyString, false); m_simplebook_ams->AddPage(m_simplebook_generic_cans, wxEmptyString, false); m_simplebook_ams->AddPage(m_simplebook_extra_cans, wxEmptyString, false); m_panel_can->SetSizer(m_sizer_cans); m_panel_can->Layout(); m_sizer_cans->Fit(m_panel_can); m_sizer_left->Add(m_sizer_ams_tips, 0, wxEXPAND, 0); m_sizer_left->Add(m_panel_can, 1, wxEXPAND, 0); wxBoxSizer *m_sizer_left_bottom = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *sizer_sextruder = new wxBoxSizer(wxVERTICAL); auto extruder_pane = new wxPanel(m_amswin, wxID_ANY, wxDefaultPosition, AMS_EXTRUDER_SIZE); extruder_pane->SetSizer(sizer_sextruder); extruder_pane->Layout(); m_extruder = new AMSextruder(extruder_pane, wxID_ANY, wxDefaultPosition, AMS_EXTRUDER_SIZE); sizer_sextruder->Add(m_extruder, 0, wxALIGN_CENTER, 0); m_sizer_left_bottom->Add(extruder_pane, 0, wxALL,0); //m_sizer_left_bottom->Add(0, 0, 0, wxEXPAND, 0); StateColor btn_bg_green(std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Disabled), std::pair(wxColour(0, 137, 123), StateColor::Pressed), std::pair(wxColour(38, 166, 154), StateColor::Hovered), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); StateColor btn_bg_white(std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Disabled), std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Pressed), std::pair(AMS_CONTROL_DEF_BLOCK_BK_COLOUR, StateColor::Hovered), std::pair(AMS_CONTROL_WHITE_COLOUR, StateColor::Normal)); StateColor btn_bd_green(std::pair(wxColour(255,255,254), StateColor::Disabled), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Enabled)); StateColor btn_bd_white(std::pair(wxColour(255,255,254), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); StateColor btn_text_green(std::pair(wxColour(255,255,254), StateColor::Disabled), std::pair(wxColour(255,255,254), StateColor::Enabled)); StateColor btn_text_white(std::pair(wxColour(255, 255, 254), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); m_button_area = new wxWindow(m_amswin, wxID_ANY); m_button_area->SetBackgroundColour(m_amswin->GetBackgroundColour()); wxBoxSizer *m_sizer_button = new wxBoxSizer(wxVERTICAL); wxBoxSizer *m_sizer_button_area = new wxBoxSizer(wxHORIZONTAL); m_button_extruder_feed = new Button(m_button_area, _L("Load")); m_button_extruder_feed->SetFont(Label::Body_13); m_button_extruder_feed->SetBackgroundColor(btn_bg_green); m_button_extruder_feed->SetBorderColor(btn_bd_green); m_button_extruder_feed->SetTextColor(btn_text_green); if (wxGetApp().app_config->get("language") == "de_DE") m_button_extruder_feed->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "fr_FR") m_button_extruder_feed->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "ru_RU") m_button_extruder_feed->SetLabel("Load"); if (wxGetApp().app_config->get("language") == "nl_NL") m_button_extruder_feed->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "hu_HU") m_button_extruder_feed->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "ja_JP") m_button_extruder_feed->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "sv_SE") m_button_extruder_feed->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "cs_CZ") m_button_extruder_feed->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "uk_UA") m_button_extruder_feed->SetFont(Label::Body_9); m_button_extruder_back = new Button(m_button_area, _L("Unload")); m_button_extruder_back->SetBackgroundColor(btn_bg_white); m_button_extruder_back->SetBorderColor(btn_bd_white); m_button_extruder_back->SetTextColor(btn_text_white); m_button_extruder_back->SetFont(Label::Body_13); if (wxGetApp().app_config->get("language") == "de_DE") m_button_extruder_back->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "fr_FR") m_button_extruder_back->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "ru_RU") m_button_extruder_back->SetLabel("Unload"); if (wxGetApp().app_config->get("language") == "nl_NL") m_button_extruder_back->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "hu_HU") m_button_extruder_back->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "ja_JP") m_button_extruder_back->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "sv_SE") m_button_extruder_back->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "cs_CZ") m_button_extruder_back->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "uk_UA") m_button_extruder_back->SetFont(Label::Body_9); m_sizer_button_area->Add(0, 0, 1, wxEXPAND, 0); m_sizer_button_area->Add(m_button_extruder_back, 0, wxLEFT, FromDIP(6)); m_sizer_button_area->Add(m_button_extruder_feed, 0, wxLEFT, FromDIP(6)); m_sizer_button->Add(m_sizer_button_area, 0, 1, wxEXPAND, 0); m_button_area->SetSizer(m_sizer_button); m_button_area->Layout(); m_button_area->Fit(); m_sizer_left_bottom->Add(0, 0, 1, wxEXPAND, 0); m_sizer_left_bottom->Add(m_button_area, 0, wxEXPAND | wxTOP, FromDIP(18)); m_sizer_left->Add(m_sizer_left_bottom, 0, wxEXPAND, 0); //virtual ams m_panel_virtual = new StaticBox(m_amswin, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); m_panel_virtual->SetBackgroundColor(StateColor(std::pair(AMS_CONTROL_DEF_LIB_BK_COLOUR, StateColor::Normal))); m_panel_virtual->SetMinSize(wxSize(AMS_CAN_LIB_SIZE.x + FromDIP(16), AMS_CANS_SIZE.y)); m_panel_virtual->SetMaxSize(wxSize(AMS_CAN_LIB_SIZE.x + FromDIP(16), AMS_CANS_SIZE.y)); m_vams_info.material_state = AMSCanType::AMS_CAN_TYPE_VIRTUAL; m_vams_info.can_id = wxString::Format("%d", VIRTUAL_TRAY_ID).ToStdString(); auto vams_panel = new wxWindow(m_panel_virtual, wxID_ANY); vams_panel->SetBackgroundColour(AMS_CONTROL_DEF_LIB_BK_COLOUR); m_vams_lib = new AMSLib(vams_panel, m_vams_info.can_id, m_vams_info); m_vams_lib->m_slot_id = m_vams_info.can_id; m_vams_road = new AMSRoad(vams_panel, wxID_ANY, m_vams_info, -1, -1, wxDefaultPosition, AMS_CAN_ROAD_SIZE); m_vams_lib->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { //clear all selected m_current_ams = m_vams_info.can_id; m_vams_lib->OnSelected(); SwitchAms(m_current_ams); for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { AmsCansWindow* cans = m_ams_cans_list[i]; cans->amsCans->SelectCan(m_current_ams); } e.Skip(); }); Bind(EVT_AMS_UNSELETED_VAMS, [this](wxCommandEvent& e) { /*if (m_current_ams == e.GetString().ToStdString()) { return; }*/ m_current_ams = e.GetString().ToStdString(); SwitchAms(m_current_ams); m_vams_lib->UnSelected(); e.Skip(); }); wxBoxSizer* m_vams_top_sizer = new wxBoxSizer(wxVERTICAL); m_vams_top_sizer->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(14)); m_vams_top_sizer->Add(0, 0, 0, wxEXPAND | wxTOP, AMS_REFRESH_SIZE.y); m_vams_top_sizer->Add(m_vams_lib, 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, FromDIP(4)); m_vams_top_sizer->Add(m_vams_road, 0, wxALL, 0); //extra road vams_panel->SetSizer(m_vams_top_sizer); vams_panel->Layout(); vams_panel->Fit(); wxBoxSizer* m_sizer_vams_panel = new wxBoxSizer(wxVERTICAL); m_sizer_vams_panel->Add(vams_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0); m_panel_virtual->SetSizer(m_sizer_vams_panel); m_panel_virtual->Layout(); m_panel_virtual->Fit(); m_vams_sizer = new wxBoxSizer(wxVERTICAL); m_sizer_vams_tips = new wxBoxSizer(wxHORIZONTAL); auto m_vams_tip = new wxStaticText(m_amswin, wxID_ANY, _L("Ext Spool"), wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); m_vams_tip->SetMaxSize(wxSize(FromDIP(66), -1)); m_vams_tip->SetFont(::Label::Body_12); m_vams_tip->SetBackgroundColour(*wxWHITE); m_img_vams_tip = new wxStaticBitmap(m_amswin, wxID_ANY, create_scaled_bitmap("enable_ams", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); m_img_vams_tip->SetBackgroundColour(*wxWHITE); m_img_vams_tip->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { wxPoint img_pos = m_img_vams_tip->ClientToScreen(wxPoint(0, 0)); wxPoint popup_pos(img_pos.x, img_pos.y + m_img_vams_tip->GetRect().height); m_ams_introduce_popup.set_mode(false); m_ams_introduce_popup.Position(popup_pos, wxSize(0, 0)); m_ams_introduce_popup.Popup(); #ifdef __WXMSW__ wxCommandEvent close_event(EVT_CLEAR_SPEED_CONTROL); wxPostEvent(this, close_event); #endif // __WXMSW__ }); m_img_vams_tip->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) { m_ams_introduce_popup.Dismiss(); }); m_sizer_vams_tips->Add(m_vams_tip, 0, wxTOP, FromDIP(5)); m_sizer_vams_tips->Add(m_img_vams_tip, 0, wxALL, FromDIP(3)); m_vams_extra_road = new AMSVirtualRoad(m_amswin, wxID_ANY); m_vams_extra_road->SetMinSize(wxSize(m_panel_virtual->GetSize().x + FromDIP(16), -1)); m_vams_sizer->Add(m_sizer_vams_tips, 0, wxALIGN_CENTER, 0); m_vams_sizer->Add(m_panel_virtual, 0, wxALIGN_CENTER, 0); m_vams_sizer->Add(m_vams_extra_road, 1, wxEXPAND, 0); //Right wxBoxSizer *m_sizer_right = new wxBoxSizer(wxVERTICAL); m_simplebook_right = new wxSimplebook(m_amswin, wxID_ANY); m_simplebook_right->SetMinSize(wxSize(AMS_STEP_SIZE.x, AMS_STEP_SIZE.y + FromDIP(19))); m_simplebook_right->SetMaxSize(wxSize(AMS_STEP_SIZE.x, AMS_STEP_SIZE.y + FromDIP(19))); m_simplebook_right->SetBackgroundColour(*wxWHITE); m_sizer_right->Add(m_simplebook_right, 0, wxALL, 0); auto tip_right = new wxPanel(m_simplebook_right, wxID_ANY, wxDefaultPosition, AMS_STEP_SIZE, wxTAB_TRAVERSAL); m_sizer_right_tip = new wxBoxSizer(wxVERTICAL); m_tip_right_top = new wxStaticText(tip_right, wxID_ANY, _L("Tips"), wxDefaultPosition, wxDefaultSize, 0); m_tip_right_top->SetFont(::Label::Head_13); m_tip_right_top->SetForegroundColour(AMS_CONTROL_BRAND_COLOUR); m_tip_right_top->Wrap(AMS_STEP_SIZE.x); m_tip_load_info = new ::Label(tip_right, wxEmptyString); m_tip_load_info->SetFont(::Label::Body_13); m_tip_load_info->SetBackgroundColour(*wxWHITE); m_tip_load_info->SetForegroundColour(AMS_CONTROL_GRAY700); m_sizer_right_tip->Add(m_tip_right_top, 0, 0, 0); m_sizer_right_tip->Add(0, 0, 0, wxEXPAND, FromDIP(10)); m_sizer_right_tip->Add(m_tip_load_info, 0, 0, 0); tip_right->SetSizer(m_sizer_right_tip); tip_right->Layout(); m_filament_load_step = new ::StepIndicator(m_simplebook_right, wxID_ANY); m_filament_load_step->SetMinSize(AMS_STEP_SIZE); m_filament_load_step->SetMaxSize(AMS_STEP_SIZE); m_filament_load_step->SetBackgroundColour(*wxWHITE); m_filament_unload_step = new ::StepIndicator(m_simplebook_right, wxID_ANY); m_filament_unload_step->SetMinSize(AMS_STEP_SIZE); m_filament_unload_step->SetMaxSize(AMS_STEP_SIZE); m_filament_unload_step->SetBackgroundColour(*wxWHITE); m_filament_vt_load_step = new ::StepIndicator(m_simplebook_right, wxID_ANY); m_filament_vt_load_step->SetMinSize(AMS_STEP_SIZE); m_filament_vt_load_step->SetMaxSize(AMS_STEP_SIZE); m_filament_vt_load_step->SetBackgroundColour(*wxWHITE); m_simplebook_right->AddPage(tip_right, wxEmptyString, false); m_simplebook_right->AddPage(m_filament_load_step, wxEmptyString, false); m_simplebook_right->AddPage(m_filament_unload_step, wxEmptyString, false); m_simplebook_right->AddPage(m_filament_vt_load_step, wxEmptyString, false); m_button_ams_setting_normal = ScalableBitmap(this, "ams_setting_normal", 24); m_button_ams_setting_hover = ScalableBitmap(this, "ams_setting_hover", 24); m_button_ams_setting_press = ScalableBitmap(this, "ams_setting_press", 24); wxBoxSizer *m_sizer_right_bottom = new wxBoxSizer(wxHORIZONTAL); m_button_ams_setting = new wxStaticBitmap(m_amswin, wxID_ANY, m_button_ams_setting_normal.bmp(), wxDefaultPosition, wxSize(FromDIP(24), FromDIP(24))); m_button_ams_setting->SetBackgroundColour(m_amswin->GetBackgroundColour()); m_button_guide = new Button(m_amswin, _L("Guide")); m_button_guide->SetFont(Label::Body_13); if (wxGetApp().app_config->get("language") == "de_DE") m_button_guide->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "fr_FR") m_button_guide->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "ru_RU") m_button_guide->SetLabel("Guide"); if (wxGetApp().app_config->get("language") == "nl_NL") m_button_guide->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "hu_HU") m_button_guide->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "ja_JP") m_button_guide->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "sv_SE") m_button_guide->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "cs_CZ") m_button_guide->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "uk_UA") m_button_guide->SetFont(Label::Body_9); m_button_guide->SetCornerRadius(FromDIP(12)); m_button_guide->SetBorderColor(btn_bd_white); m_button_guide->SetTextColor(btn_text_white); m_button_guide->SetMinSize(wxSize(-1, FromDIP(24))); m_button_guide->SetBackgroundColor(btn_bg_white); m_button_retry = new Button(m_amswin, _L("Retry")); m_button_retry->SetFont(Label::Body_13); if (wxGetApp().app_config->get("language") == "de_DE") m_button_retry->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "fr_FR") m_button_retry->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "ru_RU") m_button_retry->SetLabel("Retry"); if (wxGetApp().app_config->get("language") == "nl_NL") m_button_retry->SetLabel("Retry"); if (wxGetApp().app_config->get("language") == "hu_HU") m_button_retry->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "ja_JP") m_button_retry->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "sv_SE") m_button_retry->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "cs_CZ") m_button_retry->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "uk_UA") m_button_retry->SetFont(Label::Body_9); m_button_retry->SetCornerRadius(FromDIP(12)); m_button_retry->SetBorderColor(btn_bd_white); m_button_retry->SetTextColor(btn_text_white); m_button_retry->SetMinSize(wxSize(-1, FromDIP(24))); m_button_retry->SetBackgroundColor(btn_bg_white); m_sizer_right_bottom->Add(m_button_ams_setting, 0); m_sizer_right_bottom->Add(m_button_guide, 0, wxLEFT, FromDIP(10)); m_sizer_right_bottom->Add(m_button_retry, 0, wxLEFT, FromDIP(10)); m_sizer_right->Add(m_sizer_right_bottom, 0, wxEXPAND | wxTOP, FromDIP(20)); m_sizer_bottom->Add(m_vams_sizer, 0, wxEXPAND, 0); m_sizer_bottom->Add(m_sizer_left, 0, wxEXPAND, 0); m_sizer_bottom->Add(0, 0, 0, wxLEFT, FromDIP(15)); m_sizer_bottom->Add(m_sizer_right, 0, wxEXPAND, FromDIP(0)); m_sizer_body->Add(m_simplebook_amsitems, 0, wxEXPAND, 0); m_sizer_body->Add(0, 0, 1, wxEXPAND | wxTOP, FromDIP(18)); m_sizer_body->Add(m_sizer_bottom, 0, wxEXPAND | wxLEFT, FromDIP(6)); init_scaled_buttons(); m_amswin->SetSizer(m_sizer_body); m_amswin->Layout(); m_amswin->Fit(); //Thaw(); SetSize(m_amswin->GetSize()); SetMinSize(m_amswin->GetSize()); // calibration mode m_simplebook_calibration = new wxSimplebook(this, wxID_ANY, wxDefaultPosition, m_amswin->GetSize(), wxTAB_TRAVERSAL); auto m_in_calibration_panel = new wxWindow(m_simplebook_calibration, wxID_ANY, wxDefaultPosition, m_amswin->GetSize(), wxTAB_TRAVERSAL); m_in_calibration_panel->SetBackgroundColour(AMS_CONTROL_WHITE_COLOUR); wxBoxSizer *sizer_calibration_h = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *sizer_calibration_v = new wxBoxSizer(wxVERTICAL); auto thumbnail = new wxStaticBitmap(m_in_calibration_panel, wxID_ANY, create_scaled_bitmap("ams_icon", nullptr, 126), wxDefaultPosition, wxDefaultSize); m_text_calibration_percent = new wxStaticText(m_in_calibration_panel, wxID_ANY, wxT("0%"), wxDefaultPosition, wxDefaultSize, 0); m_text_calibration_percent->SetFont(::Label::Head_16); m_text_calibration_percent->SetForegroundColour(AMS_CONTROL_BRAND_COLOUR); auto m_text_calibration_tip = new wxStaticText(m_in_calibration_panel, wxID_ANY, _L("Calibrating AMS..."), wxDefaultPosition, wxDefaultSize, 0); m_text_calibration_tip->SetFont(::Label::Body_14); m_text_calibration_tip->SetForegroundColour(AMS_CONTROL_GRAY700); sizer_calibration_v->Add(thumbnail, 0, wxALIGN_CENTER, 0); sizer_calibration_v->Add(0, 0, 0, wxTOP, FromDIP(16)); sizer_calibration_v->Add(m_text_calibration_percent, 0, wxALIGN_CENTER, 0); sizer_calibration_v->Add(0, 0, 0, wxTOP, FromDIP(8)); sizer_calibration_v->Add(m_text_calibration_tip, 0, wxALIGN_CENTER, 0); sizer_calibration_h->Add(sizer_calibration_v, 1, wxALIGN_CENTER, 0); m_in_calibration_panel->SetSizer(sizer_calibration_h); m_in_calibration_panel->Layout(); auto m_calibration_err_panel = new wxWindow(m_simplebook_calibration, wxID_ANY, wxDefaultPosition, m_amswin->GetSize(), wxTAB_TRAVERSAL); m_calibration_err_panel->SetBackgroundColour(AMS_CONTROL_WHITE_COLOUR); wxBoxSizer *sizer_err_calibration_h = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *sizer_err_calibration_v = new wxBoxSizer(wxVERTICAL); m_hyperlink = new wxHyperlinkCtrl(m_calibration_err_panel, wxID_ANY, wxEmptyString, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); m_hyperlink->SetVisitedColour(wxColour(31, 142, 234)); auto m_tip_calibration_err = new wxStaticText(m_calibration_err_panel, wxID_ANY, _L("A problem occurred during calibration. Click to view the solution."), wxDefaultPosition, wxDefaultSize, 0); m_tip_calibration_err->SetFont(::Label::Body_14); m_tip_calibration_err->SetForegroundColour(AMS_CONTROL_GRAY700); wxBoxSizer *sizer_button = new wxBoxSizer(wxHORIZONTAL); auto m_button_calibration_again = new Button(m_calibration_err_panel, _L("Calibrate again")); m_button_calibration_again->SetBackgroundColor(btn_bg_green); m_button_calibration_again->SetBorderColor(AMS_CONTROL_BRAND_COLOUR); m_button_calibration_again->SetTextColor(AMS_CONTROL_WHITE_COLOUR); m_button_calibration_again->SetMinSize(AMS_CONTRO_CALIBRATION_BUTTON_SIZE); m_button_calibration_again->SetCornerRadius(FromDIP(12)); m_button_calibration_again->Bind(wxEVT_LEFT_DOWN, &AMSControl::on_clibration_again_click, this); sizer_button->Add(m_button_calibration_again, 0, wxALL, 5); auto m_button_calibration_cancel = new Button(m_calibration_err_panel, _L("Cancel calibration")); m_button_calibration_cancel->SetBackgroundColor(btn_bg_white); m_button_calibration_cancel->SetBorderColor(AMS_CONTROL_GRAY700); m_button_calibration_cancel->SetTextColor(AMS_CONTROL_GRAY800); m_button_calibration_cancel->SetMinSize(AMS_CONTRO_CALIBRATION_BUTTON_SIZE); m_button_calibration_cancel->SetCornerRadius(FromDIP(12)); m_button_calibration_cancel->Bind(wxEVT_LEFT_DOWN, &AMSControl::on_clibration_cancel_click, this); sizer_button->Add(m_button_calibration_cancel, 0, wxALL, 5); sizer_err_calibration_v->Add(m_hyperlink, 0, wxALIGN_CENTER, 0); sizer_err_calibration_v->Add(0, 0, 0, wxTOP, FromDIP(6)); sizer_err_calibration_v->Add(m_tip_calibration_err, 0, wxALIGN_CENTER, 0); sizer_err_calibration_v->Add(0, 0, 0, wxTOP, FromDIP(8)); sizer_err_calibration_v->Add(sizer_button, 0, wxALIGN_CENTER | wxTOP, FromDIP(18)); sizer_err_calibration_h->Add(sizer_err_calibration_v, 1, wxALIGN_CENTER, 0); m_calibration_err_panel->SetSizer(sizer_err_calibration_h); m_calibration_err_panel->Layout(); m_simplebook_calibration->AddPage(m_in_calibration_panel, wxEmptyString, false); m_simplebook_calibration->AddPage(m_calibration_err_panel, wxEmptyString, false); AddPage(m_amswin, wxEmptyString, false); AddPage(m_simplebook_calibration, wxEmptyString, false); UpdateStepCtrl(false); m_button_extruder_feed->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AMSControl::on_filament_load), NULL, this); m_button_extruder_back->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AMSControl::on_filament_unload), NULL, this); m_button_ams_setting->Bind(wxEVT_ENTER_WINDOW, [this](wxMouseEvent& e) { m_button_ams_setting->SetBitmap(m_button_ams_setting_hover.bmp()); e.Skip(); }); m_button_ams_setting->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { m_button_ams_setting->SetBitmap(m_button_ams_setting_press.bmp()); on_ams_setting_click(e); e.Skip(); }); m_button_ams_setting->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) { m_button_ams_setting->SetBitmap(m_button_ams_setting_normal.bmp()); e.Skip(); }); Bind(EVT_AMS_SHOW_HUMIDITY_TIPS, [this](wxCommandEvent& evt) { uiAmsHumidityInfo *info = (uiAmsHumidityInfo *) evt.GetClientData(); if (info) { if (info->humidity_percent >= 0) { m_percent_humidity_dry_popup->Update(info); wxPoint img_pos = ClientToScreen(wxPoint(0, 0)); wxPoint popup_pos(img_pos.x - m_percent_humidity_dry_popup->GetSize().GetWidth() + FromDIP(150), img_pos.y - FromDIP(80)); m_percent_humidity_dry_popup->Position(popup_pos, wxSize(0, 0)); m_percent_humidity_dry_popup->Popup(); } else { wxPoint img_pos = ClientToScreen(wxPoint(0, 0)); wxPoint popup_pos(img_pos.x - m_Humidity_tip_popup.GetSize().GetWidth() + FromDIP(150), img_pos.y - FromDIP(80)); m_Humidity_tip_popup.Position(popup_pos, wxSize(0, 0)); int humidity_value = info->humidity_level; if (humidity_value > 0 && humidity_value <= 5) { m_Humidity_tip_popup.set_humidity_level(humidity_value); } m_Humidity_tip_popup.Popup(); } } delete info; }); m_button_guide->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { post_event(wxCommandEvent(EVT_AMS_GUIDE_WIKI)); }); m_button_retry->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { post_event(wxCommandEvent(EVT_AMS_RETRY)); }); CreateAms(); SetSelection(0); EnterNoneAMSMode(); } void AMSControl::on_retry() { post_event(wxCommandEvent(EVT_AMS_RETRY)); } void AMSControl::init_scaled_buttons() { m_button_extruder_feed->SetMinSize(wxSize(-1, FromDIP(24))); m_button_extruder_feed->SetCornerRadius(FromDIP(12)); m_button_extruder_back->SetMinSize(wxSize(-1, FromDIP(24))); m_button_extruder_back->SetCornerRadius(FromDIP(12)); } std::string AMSControl::GetCurentAms() { return m_current_ams; } std::string AMSControl::GetCurentShowAms() { return m_current_show_ams; } std::string AMSControl::GetCurrentCan(std::string amsid) { std::string current_can; for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { AmsCansWindow *ams = m_ams_cans_list[i]; if (ams->amsCans->m_info.ams_id == amsid) { current_can = ams->amsCans->GetCurrentCan(); return current_can; } } return current_can; } wxColour AMSControl::GetCanColour(std::string amsid, std::string canid) { wxColour col = *wxWHITE; for (auto i = 0; i < m_ams_info.size(); i++) { if (m_ams_info[i].ams_id == amsid) { for (auto o = 0; o < m_ams_info[i].cans.size(); o++) { if (m_ams_info[i].cans[o].can_id == canid) { col = m_ams_info[i].cans[o].material_colour; } } } } return col; } void AMSControl::SetActionState(bool button_status[]) { if (button_status[ActionButton::ACTION_BTN_LOAD]) m_button_extruder_feed->Enable(); else m_button_extruder_feed->Disable(); if (button_status[ActionButton::ACTION_BTN_UNLOAD]) m_button_extruder_back->Enable(); else m_button_extruder_back->Disable(); } void AMSControl::EnterNoneAMSMode() { m_vams_lib->m_ams_model = m_ext_model; if(m_is_none_ams_mode == AMSModel::EXT_AMS) return; m_panel_top->Hide(); m_simplebook_amsitems->Hide(); m_simplebook_amsitems->SetSelection(0); m_simplebook_ams->SetSelection(0); m_extruder->no_ams_mode(true); m_button_ams_setting->Hide(); m_button_guide->Hide(); m_button_extruder_feed->Show(); m_button_extruder_back->Show(); ShowFilamentTip(false); m_amswin->Layout(); m_amswin->Fit(); Layout(); m_is_none_ams_mode = AMSModel::EXT_AMS; } void AMSControl::EnterGenericAMSMode() { m_vams_lib->m_ams_model = m_ext_model; if(m_is_none_ams_mode == AMSModel::GENERIC_AMS) return; m_panel_top->Show(); m_simplebook_amsitems->Show(); m_simplebook_amsitems->SetSelection(1); m_vams_lib->m_ams_model = AMSModel::GENERIC_AMS; m_ams_tip->SetLabel(_L("AMS")); m_img_vams_tip->SetBitmap(create_scaled_bitmap("enable_ams", this, 16)); m_img_vams_tip->Enable(); m_img_amsmapping_tip->SetBitmap(create_scaled_bitmap("enable_ams", this, 16)); m_img_amsmapping_tip->Enable(); m_simplebook_ams->SetSelection(1); m_extruder->no_ams_mode(false); m_button_ams_setting->Show(); m_button_guide->Show(); m_button_retry->Show(); m_button_extruder_feed->Show(); m_button_extruder_back->Show(); ShowFilamentTip(true); m_amswin->Layout(); m_amswin->Fit(); Layout(); m_is_none_ams_mode = AMSModel::GENERIC_AMS; } void AMSControl::EnterExtraAMSMode() { m_vams_lib->m_ams_model = m_ext_model; if(m_is_none_ams_mode == AMSModel::AMS_LITE) return; m_panel_top->Hide(); m_simplebook_amsitems->Show(); m_simplebook_amsitems->SetSelection(1); m_vams_lib->m_ams_model = AMSModel::AMS_LITE; m_ams_tip->SetLabel(wxEmptyString); m_img_vams_tip->SetBitmap(create_scaled_bitmap("enable_ams_disable", this, 16)); m_img_vams_tip->Disable(); m_img_amsmapping_tip->SetBitmap(create_scaled_bitmap("enable_ams_disable", this, 16)); m_img_amsmapping_tip->Disable(); m_simplebook_ams->SetSelection(2); m_extruder->no_ams_mode(false); m_button_ams_setting->Show(); m_button_guide->Show(); m_button_retry->Show(); m_button_extruder_feed->Show(); m_button_extruder_back->Show(); ShowFilamentTip(true); m_amswin->Layout(); m_amswin->Fit(); Layout(); Refresh(true); m_is_none_ams_mode = AMSModel::AMS_LITE; } void AMSControl::EnterCalibrationMode(bool read_to_calibration) { SetSelection(1); if (read_to_calibration) m_simplebook_calibration->SetSelection(0); else m_simplebook_calibration->SetSelection(1); } void AMSControl::ExitcClibrationMode() { SetSelection(0); } void AMSControl::SetClibrationpercent(int percent) { m_text_calibration_percent->SetLabelText(wxString::Format("%d%%", percent)); } void AMSControl::SetClibrationLink(wxString link) { m_hyperlink->SetLabel(link); m_hyperlink->SetURL(link); m_hyperlink->Refresh(); m_hyperlink->Update(); } void AMSControl::PlayRridLoading(wxString amsid, wxString canid) { AmsCansHash::iterator iter = m_ams_cans_list.begin(); auto count_item_index = 0; for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { AmsCansWindow *cans = m_ams_cans_list[i]; if (cans->amsCans->m_info.ams_id == amsid) { cans->amsCans->PlayRridLoading(canid); } iter++; } } void AMSControl::StopRridLoading(wxString amsid, wxString canid) { AmsCansHash::iterator iter = m_ams_cans_list.begin(); auto count_item_index = 0; for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { AmsCansWindow *cans = m_ams_cans_list[i]; if (cans->amsCans->m_info.ams_id == amsid) { cans->amsCans->StopRridLoading(canid); } iter++; } } void AMSControl::msw_rescale() { m_button_ams_setting_normal.msw_rescale(); m_button_ams_setting_hover.msw_rescale(); m_button_ams_setting_press.msw_rescale(); m_button_ams_setting->SetBitmap(m_button_ams_setting_normal.bmp()); m_extruder->msw_rescale(); m_vams_extra_road->msw_rescale(); m_button_extruder_feed->SetMinSize(wxSize(-1, FromDIP(24))); m_button_extruder_back->SetMinSize(wxSize(-1, FromDIP(24))); m_button_ams_setting->SetMinSize(wxSize(FromDIP(25), FromDIP(24))); m_button_guide->SetMinSize(wxSize(-1, FromDIP(24))); m_button_retry->SetMinSize(wxSize(-1, FromDIP(24))); m_vams_lib->msw_rescale(); for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { AmsCansWindow *cans = m_ams_cans_list[i]; cans->amsCans->msw_rescale(); } if (m_percent_humidity_dry_popup){ m_percent_humidity_dry_popup->msw_rescale(); } Layout(); Refresh(); } void AMSControl::UpdateStepCtrl(bool is_extrusion) { wxString FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_COUNT] = { _L("Idling..."), _L("Heat the nozzle"), _L("Cut filament"), _L("Pull back current filament"), _L("Push new filament into extruder"), _L("Purge old filament"), _L("Feed Filament"), _L("Confirm extruded"), _L("Check filament location") }; m_filament_load_step->DeleteAllItems(); m_filament_unload_step->DeleteAllItems(); m_filament_vt_load_step->DeleteAllItems(); if (m_ams_model == AMSModel::GENERIC_AMS || m_ext_model == AMSModel::GENERIC_AMS) { if (is_extrusion) { m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CUT_FILAMENT]); m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PULL_CURR_FILAMENT]); m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PUSH_NEW_FILAMENT]); m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PURGE_OLD_FILAMENT]); } else { m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PUSH_NEW_FILAMENT]); m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PURGE_OLD_FILAMENT]); } m_filament_vt_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); m_filament_vt_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PUSH_NEW_FILAMENT]); m_filament_vt_load_step->AppendItem(_L("Grab new filament")); m_filament_vt_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PURGE_OLD_FILAMENT]); m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CUT_FILAMENT]); m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PULL_CURR_FILAMENT]); } if (m_ams_model == AMSModel::AMS_LITE || m_ext_model == AMSModel::AMS_LITE) { m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CHECK_POSITION]); m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CUT_FILAMENT]); m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PULL_CURR_FILAMENT]); m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PUSH_NEW_FILAMENT]); m_filament_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PURGE_OLD_FILAMENT]); m_filament_vt_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); m_filament_vt_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CHECK_POSITION]); m_filament_vt_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CUT_FILAMENT]); m_filament_vt_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PULL_CURR_FILAMENT]); m_filament_vt_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PUSH_NEW_FILAMENT]); m_filament_vt_load_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PURGE_OLD_FILAMENT]); m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CHECK_POSITION]); m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CUT_FILAMENT]); m_filament_unload_step->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PULL_CURR_FILAMENT]); } } void AMSControl::CreateAms() { auto caninfo0_0 = Caninfo{"def_can_0", (""), *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; auto caninfo0_1 = Caninfo{"def_can_1", (""), *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; auto caninfo0_2 = Caninfo{"def_can_2", (""), *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; auto caninfo0_3 = Caninfo{"def_can_3", (""), *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; AMSinfo ams1 = AMSinfo{"0", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}}; AMSinfo ams2 = AMSinfo{"1", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}}; AMSinfo ams3 = AMSinfo{"2", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}}; AMSinfo ams4 = AMSinfo{"3", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}}; std::vector ams_info{ams1, ams2, ams3, ams4}; std::vector::iterator it; Freeze(); for (it = ams_info.begin(); it != ams_info.end(); it++) { AddAmsItems(*it); AddAms(*it); AddExtraAms(*it); m_ams_info.push_back(*it); } m_sizer_top->Layout(); Thaw(); } void AMSControl::Reset() { auto caninfo0_0 = Caninfo{"0", "", *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; auto caninfo0_1 = Caninfo{"1", "", *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; auto caninfo0_2 = Caninfo{"2", "", *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; auto caninfo0_3 = Caninfo{"3", "", *wxWHITE, AMSCanType::AMS_CAN_TYPE_NONE}; AMSinfo ams1 = AMSinfo{"0", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}}; AMSinfo ams2 = AMSinfo{"1", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}}; AMSinfo ams3 = AMSinfo{"2", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}}; AMSinfo ams4 = AMSinfo{"3", std::vector{caninfo0_0, caninfo0_1, caninfo0_2, caninfo0_3}}; std::vector ams_info{ams1, ams2, ams3, ams4}; std::vector::iterator it; UpdateAms(ams_info, true); m_current_show_ams = ""; m_current_ams = ""; m_current_select = ""; } void AMSControl::show_noams_mode() { show_vams(true); m_sizer_ams_tips->Show(true); if (m_ams_model == AMSModel::EXT_AMS) { EnterNoneAMSMode(); } else if(m_ams_model == AMSModel::GENERIC_AMS){ EnterGenericAMSMode(); } else if (m_ams_model == AMSModel::AMS_LITE) { EnterExtraAMSMode(); } } void AMSControl::show_auto_refill(bool show) { m_ams_backup_tip->Show(show); m_img_ams_backup->Show(show); m_amswin->Layout(); m_amswin->Fit(); } void AMSControl::show_vams(bool show) { m_panel_virtual->Show(show); m_vams_sizer->Show(show); m_vams_extra_road->Show(show); m_extruder->has_ams(show); show_vams_kn_value(show); Layout(); if (show && m_is_none_ams_mode) { if (m_current_ams == "") { wxMouseEvent event(wxEVT_LEFT_DOWN); event.SetEventObject(m_vams_lib); wxPostEvent(m_vams_lib, event); } } } void AMSControl::show_vams_kn_value(bool show) { m_vams_lib->show_kn_value(show); } void AMSControl::update_vams_kn_value(AmsTray tray, MachineObject* obj) { m_vams_lib->m_obj = obj; if (obj->cali_version >= 0) { float k_value = 0; float n_value = 0; CalibUtils::get_pa_k_n_value_by_cali_idx(obj, tray.cali_idx, k_value, n_value); m_vams_info.k = k_value; m_vams_info.n = n_value; m_vams_lib->m_info.k = k_value; m_vams_lib->m_info.n = n_value; } else { // the remaining printer types m_vams_info.k = tray.k; m_vams_info.n = tray.n; m_vams_lib->m_info.k = tray.k; m_vams_lib->m_info.n = tray.n; } m_vams_info.material_name = tray.get_display_filament_type(); m_vams_info.material_colour = tray.get_color(); m_vams_lib->m_info.material_name = tray.get_display_filament_type(); m_vams_lib->m_info.material_colour = tray.get_color(); m_vams_lib->Refresh(); } void AMSControl::reset_vams() { m_vams_lib->m_info.k = 0; m_vams_lib->m_info.n = 0; m_vams_lib->m_info.material_name = wxEmptyString; m_vams_lib->m_info.material_colour = AMS_CONTROL_WHITE_COLOUR; m_vams_info.material_name = wxEmptyString; m_vams_info.material_colour = AMS_CONTROL_WHITE_COLOUR; m_vams_lib->Refresh(); } void AMSControl::UpdateAms(std::vector info, bool is_reset) { std::string curr_ams_id = GetCurentAms(); std::string curr_can_id = GetCurrentCan(curr_ams_id); m_button_area->Layout(); m_button_area->Fit(); // update item m_ams_info = info; if (m_ams_model == AMSModel::GENERIC_AMS){ m_ams_cans_list = m_ams_generic_cans_list; } else if (m_ams_model == AMSModel::AMS_LITE) { m_ams_cans_list = m_ams_extra_cans_list; } if (info.size() > 1) { m_simplebook_amsitems->Show(); m_amswin->Layout(); m_amswin->Fit(); SetSize(m_amswin->GetSize()); SetMinSize(m_amswin->GetSize()); } else { m_simplebook_amsitems->Hide(); m_amswin->Layout(); m_amswin->Fit(); SetSize(m_amswin->GetSize()); SetMinSize(m_amswin->GetSize()); } for (auto i = 0; i < m_ams_item_list.GetCount(); i++) { AmsItems *item = m_ams_item_list[i]; if (i < info.size() && info.size() > 1) { item->amsItem->Update(m_ams_info[i]); item->amsItem->Open(); } else { item->amsItem->Close(); } } // update cans for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { AmsCansWindow *cans = m_ams_cans_list[i]; for (auto ifo : m_ams_info) { if (ifo.ams_id == cans->amsIndex) { cans->amsCans->m_info = ifo; cans->amsCans->Update(ifo); cans->amsCans->show_sn_value(m_ams_model == AMSModel::AMS_LITE?false:true); } } } if ( m_current_show_ams.empty() && !is_reset ) { if (info.size() > 0) { SwitchAms(info[0].ams_id); } } if (m_ams_model == AMSModel::EXT_AMS && !m_vams_lib->is_selected()) { m_vams_lib->OnSelected(); } /*update humidity popup*/ if (m_percent_humidity_dry_popup->IsShown()) { string target_id = m_percent_humidity_dry_popup->get_owner_ams_id(); for (const auto& the_info : info) { if (target_id == the_info.ams_id) { uiAmsHumidityInfo humidity_info; humidity_info.ams_id = the_info.ams_id; humidity_info.humidity_level = the_info.ams_humidity; humidity_info.humidity_percent = the_info.humidity_raw; humidity_info.left_dry_time = the_info.left_dray_time; humidity_info.current_temperature = the_info.current_temperature; m_percent_humidity_dry_popup->Update(&humidity_info); break; } } } } void AMSControl::AddAmsItems(AMSinfo info) { auto amsitem = new AMSItem(m_panel_top, wxID_ANY, info); amsitem->Bind(wxEVT_LEFT_DOWN, [this, amsitem](wxMouseEvent& e) { SwitchAms(amsitem->m_amsinfo.ams_id); e.Skip(); }); AmsItems* item = new AmsItems(); item->amsIndex = info.ams_id; item->amsItem = amsitem; m_ams_item_list.Add(item); m_sizer_top->Add(amsitem, 0, wxALIGN_CENTER | wxRIGHT, 6); } void AMSControl::AddAms(AMSinfo info) { AmsCansWindow* canswin = new AmsCansWindow(); auto amscans = new AmsCans(m_simplebook_generic_cans, info, AMSModel::GENERIC_AMS); canswin->amsIndex = info.ams_id; canswin->amsCans = amscans; m_ams_generic_cans_list.Add(canswin); m_simplebook_generic_cans->AddPage(amscans, wxEmptyString, false); amscans->m_selection = m_simplebook_generic_cans->GetPageCount() - 1; } void AMSControl::AddExtraAms(AMSinfo info) { AmsCansWindow* canswin = new AmsCansWindow(); auto amscans = new AmsCans(m_simplebook_extra_cans, info, AMSModel::AMS_LITE); canswin->amsIndex = info.ams_id; canswin->amsCans = amscans; m_ams_extra_cans_list.Add(canswin); m_simplebook_extra_cans->AddPage(amscans, wxEmptyString, false); amscans->m_selection = m_simplebook_extra_cans->GetPageCount() - 1; } void AMSControl::SwitchAms(std::string ams_id) { if(ams_id == m_current_show_ams){return;} if (ams_id != std::to_string(VIRTUAL_TRAY_ID)) { if (m_current_show_ams != ams_id) { m_current_show_ams = ams_id; m_extruder->OnAmsLoading(false); } } for (auto i = 0; i < m_ams_item_list.GetCount(); i++) { AmsItems *item = m_ams_item_list[i]; if (item->amsItem->m_amsinfo.ams_id == m_current_show_ams) { item->amsItem->OnSelected(); m_current_select = ams_id; //bool ready_selected = false; //for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { // AmsCansWindow* ams = m_ams_cans_list[i]; // if (ams->amsCans->m_info.ams_id == ams_id) { // //ams->amsCans->SetDefSelectCan(); // //m_vams_lib->OnSelected(); // if () { // } // } //} bool ready_selected = false; for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { AmsCansWindow* ams = m_ams_cans_list[i]; if (ams->amsCans->m_info.ams_id == ams_id) { for (auto lib : ams->amsCans->m_can_lib_list) { if (lib->canLib->is_selected()) { ready_selected = true; } } } } if (!ready_selected) { m_current_ams = std::to_string(VIRTUAL_TRAY_ID); m_vams_lib->OnSelected(); } else { m_current_ams = ams_id; m_vams_lib->UnSelected(); } } else { item->amsItem->UnSelected(); } m_sizer_top->Layout(); m_panel_top->Fit(); } for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { AmsCansWindow *cans = m_ams_cans_list[i]; if (cans->amsCans->m_info.ams_id == ams_id) { if (m_ams_model == AMSModel::GENERIC_AMS) { m_simplebook_generic_cans->SetSelection(cans->amsCans->m_selection); } else if (m_ams_model == AMSModel::AMS_LITE) { m_simplebook_extra_cans->SetSelection(cans->amsCans->m_selection); } } } // update extruder //m_extruder->OnAmsLoading(false); for (auto i = 0; i < m_ams_info.size(); i++) { if (m_ams_info[i].ams_id == m_current_ams) { switch (m_ams_info[i].current_step) { case AMSPassRoadSTEP::AMS_ROAD_STEP_NONE: m_extruder->TurnOff(); break; case AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1: m_extruder->TurnOff(); break; case AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2: m_extruder->TurnOn(GetCanColour(m_current_ams, m_ams_info[i].current_can_id)); break; case AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3: m_extruder->TurnOn(GetCanColour(m_current_ams, m_ams_info[i].current_can_id)); break; } } } } void AMSControl::SetFilamentStep(int item_idx, FilamentStepType f_type) { wxString FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_COUNT] = { _L("Idling..."), _L("Heat the nozzle"), _L("Cut filament"), _L("Pull back current filament"), _L("Push new filament into extruder"), _L("Purge old filament"), _L("Feed Filament"), _L("Confirm extruded"), _L("Check filament location") }; if (item_idx == FilamentStep::STEP_IDLE) { m_simplebook_right->SetSelection(0); m_filament_load_step->Idle(); m_filament_unload_step->Idle(); m_filament_vt_load_step->Idle(); return; } wxString step_str = wxEmptyString; if (item_idx < FilamentStep::STEP_COUNT) { step_str = FILAMENT_CHANGE_STEP_STRING[item_idx]; } if (f_type == FilamentStepType::STEP_TYPE_LOAD) { if (item_idx > 0 && item_idx < FilamentStep::STEP_COUNT) { if (m_simplebook_right->GetSelection() != 1) { m_simplebook_right->SetSelection(1); } m_filament_load_step->SelectItem( m_filament_load_step->GetItemUseText(step_str) ); } else { m_filament_load_step->Idle(); } } else if (f_type == FilamentStepType::STEP_TYPE_UNLOAD) { if (item_idx > 0 && item_idx < FilamentStep::STEP_COUNT) { if (m_simplebook_right->GetSelection() != 2) { m_simplebook_right->SetSelection(2); } m_filament_unload_step->SelectItem( m_filament_unload_step->GetItemUseText(step_str) ); } else { m_filament_unload_step->Idle(); } } else if (f_type == FilamentStepType::STEP_TYPE_VT_LOAD) { m_simplebook_right->SetSelection(3); if (item_idx > 0 && item_idx < FilamentStep::STEP_COUNT) { if (item_idx == STEP_CONFIRM_EXTRUDED) { m_filament_vt_load_step->SelectItem(2); } else { m_filament_vt_load_step->SelectItem( m_filament_vt_load_step->GetItemUseText(step_str) ); } } else { m_filament_vt_load_step->Idle(); } } else { if (item_idx > 0 && item_idx < FilamentStep::STEP_COUNT) { m_simplebook_right->SetSelection(1); m_filament_load_step->SelectItem( m_filament_load_step->GetItemUseText(step_str) ); } else { m_filament_load_step->Idle(); } } } void AMSControl::ShowFilamentTip(bool hasams) { m_simplebook_right->SetSelection(0); if (hasams) { m_tip_right_top->Show(); m_tip_load_info->SetLabelText(_L("Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically load or unload filaments.")); } else { // m_tip_load_info->SetLabelText(_L("Before loading, please make sure the filament is pushed into toolhead.")); m_tip_right_top->Hide(); m_tip_load_info->SetLabelText(wxEmptyString); } m_tip_load_info->SetMinSize(AMS_STEP_SIZE); m_tip_load_info->Wrap(AMS_STEP_SIZE.x - FromDIP(5)); m_sizer_right_tip->Layout(); } bool AMSControl::Enable(bool enable) { for (auto i = 0; i < m_ams_item_list.GetCount(); i++) { AmsItems *item = m_ams_item_list[i]; item->amsItem->Enable(enable); } for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { AmsCansWindow *cans = m_ams_cans_list[i]; cans->amsCans->Enable(enable); } m_button_extruder_feed->Enable(enable); m_button_extruder_back->Enable(enable); m_button_ams_setting->Enable(enable); m_filament_load_step->Enable(enable); return wxWindow::Enable(enable); } void AMSControl::SetExtruder(bool on_off, bool is_vams, std::string ams_now, wxColour col) { if (m_ams_model == AMSModel::GENERIC_AMS || m_ext_model == AMSModel::GENERIC_AMS ) { if (!on_off) { m_extruder->TurnOff(); m_vams_extra_road->OnVamsLoading(false); m_extruder->OnVamsLoading(false); m_vams_road->OnVamsLoading(false); } else { m_extruder->TurnOn(col); if (ams_now != GetCurentShowAms()) { m_extruder->OnAmsLoading(false, col); } else { m_extruder->OnAmsLoading(true, col); } } if (is_vams && on_off) { m_extruder->OnAmsLoading(false); m_vams_extra_road->OnVamsLoading(true, col); m_extruder->OnVamsLoading(true, col); m_vams_road->OnVamsLoading(true, col); } else { m_vams_extra_road->OnVamsLoading(false); m_extruder->OnVamsLoading(false); m_vams_road->OnVamsLoading(false); } } else if (m_ams_model == AMSModel::AMS_LITE || m_ext_model == AMSModel::AMS_LITE) { if (!is_vams && !on_off) { m_extruder->TurnOff(); m_extruder->OnVamsLoading(false); m_vams_extra_road->OnVamsLoading(false); m_vams_road->OnVamsLoading(false); } else { m_extruder->TurnOn(col); } if (is_vams && on_off) { m_vams_extra_road->OnVamsLoading(true, col); m_extruder->OnVamsLoading(true, col); m_vams_road->OnVamsLoading(true, col); } else { m_vams_extra_road->OnVamsLoading(false); m_extruder->OnVamsLoading(false); m_vams_road->OnVamsLoading(false); } } } void AMSControl::SetAmsStep(std::string ams_id, std::string canid, AMSPassRoadType type, AMSPassRoadSTEP step) { AmsCansWindow *cans = nullptr; bool notfound = true; for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { cans = m_ams_cans_list[i]; if (cans->amsCans->m_info.ams_id == ams_id) { notfound = false; break; } } if (ams_id != m_last_ams_id || m_last_tray_id != canid) { SetAmsStep(m_last_ams_id, m_last_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); m_vams_extra_road->OnVamsLoading(false); m_extruder->OnVamsLoading(false); m_vams_road->OnVamsLoading(false); } if (notfound) return; if (cans == nullptr) return; m_last_ams_id = ams_id; m_last_tray_id = canid; if (m_ams_model == AMSModel::GENERIC_AMS) { if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); m_extruder->OnAmsLoading(false); } if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1) { cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); m_extruder->OnAmsLoading(false); } if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2) { cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); if (m_current_show_ams == ams_id) { m_extruder->OnAmsLoading(true, cans->amsCans->GetTagColr(canid)); } } if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3) { cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_3); m_extruder->OnAmsLoading(true, cans->amsCans->GetTagColr(canid)); } } else if (m_ams_model == AMSModel::AMS_LITE) { cans->amsCans->SetAmsStepExtra(canid, type, step); if (step != AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { m_extruder->OnAmsLoading(true, cans->amsCans->GetTagColr(canid)); } else { m_extruder->OnAmsLoading(false); } } for (auto i = 0; i < m_ams_info.size(); i++) { if (m_ams_info[i].ams_id == ams_id) { m_ams_info[i].current_step = step; m_ams_info[i].current_can_id = canid; } } } void AMSControl::on_filament_load(wxCommandEvent &event) { m_button_extruder_back->Disable(); for (auto i = 0; i < m_ams_info.size(); i++) { if (m_ams_info[i].ams_id == m_current_ams) { m_ams_info[i].current_action = AMSAction::AMS_ACTION_LOAD; } } post_event(SimpleEvent(EVT_AMS_LOAD)); } void AMSControl::on_extrusion_cali(wxCommandEvent &event) { for (auto i = 0; i < m_ams_info.size(); i++) { if (m_ams_info[i].ams_id == m_current_ams) { m_ams_info[i].current_action = AMSAction::AMS_ACTION_CALI; } } post_event(SimpleEvent(EVT_AMS_EXTRUSION_CALI)); } void AMSControl::on_filament_unload(wxCommandEvent &event) { m_button_extruder_feed->Disable(); for (auto i = 0; i < m_ams_info.size(); i++) { if (m_ams_info[i].ams_id == m_current_ams) { m_ams_info[i].current_action = AMSAction::AMS_ACTION_UNLOAD; } } post_event(SimpleEvent(EVT_AMS_UNLOAD)); } void AMSControl::on_ams_setting_click(wxMouseEvent &event) { for (auto i = 0; i < m_ams_info.size(); i++) { if (m_ams_info[i].ams_id == m_current_ams) { m_ams_info[i].current_action = AMSAction::AMS_ACTION_CALI; } } post_event(SimpleEvent(EVT_AMS_SETTINGS)); } void AMSControl::on_clibration_again_click(wxMouseEvent &event) { post_event(SimpleEvent(EVT_AMS_CLIBRATION_AGAIN)); } void AMSControl::on_clibration_cancel_click(wxMouseEvent &event) { post_event(SimpleEvent(EVT_AMS_CLIBRATION_CANCEL)); } void AMSControl::post_event(wxEvent &&event) { event.SetEventObject(m_parent); wxPostEvent(m_parent, event); } }} // namespace Slic3r::GUI