ENH: refine load/unload for spool holder filament

update ams load/unload gcode

Change-Id: Ia3d4a26efb14325c89f0c9f9571268c1834361ae
Signed-off-by: Stone Li <stone.li@bambulab.com>
This commit is contained in:
Stone Li 2023-02-17 12:10:23 +08:00 committed by Lane.Wei
parent 9480b84b64
commit a48c36fde1
11 changed files with 323 additions and 156 deletions

View File

@ -1,6 +1,6 @@
M620 S[next_extruder] M620 S[next_extruder]
M106 S255 M106 S255
M104 S142 M104 S250
M17 S M17 S
M17 X0.5 Y0.5 M17 X0.5 Y0.5
G91 G91
@ -9,24 +9,24 @@ G1 Z3
G90 G90
G28 X G28 X
M17 R M17 R
G1 X70 F12000 G1 X70 F21000
G1 Y245 G1 Y245
G1 Y265 F3000 G1 Y265 F3000
G4 G4
M106 S0 M106 S0
M109 S250 M109 S250
G4 S10
G1 X90 G1 X90
G1 Y255 G1 Y255
G1 X120 G1 X120
G1 X20 Y50 F12000 G1 X20 Y50 F21000
G1 Y-3 G1 Y-3
T[next_extruder] T[next_extruder]
G1 X54 G1 X54
G1 Y265 G1 Y265
G92 E0 G92 E0
G1 E40 F180 G1 E40 F180
M109 S[new_filament_temp] G4
M104 S[new_filament_temp]
G1 X70 F15000 G1 X70 F15000
G1 X76 G1 X76
G1 X65 G1 X65

View File

@ -1,35 +1,32 @@
M620 S255 M620 S255
M106 P1 S255 M106 P1 S255
M104 S142 M104 S250
M17 S M17 S
M17 X0.5 Y0.5 M17 X0.5 Y0.5
G91 G91
G1 Y-5 F3000 G1 Y-5 F3000
G1 Z3.0 F1200 G1 Z3 F1200
G90 G90
G28 X G28 X
M17 R M17 R
G1 X70 F21000
G1 X70 F12000
G1 Y245 G1 Y245
G1 Y265 F3000 G1 Y265 F3000
M400 G4
M106 P1 S0 M106 P1 S0
M109 S250 M109 S250
G4 S10
G1 X90 F3000 G1 X90 F3000
G1 Y255 F4000 G1 Y255 F4000
G1 X100 F5000 G1 X100 F5000
G1 X120 F12000 G1 X120 F21000
G1 X20 Y50
G1 X20 Y50 F12000
G1 Y-3 G1 Y-3
T255 T255
G4
M104 S0 M104 S0
G1 X70 F3000 G1 X70 F3000
G91 G91
G1 Z-3.0 F1200 G1 Z-3 F1200
G90 G90
M621 S255 M621 S255

View File

