diff --git a/resources/images/filament_load_extruder.png b/resources/images/filament_load_extruder.png new file mode 100644 index 0000000000..30afd6494d Binary files /dev/null and b/resources/images/filament_load_extruder.png differ diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 5e6bae0fd1..8386bf663a 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -66,6 +66,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 02a11836bc..0fc585daf2 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -1977,6 +1977,19 @@ int MachineObject::command_ams_change_filament(bool load, std::string ams_id, st 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; @@ -5805,6 +5818,9 @@ void MachineObject::parse_new_info(json print) extder_data.current_extder_id = get_flag_bits(extruder["state"].get(), 4, 4); extder_data.target_extder_id = get_flag_bits(extruder["state"].get(), 8, 4); + extder_data.switch_extder_state = (ExtruderSwitchState) get_flag_bits(extruder["state"].get(), 12, 3); + + extder_data.current_loading_extder_id = get_flag_bits(extruder["state"].get(), 15, 4); for (auto it = extruder["info"].begin(); it != extruder["info"].end(); it++) { diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index d1a06f1ffd..5608c2f029 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -225,7 +225,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; }; @@ -1067,6 +1068,7 @@ public: // ams controls //int command_ams_switch(int tray_index, int old_temp = 210, int new_temp = 210); int command_ams_change_filament(bool load, std::string ams_id, std::string slot_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/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index ba5ce50e98..a2da25949c 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -916,9 +916,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(); @@ -934,27 +933,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 a687f305cd..074b52b55b 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -1343,10 +1343,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; @@ -1623,7 +1628,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); @@ -1841,21 +1845,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); @@ -1913,15 +1902,97 @@ 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) { - m_ams_control->Show(true); - m_ams_control_box->Show(true); - m_ams_control->show_noams_mode(); - if (m_show_ams_group != show) { + if (m_ams_control->IsShown() != show) { + m_ams_control->Show(show); + m_ams_control->show_noams_mode(); + } + + 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_ams_control->Layout(); + m_ams_control->Fit(); + Layout(); + Fit(); + } +} + +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(); } - m_show_ams_group = show; } void StatusPanel::update_camera_state(MachineObject* obj) @@ -2011,7 +2082,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); @@ -2086,7 +2156,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); @@ -2153,8 +2222,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; @@ -2176,8 +2244,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); @@ -2626,7 +2692,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(); @@ -2654,7 +2719,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); } @@ -3006,16 +3070,17 @@ 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); - m_ams_control->show_auto_refill(true); + show_filament_load_group(true); + m_ams_control->show_auto_refill(true); } @@ -3042,18 +3107,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, false); @@ -3073,120 +3126,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) ) { - 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)) { - 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; @@ -3205,36 +3346,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) { @@ -3249,48 +3361,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; @@ -3307,10 +3442,10 @@ 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; @@ -3326,7 +3461,7 @@ void StatusPanel::update_ams_control_state(bool is_curr_tray_selected) else if (!m_ams_control->GetCurrentCan(m_ams_control->GetCurentAms()).empty()) { enable[ACTION_BTN_LOAD] = false; enable[ACTION_BTN_UNLOAD] = false; - } + } } else if (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_MAIN_ID)) { if (m_ams_control->GetCurentAms() == std::to_string(VIRTUAL_TRAY_MAIN_ID)) { @@ -3342,13 +3477,9 @@ void StatusPanel::update_ams_control_state(bool is_curr_tray_selected) enable[ACTION_BTN_LOAD] = false; enable[ACTION_BTN_UNLOAD] = false; } - } + } } - } - -// if (obj->m_tray_now == "255") { -// enable[ACTION_BTN_UNLOAD] = false; -// } + }*/ m_ams_control->SetActionState(enable); } @@ -3835,11 +3966,6 @@ void StatusPanel::on_axis_ctrl_e_down_10(wxCommandEvent &event) } } -void StatusPanel::on_start_unload(wxCommandEvent &event) -{ - if (obj) obj->command_ams_change_filament(false, "255", "255"); -} - void StatusPanel::on_set_bed_temp() { if (!obj) {return;} @@ -3934,7 +4060,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; } @@ -4326,7 +4453,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(); @@ -4803,6 +4929,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(); @@ -4817,8 +4944,11 @@ 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(); +#endif } void StatusPanel::show_status(int status) diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp index 42e9e9743c..6916dfff3a 100644 --- a/src/slic3r/GUI/StatusPanel.hpp +++ b/src/slic3r/GUI/StatusPanel.hpp @@ -30,6 +30,7 @@ #include "Widgets/ProgressBar.hpp" #include "Widgets/ImageSwitchButton.hpp" #include "Widgets/AMSControl.hpp" +#include "Widgets/FilamentLoad.hpp" #include "Widgets/FanControl.hpp" #include "HMS.hpp" @@ -446,6 +447,7 @@ protected: wxBoxSizer* m_ams_list; wxStaticText * m_ams_debug; bool m_show_ams_group{false}; + bool m_show_filament_group{ false }; AMSControl* m_ams_control; StaticBox* m_ams_control_box; wxStaticBitmap *m_ams_extruder_img; @@ -471,6 +473,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(); } @@ -523,8 +529,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 show_ams_group(bool show = true); + void show_filament_load_group(bool show = true); MediaPlayCtrl* get_media_play_ctrl() {return m_media_play_ctrl;}; }; @@ -616,8 +624,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); @@ -683,7 +689,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/AMSItem.hpp b/src/slic3r/GUI/Widgets/AMSItem.hpp index ac926b0aa1..0629d93bf7 100644 --- a/src/slic3r/GUI/Widgets/AMSItem.hpp +++ b/src/slic3r/GUI/Widgets/AMSItem.hpp @@ -106,8 +106,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, diff --git a/src/slic3r/GUI/Widgets/FilamentLoad.cpp b/src/slic3r/GUI/Widgets/FilamentLoad.cpp new file mode 100644 index 0000000000..6aff47be7b --- /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 0000000000..93f578b7f3 --- /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 73a3e80dd3..e937544f78 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 63df3625ee..303eee0305 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_