diff --git a/resources/images/filament_load_extruder.png b/resources/images/filament_load_extruder.png index 30afd6494..e04121ea7 100644 Binary files a/resources/images/filament_load_extruder.png and b/resources/images/filament_load_extruder.png differ diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 0c512efd1..2169a2756 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -1640,8 +1640,6 @@ int MachineObject::command_select_extruder(int id) { BOOST_LOG_TRIVIAL(info) << "select_extruder"; - nozzle_selected_count = HOLD_COUNT_MAX; - json j; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["print"]["command"] = "select_extruder"; @@ -1923,8 +1921,6 @@ int MachineObject::command_set_nozzle_new(int nozzle_id, int temp) { BOOST_LOG_TRIVIAL(info) << "set_nozzle_temp"; - nozzle_selected_count = HOLD_COUNT_MAX; - json j; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["print"]["command"] = "set_nozzle_temp"; @@ -5372,7 +5368,7 @@ void MachineObject::converse_to_duct(bool is_suppt_part_fun, bool is_suppt_aux_f m_air_duct_data.curren_mode = -1; //def mode - if (is_suppt_part_fun) { + if (is_suppt_part_fun) { AirParts part_fan; part_fan.type = int(AirDuctType::AIR_FAN_TYPE); part_fan.id = int(AIR_FUN::FAN_COOLING_0_AIRDOOR); @@ -5706,9 +5702,9 @@ void MachineObject::parse_new_info(json print) json const &nozzle = device["nozzle"]; m_nozzle_data = NozzleData(); - m_nozzle_data.extder_exist = get_flag_bits(nozzle["exist"].get(), 0, 15); - m_nozzle_data.cut_exist = get_flag_bits(nozzle["exist"].get(), 16, 31); - m_nozzle_data.state = get_flag_bits(nozzle["state"].get(), 0, 3); + m_nozzle_data.extder_exist = get_flag_bits(nozzle["exist"].get(), 0, 15); + m_nozzle_data.cut_exist = get_flag_bits(nozzle["exist"].get(), 16, 31); + m_nozzle_data.state = get_flag_bits(nozzle["state"].get(), 0, 3); for (auto it = nozzle["info"].begin(); it != nozzle["info"].end(); it++) { Nozzle nozzle_obj; @@ -5752,18 +5748,21 @@ void MachineObject::parse_new_info(json print) if (device.contains("extruder")) { json const& extruder = device["extruder"]; - m_extder_data = ExtderData(); - m_extder_data.total_extder_count = get_flag_bits(extruder["state"].get(), 0, 3); + auto extder_data = ExtderData(); + extder_data.total_extder_count = get_flag_bits(extruder["state"].get(), 0, 3); - if (nozzle_selected_count > 0) { - nozzle_selected_count--; - } 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.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); + + extder_data.current_extder_id = get_flag_bits(extruder["state"].get(), 4, 3); + extder_data.target_extder_id = get_flag_bits(extruder["state"].get(), 8, 3); + extder_data.switch_extder_state = (ExtruderSwitchState) get_flag_bits(extruder["state"].get(), 12, 2); + + if (extder_data.switch_extder_state != ExtruderSwitchState::ES_SWITCHING && extder_data.target_extder_id == extder_data.current_extder_id) { + flag_update_nozzle = true; } + extder_data.current_loading_extder_id = get_flag_bits(extruder["state"].get(), 15, 3); + extder_data.current_busy_for_loading = get_flag_bits(extruder["state"].get(), 19); + for (auto it = extruder["info"].begin(); it != extruder["info"].end(); it++) { Extder extder_obj; @@ -5813,19 +5812,21 @@ void MachineObject::parse_new_info(json print) } } } - m_extder_data.extders.push_back(extder_obj); + extder_data.extders.push_back(extder_obj); } - if (m_extder_data.extders.size() <= 0) { + if (extder_data.extders.size() <= 0) { // def data - m_extder_data.current_extder_id = 0; - m_extder_data.target_extder_id = 0; - m_extder_data.total_extder_count = 1; + extder_data.current_extder_id = 0; + extder_data.target_extder_id = 0; + extder_data.total_extder_count = 1; Extder nozzle; - m_extder_data.extders.push_back(nozzle); + extder_data.extders.push_back(nozzle); } + + m_extder_data = extder_data; } - } + } } bool MachineObject::is_nozzle_data_invalid() diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 63e9f3eaa..1c3b85d8f 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -221,6 +221,7 @@ struct ExtderData int target_extder_id{0}; int total_extder_count {0}; int current_loading_extder_id {-1}; + bool current_busy_for_loading{false}; ExtruderSwitchState switch_extder_state; std::vector extders; }; @@ -917,6 +918,7 @@ public: int xcam_filament_tangle_detect_count = 0; int ams_print_option_count = 0; int nozzle_selected_count = 0; + bool flag_update_nozzle = {true}; //supported features bool is_support_chamber_edit{false}; diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index 4aea7cd33..9b2a2d3b6 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -2161,10 +2161,11 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co Bind(wxEVT_WEBREQUEST_STATE, &StatusPanel::on_webrequest_state, this); Bind(wxCUSTOMEVT_SET_TEMP_FINISH, [this](wxCommandEvent e) { - int id = e.GetInt(); + int id = e.GetInt(); if (id == m_tempCtrl_bed->GetType()) { on_set_bed_temp(); } else if (id == m_tempCtrl_nozzle->GetType()) { + if (e.GetString() == wxString::Format("%d", MAIN_NOZZLE_ID)) { on_set_nozzle_temp(MAIN_NOZZLE_ID); } else if (e.GetString() == wxString::Format("%d", DEPUTY_NOZZLE_ID)) { @@ -2190,6 +2191,8 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co m_tempCtrl_bed->Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_bed_temp_set_focus), NULL, this); m_tempCtrl_nozzle->Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_kill_focus), NULL, this); m_tempCtrl_nozzle->Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_set_focus), NULL, this); + m_tempCtrl_nozzle_deputy->Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_kill_focus), NULL, this); + m_tempCtrl_nozzle_deputy->Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_set_focus), NULL, this); m_tempCtrl_chamber->Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_cham_temp_kill_focus), NULL, this); m_tempCtrl_chamber->Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_cham_temp_set_focus), NULL, this); m_switch_lamp->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_lamp_switch), NULL, this); @@ -2256,6 +2259,10 @@ StatusPanel::~StatusPanel() m_tempCtrl_bed->Disconnect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_bed_temp_set_focus), NULL, this); m_tempCtrl_nozzle->Disconnect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_kill_focus), NULL, this); m_tempCtrl_nozzle->Disconnect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_set_focus), NULL, this); + + m_tempCtrl_nozzle_deputy->Disconnect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_kill_focus), NULL, this); + m_tempCtrl_nozzle_deputy->Disconnect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_set_focus), NULL, this); + m_switch_lamp->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_lamp_switch), NULL, this); /*m_switch_nozzle_fan->Disconnect(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_nozzle_fan_switch), NULL, this); m_switch_printing_fan->Disconnect(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_nozzle_fan_switch), NULL, this); @@ -2853,24 +2860,28 @@ void StatusPanel::update_temp_ctrl(MachineObject *obj) if (m_temp_nozzle_timeout > 0) { m_temp_nozzle_timeout--; } else { - if (!nozzle_temp_input) { m_tempCtrl_nozzle->SetTagTemp((int) obj->m_extder_data.extders[MAIN_NOZZLE_ID].target_temp); } + if (!nozzle_temp_input) { + m_tempCtrl_nozzle->SetTagTemp((int) obj->m_extder_data.extders[MAIN_NOZZLE_ID].target_temp); + } } if (m_temp_nozzle_deputy_timeout > 0) { m_temp_nozzle_deputy_timeout--; } else { - if (!nozzle_temp_input && nozzle_num >= 2) { m_tempCtrl_nozzle_deputy->SetTagTemp((int)obj->m_extder_data.extders[DEPUTY_NOZZLE_ID].target_temp); } + if (!nozzle_temp_input && nozzle_num >= 2) { + m_tempCtrl_nozzle_deputy->SetTagTemp((int)obj->m_extder_data.extders[DEPUTY_NOZZLE_ID].target_temp); + } } - if ((obj->m_extder_data.extders[0].target_temp - obj->m_extder_data.extders[0].temp) >= TEMP_THRESHOLD_VAL) { + if ((obj->m_extder_data.extders[MAIN_NOZZLE_ID].target_temp - obj->m_extder_data.extders[MAIN_NOZZLE_ID].temp) >= TEMP_THRESHOLD_VAL) { m_tempCtrl_nozzle->SetIconActive(); } else { m_tempCtrl_nozzle->SetIconNormal(); } if (nozzle_num >= 2 && obj->m_extder_data.extders.size() > 1){ - if ((obj->m_extder_data.extders[1].target_temp - obj->m_extder_data.extders[1].temp) >= TEMP_THRESHOLD_VAL) { + if ((obj->m_extder_data.extders[DEPUTY_NOZZLE_ID].target_temp - obj->m_extder_data.extders[DEPUTY_NOZZLE_ID].temp) >= TEMP_THRESHOLD_VAL) { m_tempCtrl_nozzle_deputy->SetIconActive(); } else { @@ -2913,17 +2924,18 @@ void StatusPanel::update_misc_ctrl(MachineObject *obj) m_extruderImage[select_index]->update(ExtruderState::FILLED_LOAD, ExtruderState::FILLED_UNLOAD); /*current*/ - if (obj->m_extder_data.current_extder_id == 0xf) { - m_extruderImage[select_index]->setExtruderUsed(""); - m_nozzle_btn_panel->updateState(""); - } else if (obj->m_extder_data.current_extder_id == MAIN_NOZZLE_ID) { - m_extruderImage[select_index]->setExtruderUsed("right"); - m_nozzle_btn_panel->updateState("right"); - } else if (obj->m_extder_data.current_extder_id == DEPUTY_NOZZLE_ID) { - m_extruderImage[select_index]->setExtruderUsed("left"); - m_nozzle_btn_panel->updateState("left"); + if (obj->flag_update_nozzle) { + if (obj->m_extder_data.current_extder_id == 0xf) { + m_extruderImage[select_index]->setExtruderUsed(""); + m_nozzle_btn_panel->updateState(""); + } else if (obj->m_extder_data.current_extder_id == MAIN_NOZZLE_ID) { + m_extruderImage[select_index]->setExtruderUsed("right"); + m_nozzle_btn_panel->updateState("right"); + } else if (obj->m_extder_data.current_extder_id == DEPUTY_NOZZLE_ID) { + m_extruderImage[select_index]->setExtruderUsed("left"); + m_nozzle_btn_panel->updateState("left"); + } } - Layout(); } else { m_nozzle_btn_panel->Hide(); m_extruder_book->SetSelection(m_nozzle_num); @@ -3162,24 +3174,19 @@ void StatusPanel::update_ams(MachineObject *obj) 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); } bool ams_loading_state = false; auto ams_status_sub = obj->ams_status_sub; 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) { + if (obj->is_enable_np) { + if (obj->m_extder_data.current_busy_for_loading) { ams_loading_state = true; } - } else if(obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE){ + } else if (obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE) { ams_loading_state = true; - }*/ - + } if (ams_loading_state) { update_filament_step(); @@ -3346,7 +3353,6 @@ void StatusPanel::update_ams_insert_material(MachineObject* obj) { 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_LOAD] = true; @@ -3362,10 +3368,13 @@ void StatusPanel::update_ams_control_state(std::string ams_id, std::string slot_ else { /*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) { + + if (obj->is_enable_np) { + if (obj->m_extder_data.current_busy_for_loading) { in_switch_filament = true; } + } else if (obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE) { + in_switch_filament = true; } if (in_switch_filament) { @@ -4011,7 +4020,7 @@ void StatusPanel::on_set_nozzle_temp(int nozzle_id) if (nozzle_id == DEPUTY_NOZZLE_ID) { wxString str = m_tempCtrl_nozzle_deputy->GetTextCtrl()->GetValue(); if (str.ToLong(&nozzle_temp) && obj) { - // set_hold_count(m_temp_nozzle_deputy_timeout); + set_hold_count(m_temp_nozzle_deputy_timeout); if (nozzle_temp > m_tempCtrl_nozzle_deputy->get_max_temp()) { nozzle_temp = m_tempCtrl_nozzle_deputy->get_max_temp(); m_tempCtrl_nozzle_deputy->SetTagTemp(wxString::Format("%d", nozzle_temp)); @@ -4055,7 +4064,6 @@ void StatusPanel::on_ams_load(SimpleEvent &event) void StatusPanel::update_filament_step() { - //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; @@ -4654,7 +4662,7 @@ void StatusPanel::on_nozzle_fan_switch(wxCommandEvent &event) m_fan_control_popup->Destroy(); m_fan_control_popup = nullptr; } - + if (!obj) return; @@ -4776,7 +4784,7 @@ void StatusPanel::on_xyz_abs(wxCommandEvent &event) void StatusPanel::on_nozzle_selected(wxCommandEvent &event) { if (obj) { - obj->m_extder_data.current_extder_id = event.GetInt(); + obj->flag_update_nozzle = false; auto nozzle_id = event.GetInt();obj->command_select_extruder(nozzle_id); } } @@ -4851,6 +4859,7 @@ void StatusPanel::set_default() speed_lvl_timeout = 0; m_switch_lamp_timeout = 0; m_temp_nozzle_timeout = 0; + m_temp_nozzle_deputy_timeout = 0; m_temp_bed_timeout = 0; m_temp_chamber_timeout = 0; m_switch_nozzle_fan_timeout = 0; diff --git a/src/slic3r/GUI/Widgets/FilamentLoad.cpp b/src/slic3r/GUI/Widgets/FilamentLoad.cpp index 6aff47be7..26f9c0522 100644 --- a/src/slic3r/GUI/Widgets/FilamentLoad.cpp +++ b/src/slic3r/GUI/Widgets/FilamentLoad.cpp @@ -45,10 +45,11 @@ void FilamentLoad::SetFilamentStep(FilamentStep item_idx, FilamentStepType f_typ m_filament_load_steps->Idle(); m_filament_unload_steps->Idle(); m_filament_vt_load_steps->Idle(); - this->Hide(); + if (IsShown()) {Hide(); } return; } - this->Show(); + + if (!IsShown()) {Show();} wxString step_str = wxEmptyString; if (item_idx < FilamentStep::STEP_COUNT) { step_str = FILAMENT_CHANGE_STEP_STRING[item_idx]; @@ -58,36 +59,36 @@ void FilamentLoad::SetFilamentStep(FilamentStep item_idx, FilamentStepType f_typ 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); + if (GetSelection() != 0) { + SetSelection(0); } m_filament_load_steps->SelectItem(m_filament_load_steps->GetItemUseText(step_str)); } else { m_filament_load_steps->Idle(); - this->Hide(); - this->Layout(); + Hide(); + 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(); + SetSelection(1); + Layout(); } m_filament_unload_steps->SelectItem(m_filament_unload_steps->GetItemUseText(step_str)); } else { m_filament_unload_steps->Idle(); - this->Hide(); - this->Layout(); + Hide(); + Layout(); } } else if (f_type == FilamentStepType::STEP_TYPE_VT_LOAD) { step_control = m_filament_vt_load_steps; - this->SetSelection(2); - this->Layout(); + SetSelection(2); + Layout(); if (item_idx > 0 && item_idx < FilamentStep::STEP_COUNT) { if (item_idx == STEP_CONFIRM_EXTRUDED) { m_filament_vt_load_steps->SelectItem(2); @@ -98,8 +99,8 @@ void FilamentLoad::SetFilamentStep(FilamentStep item_idx, FilamentStepType f_typ } else { m_filament_vt_load_steps->Idle(); - this->Hide(); - this->Layout(); + Hide(); + Layout(); } } else { @@ -110,8 +111,8 @@ void FilamentLoad::SetFilamentStep(FilamentStep item_idx, FilamentStepType f_typ } else { m_filament_load_steps->Idle(); - this->Hide(); - this->Layout(); + Hide(); + Layout(); } } @@ -130,7 +131,7 @@ void FilamentLoad::UpdateStepCtrl(bool is_extrusion_exist) { 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 (m_ams_model == AMSModel::GENERIC_AMS || m_ext_model == AMSModel::N3F_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]);