@ -1562,9 +1562,8 @@ int MachineObject::command_ams_switch(int tray_index, int old_temp, int new_temp
std::string gcode = ""; std::string gcode = "";
if (tray_index == 255) { if (tray_index == 255) {
gcode = DeviceManager::load_gcode(printer_type, "ams_unload.gcode"); 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 { } else {
// include VIRTUAL_TRAY_ID
gcode = DeviceManager::load_gcode(printer_type, "ams_load.gcode"); gcode = DeviceManager::load_gcode(printer_type, "ams_load.gcode");
boost::replace_all(gcode, "[next_extruder]", std::to_string(tray_index)); boost::replace_all(gcode, "[next_extruder]", std::to_string(tray_index));
boost::replace_all(gcode, "[new_filament_temp]", std::to_string(new_temp)); 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) int MachineObject::command_ams_control(std::string action)
{ {
//valid actions //valid actions
if (action == "resume" || action == "reset" || action == "pause") { if (action == "resume" || action == "reset" || action == "pause" || action == "done") {
json j; json j;
j["print"]["command"] = "ams_control"; j["print"]["command"] = "ams_control";
j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++);

View File

@ -59,46 +59,51 @@ void PrintJob::on_success(std::function<void()> success)
wxString PrintJob::get_http_error_msg(unsigned int status, std::string body) wxString PrintJob::get_http_error_msg(unsigned int status, std::string body)
{ {
int code = 0; try {
std::string error; int code = 0;
std::string message; std::string error;
wxString result; std::string message;
if (status >= 400 && status < 500) wxString result;
try { if (status >= 400 && status < 500)
json j = json::parse(body); try {
if (j.contains("code")) { json j = json::parse(body);
if (!j["code"].is_null()) if (j.contains("code")) {
code = j["code"].get<int>(); if (!j["code"].is_null())
code = j["code"].get<int>();
}
if (j.contains("error")) {
if (!j["error"].is_null())
error = j["error"].get<std::string>();
}
if (j.contains("message")) {
if (!j["message"].is_null())
message = j["message"].get<std::string>();
}
switch (status) {
;
}
} }
if (j.contains("error")) { catch (...) {
if (!j["error"].is_null())
error = j["error"].get<std::string>();
}
if (j.contains("message")) {
if (!j["message"].is_null())
message = j["message"].get<std::string>();
}
switch (status) {
; ;
} }
} else if (status == 503) {
catch (...) { 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 wxEmptyString;
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;
} }
void PrintJob::process() void PrintJob::process()

View File

@ -26,6 +26,7 @@ namespace Slic3r { namespace GUI {
wxDEFINE_EVENT(EVT_SECONDARY_CHECK_CONFIRM, wxCommandEvent); wxDEFINE_EVENT(EVT_SECONDARY_CHECK_CONFIRM, wxCommandEvent);
wxDEFINE_EVENT(EVT_SECONDARY_CHECK_CANCEL, wxCommandEvent); wxDEFINE_EVENT(EVT_SECONDARY_CHECK_CANCEL, wxCommandEvent);
wxDEFINE_EVENT(EVT_SECONDARY_CHECK_FUNC, wxCommandEvent);
wxDEFINE_EVENT(EVT_CHECKBOX_CHANGE, wxCommandEvent); wxDEFINE_EVENT(EVT_CHECKBOX_CHANGE, wxCommandEvent);
wxDEFINE_EVENT(EVT_ENTER_IP_ADDRESS, wxCommandEvent); wxDEFINE_EVENT(EVT_ENTER_IP_ADDRESS, wxCommandEvent);
wxDEFINE_EVENT(EVT_CLOSE_IPADDRESS_DLG, 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->SetCornerRadius(FromDIP(12));
m_button_cancel->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { m_button_cancel->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) {
wxCommandEvent evt(EVT_SECONDARY_CHECK_CANCEL); wxCommandEvent evt(EVT_SECONDARY_CHECK_CANCEL);
e.SetEventObject(this); e.SetEventObject(this);
GetEventHandler()->ProcessEvent(evt); GetEventHandler()->ProcessEvent(evt);
this->on_hide(); this->on_hide();
}); });
if (btn_style != CONFIRM_AND_CANCEL) m_button_fn = new Button(this, _L("Done"));
m_button_cancel->Hide(); m_button_fn->SetBackgroundColor(btn_bg_white);
else 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_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->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_ok, 0, wxALL, FromDIP(5));
sizer_button->Add(m_button_cancel, 0, wxALL, FromDIP(5)); sizer_button->Add(m_button_cancel, 0, wxALL, FromDIP(5));
sizer_button->Add(FromDIP(5),0, 0, 0); sizer_button->Add(FromDIP(5),0, 0, 0);
@ -619,6 +640,16 @@ SecondaryCheckDialog::SecondaryCheckDialog(wxWindow* parent, wxWindowID id, cons
wxGetApp().UpdateFrameDarkUI(this); 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) void SecondaryCheckDialog::update_text(wxString text)
{ {
wxBoxSizer* sizer_text_release_note = new wxBoxSizer(wxVERTICAL); 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) void SecondaryCheckDialog::update_btn_label(wxString ok_btn_text, wxString cancel_btn_text)
{ {
m_button_ok->SetLabel(ok_btn_text); m_button_ok->SetLabel(ok_btn_text);

View File

@ -22,6 +22,7 @@
#include <wx/spinctrl.h> #include <wx/spinctrl.h>
#include <wx/artprov.h> #include <wx/artprov.h>
#include <wx/wrapsizer.h> #include <wx/wrapsizer.h>
#include <wx/event.h>
#include "AmsMappingPopup.hpp" #include "AmsMappingPopup.hpp"
#include "GUI_Utils.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_CONFIRM, wxCommandEvent);
wxDECLARE_EVENT(EVT_SECONDARY_CHECK_CANCEL, wxCommandEvent); wxDECLARE_EVENT(EVT_SECONDARY_CHECK_CANCEL, wxCommandEvent);
wxDECLARE_EVENT(EVT_SECONDARY_CHECK_FUNC, wxCommandEvent);
class ReleaseNoteDialog : public DPIDialog class ReleaseNoteDialog : public DPIDialog
{ {
@ -98,11 +100,14 @@ public:
class SecondaryCheckDialog : public DPIFrame class SecondaryCheckDialog : public DPIFrame
{ {
private:
wxWindow* event_parent { nullptr };
public: public:
enum ButtonStyle { enum ButtonStyle {
ONLY_CONFIRM = 0, ONLY_CONFIRM = 0,
CONFIRM_AND_CANCEL = 1, CONFIRM_AND_CANCEL = 1,
MAX_STYLE_NUM = 2 CONFIRM_AND_FUNC = 2,
MAX_STYLE_NUM = 3
}; };
SecondaryCheckDialog( SecondaryCheckDialog(
wxWindow* parent, wxWindow* parent,
@ -118,6 +123,9 @@ public:
void on_show(); void on_show();
void on_hide(); void on_hide();
void update_btn_label(wxString ok_btn_text, wxString cancel_btn_text); 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(); void rescale();
~SecondaryCheckDialog(); ~SecondaryCheckDialog();
void on_dpi_changed(const wxRect& suggested_rect); void on_dpi_changed(const wxRect& suggested_rect);
@ -125,8 +133,9 @@ public:
Label* m_staticText_release_note {nullptr}; Label* m_staticText_release_note {nullptr};
wxBoxSizer* m_sizer_main; wxBoxSizer* m_sizer_main;
wxScrolledWindow *m_vebview_release_note {nullptr}; wxScrolledWindow *m_vebview_release_note {nullptr};
Button* m_button_ok; Button* m_button_ok { nullptr };
Button* m_button_cancel; Button* m_button_cancel { nullptr };
Button* m_button_fn { nullptr };
wxCheckBox* m_show_again_checkbox; wxCheckBox* m_show_again_checkbox;
bool not_show_again = false; bool not_show_again = false;
std::string show_again_config_text = ""; std::string show_again_config_text = "";

View File

@ -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_GUIDE_WIKI, &StatusPanel::on_ams_guide, this);
Bind(EVT_AMS_RETRY, &StatusPanel::on_ams_retry, this); Bind(EVT_AMS_RETRY, &StatusPanel::on_ams_retry, this);
Bind(EVT_FAN_CHANGED, &StatusPanel::on_fan_changed, 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_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); 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(); 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 (msg.IsEmpty()) {
if (m_panel_error_txt->IsShown()) { if (m_panel_error_txt->IsShown()) {
@ -1611,6 +1611,12 @@ void StatusPanel::show_error_message(wxString msg)
if (m_print_error_dlg == nullptr) { if (m_print_error_dlg == nullptr) {
m_print_error_dlg = new SecondaryCheckDialog(this->GetParent(), wxID_ANY, _L("Warning"), SecondaryCheckDialog::ButtonStyle::ONLY_CONFIRM); 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->update_text(msg);
m_print_error_dlg->on_show(); m_print_error_dlg->on_show();
} }
@ -1638,7 +1644,7 @@ void StatusPanel::update_error_message()
error_msg = wxString::Format("%s[%s]", error_msg = wxString::Format("%s[%s]",
error_msg, error_msg,
print_error_str); print_error_str);
show_error_message(error_msg); show_error_message(error_msg, print_error_str);
} else { } else {
BOOST_LOG_TRIVIAL(info) << "show print error! error_msg is empty, print error = " << obj->print_error; BOOST_LOG_TRIVIAL(info) << "show print error! error_msg is empty, print error = " << obj->print_error;
} }
@ -1951,91 +1957,110 @@ void StatusPanel::update_ams(MachineObject *obj)
std::string curr_ams_id = m_ams_control->GetCurentAms(); std::string curr_ams_id = m_ams_control->GetCurentAms();
std::string curr_can_id = m_ams_control->GetCurrentCan(curr_ams_id); 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)) { // set segment 1, 2
m_ams_control->SetAmsStep(curr_ams_id, curr_can_id, AMSPassRoadType::AMS_ROAD_TYPE_NONE, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); if (m_ams_control->GetCurentAms() != std::to_string(VIRTUAL_TRAY_ID)) {
} if (obj->m_tray_now != "255" && obj->is_filament_at_extruder()) {
else if (m_ams_control->GetCurentAms() != obj->m_ams_id) { 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->SetAmsStep(curr_ams_id, curr_can_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); }
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 { } 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 // wait to heat hotend
if (obj->ams_status_sub == 0x02) { if (obj->ams_status_sub == 0x02) {
if (curr_ams_id == obj->m_ams_id) { if (curr_ams_id == obj->m_ams_id) {
if (!obj->is_ams_unload()) { if (!obj->is_ams_unload()) {
m_ams_control->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, true); m_ams_control->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, FilamentStepType::STEP_TYPE_LOAD);
m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_3);
} else { } else {
m_ams_control->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, false); m_ams_control->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, FilamentStepType::STEP_TYPE_UNLOAD);
m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_3);
} }
} else {
m_ams_control->SetFilamentStep(FilamentStep::STEP_IDLE, FilamentStepType::STEP_TYPE_UNLOAD);
} }
} else if (obj->ams_status_sub == 0x03) { } else if (obj->ams_status_sub == 0x03) {
if (!obj->is_ams_unload()) { if (!obj->is_ams_unload()) {
m_ams_control->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT, true); m_ams_control->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT, FilamentStepType::STEP_TYPE_LOAD);
m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1);
} }
else { else {
m_ams_control->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT, false); m_ams_control->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD);
m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3);
} }
} else if (obj->ams_status_sub == 0x04) { } else if (obj->ams_status_sub == 0x04) {
if (!obj->is_ams_unload()) { if (!obj->is_ams_unload()) {
m_ams_control->SetFilamentStep(FilamentStep::STEP_PULL_CURR_FILAMENT, true); m_ams_control->SetFilamentStep(FilamentStep::STEP_PULL_CURR_FILAMENT, FilamentStepType::STEP_TYPE_LOAD);
m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2);
} }
else { else {
//FilamentStep::STEP_PULL_CURR_FILAMENT); m_ams_control->SetFilamentStep(FilamentStep::STEP_PULL_CURR_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD);
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);
} }
} else if (obj->ams_status_sub == 0x05) { } else if (obj->ams_status_sub == 0x05) {
if (!obj->is_ams_unload()) { if (!obj->is_ams_unload()) {
m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, true); m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_LOAD);
m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2);
} }
else { else {
m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, false); m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD);
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_sub == 0x06) { } else if (obj->ams_status_sub == 0x06) {
if (!obj->is_ams_unload()) { if (!obj->is_ams_unload()) {
m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, true); m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_LOAD);
m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); }
} else { else {
m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, false); m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, FilamentStepType::STEP_TYPE_UNLOAD);
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_sub == 0x07) { } else if (obj->ams_status_sub == 0x07) {
if (!obj->is_ams_unload()) { if (!obj->is_ams_unload()) {
m_ams_control->SetFilamentStep(FilamentStep::STEP_PURGE_OLD_FILAMENT); m_ams_control->SetFilamentStep(FilamentStep::STEP_PURGE_OLD_FILAMENT, FilamentStepType::STEP_TYPE_LOAD);
} else { }
m_ams_control->SetFilamentStep(FilamentStep::STEP_PURGE_OLD_FILAMENT, false); 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 { } 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);
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);
} }
} }
} 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++) { for (auto ams_it = obj->amsList.begin(); ams_it != obj->amsList.end(); ams_it++) {
std::string ams_id = ams_it->first; std::string ams_id = ams_it->first;
try { try {
@ -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)); update_ams_control_state(curr_ams_id, obj->is_function_supported(PrinterFunction::FUNC_EXTRUSION_CALI));
} }
} }
} }
void StatusPanel::on_ams_guide(wxCommandEvent& event) 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) void StatusPanel::on_fan_changed(wxCommandEvent& event)
{ {
auto type = event.GetInt(); auto type = event.GetInt();

View File

@ -312,7 +312,7 @@ protected:
void on_subtask_pause_resume(wxCommandEvent &event); void on_subtask_pause_resume(wxCommandEvent &event);
void on_subtask_abort(wxCommandEvent &event); void on_subtask_abort(wxCommandEvent &event);
void on_print_error_clean(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 error_info_reset();
void show_recenter_dialog(); void show_recenter_dialog();
@ -348,6 +348,7 @@ protected:
void on_ams_selected(wxCommandEvent &event); void on_ams_selected(wxCommandEvent &event);
void on_ams_guide(wxCommandEvent &event); void on_ams_guide(wxCommandEvent &event);
void on_ams_retry(wxCommandEvent &event); void on_ams_retry(wxCommandEvent &event);
void on_print_error_func(wxCommandEvent& event);
void on_fan_changed(wxCommandEvent& event); void on_fan_changed(wxCommandEvent& event);
void on_switch_speed(wxCommandEvent& event); void on_switch_speed(wxCommandEvent& event);

View File

@ -9,8 +9,9 @@
namespace Slic3r { namespace GUI { namespace Slic3r { namespace GUI {
static const int LOAD_STEP_COUNT = 5; static const int LOAD_STEP_COUNT = 5;
static const int UNLOAD_STEP_COUNT = 3; 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); 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"), _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_EXTRUSION_CALI, wxCommandEvent);
wxDEFINE_EVENT(EVT_AMS_LOAD, SimpleEvent); 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->SetSize(AMS_STEP_SIZE);
m_filament_unload_step->SetBackgroundColour(*wxWHITE); 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(tip_right, wxEmptyString, false);
m_simplebook_right->AddPage(m_filament_load_step, 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_unload_step, wxEmptyString, false);
m_simplebook_right->AddPage(m_filament_vt_load_step, wxEmptyString, false);
m_button_ams_setting_normal = ScalableBitmap(this, "ams_setting_normal", 24); m_button_ams_setting_normal = ScalableBitmap(this, "ams_setting_normal", 24);
@ -2169,8 +2187,15 @@ void AMSControl::msw_rescale()
void AMSControl::UpdateStepCtrl() 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 < LOAD_STEP_COUNT; i++) {
for (int i = 0; i < UNLOAD_STEP_COUNT; i++) { m_filament_unload_step->AppendItem(FILAMENT_UNLOAD_STEP_STRING[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() void AMSControl::CreateAms()
@ -2403,26 +2428,56 @@ void AMSControl::SwitchAms(std::string ams_id)
// update buttons // 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(); m_filament_load_step->Idle();
return;
}
if (item_idx == FilamentStep::STEP_IDLE && !isload) {
m_filament_unload_step->Idle(); m_filament_unload_step->Idle();
m_filament_vt_load_step->Idle();
return; return;
} }
if (item_idx >= 0 && isload && item_idx < FilamentStep::STEP_COUNT) { if (f_type == FilamentStepType::STEP_TYPE_LOAD) {
m_simplebook_right->SetSelection(1); if (item_idx > 0 && item_idx < FilamentStep::STEP_COUNT) {
m_filament_load_step->SelectItem(item_idx - 1); m_simplebook_right->SetSelection(1);
} m_filament_load_step->SelectItem(item_idx - 1);
} else {
if (item_idx >= 0 && !isload && item_idx < FilamentStep::STEP_COUNT) { m_filament_load_step->Idle();
m_simplebook_right->SetSelection(2); }
m_filament_unload_step->SelectItem(item_idx - 1); } 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); 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) void AMSControl::SetAmsStep(std::string ams_id, std::string canid, AMSPassRoadType type, AMSPassRoadSTEP step)
{ {
AmsCansWindow *cans = nullptr; AmsCansWindow *cans = nullptr;
@ -2487,25 +2551,22 @@ void AMSControl::SetAmsStep(std::string ams_id, std::string canid, AMSPassRoadTy
if (cans == nullptr) return; if (cans == nullptr) return;
if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { 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); cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE);
} }
if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1) { 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_1);
cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2);
} }
if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2) { 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_1);
cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2);
} }
if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3) { 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_1);
cans->amsCans->SetAmsStep(canid, type, AMSPassRoadSTEP::AMS_ROAD_STEP_2); 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++) { 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; 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) void AMSControl::on_filament_load(wxCommandEvent &event)

