From 5d9a7eaadcd5ab6dc2f18e65000ead81e7e8adb6 Mon Sep 17 00:00:00 2001 From: tao wang Date: Wed, 4 Dec 2024 09:38:34 +0800 Subject: [PATCH] NEW:new fialment load/unload process jira:[none] Change-Id: Ie0076d5c7ec619414121c1f6d37876aaa4e044c1 --- resources/images/filament_load_extruder.png | Bin 0 -> 20037 bytes src/slic3r/CMakeLists.txt | 2 + src/slic3r/GUI/DeviceManager.cpp | 42 +- src/slic3r/GUI/DeviceManager.hpp | 6 +- src/slic3r/GUI/Monitor.cpp | 2 - src/slic3r/GUI/SelectMachine.cpp | 18 +- src/slic3r/GUI/StatusPanel.cpp | 477 +++++++++++++------- src/slic3r/GUI/StatusPanel.hpp | 14 +- src/slic3r/GUI/Widgets/AMSControl.cpp | 26 +- src/slic3r/GUI/Widgets/AMSItem.cpp | 5 +- src/slic3r/GUI/Widgets/AMSItem.hpp | 6 +- src/slic3r/GUI/Widgets/FilamentLoad.cpp | 223 +++++++++ src/slic3r/GUI/Widgets/FilamentLoad.hpp | 60 +++ src/slic3r/GUI/Widgets/StepCtrl.cpp | 131 ++++++ src/slic3r/GUI/Widgets/StepCtrl.hpp | 24 + 15 files changed, 826 insertions(+), 210 deletions(-) create mode 100644 resources/images/filament_load_extruder.png create mode 100644 src/slic3r/GUI/Widgets/FilamentLoad.cpp create mode 100644 src/slic3r/GUI/Widgets/FilamentLoad.hpp diff --git a/resources/images/filament_load_extruder.png b/resources/images/filament_load_extruder.png new file mode 100644 index 0000000000000000000000000000000000000000..30afd6494d79b8d93aba87106ab9287342d5cb2d GIT binary patch literal 20037 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

