diff --git a/resources/printers/ams_load.gcode b/resources/printers/ams_load.gcode index c7d0c4335..a05589002 100644 --- a/resources/printers/ams_load.gcode +++ b/resources/printers/ams_load.gcode @@ -1,6 +1,6 @@ M620 S[next_extruder] M106 S255 -M104 S142 +M104 S250 M17 S M17 X0.5 Y0.5 G91 @@ -9,24 +9,24 @@ G1 Z3 G90 G28 X M17 R -G1 X70 F12000 +G1 X70 F21000 G1 Y245 G1 Y265 F3000 G4 M106 S0 M109 S250 -G4 S10 G1 X90 G1 Y255 G1 X120 -G1 X20 Y50 F12000 +G1 X20 Y50 F21000 G1 Y-3 T[next_extruder] G1 X54 G1 Y265 G92 E0 G1 E40 F180 -M109 S[new_filament_temp] +G4 +M104 S[new_filament_temp] G1 X70 F15000 G1 X76 G1 X65 diff --git a/resources/printers/ams_unload.gcode b/resources/printers/ams_unload.gcode index 9078336ae..e5db6b160 100644 --- a/resources/printers/ams_unload.gcode +++ b/resources/printers/ams_unload.gcode @@ -1,35 +1,32 @@ M620 S255 M106 P1 S255 -M104 S142 +M104 S250 M17 S M17 X0.5 Y0.5 G91 G1 Y-5 F3000 -G1 Z3.0 F1200 +G1 Z3 F1200 G90 G28 X M17 R - -G1 X70 F12000 +G1 X70 F21000 G1 Y245 G1 Y265 F3000 -M400 +G4 M106 P1 S0 M109 S250 -G4 S10 G1 X90 F3000 G1 Y255 F4000 G1 X100 F5000 -G1 X120 F12000 - -G1 X20 Y50 F12000 +G1 X120 F21000 +G1 X20 Y50 G1 Y-3 - T255 +G4 M104 S0 G1 X70 F3000 G91 -G1 Z-3.0 F1200 +G1 Z-3 F1200 G90 M621 S255 \ No newline at end of file diff --git a/resources/printers/vt_load.gcode b/resources/printers/vt_load.gcode deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index b1314ed09..a05592f6c 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -1562,9 +1562,8 @@ int MachineObject::command_ams_switch(int tray_index, int old_temp, int new_temp std::string gcode = ""; if (tray_index == 255) { gcode = DeviceManager::load_gcode(printer_type, "ams_unload.gcode"); - } else if (tray_index == VIRTUAL_TRAY_ID) { - gcode = DeviceManager::load_gcode(printer_type, "vt_load.gcode"); } else { + // include VIRTUAL_TRAY_ID gcode = DeviceManager::load_gcode(printer_type, "ams_load.gcode"); boost::replace_all(gcode, "[next_extruder]", std::to_string(tray_index)); boost::replace_all(gcode, "[new_filament_temp]", std::to_string(new_temp)); @@ -1668,7 +1667,7 @@ int MachineObject::command_ams_select_tray(std::string tray_id) int MachineObject::command_ams_control(std::string action) { //valid actions - if (action == "resume" || action == "reset" || action == "pause") { + if (action == "resume" || action == "reset" || action == "pause" || action == "done") { json j; j["print"]["command"] = "ams_control"; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); diff --git a/src/slic3r/GUI/Jobs/PrintJob.cpp b/src/slic3r/GUI/Jobs/PrintJob.cpp index 0feef2454..ea56483f3 100644 --- a/src/slic3r/GUI/Jobs/PrintJob.cpp +++ b/src/slic3r/GUI/Jobs/PrintJob.cpp @@ -59,47 +59,52 @@ void PrintJob::on_success(std::function success) wxString PrintJob::get_http_error_msg(unsigned int status, std::string body) { - int code = 0; - std::string error; - std::string message; - wxString result; - if (status >= 400 && status < 500) - try { - json j = json::parse(body); - if (j.contains("code")) { - if (!j["code"].is_null()) - code = j["code"].get(); + try { + int code = 0; + std::string error; + std::string message; + wxString result; + if (status >= 400 && status < 500) + try { + json j = json::parse(body); + if (j.contains("code")) { + if (!j["code"].is_null()) + code = j["code"].get(); + } + if (j.contains("error")) { + if (!j["error"].is_null()) + error = j["error"].get(); + } + if (j.contains("message")) { + if (!j["message"].is_null()) + message = j["message"].get(); + } + switch (status) { + ; + } } - if (j.contains("error")) { - if (!j["error"].is_null()) - error = j["error"].get(); - } - if (j.contains("message")) { - if (!j["message"].is_null()) - message = j["message"].get(); - } - switch (status) { + catch (...) { ; } - } - catch (...) { + else if (status == 503) { + return _L("Service Unavailable"); + } + else { + wxString unkown_text = _L("Unkown Error."); + unkown_text += wxString::Format("status=%u, body=%s", status, body); + BOOST_LOG_TRIVIAL(error) << "http_error: status=" << status << ", code=" << code << ", error=" << error; + return unkown_text; + } + + BOOST_LOG_TRIVIAL(error) << "http_error: status=" << status << ", code=" << code << ", error=" << error; + + result = wxString::Format("code=%u, error=%s", code, from_u8(error)); + return result; + } catch(...) { ; } - else if (status == 503) { - return _L("Service Unavailable"); - } - else { - wxString unkown_text = _L("Unkown Error."); - unkown_text += wxString::Format("status=%u, body=%s", status, body); - BOOST_LOG_TRIVIAL(error) << "http_error: status=" << status << ", code=" << code << ", error=" << error; - return unkown_text; - } - - BOOST_LOG_TRIVIAL(error) << "http_error: status=" << status << ", code=" << code << ", error=" << error; - - result = wxString::Format("code=%u, error=%s", code, from_u8(error)); - return result; -} + return wxEmptyString; +} void PrintJob::process() { diff --git a/src/slic3r/GUI/ReleaseNote.cpp b/src/slic3r/GUI/ReleaseNote.cpp index 37316ddf3..fc7b96455 100644 --- a/src/slic3r/GUI/ReleaseNote.cpp +++ b/src/slic3r/GUI/ReleaseNote.cpp @@ -26,6 +26,7 @@ namespace Slic3r { namespace GUI { wxDEFINE_EVENT(EVT_SECONDARY_CHECK_CONFIRM, wxCommandEvent); wxDEFINE_EVENT(EVT_SECONDARY_CHECK_CANCEL, wxCommandEvent); +wxDEFINE_EVENT(EVT_SECONDARY_CHECK_FUNC, wxCommandEvent); wxDEFINE_EVENT(EVT_CHECKBOX_CHANGE, wxCommandEvent); wxDEFINE_EVENT(EVT_ENTER_IP_ADDRESS, wxCommandEvent); wxDEFINE_EVENT(EVT_CLOSE_IPADDRESS_DLG, wxCommandEvent); @@ -586,18 +587,38 @@ SecondaryCheckDialog::SecondaryCheckDialog(wxWindow* parent, wxWindowID id, cons m_button_cancel->SetCornerRadius(FromDIP(12)); m_button_cancel->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { - wxCommandEvent evt(EVT_SECONDARY_CHECK_CANCEL); - e.SetEventObject(this); - GetEventHandler()->ProcessEvent(evt); - this->on_hide(); + wxCommandEvent evt(EVT_SECONDARY_CHECK_CANCEL); + e.SetEventObject(this); + GetEventHandler()->ProcessEvent(evt); + this->on_hide(); }); - if (btn_style != CONFIRM_AND_CANCEL) - m_button_cancel->Hide(); - else + m_button_fn = new Button(this, _L("Done")); + m_button_fn->SetBackgroundColor(btn_bg_white); + m_button_fn->SetBorderColor(wxColour(38, 46, 48)); + m_button_fn->SetFont(Label::Body_12); + m_button_fn->SetSize(wxSize(FromDIP(58), FromDIP(24))); + m_button_fn->SetMinSize(wxSize(-1, FromDIP(24))); + m_button_fn->SetCornerRadius(FromDIP(12)); + + m_button_fn->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { + post_event(wxCommandEvent(EVT_SECONDARY_CHECK_FUNC)); + e.Skip(); + }); + + if (btn_style == CONFIRM_AND_CANCEL) { m_button_cancel->Show(); + m_button_fn->Hide(); + } else if (btn_style == CONFIRM_AND_FUNC) { + m_button_cancel->Hide(); + m_button_fn->Show(); + } else { + m_button_cancel->Hide(); + m_button_fn->Hide(); + } sizer_button->AddStretchSpacer(); + sizer_button->Add(m_button_fn, 0, wxALL, FromDIP(5)); sizer_button->Add(m_button_ok, 0, wxALL, FromDIP(5)); sizer_button->Add(m_button_cancel, 0, wxALL, FromDIP(5)); sizer_button->Add(FromDIP(5),0, 0, 0); @@ -619,6 +640,16 @@ SecondaryCheckDialog::SecondaryCheckDialog(wxWindow* parent, wxWindowID id, cons wxGetApp().UpdateFrameDarkUI(this); } +void SecondaryCheckDialog::post_event(wxCommandEvent&& event) +{ + if (event_parent) { + event.SetString(""); + event.SetEventObject(event_parent); + wxPostEvent(event_parent, event); + event.Skip(); + } +} + void SecondaryCheckDialog::update_text(wxString text) { wxBoxSizer* sizer_text_release_note = new wxBoxSizer(wxVERTICAL); @@ -681,6 +712,33 @@ void SecondaryCheckDialog::on_hide() } } +void SecondaryCheckDialog::update_title_style(wxString title, SecondaryCheckDialog::ButtonStyle style, wxWindow* parent) +{ + SetTitle(title); + + event_parent = parent; + + if (style == CONFIRM_AND_CANCEL) { + m_button_cancel->Show(); + m_button_fn->Hide(); + } + else if (style == CONFIRM_AND_FUNC) { + m_button_cancel->Hide(); + m_button_fn->Show(); + } + else { + m_button_cancel->Hide(); + m_button_fn->Hide(); + } + Layout(); +} + +void SecondaryCheckDialog::update_func_btn(wxString func_btn_text) +{ + m_button_fn->SetLabel(func_btn_text); + rescale(); +} + void SecondaryCheckDialog::update_btn_label(wxString ok_btn_text, wxString cancel_btn_text) { m_button_ok->SetLabel(ok_btn_text); diff --git a/src/slic3r/GUI/ReleaseNote.hpp b/src/slic3r/GUI/ReleaseNote.hpp index 32673f4a1..a90c45507 100644 --- a/src/slic3r/GUI/ReleaseNote.hpp +++ b/src/slic3r/GUI/ReleaseNote.hpp @@ -22,6 +22,7 @@ #include #include #include +#include #include "AmsMappingPopup.hpp" #include "GUI_Utils.hpp" @@ -39,6 +40,7 @@ namespace Slic3r { namespace GUI { wxDECLARE_EVENT(EVT_SECONDARY_CHECK_CONFIRM, wxCommandEvent); wxDECLARE_EVENT(EVT_SECONDARY_CHECK_CANCEL, wxCommandEvent); +wxDECLARE_EVENT(EVT_SECONDARY_CHECK_FUNC, wxCommandEvent); class ReleaseNoteDialog : public DPIDialog { @@ -98,11 +100,14 @@ public: class SecondaryCheckDialog : public DPIFrame { +private: + wxWindow* event_parent { nullptr }; public: enum ButtonStyle { - ONLY_CONFIRM = 0, - CONFIRM_AND_CANCEL = 1, - MAX_STYLE_NUM = 2 + ONLY_CONFIRM = 0, + CONFIRM_AND_CANCEL = 1, + CONFIRM_AND_FUNC = 2, + MAX_STYLE_NUM = 3 }; SecondaryCheckDialog( wxWindow* parent, @@ -118,6 +123,9 @@ public: void on_show(); void on_hide(); void update_btn_label(wxString ok_btn_text, wxString cancel_btn_text); + void update_title_style(wxString title, SecondaryCheckDialog::ButtonStyle style, wxWindow* parent = nullptr); + void update_func_btn(wxString func_btn_text); + void post_event(wxCommandEvent&& event); void rescale(); ~SecondaryCheckDialog(); void on_dpi_changed(const wxRect& suggested_rect); @@ -125,8 +133,9 @@ public: Label* m_staticText_release_note {nullptr}; wxBoxSizer* m_sizer_main; wxScrolledWindow *m_vebview_release_note {nullptr}; - Button* m_button_ok; - Button* m_button_cancel; + Button* m_button_ok { nullptr }; + Button* m_button_cancel { nullptr }; + Button* m_button_fn { nullptr }; wxCheckBox* m_show_again_checkbox; bool not_show_again = false; std::string show_again_config_text = ""; diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index 6e3360cba..fa5aabb21 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -1274,7 +1274,7 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co Bind(EVT_AMS_GUIDE_WIKI, &StatusPanel::on_ams_guide, this); Bind(EVT_AMS_RETRY, &StatusPanel::on_ams_retry, this); Bind(EVT_FAN_CHANGED, &StatusPanel::on_fan_changed, this); - + Bind(EVT_SECONDARY_CHECK_FUNC, &StatusPanel::on_print_error_func, this); m_switch_speed->Connect(wxEVT_LEFT_DOWN, wxCommandEventHandler(StatusPanel::on_switch_speed), NULL, this); m_calibration_btn->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_start_calibration), NULL, this); @@ -1591,7 +1591,7 @@ void StatusPanel::show_recenter_dialog() { obj->command_go_home(); } -void StatusPanel::show_error_message(wxString msg) +void StatusPanel::show_error_message(wxString msg, std::string print_error_str) { if (msg.IsEmpty()) { if (m_panel_error_txt->IsShown()) { @@ -1611,6 +1611,12 @@ void StatusPanel::show_error_message(wxString msg) if (m_print_error_dlg == nullptr) { m_print_error_dlg = new SecondaryCheckDialog(this->GetParent(), wxID_ANY, _L("Warning"), SecondaryCheckDialog::ButtonStyle::ONLY_CONFIRM); } + if (print_error_str == "07FF 8007") { + m_print_error_dlg->update_func_btn("Done"); + m_print_error_dlg->update_title_style(_L("Warning"), SecondaryCheckDialog::ButtonStyle::CONFIRM_AND_FUNC, this); + } else { + m_print_error_dlg->update_title_style(_L("Warning"), SecondaryCheckDialog::ButtonStyle::ONLY_CONFIRM, this); + } m_print_error_dlg->update_text(msg); m_print_error_dlg->on_show(); } @@ -1638,7 +1644,7 @@ void StatusPanel::update_error_message() error_msg = wxString::Format("%s[%s]", error_msg, print_error_str); - show_error_message(error_msg); + show_error_message(error_msg, print_error_str); } else { BOOST_LOG_TRIVIAL(info) << "show print error! error_msg is empty, print error = " << obj->print_error; } @@ -1951,90 +1957,109 @@ void StatusPanel::update_ams(MachineObject *obj) std::string curr_ams_id = m_ams_control->GetCurentAms(); std::string curr_can_id = m_ams_control->GetCurrentCan(curr_ams_id); + bool is_vt_tray = false; + if (obj->m_tray_tar == std::to_string(VIRTUAL_TRAY_ID)) + is_vt_tray = true; - if (m_ams_control->GetCurentAms() == std::to_string(VIRTUAL_TRAY_ID)) { - m_ams_control->SetAmsStep(curr_ams_id, curr_can_id, AMSPassRoadType::AMS_ROAD_TYPE_NONE, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); - } - else if (m_ams_control->GetCurentAms() != obj->m_ams_id) { - m_ams_control->SetAmsStep(curr_ams_id, curr_can_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + // set segment 1, 2 + if (m_ams_control->GetCurentAms() != std::to_string(VIRTUAL_TRAY_ID)) { + if (obj->m_tray_now != "255" && obj->is_filament_at_extruder()) { + m_ams_control->SetAmsStep(curr_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(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1); + } + else { + m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + } } else { - if (obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE) { + m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + } + + // set segment 3 + if (m_ams_control->GetCurentAms() == std::to_string(VIRTUAL_TRAY_ID)) { + m_ams_control->SetExtruder(obj->is_filament_at_extruder(), obj->vt_tray.get_color()); + } else { + m_ams_control->SetExtruder(obj->is_filament_at_extruder(), m_ams_control->GetCanColour(curr_ams_id, obj->m_tray_id)); + } + + if (obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE) { + if (obj->m_tray_tar == std::to_string(VIRTUAL_TRAY_ID) + && (obj->m_tray_now != std::to_string(VIRTUAL_TRAY_ID) || obj->m_tray_now != "255") + ) { + // wait to heat hotend + if (obj->ams_status_sub == 0x02) { + m_ams_control->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 (obj->ams_status_sub == 0x06) { + m_ams_control->SetFilamentStep(FilamentStep::STEP_CONFIRM_EXTRUDED, FilamentStepType::STEP_TYPE_VT_LOAD); + } + else if (obj->ams_status_sub == 0x07) { + m_ams_control->SetFilamentStep(FilamentStep::STEP_PURGE_OLD_FILAMENT, FilamentStepType::STEP_TYPE_VT_LOAD); + } + else { + m_ams_control->SetFilamentStep(FilamentStep::STEP_IDLE, FilamentStepType::STEP_TYPE_VT_LOAD); + } + } else { // wait to heat hotend if (obj->ams_status_sub == 0x02) { - if (curr_ams_id == obj->m_ams_id) { if (!obj->is_ams_unload()) { - m_ams_control->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, true); - m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_3); + m_ams_control->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, FilamentStepType::STEP_TYPE_LOAD); } else { - m_ams_control->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, false); - m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_3); + m_ams_control->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, FilamentStepType::STEP_TYPE_UNLOAD); } + } else { + m_ams_control->SetFilamentStep(FilamentStep::STEP_IDLE, FilamentStepType::STEP_TYPE_UNLOAD); } } else if (obj->ams_status_sub == 0x03) { if (!obj->is_ams_unload()) { - m_ams_control->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT, true); - m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1); + m_ams_control->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); } else { - m_ams_control->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT, false); - m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); + m_ams_control->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD); } - } else if (obj->ams_status_sub == 0x04) { if (!obj->is_ams_unload()) { - m_ams_control->SetFilamentStep(FilamentStep::STEP_PULL_CURR_FILAMENT, true); - m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); + m_ams_control->SetFilamentStep(FilamentStep::STEP_PULL_CURR_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); } else { - //FilamentStep::STEP_PULL_CURR_FILAMENT); - m_ams_control->SetFilamentStep(FilamentStep::STEP_PULL_CURR_FILAMENT, false); - m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + m_ams_control->SetFilamentStep(FilamentStep::STEP_PULL_CURR_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD); } } else if (obj->ams_status_sub == 0x05) { if (!obj->is_ams_unload()) { - m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, true); - m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); + m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); } else { - m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, false); - m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD); } } else if (obj->ams_status_sub == 0x06) { if (!obj->is_ams_unload()) { - m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, true); - m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); - } else { - m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, false); - m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_LOAD); + } + else { + m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD); } } else if (obj->ams_status_sub == 0x07) { if (!obj->is_ams_unload()) { - m_ams_control->SetFilamentStep(FilamentStep::STEP_PURGE_OLD_FILAMENT); - } else { - m_ams_control->SetFilamentStep(FilamentStep::STEP_PURGE_OLD_FILAMENT, false); + m_ams_control->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_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); } else { - m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); - } - } else if (obj->ams_status_main == AMS_STATUS_MAIN_ASSIST) { - m_ams_control->SetFilamentStep(FilamentStep::STEP_IDLE); - if (obj->is_filament_move()) { - m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); - } else { - m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); - } - } else { - m_ams_control->SetFilamentStep(FilamentStep::STEP_IDLE, false); - if (obj->is_filament_move()) { - m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); - } else { - m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + m_ams_control->SetFilamentStep(FilamentStep::STEP_IDLE, FilamentStepType::STEP_TYPE_UNLOAD); } } + } else if (obj->ams_status_main == AMS_STATUS_MAIN_ASSIST) { + m_ams_control->SetFilamentStep(FilamentStep::STEP_IDLE, FilamentStepType::STEP_TYPE_LOAD); + } else { + m_ams_control->SetFilamentStep(FilamentStep::STEP_IDLE, FilamentStepType::STEP_TYPE_LOAD); } + for (auto ams_it = obj->amsList.begin(); ams_it != obj->amsList.end(); ams_it++) { std::string ams_id = ams_it->first; @@ -2796,7 +2821,6 @@ void StatusPanel::on_ams_selected(wxCommandEvent &event) update_ams_control_state(curr_ams_id, obj->is_function_supported(PrinterFunction::FUNC_EXTRUSION_CALI)); } } - } void StatusPanel::on_ams_guide(wxCommandEvent& event) @@ -2813,6 +2837,17 @@ void StatusPanel::on_ams_retry(wxCommandEvent& event) } } +void StatusPanel::on_print_error_func(wxCommandEvent& event) +{ + BOOST_LOG_TRIVIAL(info) << "on_print_error_func"; + if (obj) { + obj->command_ams_control("done"); + if (m_print_error_dlg) { + m_print_error_dlg->on_hide(); + } + } +} + void StatusPanel::on_fan_changed(wxCommandEvent& event) { auto type = event.GetInt(); diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp index ce7c2c1c3..eaa9b2dec 100644 --- a/src/slic3r/GUI/StatusPanel.hpp +++ b/src/slic3r/GUI/StatusPanel.hpp @@ -312,7 +312,7 @@ protected: void on_subtask_pause_resume(wxCommandEvent &event); void on_subtask_abort(wxCommandEvent &event); void on_print_error_clean(wxCommandEvent &event); - void show_error_message(wxString msg); + void show_error_message(wxString msg, std::string print_error_str = ""); void error_info_reset(); void show_recenter_dialog(); @@ -348,6 +348,7 @@ protected: void on_ams_selected(wxCommandEvent &event); void on_ams_guide(wxCommandEvent &event); void on_ams_retry(wxCommandEvent &event); + void on_print_error_func(wxCommandEvent& event); void on_fan_changed(wxCommandEvent& event); void on_switch_speed(wxCommandEvent& event); diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index af5ed753f..ee50bedc9 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -9,8 +9,9 @@ namespace Slic3r { namespace GUI { -static const int LOAD_STEP_COUNT = 5; -static const int UNLOAD_STEP_COUNT = 3; +static const int LOAD_STEP_COUNT = 5; +static const int UNLOAD_STEP_COUNT = 3; +static const int VT_LOAD_STEP_COUNT = 4; static const wxColour AMS_TRAY_DEFAULT_COL = wxColour(255, 255, 255); @@ -22,7 +23,18 @@ static wxString FILAMENT_LOAD_STEP_STRING[LOAD_STEP_COUNT] = { _L("Purge old filament"), }; -static wxString FILAMENT_UNLOAD_STEP_STRING[UNLOAD_STEP_COUNT] = {_L("Heat the nozzle"), _L("Cut filament"), _L("Pull back current filament")}; +static wxString VT_TRAY_LOAD_STEP_STRING[VT_LOAD_STEP_COUNT] = { + _L("Heat the nozzle"), + _L("Feed new filament from external spool"), + _L("Confirm whether the filament has been extruded"), + _L("Purge old filament"), +}; + +static wxString FILAMENT_UNLOAD_STEP_STRING[UNLOAD_STEP_COUNT] = { + _L("Heat the nozzle"), + _L("Cut filament"), + _L("Pull back current filament") +}; wxDEFINE_EVENT(EVT_AMS_EXTRUSION_CALI, wxCommandEvent); wxDEFINE_EVENT(EVT_AMS_LOAD, SimpleEvent); @@ -1805,9 +1817,15 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_filament_unload_step->SetSize(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->SetSize(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); @@ -2169,8 +2187,15 @@ void AMSControl::msw_rescale() void AMSControl::UpdateStepCtrl() { - for (int i = 0; i < LOAD_STEP_COUNT; i++) { m_filament_load_step->AppendItem(FILAMENT_LOAD_STEP_STRING[i]); } - for (int i = 0; i < UNLOAD_STEP_COUNT; i++) { m_filament_unload_step->AppendItem(FILAMENT_UNLOAD_STEP_STRING[i]); } + for (int i = 0; i < LOAD_STEP_COUNT; i++) { + m_filament_load_step->AppendItem(FILAMENT_LOAD_STEP_STRING[i]); + } + for (int i = 0; i < UNLOAD_STEP_COUNT; i++) { + m_filament_unload_step->AppendItem(FILAMENT_UNLOAD_STEP_STRING[i]); + } + for (int i = 0; i < VT_LOAD_STEP_COUNT; i++) { + m_filament_vt_load_step->AppendItem(VT_TRAY_LOAD_STEP_STRING[i]); + } } void AMSControl::CreateAms() @@ -2403,26 +2428,56 @@ void AMSControl::SwitchAms(std::string ams_id) // update buttons } -void AMSControl::SetFilamentStep(int item_idx, bool isload) +void AMSControl::SetFilamentStep(int item_idx, FilamentStepType f_type) { - if (item_idx == FilamentStep::STEP_IDLE && isload) { + if (item_idx == FilamentStep::STEP_IDLE) { + m_simplebook_right->SetSelection(0); m_filament_load_step->Idle(); - return; - } - - if (item_idx == FilamentStep::STEP_IDLE && !isload) { m_filament_unload_step->Idle(); + m_filament_vt_load_step->Idle(); return; } - if (item_idx >= 0 && isload && item_idx < FilamentStep::STEP_COUNT) { - m_simplebook_right->SetSelection(1); - m_filament_load_step->SelectItem(item_idx - 1); - } - - if (item_idx >= 0 && !isload && item_idx < FilamentStep::STEP_COUNT) { - m_simplebook_right->SetSelection(2); - m_filament_unload_step->SelectItem(item_idx - 1); + if (f_type == FilamentStepType::STEP_TYPE_LOAD) { + if (item_idx > 0 && item_idx < FilamentStep::STEP_COUNT) { + m_simplebook_right->SetSelection(1); + m_filament_load_step->SelectItem(item_idx - 1); + } else { + m_filament_load_step->Idle(); + } + } else if (f_type == FilamentStepType::STEP_TYPE_UNLOAD) { + if (item_idx > 0 && item_idx < FilamentStep::STEP_COUNT) { + m_simplebook_right->SetSelection(2); + m_filament_unload_step->SelectItem(item_idx - 1); + } + else { + m_filament_unload_step->Idle(); + } + } else if (f_type == FilamentStepType::STEP_TYPE_VT_LOAD) { + m_simplebook_right->SetSelection(3); + if (item_idx == STEP_HEAT_NOZZLE) { + m_filament_vt_load_step->SelectItem(0); + } + else if (item_idx == STEP_FEED_FILAMENT) { + m_filament_vt_load_step->SelectItem(1); + } + else if (item_idx == STEP_CONFIRM_EXTRUDED) { + m_filament_vt_load_step->SelectItem(2); + } + else if (item_idx == STEP_PURGE_OLD_FILAMENT) { + m_filament_vt_load_step->SelectItem(3); + } + 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(item_idx - 1); + } + else { + m_filament_load_step->Idle(); + } } } @@ -2470,6 +2525,15 @@ bool AMSControl::Enable(bool enable) return wxWindow::Enable(enable); } +void AMSControl::SetExtruder(bool on_off, wxColour col) +{ + if (!on_off) { + m_extruder->TurnOff(); + } else { + m_extruder->TurnOn(col); + } +} + void AMSControl::SetAmsStep(std::string ams_id, std::string canid, AMSPassRoadType type, AMSPassRoadSTEP step) { AmsCansWindow *cans = nullptr; @@ -2487,25 +2551,22 @@ void AMSControl::SetAmsStep(std::string ams_id, std::string canid, AMSPassRoadTy if (cans == nullptr) return; if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { - if (ams_id == m_current_ams) { m_extruder->TurnOff(); } cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); } if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1) { - if (ams_id == m_current_ams) { m_extruder->TurnOff(); } cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); - cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); } if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2) { - if (ams_id == m_current_ams) { m_extruder->TurnOn(GetCanColour(ams_id, canid)); } - cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_1); + cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); } if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3) { - if (ams_id == m_current_ams) { m_extruder->TurnOn(GetCanColour(ams_id, canid)); } 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); } for (auto i = 0; i < m_ams_info.size(); i++) { @@ -2514,14 +2575,6 @@ void AMSControl::SetAmsStep(std::string ams_id, std::string canid, AMSPassRoadTy m_ams_info[i].current_can_id = canid; } } - - if (type == AMSPassRoadType::AMS_ROAD_TYPE_LOAD) { - SetActionState(AMSAction::AMS_ACTION_LOAD); - } else if (type == AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD) { - SetActionState(AMSAction::AMS_ACTION_UNLOAD); - } else if (type == AMSPassRoadType::AMS_ROAD_TYPE_NONE) { - SetActionState(AMSAction::AMS_ACTION_NORMAL); - } } void AMSControl::on_filament_load(wxCommandEvent &event) diff --git a/src/slic3r/GUI/Widgets/AMSControl.hpp b/src/slic3r/GUI/Widgets/AMSControl.hpp index bf1c292c2..7d3b9353a 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.hpp +++ b/src/slic3r/GUI/Widgets/AMSControl.hpp @@ -95,9 +95,17 @@ enum FilamentStep { STEP_PULL_CURR_FILAMENT, STEP_PUSH_NEW_FILAMENT, STEP_PURGE_OLD_FILAMENT, + STEP_FEED_FILAMENT, + STEP_CONFIRM_EXTRUDED, STEP_COUNT, }; +enum FilamentStepType { + STEP_TYPE_LOAD = 0, + STEP_TYPE_UNLOAD = 1, + STEP_TYPE_VT_LOAD = 2, +}; + #define AMS_ITEM_CUBE_SIZE wxSize(FromDIP(14), FromDIP(14)) #define AMS_ITEM_SIZE wxSize(FromDIP(82), FromDIP(27)) #define AMS_ITEM_HUMIDITY_SIZE wxSize(FromDIP(120), FromDIP(27)) @@ -495,6 +503,7 @@ protected: ::StepIndicator *m_filament_load_step = {nullptr}; ::StepIndicator *m_filament_unload_step = {nullptr}; + ::StepIndicator *m_filament_vt_load_step = {nullptr}; Button *m_button_extruder_feed = {nullptr}; Button *m_button_extruder_back = {nullptr}; @@ -528,7 +537,7 @@ public: void PlayRridLoading(wxString amsid, wxString canid); void StopRridLoading(wxString amsid, wxString canid); - void SetFilamentStep(int item_idx, bool isload = true); + void SetFilamentStep(int item_idx, FilamentStepType f_type); void ShowFilamentTip(bool hasams = true); void SetHumidity(std::string amsid, int humidity); @@ -536,6 +545,7 @@ public: void CreateAms(); void UpdateAms(std::vector info, bool keep_selection = true, bool has_extrusion_cali = true); void AddAms(AMSinfo info, bool refresh = true); + void SetExtruder(bool on_off, wxColour col); void SetAmsStep(std::string ams_id, std::string canid, AMSPassRoadType type, AMSPassRoadSTEP step); void SwitchAms(std::string ams_id);