View File

@ -95,9 +95,17 @@ enum FilamentStep {
STEP_PULL_CURR_FILAMENT, STEP_PULL_CURR_FILAMENT,
STEP_PUSH_NEW_FILAMENT, STEP_PUSH_NEW_FILAMENT,
STEP_PURGE_OLD_FILAMENT, STEP_PURGE_OLD_FILAMENT,
STEP_FEED_FILAMENT,
STEP_CONFIRM_EXTRUDED,
STEP_COUNT, 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_CUBE_SIZE wxSize(FromDIP(14), FromDIP(14))
#define AMS_ITEM_SIZE wxSize(FromDIP(82), FromDIP(27)) #define AMS_ITEM_SIZE wxSize(FromDIP(82), FromDIP(27))
#define AMS_ITEM_HUMIDITY_SIZE wxSize(FromDIP(120), 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_load_step = {nullptr};
::StepIndicator *m_filament_unload_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_feed = {nullptr};
Button *m_button_extruder_back = {nullptr}; Button *m_button_extruder_back = {nullptr};
@ -528,7 +537,7 @@ public:
void PlayRridLoading(wxString amsid, wxString canid); void PlayRridLoading(wxString amsid, wxString canid);
void StopRridLoading(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 ShowFilamentTip(bool hasams = true);
void SetHumidity(std::string amsid, int humidity); void SetHumidity(std::string amsid, int humidity);
@ -536,6 +545,7 @@ public:
void CreateAms(); void CreateAms();
void UpdateAms(std::vector<AMSinfo> info, bool keep_selection = true, bool has_extrusion_cali = true); void UpdateAms(std::vector<AMSinfo> info, bool keep_selection = true, bool has_extrusion_cali = true);
void AddAms(AMSinfo info, bool refresh = 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 SetAmsStep(std::string ams_id, std::string canid, AMSPassRoadType type, AMSPassRoadSTEP step);
void SwitchAms(std::string ams_id); void SwitchAms(std::string ams_id);