aCXP}R-}s)y0-t+s7B_nu)vd+w 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 Bwv7M) literal 0 HcmV?d00001 diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 29f5b11c3..81223a9f6 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -62,6 +62,8 @@ set(SLIC3R_GUI_SOURCES GUI/Widgets/AMSControl.hpp GUI/Widgets/AMSItem.cpp GUI/Widgets/AMSItem.hpp + GUI/Widgets/FilamentLoad.cpp + GUI/Widgets/FilamentLoad.hpp GUI/Widgets/FanControl.cpp GUI/Widgets/FanControl.hpp GUI/Widgets/Scrollbar.cpp diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index fd1534a93..10f0caebf 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -777,7 +777,7 @@ bool MachineObject::is_extrusion_cali_finished() void MachineObject::_parse_tray_now(std::string tray_now) { - m_tray_now = tray_now; + m_tray_now = tray_now; if (tray_now.empty()) { return; } else { @@ -2005,6 +2005,19 @@ int MachineObject::command_ams_change_filament(int tray_id, int old_temp, int ne return this->publish_json(j.dump()); } +int MachineObject::command_ams_change_filament2(int ams_id, int slot_id, int old_temp, int new_temp) +{ + json j; + j["print"]["command"] = "ams_change_filament"; + j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["print"]["target"] = ams_id == VIRTUAL_TRAY_MAIN_ID?VIRTUAL_TRAY_DEPUTY_ID:slot_id; + j["print"]["curr_temp"] = old_temp; + j["print"]["tar_temp"] = new_temp; + j["print"]["ams_id"] = ams_id; + j["print"]["slot_id"] = slot_id; + return this->publish_json(j.dump()); +} + int MachineObject::command_ams_user_settings(int ams_id, bool start_read_opt, bool tray_read_opt, bool remain_flag) { json j; @@ -3608,14 +3621,14 @@ int MachineObject::parse_json(std::string payload, bool key_field_only) if (jj.contains("nozzle_temper")) { if (jj["nozzle_temper"].is_number()) { if (m_extder_data.extders.size() == 1) { - m_extder_data.extders[0].temp = jj["nozzle_temper"].get(); + m_extder_data.extders[MAIN_NOZZLE_ID].temp = jj["nozzle_temper"].get(); } } } if (jj.contains("nozzle_target_temper")) { if (jj["nozzle_target_temper"].is_number()) { if (m_extder_data.extders.size() == 1) { - m_extder_data.extders[0].target_temp = jj["nozzle_target_temper"].get(); + m_extder_data.extders[MAIN_NOZZLE_ID].target_temp = jj["nozzle_target_temper"].get(); } } } @@ -3812,8 +3825,8 @@ int MachineObject::parse_json(std::string payload, bool key_field_only) nozzle_diameter = string_to_float(jj["nozzle_diameter"].get()); } - if (nozzle_diameter == 0.0f) {m_extder_data.extders[0].current_nozzle_diameter = 0.4f;} - else {m_extder_data.extders[0].current_nozzle_diameter = round(nozzle_diameter * 10) / 10;} + if (nozzle_diameter == 0.0f) {m_extder_data.extders[MAIN_NOZZLE_ID].current_nozzle_diameter = 0.4f;} + else {m_extder_data.extders[MAIN_NOZZLE_ID].current_nozzle_diameter = round(nozzle_diameter * 10) / 10;} } } } @@ -3830,7 +3843,7 @@ int MachineObject::parse_json(std::string payload, bool key_field_only) else { if (jj["nozzle_type"].is_string()) { auto nozzle_type = jj["nozzle_type"].get(); - m_extder_data.extders[0].current_nozzle_type = NozzleTypeStrToEumn[nozzle_type]; + m_extder_data.extders[MAIN_NOZZLE_ID].current_nozzle_type = NozzleTypeStrToEumn[nozzle_type]; } } } @@ -5734,7 +5747,8 @@ void MachineObject::parse_new_info(json print) } else { m_extder_data.current_extder_id = get_flag_bits(extruder["state"].get(), 4, 3); m_extder_data.target_extder_id = get_flag_bits(extruder["state"].get(), 8, 3); - m_extder_data.state = (ExtruderSwitchState) get_flag_bits(extruder["state"].get(), 12, 2); + m_extder_data.switch_extder_state = (ExtruderSwitchState) get_flag_bits(extruder["state"].get(), 12, 2); + m_extder_data.current_loading_extder_id = get_flag_bits(extruder["state"].get(), 15, 3); } for (auto it = extruder["info"].begin(); it != extruder["info"].end(); it++) { @@ -5752,16 +5766,16 @@ void MachineObject::parse_new_info(json print) extder_obj.target_temp = get_flag_bits(njon["temp"].get(), 16, 15); AmsSlot spre; - spre.ams_id = std::to_string(get_flag_bits(njon["spre"].get(), 0, 8)); - spre.slot_id = std::to_string(get_flag_bits(njon["spre"].get(), 8, 8)); + spre.slot_id = std::to_string(get_flag_bits(njon["spre"].get(), 0, 8)); + spre.ams_id = std::to_string(get_flag_bits(njon["spre"].get(), 8, 8)); AmsSlot snow; - snow.ams_id = std::to_string(get_flag_bits(njon["snow"].get(), 0, 8)); - snow.slot_id = std::to_string(get_flag_bits(njon["snow"].get(), 8, 8)); + snow.slot_id = std::to_string(get_flag_bits(njon["snow"].get(), 0, 8)); + snow.ams_id = std::to_string(get_flag_bits(njon["snow"].get(), 8, 8)); AmsSlot star; - star.ams_id = std::to_string(get_flag_bits(njon["star"].get(), 0, 8)); - star.slot_id = std::to_string(get_flag_bits(njon["star"].get(), 8, 8)); + star.slot_id = std::to_string(get_flag_bits(njon["star"].get(), 0, 8)); + star.ams_id = std::to_string(get_flag_bits(njon["star"].get(), 8, 8)); extder_obj.nozzle_id = njon["hnow"].get(); extder_obj.target_nozzle_id = njon["htar"].get(); @@ -6048,7 +6062,7 @@ void MachineObject::check_ams_filament_valid() std::string preset_setting_id; PresetBundle * preset_bundle = Slic3r::GUI::wxGetApp().preset_bundle; std::ostringstream stream; - stream << std::fixed << std::setprecision(1) << m_extder_data.extders[0].current_nozzle_diameter; + stream << std::fixed << std::setprecision(1) << m_extder_data.extders[MAIN_NOZZLE_ID].current_nozzle_diameter; std::string nozzle_diameter_str = stream.str(); bool is_equation = preset_bundle->check_filament_temp_equation_by_printer_type_and_nozzle_for_mas_tray(MachineObject::get_preset_printer_model_name( this->printer_type), diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 809300a34..9067a930a 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -37,6 +37,8 @@ #define HOLD_COUNT_CAMERA 6 #define GET_VERSION_RETRYS 10 #define RETRY_INTERNAL 2000 +#define MAIN_NOZZLE_ID 0 +#define DEPUTY_NOZZLE_ID 1 #define VIRTUAL_TRAY_MAIN_ID 255 #define VIRTUAL_TRAY_DEPUTY_ID 254 #define START_SEQ_ID 20000 @@ -218,7 +220,8 @@ struct ExtderData int current_extder_id{0}; int target_extder_id{0}; int total_extder_count {0}; - int state; + int current_loading_extder_id {-1}; + ExtruderSwitchState switch_extder_state; std::vector extders; }; @@ -1039,6 +1042,7 @@ public: // ams controls int command_ams_switch(int tray_index, int old_temp = 210, int new_temp = 210); int command_ams_change_filament(int tray_id, int old_temp = 210, int new_temp = 210); + int command_ams_change_filament2(int ams_id, int slot_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_switch_filament(bool switch_filament); int command_ams_air_print_detect(bool air_print_detect); diff --git a/src/slic3r/GUI/Monitor.cpp b/src/slic3r/GUI/Monitor.cpp index 56dce7c5a..065145d74 100644 --- a/src/slic3r/GUI/Monitor.cpp +++ b/src/slic3r/GUI/Monitor.cpp @@ -305,8 +305,6 @@ void MonitorPanel::select_machine(std::string machine_sn) if (!dev->set_selected_machine(event.GetString().ToStdString())) return; - m_status_info_panel->reset_ams_group_show_flag(); - set_default(); update_all(); diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 90cfcffa5..f18d11927 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -950,9 +950,8 @@ void SelectMachineDialog::update_select_layout(MachineObject *obj) m_checkbox_list["flow_cali"]->Hide(); m_checkbox_list["nozzle_offset_cali"]->Hide(); - if (!obj) { - return; - } + if (!obj) {return;} + AppConfig *config = wxGetApp().app_config; if (obj->is_enable_np) { m_checkbox_list["nozzle_offset_cali"]->Show(); @@ -968,27 +967,28 @@ void SelectMachineDialog::update_select_layout(MachineObject *obj) m_checkbox_list["bed_leveling"]->update_options(ops_no_auto); m_checkbox_list["flow_cali"]->update_options(ops_auto); - AppConfig *config = wxGetApp().app_config; if (config && config->get("print", "bed_leveling") == "0") { m_checkbox_list["bed_leveling"]->setValue("off"); } else { m_checkbox_list["bed_leveling"]->setValue("on"); } + if (config && config->get("print", "flow_cali") == "0") { m_checkbox_list["flow_cali"]->setValue("off"); } else { m_checkbox_list["flow_cali"]->setValue("on"); } - if (config && config->get("print", "timelapse") == "0") { - m_checkbox_list["timelapse"]->setValue("off"); - } else { - m_checkbox_list["timelapse"]->setValue("on"); - } update_timelapse_enable_status(); update_flow_cali_check(obj); } + if (config && config->get("print", "timelapse") == "0") { + m_checkbox_list["timelapse"]->setValue("off"); + } else { + m_checkbox_list["timelapse"]->setValue("on"); + } + if (obj && obj->is_support_auto_flow_calibration) { m_checkbox_list["flow_cali"]->Show(); } diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index b6cf311a6..a10d9cb6e 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -1307,10 +1307,15 @@ wxBoxSizer *StatusBasePanel::create_machine_control_page(wxWindow *parent) auto temp_axis_ctrl_sizer = create_temp_axis_group(parent); auto m_ams_ctrl_sizer = create_ams_group(parent); + auto m_filament_load_sizer = create_filament_group(parent); + + bSizer_control->Add(0, 0, 0, wxTOP, FromDIP(8)); + bSizer_control->Add(temp_axis_ctrl_sizer, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(8)); + bSizer_control->Add(0, 0, 0, wxTOP, FromDIP(6)); + bSizer_control->Add(m_ams_ctrl_sizer, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(8)); + bSizer_control->Add(m_filament_load_sizer, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(8)); + bSizer_control->Add(0, 0, 0, wxTOP, FromDIP(4)); - bSizer_control->Add(temp_axis_ctrl_sizer, 0, wxALL | wxEXPAND, FromDIP(4)); - bSizer_control->Add(0, 0, 0, wxTOP, FromDIP(10)); - bSizer_control->Add(m_ams_ctrl_sizer, 0, wxALL | wxEXPAND, FromDIP(4)); bSizer_right->Add(bSizer_control, 1, wxEXPAND | wxALL, 0); return bSizer_right; @@ -1587,7 +1592,6 @@ void StatusBasePanel::reset_temp_misc_control() m_tempCtrl_bed->GetTextCtrl()->SetValue(TEMP_BLANK_STR); m_tempCtrl_chamber->SetLabel(TEMP_BLANK_STR); m_tempCtrl_chamber->GetTextCtrl()->SetValue(TEMP_BLANK_STR); - //m_button_unload->Show(); m_tempCtrl_nozzle->Enable(true); m_tempCtrl_nozzle_deputy->Enable(true); @@ -1805,21 +1809,6 @@ wxBoxSizer *StatusBasePanel::create_extruder_control(wxWindow *parent) m_bpButton_e_down_10->SetBorderColor(e_ctrl_bd); m_bpButton_e_down_10->SetMinSize(wxSize(FromDIP(40), FromDIP(40))); - /*m_button_unload = new Button(panel, _L("Unload")); - - StateColor abort_bg(std::pair(wxColour(255, 255, 255), StateColor::Disabled), std::pair(wxColour(206, 206, 206), StateColor::Pressed), - std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(wxColour(255, 255, 255), StateColor::Enabled), - std::pair(wxColour(255, 255, 255), StateColor::Normal)); - m_button_unload->SetBackgroundColor(abort_bg); - StateColor abort_bd(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); - m_button_unload->SetBorderColor(abort_bd); - StateColor abort_text(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); - m_button_unload->SetTextColor(abort_text); - m_button_unload->SetFont(Label::Body_10); - m_button_unload->SetMinSize(wxSize(-1, FromDIP(24))); - m_button_unload->SetCornerRadius(FromDIP(12)); - bSizer_e_ctrl->Add(0, 0, 1, wxEXPAND, 0); - bSizer_e_ctrl->Add(m_button_unload, 0, wxALIGN_CENTER_HORIZONTAL| wxTOP|wxBOTTOM, FromDIP(5));*/ m_extruder_label = new ::Label(panel, _L("Extruder")); m_extruder_label->SetFont(::Label::Body_13); m_extruder_label->SetForegroundColour(TEXT_LIGHT_FONT_COL); @@ -1877,15 +1866,75 @@ wxBoxSizer *StatusBasePanel::create_ams_group(wxWindow *parent) return sizer; } +wxBoxSizer* StatusBasePanel::create_filament_group(wxWindow* parent) +{ + auto sizer = new wxBoxSizer(wxVERTICAL); + auto sizer_box = new wxBoxSizer(wxVERTICAL); + + m_filament_load_box = new StaticBox(parent); + + StateColor box_colour(std::pair(*wxWHITE, StateColor::Normal)); + StateColor box_border_colour(std::pair(STATUS_PANEL_BG, StateColor::Normal)); + + m_filament_load_box->SetBackgroundColor(box_colour); + m_filament_load_box->SetBorderColor(box_border_colour); + m_filament_load_box->SetCornerRadius(5); + m_filament_load_box->SetMinSize(wxSize(FromDIP(586), -1)); + m_filament_load_box->SetMaxSize(wxSize(FromDIP(586), -1)); + m_filament_load_box->SetBackgroundColour(*wxWHITE); + + m_filament_step = new FilamentLoad(m_filament_load_box, wxID_ANY); + m_filament_step->SetDoubleBuffered(true); + m_filament_step->set_min_size(wxSize(wxSize(FromDIP(586), FromDIP(215)))); + m_filament_step->set_max_size(wxSize(wxSize(FromDIP(586), FromDIP(215)))); + m_filament_step->SetBackgroundColour(*wxWHITE); + + 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)); + 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)); + + m_button_retry = new Button(m_filament_load_box, _L("Retry")); + m_button_retry->SetFont(Label::Body_13); + m_button_retry->SetBorderColor(btn_bd_white); + m_button_retry->SetTextColor(btn_text_white); + m_button_retry->SetMinSize(wxSize(FromDIP(80), FromDIP(31))); + m_button_retry->SetBackgroundColor(btn_bg_white); + + m_button_retry->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { + wxCommandEvent evt(EVT_AMS_RETRY); + evt.SetEventObject(this); + wxPostEvent(m_parent, evt); + }); + + + sizer_box->Add(m_filament_step, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP|wxLEFT|wxRIGHT, FromDIP(10)); + sizer_box->Add(0, 0, 0, wxTOP, FromDIP(5)); + sizer_box->Add(m_button_retry, 0, wxLEFT, FromDIP(28)); + sizer_box->Add(0, 0, 0, wxTOP, FromDIP(10)); + m_filament_load_box->SetBackgroundColour(*wxWHITE); + m_filament_load_box->SetSizer(sizer_box); + m_filament_load_box->Layout(); + m_filament_load_box->Fit(); + sizer->Add(m_filament_load_box, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, FromDIP(10)); + return sizer; +} + void StatusBasePanel::show_ams_group(bool show) { - if (m_show_ams_group != show || m_show_ams_group_reset) { - m_ams_control->Show(true); - m_ams_control_box->Show(true); + if (m_ams_control->IsShown() != show) { + m_ams_control->Show(show); m_ams_control->show_noams_mode(); - if (m_show_ams_group != show) { Fit(); } + } + + if (m_ams_control_box->IsShown() != show) { + m_ams_control_box->Show(show); + } + + if (m_show_ams_group != show) + { m_show_ams_group = show; - m_show_ams_group_reset = false; m_ams_control->Layout(); m_ams_control->Fit(); Layout(); @@ -1893,6 +1942,22 @@ void StatusBasePanel::show_ams_group(bool show) } } +void StatusBasePanel::show_filament_load_group(bool show) +{ + if (m_filament_load_box->IsShown() != show) { + m_filament_load_box->Show(show); + } + + if (m_filament_step->IsShown() != show) { + m_filament_step->Show(show); + } + + if (m_show_filament_group != show ) { + m_show_filament_group = show; + Layout(); + Fit(); + } +} void StatusPanel::update_camera_state(MachineObject* obj) { @@ -1981,7 +2046,6 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co , m_fan_control_popup(new FanControlPopup(this)) { init_scaled_buttons(); - //m_buttons.push_back(m_button_unload); m_buttons.push_back(m_bpButton_z_10); m_buttons.push_back(m_bpButton_z_1); m_buttons.push_back(m_bpButton_z_down_1); @@ -2056,7 +2120,6 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co m_bpButton_e_down_10->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_axis_ctrl_e_down_10), NULL, this); m_nozzle_btn_panel->Connect(wxCUSTOMEVT_SELECT_NOZZLE_POS, wxCommandEventHandler(StatusPanel::on_nozzle_selected), NULL, this); - //m_button_unload->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_start_unload), NULL, this); 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); @@ -2124,8 +2187,7 @@ StatusPanel::~StatusPanel() m_calibration_btn->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_start_calibration), NULL, this); m_options_btn->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_show_print_options), NULL, this); m_parts_btn->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_show_parts_options), NULL, this); - //m_button_unload->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_start_unload), NULL, this); - // + // remove warning dialogs if (m_print_error_dlg != nullptr) delete m_print_error_dlg; @@ -2147,8 +2209,6 @@ StatusPanel::~StatusPanel() void StatusPanel::init_scaled_buttons() { m_project_task_panel->init_scaled_buttons(); - //m_button_unload->SetMinSize(wxSize(-1, FromDIP(24))); - //m_button_unload->SetCornerRadius(FromDIP(12)); m_bpButton_z_10->SetMinSize(Z_BUTTON_SIZE); m_bpButton_z_10->SetCornerRadius(0); m_bpButton_z_1->SetMinSize(Z_BUTTON_SIZE); @@ -2605,7 +2665,6 @@ void StatusPanel::show_printing_status(bool ctrl_area, bool temp_area) m_staticText_z_tip->SetForegroundColour(DISCONNECT_TEXT_COL); m_extruder_label->SetForegroundColour(DISCONNECT_TEXT_COL); - //m_button_unload->Enable(false); m_switch_speed->SetValue(false); } else { m_switch_speed->Enable(); @@ -2633,7 +2692,6 @@ void StatusPanel::show_printing_status(bool ctrl_area, bool temp_area) m_staticText_z_tip->SetForegroundColour(TEXT_LIGHT_FONT_COL); m_extruder_label->SetForegroundColour(TEXT_LIGHT_FONT_COL); - //m_button_unload->Enable(); m_switch_speed->SetValue(true); } @@ -2994,16 +3052,16 @@ void StatusPanel::update_ams(MachineObject *obj) BOOST_LOG_TRIVIAL(trace) << "machine object" << obj->dev_name << " was disconnected, set show_ams_group is false"; } - m_ams_control->SetAmsModel(AMSModel::EXT_AMS, ams_mode); - show_ams_group(false); + show_filament_load_group(false); m_ams_control->show_auto_refill(false); } else { - m_ams_control->SetAmsModel(ams_mode, ams_mode); + m_filament_step->SetAmsModel(ams_mode, ams_mode); show_ams_group(true); + show_filament_load_group(true); m_ams_control->show_auto_refill(true); } @@ -3033,18 +3091,6 @@ void StatusPanel::update_ams(MachineObject *obj) } std::string dev_id = obj->dev_id; ExtderData data = obj->m_extder_data; - //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) { - // m_ams_control->UpdateAms(ams_info, false); - // // select current ams - // //if (!obj->m_ams_id.empty()) m_ams_control->SwitchAms(obj->m_ams_id); - - // last_tray_exist_bits = obj->tray_exist_bits; - // last_ams_exist_bits = obj->ams_exist_bits; - // last_tray_is_bbl_bits = obj->tray_is_bbl_bits; - // last_read_done_bits = obj->tray_read_done_bits; - // last_ams_version = obj->ams_version; - //} // must select a current can m_ams_control->UpdateAms(ams_info, ext_info, data, dev_id, false); @@ -3064,119 +3110,208 @@ void StatusPanel::update_ams(MachineObject *obj) is_vt_tray = true; // set segment 1, 2 - if (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_MAIN_ID) || obj->m_tray_now == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { - m_ams_control->SetAmsStep(obj->m_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + if (!obj->is_enable_np) { + + if (obj->m_tray_now == std::to_string(255) || obj->m_tray_now == std::to_string(254)) { + m_ams_control->SetAmsStep(obj->m_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + } else { + if (obj->m_tray_now != "255" && obj->is_filament_at_extruder() && !obj->m_tray_id.empty()) { + m_ams_control->SetAmsStep(obj->m_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); + } else if (obj->m_tray_now != "255") { + m_ams_control->SetAmsStep(obj->m_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1); + } else { + m_ams_control->SetAmsStep(obj->m_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + } + } + + if (obj->m_tray_now == std::to_string(255) || obj->m_tray_now == std::to_string(254)) { + m_ams_control->SetExtruder(obj->is_filament_at_extruder(), true, obj->m_ams_id, obj->vt_slot[0].get_color()); + } else { + m_ams_control->SetExtruder(obj->is_filament_at_extruder(), false, obj->m_ams_id, m_ams_control->GetCanColour(obj->m_ams_id, obj->m_tray_id)); + } } else { - if (obj->m_tray_now != "255" && obj->is_filament_at_extruder() && !obj->m_tray_id.empty()) { - m_ams_control->SetAmsStep(obj->m_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); + + /*right*/ + if (obj->m_extder_data.extders.size() > 0) { + auto ext = obj->m_extder_data.extders[MAIN_NOZZLE_ID]; + if (ext.ext_has_filament) { + if (ext.snow.slot_id == std::to_string(MAIN_NOZZLE_ID) || ext.snow.slot_id == std::to_string(MAIN_NOZZLE_ID)) { + m_ams_control->SetAmsStep(ext.star.ams_id, "0", AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); + } else { + m_ams_control->SetAmsStep(ext.snow.ams_id, ext.snow.slot_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); + } + m_ams_control->SetExtruder(true, true, ext.snow.ams_id, m_ams_control->GetCanColour(obj->m_ams_id, obj->m_tray_id)); + } else { + m_ams_control->SetAmsStep(ext.snow.ams_id, ext.snow.slot_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + m_ams_control->SetExtruder(false, true, ext.snow.ams_id, m_ams_control->GetCanColour(obj->m_ams_id, obj->m_tray_id)); + } } - else if (obj->m_tray_now != "255") { - m_ams_control->SetAmsStep(obj->m_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1); - } - else { - m_ams_control->SetAmsStep(obj->m_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + + /*left*/ + if (obj->m_extder_data.extders.size() > 1) { + auto ext = obj->m_extder_data.extders[DEPUTY_NOZZLE_ID]; + if (ext.ext_has_filament) { + if (ext.snow.slot_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || ext.snow.slot_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { + m_ams_control->SetAmsStep(ext.snow.ams_id, "0", AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); + } else { + m_ams_control->SetAmsStep(ext.snow.ams_id, ext.snow.slot_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); + } + m_ams_control->SetExtruder(true, true, ext.snow.ams_id, m_ams_control->GetCanColour(obj->m_ams_id, obj->m_tray_id)); + } else { + m_ams_control->SetAmsStep(ext.snow.ams_id, ext.snow.slot_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + m_ams_control->SetExtruder(false, true, ext.snow.ams_id, m_ams_control->GetCanColour(obj->m_ams_id, obj->m_tray_id)); + } } + + + //m_ams_control->SetAmsStep(std::to_string(VIRTUAL_TRAY_MAIN_ID), "0", AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); + //m_ams_control->SetExtruder(true, true, std::to_string(VIRTUAL_TRAY_MAIN_ID), *wxRED); } - // set segment 3 - if (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_MAIN_ID) || obj->m_tray_now == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { - m_ams_control->SetExtruder(obj->is_filament_at_extruder(), true, obj->m_ams_id, obj->vt_slot[0].get_color()); - } else { - m_ams_control->SetExtruder(obj->is_filament_at_extruder(), false, obj->m_ams_id, m_ams_control->GetCanColour(obj->m_ams_id, obj->m_tray_id)); - } + bool ams_loading_state = false; + auto ams_status_sub = obj->ams_status_sub; - if (obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE) { + int vt_tray_id = VIRTUAL_TRAY_DEPUTY_ID; + /*if (obj->is_enable_np) { + if (obj->m_extder_data.current_loading_extder_id == MAIN_NOZZLE_ID || obj->m_extder_data.current_loading_extder_id == DEPUTY_NOZZLE_ID) { + ams_loading_state = true; + } + } else if(obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE){ + ams_loading_state = true; + }*/ + + + if (ams_loading_state) { update_filament_step(); - - if (obj->m_tray_tar == std::to_string(VIRTUAL_TRAY_MAIN_ID) && (obj->m_tray_now != std::to_string(VIRTUAL_TRAY_MAIN_ID) || obj->m_tray_now != "255")) { + m_filament_step->updateID(std::atoi(obj->m_ams_id.c_str()), std::atoi(obj->m_tray_id.c_str())); + if (obj->m_tray_tar == std::to_string(vt_tray_id) && (obj->m_tray_now != std::to_string(vt_tray_id) || obj->m_tray_now != "255")) { // wait to heat hotend - if (obj->ams_status_sub == 0x02) { + if (ams_status_sub == 0x02) { m_ams_control->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, FilamentStepType::STEP_TYPE_VT_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, FilamentStepType::STEP_TYPE_VT_LOAD); } - else if (obj->ams_status_sub == 0x05) { - m_ams_control->SetFilamentStep(FilamentStep::STEP_FEED_FILAMENT, FilamentStepType::STEP_TYPE_VT_LOAD); + else if (ams_status_sub == 0x05) { + m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_VT_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_VT_LOAD); } - else if (obj->ams_status_sub == 0x06) { + else if (ams_status_sub == 0x06) { m_ams_control->SetFilamentStep(FilamentStep::STEP_CONFIRM_EXTRUDED, FilamentStepType::STEP_TYPE_VT_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_CONFIRM_EXTRUDED, FilamentStepType::STEP_TYPE_VT_LOAD); } - else if (obj->ams_status_sub == 0x07) { + else if (ams_status_sub == 0x07) { m_ams_control->SetFilamentStep(FilamentStep::STEP_PURGE_OLD_FILAMENT, FilamentStepType::STEP_TYPE_VT_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_PURGE_OLD_FILAMENT, FilamentStepType::STEP_TYPE_VT_LOAD); } else { m_ams_control->SetFilamentStep(FilamentStep::STEP_IDLE, FilamentStepType::STEP_TYPE_VT_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_IDLE, FilamentStepType::STEP_TYPE_VT_LOAD); + ams_loading_state = false; } } else { // wait to heat hotend - if (obj->ams_status_sub == 0x02) { + if (ams_status_sub == 0x02) { if (!obj->is_ams_unload()) { m_ams_control->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, FilamentStepType::STEP_TYPE_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, FilamentStepType::STEP_TYPE_LOAD); } else { m_ams_control->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, FilamentStepType::STEP_TYPE_UNLOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, FilamentStepType::STEP_TYPE_UNLOAD); } - } else if (obj->ams_status_sub == 0x03) { + } else if (ams_status_sub == 0x03) { if (!obj->is_ams_unload()) { m_ams_control->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); } else { m_ams_control->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD); } - } else if (obj->ams_status_sub == 0x04) { + } else if (ams_status_sub == 0x04) { if (!obj->is_ams_unload()) { m_ams_control->SetFilamentStep(FilamentStep::STEP_PULL_CURR_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_PULL_CURR_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); } else { m_ams_control->SetFilamentStep(FilamentStep::STEP_PULL_CURR_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_PULL_CURR_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD); } - } else if (obj->ams_status_sub == 0x05) { + } else if (ams_status_sub == 0x05) { if (!obj->is_ams_unload()) { if(m_is_load_with_temp){ m_ams_control->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); }else{ m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); } } else { m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD); } - } else if (obj->ams_status_sub == 0x06) { + } else if (ams_status_sub == 0x06) { if (!obj->is_ams_unload()) { m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); } else { m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD); } - } else if (obj->ams_status_sub == 0x07) { + } else if (ams_status_sub == 0x07) { if (!obj->is_ams_unload()) { if (m_is_load_with_temp) { m_ams_control->SetFilamentStep(FilamentStep::STEP_PULL_CURR_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_PULL_CURR_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); }else{ m_ams_control->SetFilamentStep(FilamentStep::STEP_PURGE_OLD_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_PURGE_OLD_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); } } else { m_ams_control->SetFilamentStep(FilamentStep::STEP_PURGE_OLD_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_PURGE_OLD_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD); } } - else if (obj->ams_status_sub == 0x08) { + else if (ams_status_sub == 0x08) { if (!obj->is_ams_unload()) { m_ams_control->SetFilamentStep(FilamentStep::STEP_CHECK_POSITION, FilamentStepType::STEP_TYPE_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_CHECK_POSITION, FilamentStepType::STEP_TYPE_LOAD); } else { m_ams_control->SetFilamentStep(FilamentStep::STEP_CHECK_POSITION, FilamentStepType::STEP_TYPE_UNLOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_CHECK_POSITION, FilamentStepType::STEP_TYPE_UNLOAD); } - } else { + } + else if (ams_status_sub == 0x0B) { + if (!obj->is_ams_unload()) { + m_ams_control->SetFilamentStep(FilamentStep::STEP_CHECK_POSITION, FilamentStepType::STEP_TYPE_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_CHECK_POSITION, FilamentStepType::STEP_TYPE_LOAD); + } else { + m_ams_control->SetFilamentStep(FilamentStep::STEP_CHECK_POSITION, FilamentStepType::STEP_TYPE_UNLOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_CHECK_POSITION, FilamentStepType::STEP_TYPE_UNLOAD); + } + } + else { m_ams_control->SetFilamentStep(FilamentStep::STEP_IDLE, FilamentStepType::STEP_TYPE_UNLOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_IDLE, FilamentStepType::STEP_TYPE_UNLOAD); + ams_loading_state = false; } } } else if (obj->ams_status_main == AMS_STATUS_MAIN_ASSIST) { m_ams_control->SetFilamentStep(FilamentStep::STEP_IDLE, FilamentStepType::STEP_TYPE_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_IDLE, FilamentStepType::STEP_TYPE_LOAD); + ams_loading_state = false; } else { m_ams_control->SetFilamentStep(FilamentStep::STEP_IDLE, FilamentStepType::STEP_TYPE_LOAD); + m_filament_step->SetFilamentStep(FilamentStep::STEP_IDLE, FilamentStepType::STEP_TYPE_LOAD); + ams_loading_state = false; } + show_filament_load_group(ams_loading_state); for (auto ams_it = obj->amsList.begin(); ams_it != obj->amsList.end(); ams_it++) { std::string ams_id = ams_it->first; @@ -3195,36 +3330,7 @@ void StatusPanel::update_ams(MachineObject *obj) } catch (...) {} } - bool is_curr_tray_selected = false; - if (!curr_ams_id.empty() && !curr_can_id.empty() && (curr_ams_id != std::to_string(VIRTUAL_TRAY_MAIN_ID)) ) { - if (curr_can_id == obj->m_tray_now) { - is_curr_tray_selected = true; - } - else { - std::map::iterator it = obj->amsList.find(curr_ams_id); - if (it == obj->amsList.end()) { - BOOST_LOG_TRIVIAL(trace) << "ams: find " << curr_ams_id << " failed"; - return; - } - auto tray_it = it->second->trayList.find(curr_can_id); - if (tray_it == it->second->trayList.end()) { - BOOST_LOG_TRIVIAL(trace) << "ams: find " << curr_can_id << " failed"; - return; - } - - if (!tray_it->second->is_exists) { - is_curr_tray_selected = true; - } - } - }else if (curr_ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID)) { - if (curr_ams_id == obj->m_tray_now) { - is_curr_tray_selected = true; - } - }else { - is_curr_tray_selected = true; - } - - update_ams_control_state(is_curr_tray_selected); + update_ams_control_state(curr_ams_id, curr_can_id); } void StatusPanel::update_ams_insert_material(MachineObject* obj) { @@ -3239,48 +3345,71 @@ void StatusPanel::update_ams_insert_material(MachineObject* obj) { } -void StatusPanel::update_ams_control_state(bool is_curr_tray_selected) +void StatusPanel::update_ams_control_state(std::string ams_id, std::string slot_id) { + return; // set default value to true bool enable[ACTION_BTN_COUNT]; - enable[ACTION_BTN_CALI] = true; enable[ACTION_BTN_LOAD] = true; enable[ACTION_BTN_UNLOAD] = true; - if (obj->is_in_printing()) { - if (obj->is_in_extrusion_cali()) { - enable[ACTION_BTN_LOAD] = false; - enable[ACTION_BTN_UNLOAD] = false; - enable[ACTION_BTN_CALI] = true; + if (obj->is_enable_np) { + if (obj->is_in_printing() && !obj->can_resume()) { + if (!obj->can_resume() || obj->is_in_extrusion_cali()) { + enable[ACTION_BTN_LOAD] = false; + enable[ACTION_BTN_UNLOAD] = false; + } } else { - enable[ACTION_BTN_CALI] = false; + /*switch now*/ + bool in_switch_filament = false; + for ( auto ext : obj->m_extder_data.extders) { + if (ext.ams_stat == AmsStatusMain::AMS_STATUS_MAIN_FILAMENT_CHANGE) { + in_switch_filament = true; + } + } + + if (in_switch_filament) { + enable[ACTION_BTN_LOAD] = false; + enable[ACTION_BTN_UNLOAD] = false; + } + + if (ams_id.empty() || slot_id.empty()) { + enable[ACTION_BTN_LOAD] = false; + enable[ACTION_BTN_UNLOAD] = false; + } + else if (ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { + //todo + } else { + for (auto ext : obj->m_extder_data.extders) { + if (ext.snow.ams_id == ams_id && ext.snow.slot_id == slot_id) { + enable[ACTION_BTN_LOAD] = false; + } + } + + /*empty*/ + std::map::iterator it = obj->amsList.find(ams_id); + if (it == obj->amsList.end()) { + enable[ACTION_BTN_LOAD] = false; + + } else { + auto tray_it = it->second->trayList.find(slot_id); + + if (tray_it == it->second->trayList.end()) { enable[ACTION_BTN_LOAD] = false; } + + if (!tray_it->second->is_exists) { enable[ACTION_BTN_LOAD] = false; } + } + } + } - } - else { - enable[ACTION_BTN_CALI] = true; + } else { } - if (obj->is_in_printing() && !obj->can_resume()) { - enable[ACTION_BTN_LOAD] = false; - enable[ACTION_BTN_UNLOAD] = false; - } + //if (!obj->is_filament_at_extruder()) { + // enable[ACTION_BTN_UNLOAD] = false; + //} - if (obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE) { - enable[ACTION_BTN_LOAD] = false; - enable[ACTION_BTN_UNLOAD] = false; - } - - // select current - if (is_curr_tray_selected) { - enable[ACTION_BTN_LOAD] = false; - } - - if (!obj->is_filament_at_extruder()) { - enable[ACTION_BTN_UNLOAD] = false; - } - - if (obj->ams_exist_bits == 0) { + /*if (obj->ams_exist_bits == 0) { if (obj->is_in_printing()) { if (!obj->can_resume()) { enable[ACTION_BTN_LOAD] = false; @@ -3300,7 +3429,7 @@ void StatusPanel::update_ams_control_state(bool is_curr_tray_selected) } else { - if (obj->is_in_printing() /*&& obj->can_resume() && obj->m_tray_now != std::to_string(VIRTUAL_TRAY_MAIN_ID) */) { + if (obj->is_in_printing()) { if (!obj->can_resume()) { enable[ACTION_BTN_LOAD] = false; @@ -3334,11 +3463,7 @@ void StatusPanel::update_ams_control_state(bool is_curr_tray_selected) } } } - } - -// if (obj->m_tray_now == "255") { -// enable[ACTION_BTN_UNLOAD] = false; -// } + }*/ m_ams_control->SetActionState(enable); } @@ -3837,11 +3962,6 @@ void StatusPanel::on_axis_ctrl_e_down_10(wxCommandEvent &event) } } -void StatusPanel::on_start_unload(wxCommandEvent &event) -{ - if (obj) obj->command_ams_switch(255); -} - void StatusPanel::on_set_bed_temp() { if (!obj) {return;} @@ -3936,7 +4056,8 @@ void StatusPanel::on_ams_load(SimpleEvent &event) void StatusPanel::update_filament_step() { - m_ams_control->UpdateStepCtrl(obj->is_filament_at_extruder()); + //m_ams_control->UpdateStepCtrl(obj->is_filament_at_extruder()); + m_filament_step->UpdateStepCtrl(obj->is_filament_at_extruder()); if (!obj->is_filament_at_extruder()) { m_is_load_with_temp = true; } @@ -3970,7 +4091,16 @@ void StatusPanel::on_ams_load_curr() catch (...) { ; } - obj->command_ams_switch(VIRTUAL_TRAY_MAIN_ID, old_temp, new_temp); + + if (obj->is_enable_np) { + try { + if (!curr_ams_id.empty() && !curr_can_id.empty()) { + obj->command_ams_change_filament2(stoi(curr_ams_id), 0, old_temp, new_temp); + } + } catch (...) {} + } else { + obj->command_ams_switch(VIRTUAL_TRAY_MAIN_ID, old_temp, new_temp); + } } std::map::iterator it = obj->amsList.find(curr_ams_id); @@ -3985,24 +4115,32 @@ void StatusPanel::on_ams_load_curr() } AmsTray* curr_tray = obj->get_curr_tray(); AmsTray* targ_tray = obj->get_ams_tray(curr_ams_id, curr_can_id); + + int old_temp = -1; + int new_temp = -1; + if (curr_tray && targ_tray) { - int old_temp = -1; - int new_temp = -1; try { if (!curr_tray->nozzle_temp_max.empty() && !curr_tray->nozzle_temp_min.empty()) old_temp = (atoi(curr_tray->nozzle_temp_min.c_str()) + atoi(curr_tray->nozzle_temp_max.c_str())) / 2; if (!targ_tray->nozzle_temp_max.empty() && !targ_tray->nozzle_temp_min.empty()) new_temp = (atoi(targ_tray->nozzle_temp_min.c_str()) + atoi(targ_tray->nozzle_temp_max.c_str())) / 2; - } - catch (...) { + } catch (...) { ; } - int tray_index = atoi(curr_ams_id.c_str()) * 4 + atoi(tray_it->second->id.c_str()); - obj->command_ams_switch(tray_index, old_temp, new_temp); } - else { - int tray_index = atoi(curr_ams_id.c_str()) * 4 + atoi(tray_it->second->id.c_str()); - obj->command_ams_switch(tray_index, -1, -1); + + int tray_index = atoi(curr_ams_id.c_str()) * 4 + atoi(tray_it->second->id.c_str()); + + if (obj->is_enable_np) { + try { + if (!curr_ams_id.empty() && !curr_can_id.empty()) { + obj->command_ams_change_filament2(stoi(curr_ams_id), stoi(curr_can_id), old_temp, new_temp); + } + } + catch (...){} + } else { + obj->command_ams_switch(tray_index, old_temp, new_temp); } } } @@ -4019,7 +4157,21 @@ void StatusPanel::on_ams_load_vams(wxCommandEvent& event) { void StatusPanel::on_ams_unload(SimpleEvent &event) { - if (obj) { obj->command_ams_switch(255); } + if (obj) { + if (obj->is_enable_np) { + + try { + std::string curr_ams_id = m_ams_control->GetCurentAms(); + std::string curr_can_id = m_ams_control->GetCurrentCan(curr_ams_id); + + for (auto ext : obj->m_extder_data.extders) { + if (ext.snow.ams_id == curr_ams_id && ext.snow.slot_id == curr_can_id) { obj->command_ams_change_filament2(stoi(curr_ams_id), 255); } + } + } catch (...) {} + } else { + obj->command_ams_switch(255); + } + } } void StatusPanel::on_ams_filament_backup(SimpleEvent& event) @@ -4289,7 +4441,6 @@ void StatusPanel::on_ams_selected(wxCommandEvent &event) std::string curr_selected_ams_id = std::to_string(event.GetInt()); if (curr_ams_id.compare(std::to_string(VIRTUAL_TRAY_MAIN_ID)) == 0) { - //update_ams_control_state(curr_ams_id, true); return; } else { std::string curr_can_id = event.GetString().ToStdString(); @@ -4701,6 +4852,7 @@ void StatusPanel::set_default() m_switch_printing_fan_timeout = 0; m_switch_cham_fan_timeout = 0; m_show_ams_group = false; + m_show_filament_group = false; reset_printing_values(); m_bitmap_timelapse_img->Hide(); @@ -4715,6 +4867,7 @@ void StatusPanel::set_default() m_ams_control->Hide(); m_ams_control_box->Hide(); m_ams_control->Reset(); + m_filament_step->Hide(); error_info_reset(); #ifndef __WXGTK__ SetFocus(); diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp index 3b1897ee1..c47ed3779 100644 --- a/src/slic3r/GUI/StatusPanel.hpp +++ b/src/slic3r/GUI/StatusPanel.hpp @@ -29,6 +29,7 @@ #include "Widgets/ProgressBar.hpp" #include "Widgets/ImageSwitchButton.hpp" #include "Widgets/AMSControl.hpp" +#include "Widgets/FilamentLoad.hpp" #include "Widgets/FanControl.hpp" #include "HMS.hpp" @@ -456,7 +457,7 @@ protected: wxBoxSizer* m_ams_list; wxStaticText * m_ams_debug; bool m_show_ams_group{false}; - bool m_show_ams_group_reset{true}; + bool m_show_filament_group{ false }; AMSControl* m_ams_control; StaticBox* m_ams_control_box; wxStaticBitmap *m_ams_extruder_img; @@ -482,6 +483,10 @@ protected: wxPanel * m_machine_ctrl_panel; PrintingTaskPanel * m_project_task_panel; + FilamentLoad* m_filament_step; + Button *m_button_retry {nullptr}; + StaticBox* m_filament_load_box; + // Virtual event handlers, override them in your derived class virtual void on_subtask_pause_resume(wxCommandEvent &event) { event.Skip(); } virtual void on_subtask_abort(wxCommandEvent &event) { event.Skip(); } @@ -527,9 +532,10 @@ public: int skip_print_error = 0; wxBoxSizer *create_ams_group(wxWindow *parent); wxBoxSizer *create_settings_group(wxWindow *parent); + wxBoxSizer* create_filament_group(wxWindow* parent); - void reset_ams_group_show_flag() {m_show_ams_group_reset = true;}; void show_ams_group(bool show = true); + void show_filament_load_group(bool show = true); MediaPlayCtrl* get_media_play_ctrl() {return m_media_play_ctrl;}; }; @@ -622,8 +628,6 @@ protected: void axis_ctrl_e_hint(bool up_down); void on_nozzle_selected(wxCommandEvent &event); - - void on_start_unload(wxCommandEvent &event); /* temp control */ void on_bed_temp_kill_focus(wxFocusEvent &event); void on_bed_temp_set_focus(wxFocusEvent &event); @@ -689,7 +693,7 @@ protected: void update_ams(MachineObject* obj); void update_ams_insert_material(MachineObject* obj); void update_extruder_status(MachineObject* obj); - void update_ams_control_state(bool is_curr_tray_selected); + void update_ams_control_state(std::string ams_id, std::string slot_id); void update_cali(MachineObject* obj); void update_calib_bitmap(); diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index a9c817000..c291af318 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -2501,7 +2501,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons // }); // // - + //ams area @@ -4166,12 +4166,18 @@ void AMSControl::SwitchAms(std::string ams_id) pos == AMSPanelPos::LEFT_PANEL ? m_simplebook_ams_left->SetSelection(item->m_selection) : m_simplebook_ams_right->SetSelection(item->m_selection); if (item->m_info.cans.size() == GENERIC_AMS_SLOT_NUM) { if (item->m_info.ams_type == AMSModel::AMS_LITE) { - pos == AMSPanelPos::LEFT_PANEL ? m_down_road->UpdateLeft(m_extder_data.total_extder_count, AMSRoadShowMode::AMS_ROAD_MODE_AMS_LITE) - : m_down_road->UpdateRight(m_extder_data.total_extder_count, AMSRoadShowMode::AMS_ROAD_MODE_AMS_LITE); + if (pos == AMSPanelPos::LEFT_PANEL) { + m_down_road->UpdateLeft(m_extder_data.total_extder_count, AMSRoadShowMode::AMS_ROAD_MODE_AMS_LITE); + } else { + m_down_road->UpdateRight(m_extder_data.total_extder_count, AMSRoadShowMode::AMS_ROAD_MODE_AMS_LITE); + } } else { - pos == AMSPanelPos::LEFT_PANEL ? m_down_road->UpdateLeft(m_extder_data.total_extder_count, AMSRoadShowMode::AMS_ROAD_MODE_FOUR) - : m_down_road->UpdateRight(m_extder_data.total_extder_count, AMSRoadShowMode::AMS_ROAD_MODE_FOUR); + if (pos == AMSPanelPos::LEFT_PANEL) { + m_down_road->UpdateLeft(m_extder_data.total_extder_count, AMSRoadShowMode::AMS_ROAD_MODE_FOUR); + } else { + m_down_road->UpdateRight(m_extder_data.total_extder_count, AMSRoadShowMode::AMS_ROAD_MODE_FOUR); + } } } else { @@ -4184,13 +4190,11 @@ void AMSControl::SwitchAms(std::string ams_id) } pos == AMSPanelPos::LEFT_PANEL ? m_down_road->UpdateLeft(m_extder_data.total_extder_count, mode) : m_down_road->UpdateRight(m_extder_data.total_extder_count, mode); - if (pos == AMSPanelPos::LEFT_PANEL){ + if (pos == AMSPanelPos::LEFT_PANEL) { m_down_road->UpdatePassRoad(item->m_info.current_can_id, AMSPanelPos::LEFT_PANEL, -1, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); - } - else{ + } else { m_down_road->UpdatePassRoad(item->m_info.current_can_id, AMSPanelPos::RIGHT_PANEL, -1, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); } - } } } @@ -4513,6 +4517,10 @@ void AMSControl::SetAmsStep(std::string ams_id, std::string canid, AMSPassRoadTy length = 145; } + if (model == EXT_AMS && ams->m_info.ext_type == AMSModelOriginType::GENERIC_EXT){ + length = 82; + } + 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; diff --git a/src/slic3r/GUI/Widgets/AMSItem.cpp b/src/slic3r/GUI/Widgets/AMSItem.cpp index 1fc1ba55a..bff2e3d60 100644 --- a/src/slic3r/GUI/Widgets/AMSItem.cpp +++ b/src/slic3r/GUI/Widgets/AMSItem.cpp @@ -957,7 +957,7 @@ void AMSLib::on_left_down(wxMouseEvent &evt) auto top = 0; auto bottom = 0; - if (m_ams_model == AMSModel::GENERIC_AMS) { + if (m_ams_model == AMSModel::GENERIC_AMS || m_ams_model == AMSModel::N3F_AMS || m_ams_model == AMSModel::EXT_AMS) { top = (size.y - FromDIP(15) - m_bitmap_editable_light.GetBmpSize().y); bottom = size.y - FromDIP(15); } @@ -2265,7 +2265,6 @@ void AMSRoadDownPart::create(wxWindow* parent, wxWindowID id, const wxPoint& pos // Refresh(); //} - void AMSRoadDownPart::UpdateLeft(int nozzle_num, AMSRoadShowMode mode) { this->m_left_rode_mode = mode; m_nozzle_num = nozzle_num; @@ -2277,7 +2276,6 @@ void AMSRoadDownPart::UpdateRight(int nozzle_num, AMSRoadShowMode mode) { Refresh(); } - void AMSRoadDownPart::OnVamsLoading(bool load, wxColour col /*= AMS_CONTROL_GRAY500*/) { /*m_vams_loading = load; @@ -2478,6 +2476,7 @@ void AMSRoadDownPart::UpdatePassRoad(string can_id, AMSPanelPos pos, int len, AM m_pass_road_right_step = step; } } + Refresh(); } void AMSRoadDownPart::msw_rescale() { diff --git a/src/slic3r/GUI/Widgets/AMSItem.hpp b/src/slic3r/GUI/Widgets/AMSItem.hpp index 012589bc6..86bc4e409 100644 --- a/src/slic3r/GUI/Widgets/AMSItem.hpp +++ b/src/slic3r/GUI/Widgets/AMSItem.hpp @@ -126,8 +126,8 @@ enum FilamentStep { STEP_CUT_FILAMENT, STEP_PULL_CURR_FILAMENT, STEP_PUSH_NEW_FILAMENT, + STEP_GRAB_NEW_FILAMENT, STEP_PURGE_OLD_FILAMENT, - STEP_FEED_FILAMENT, STEP_CONFIRM_EXTRUDED, STEP_CHECK_POSITION, STEP_COUNT, @@ -162,10 +162,6 @@ enum FilamentStepType { #define AMS_HUMIDITY_SIZE wxSize(FromDIP(93), FromDIP(26)) #define AMS_PANEL_SIZE wxSize(FromDIP(264), FromDIP(150)) - - -#define MAIN_NOZZLE_ID 0 -#define DEPUTY_NOZZLE_ID 1 #define GENERIC_AMS_SLOT_NUM 4 #define MAX_AMS_NUM_IN_PANEL 2 diff --git a/src/slic3r/GUI/Widgets/FilamentLoad.cpp b/src/slic3r/GUI/Widgets/FilamentLoad.cpp new file mode 100644 index 000000000..6aff47be7 --- /dev/null +++ b/src/slic3r/GUI/Widgets/FilamentLoad.cpp @@ -0,0 +1,223 @@ +#include "FilamentLoad.hpp" +#include "Label.hpp" +#include "../BitmapCache.hpp" +#include "../I18N.hpp" +#include "../GUI_App.hpp" + +#include +#include + +#include + +#include "CalibUtils.hpp" + +namespace Slic3r { + namespace GUI { + +FilamentLoad::FilamentLoad(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size) + : wxSimplebook(parent, wxID_ANY, pos, size) +{ + SetBackgroundColour(*wxWHITE); + m_filament_load_steps = new FilamentStepIndicator(this, wxID_ANY); + m_filament_unload_steps = new ::FilamentStepIndicator(this, wxID_ANY); + m_filament_vt_load_steps = new ::FilamentStepIndicator(this, wxID_ANY); + + this->AddPage(m_filament_load_steps, wxEmptyString, false); + this->AddPage(m_filament_unload_steps, wxEmptyString, false); + this->AddPage(m_filament_vt_load_steps, wxEmptyString, false); + //UpdateStepCtrl(false); + + FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_IDLE] = _L("Idling..."); + FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE] = _L("Heat the nozzle"); + FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CUT_FILAMENT] = _L("Cut filament"); + FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PULL_CURR_FILAMENT] = _L("Pull back current filament"); + FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PUSH_NEW_FILAMENT] = _L("Push new filament into extruder"); + FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_GRAB_NEW_FILAMENT] = _L("Grab new filament"); + FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PURGE_OLD_FILAMENT] = _L("Purge old filament"); + //FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_FEED_FILAMENT] = _L("Feed Filament"); + FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CONFIRM_EXTRUDED] = _L("Confirm extruded"); + FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CHECK_POSITION] = _L("Check filament location"); +} + +void FilamentLoad::SetFilamentStep(FilamentStep item_idx, FilamentStepType f_type) +{ + if (item_idx == FilamentStep::STEP_IDLE) { + m_filament_load_steps->Idle(); + m_filament_unload_steps->Idle(); + m_filament_vt_load_steps->Idle(); + this->Hide(); + return; + } + this->Show(); + wxString step_str = wxEmptyString; + if (item_idx < FilamentStep::STEP_COUNT) { + step_str = FILAMENT_CHANGE_STEP_STRING[item_idx]; + } + + auto step_control = m_filament_load_steps; + if (f_type == FilamentStepType::STEP_TYPE_LOAD) { + step_control = m_filament_load_steps; + if (item_idx > 0 && item_idx < FilamentStep::STEP_COUNT) { + if (this->GetSelection() != 0) { + this->SetSelection(0); + } + m_filament_load_steps->SelectItem(m_filament_load_steps->GetItemUseText(step_str)); + } + else { + m_filament_load_steps->Idle(); + this->Hide(); + this->Layout(); + } + } + else if (f_type == FilamentStepType::STEP_TYPE_UNLOAD) { + step_control = m_filament_unload_steps; + if (item_idx > 0 && item_idx < FilamentStep::STEP_COUNT) { + if (GetSelection() != 1) { + this->SetSelection(1); + this->Layout(); + } + m_filament_unload_steps->SelectItem(m_filament_unload_steps->GetItemUseText(step_str)); + } + else { + m_filament_unload_steps->Idle(); + this->Hide(); + this->Layout(); + } + } + else if (f_type == FilamentStepType::STEP_TYPE_VT_LOAD) { + step_control = m_filament_vt_load_steps; + this->SetSelection(2); + this->Layout(); + if (item_idx > 0 && item_idx < FilamentStep::STEP_COUNT) { + if (item_idx == STEP_CONFIRM_EXTRUDED) { + m_filament_vt_load_steps->SelectItem(2); + } + else { + m_filament_vt_load_steps->SelectItem(m_filament_vt_load_steps->GetItemUseText(step_str)); + } + } + else { + m_filament_vt_load_steps->Idle(); + this->Hide(); + this->Layout(); + } + } + else { + step_control = m_filament_load_steps; + if (item_idx > 0 && item_idx < FilamentStep::STEP_COUNT) { + SetSelection(0); + m_filament_load_steps->SelectItem(m_filament_load_steps->GetItemUseText(step_str)); + } + else { + m_filament_load_steps->Idle(); + this->Hide(); + this->Layout(); + } + } + + wxString slot_info = L"Ams-"; + slot_info = slot_info + std::to_string(m_ams_id); + slot_info = slot_info + L'-'; + slot_info = slot_info + std::to_string(m_slot_id); + slot_info = slot_info + L" Slot"; + step_control->SetSlotInformation(slot_info); +} + +void FilamentLoad::UpdateStepCtrl(bool is_extrusion_exist) { + m_filament_load_steps->DeleteAllItems(); + m_filament_unload_steps->DeleteAllItems(); + m_filament_vt_load_steps->DeleteAllItems(); + + is_extrusion = true; //Forgot what it means, need to update dynamically + + if (m_ams_model == AMSModel::GENERIC_AMS || m_ext_model == AMSModel::GENERIC_AMS) { + if (is_extrusion) { + m_filament_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); + m_filament_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CUT_FILAMENT]); + m_filament_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PULL_CURR_FILAMENT]); + m_filament_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PUSH_NEW_FILAMENT]); + m_filament_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PURGE_OLD_FILAMENT]); + } + else { + m_filament_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); + m_filament_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PUSH_NEW_FILAMENT]); + m_filament_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PURGE_OLD_FILAMENT]); + } + + m_filament_vt_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); + m_filament_vt_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PUSH_NEW_FILAMENT]); + m_filament_vt_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_GRAB_NEW_FILAMENT]); + m_filament_vt_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PURGE_OLD_FILAMENT]); + + m_filament_unload_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); + m_filament_unload_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CUT_FILAMENT]); + m_filament_unload_steps->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_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); + m_filament_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CHECK_POSITION]); + m_filament_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CUT_FILAMENT]); + m_filament_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PULL_CURR_FILAMENT]); + m_filament_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PUSH_NEW_FILAMENT]); + m_filament_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PURGE_OLD_FILAMENT]); + + m_filament_vt_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); + m_filament_vt_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CHECK_POSITION]); + m_filament_vt_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CUT_FILAMENT]); + m_filament_vt_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PULL_CURR_FILAMENT]); + m_filament_vt_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PUSH_NEW_FILAMENT]); + m_filament_vt_load_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PURGE_OLD_FILAMENT]); + + m_filament_unload_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_HEAT_NOZZLE]); + m_filament_unload_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CHECK_POSITION]); + m_filament_unload_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_CUT_FILAMENT]); + m_filament_unload_steps->AppendItem(FILAMENT_CHANGE_STEP_STRING[FilamentStep::STEP_PULL_CURR_FILAMENT]); + } +} + + +void FilamentLoad::show_nofilament_mode(bool show) +{ + m_filament_load_steps->DeleteAllItems(); + m_filament_unload_steps->DeleteAllItems(); + m_filament_vt_load_steps->DeleteAllItems(); + m_filament_load_steps->Idle(); + m_filament_unload_steps->Idle(); + m_filament_vt_load_steps->Idle(); + this->Layout(); + Refresh(); + /*if (!show) + { + m_filament_load_steps->Idle(); + m_filament_unload_steps->Idle(); + m_filament_vt_load_steps->Idle(); + } + else { + this->Show(); + this->Layout(); + }*/ +} + +void FilamentLoad::set_min_size(const wxSize& minSize) { + this->SetMinSize(minSize); + m_filament_load_steps->SetMinSize(minSize); + m_filament_unload_steps->SetMinSize(minSize); + m_filament_vt_load_steps->SetMinSize(minSize); +} + +void FilamentLoad::set_max_size(const wxSize& minSize) { + this->SetMaxSize(minSize); + m_filament_load_steps->SetMaxSize(minSize); + m_filament_unload_steps->SetMaxSize(minSize); + m_filament_vt_load_steps->SetMaxSize(minSize); +} + +void FilamentLoad::set_background_color(const wxColour& colour) { + m_filament_load_steps->SetBackgroundColour(colour); + m_filament_unload_steps->SetBackgroundColour(colour); + m_filament_vt_load_steps->SetBackgroundColour(colour); +} + +}} // namespace Slic3r::GUI \ No newline at end of file diff --git a/src/slic3r/GUI/Widgets/FilamentLoad.hpp b/src/slic3r/GUI/Widgets/FilamentLoad.hpp new file mode 100644 index 000000000..93f578b7f --- /dev/null +++ b/src/slic3r/GUI/Widgets/FilamentLoad.hpp @@ -0,0 +1,60 @@ +#ifndef slic3r_GUI_FILAMENTLOAD_hpp_ +#define slic3r_GUI_FILAMENTLOAD_hpp_ + +#include "../wxExtensions.hpp" +#include "StaticBox.hpp" +#include "StepCtrl.hpp" +#include "AMSControl.hpp" +#include "../DeviceManager.hpp" +#include "slic3r/GUI/Event.hpp" +#include "slic3r/GUI/AmsMappingPopup.hpp" +#include +#include +#include +#include + + +namespace Slic3r { namespace GUI { + + +class FilamentLoad : public wxSimplebook +{ +public: + FilamentLoad(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + +protected: + ::FilamentStepIndicator* m_filament_load_steps = { nullptr }; + ::FilamentStepIndicator* m_filament_unload_steps = { nullptr }; + ::FilamentStepIndicator* m_filament_vt_load_steps = { nullptr }; + int m_ams_id = { 1 }; + int m_slot_id = { 1 }; + bool is_extrusion = false; + + +public: + std::map FILAMENT_CHANGE_STEP_STRING; + AMSModel m_ams_model{ AMSModel::GENERIC_AMS }; + AMSModel m_ext_model{ AMSModel::AMS_LITE }; + AMSModel m_is_none_ams_mode{ AMSModel::AMS_LITE }; + + void SetAmsModel(AMSModel mode, AMSModel ext_mode) { m_ams_model = mode; m_ext_model = ext_mode; }; + + void SetFilamentStep(FilamentStep item_idx, FilamentStepType f_type); + void ShowFilamentTip(bool hasams = true); + + void UpdateStepCtrl(bool is_extrusion_exist); + + void show_nofilament_mode(bool show); + void updateID(int ams_id, int slot_id) { m_ams_id = ams_id; m_slot_id = slot_id; }; + void SetExt(bool ext) { is_extrusion = ext; }; + + void set_min_size(const wxSize& minSize); + void set_max_size(const wxSize& maxSize); + void set_background_color(const wxColour& colour); +}; + +}} + + + +#endif // !slic3r_GUI_filamentload_hpp_ \ No newline at end of file diff --git a/src/slic3r/GUI/Widgets/StepCtrl.cpp b/src/slic3r/GUI/Widgets/StepCtrl.cpp index 04488c100..c4dd6034d 100644 --- a/src/slic3r/GUI/Widgets/StepCtrl.cpp +++ b/src/slic3r/GUI/Widgets/StepCtrl.cpp @@ -351,3 +351,134 @@ void StepIndicator::doRender(wxDC &dc) circleY += itemWidth; } } + + +/* FilamentStepIndicator */ + +FilamentStepIndicator::FilamentStepIndicator(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + : StepCtrlBase(parent, id, pos, size, style) + , bmp_ok(this, "step_ok", 12) +{ + static Slic3r::GUI::BitmapCache cache; + bmp_extruder = *cache.load_png("filament_load_extruder", FromDIP(300), FromDIP(200), false, false); + SetFont(Label::Body_12); + font_tip = Label::Body_12; + clr_bar = 0xE1E1E1; + clr_step = StateColor( + std::make_pair(0xACACAC, (int)StateColor::Disabled), + std::make_pair(0x00AE42, 0)); + clr_text = StateColor( + std::make_pair(0xACACAC, (int)StateColor::Disabled), + std::make_pair(0x323A3D, (int)StateColor::Checked), + std::make_pair(0x6B6B6B, 0)); + clr_tip = *wxWHITE; + StaticBox::border_width = 0; + radius = 9; + bar_width = 0; +} + +void FilamentStepIndicator::Rescale() +{ + bmp_ok.msw_rescale(); + radius = bmp_ok.GetBmpHeight() / 2; + bar_width = bmp_ok.GetBmpHeight() / 20; + if (bar_width < 2) bar_width = 2; +} + +void FilamentStepIndicator::SelectNext() { SelectItem(step + 1); } + + +void FilamentStepIndicator::doRender(wxDC& dc) +{ + + + if (steps.empty()) return; + + StaticBox::doRender(dc); + + wxSize size = GetSize(); + + int states = state_handler.states(); + if (!IsEnabled()) { + states = clr_step.Disabled; + } + + dc.SetFont(::Label::Head_16); + dc.SetTextForeground(wxColour(0, 174, 66)); + int circleX = 20; + int circleY = 20; + wxSize sz = dc.GetTextExtent(L"Loading"); + dc.DrawText(L"Loading", circleX, circleY); + + dc.SetFont(::Label::Body_13); + + dc.DrawText(m_slot_information, circleX + sz.GetWidth() + FromDIP(5), circleY + FromDIP(3)); + + dc.DrawBitmap(bmp_extruder, FromDIP(250), circleY); + circleY += sz.y; + + int textWidth = size.x - radius * 5; + dc.SetFont(GetFont()); + wxString firstLine; + if (step == 0) dc.SetFont(GetFont().Bold()); + wxSize firstLineSize = Label::split_lines(dc, textWidth, steps.front(), firstLine); + wxString lastLine; + if (step == steps.size() - 1) dc.SetFont(GetFont().Bold()); + wxSize lastLineSize = Label::split_lines(dc, textWidth, steps.back(), lastLine); + int firstPadding = std::max(0, firstLineSize.y / 2 - radius); + int lastPadding = std::max(0, lastLineSize.y / 2 - radius); + + int itemWidth = radius * 3; + + // Draw thin bar stick + dc.SetPen(wxPen(clr_bar.colorForStates(states))); + dc.SetBrush(wxBrush(clr_bar.colorForStates(states))); + //dc.DrawRectangle(rcBar); + + circleX += radius; + circleY += radius * 3 + firstPadding; + dc.SetPen(wxPen(clr_step.colorForStates(states))); + dc.SetBrush(wxBrush(clr_step.colorForStates(states))); + for (int i = 0; i < steps.size(); ++i) { + bool disabled = step > i; + bool checked = step == i; + // Draw circle point & texts in it + dc.DrawEllipse(circleX - radius, circleY - radius, radius * 2, radius * 2); + // Draw content ( icon or text ) in circle + if (disabled) { + wxSize sz = bmp_ok.GetBmpSize(); + dc.DrawBitmap(bmp_ok.bmp(), circleX - sz.x / 2, circleY - sz.y / 2); + } + else { + dc.SetFont(font_tip); + dc.SetTextForeground(clr_tip.colorForStates(states)); + auto tip = tips[i]; + if (tip.IsEmpty()) tip.append(1, wchar_t(L'0' + i + 1)); + wxSize sz = dc.GetTextExtent(tip); + dc.DrawText(tip, circleX - sz.x / 2, circleY - sz.y / 2 + 1); + } + // Draw step text + dc.SetTextForeground(clr_text.colorForStates(states + | (disabled ? StateColor::Disabled : checked ? StateColor::Checked : 0))); + dc.SetFont(checked ? GetFont().Bold() : GetFont()); + wxString text; + wxSize textSize; + if (i == 0) { + text = firstLine; + textSize = firstLineSize; + } + else if (i == steps.size() - 1) { + text = lastLine; + textSize = lastLineSize; + } + else { + textSize = Label::split_lines(dc, textWidth, steps[i], text); + } + dc.DrawText(text, circleX + radius * 1.5, circleY - (textSize.y / 2)); + circleY += itemWidth; + } +} + +void FilamentStepIndicator::SetSlotInformation(wxString slot) { + this->m_slot_information = slot; +} \ No newline at end of file diff --git a/src/slic3r/GUI/Widgets/StepCtrl.hpp b/src/slic3r/GUI/Widgets/StepCtrl.hpp index 63df3625e..303eee030 100644 --- a/src/slic3r/GUI/Widgets/StepCtrl.hpp +++ b/src/slic3r/GUI/Widgets/StepCtrl.hpp @@ -103,4 +103,28 @@ private: void doRender(wxDC &dc) override; }; + +class FilamentStepIndicator : public StepCtrlBase + +{ + ScalableBitmap bmp_ok; + wxBitmap bmp_extruder; + wxString m_slot_information = ""; + +public: + FilamentStepIndicator(wxWindow* parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0); + + virtual void Rescale(); + + void SelectNext(); + void SetSlotInformation(wxString slot); +private: + void doRender(wxDC& dc) override; +}; + + #endif // !slic3r_GUI_StepCtrlBase_hpp_