From 1d1b247a6295cef3bf4ab5e26e446eabfd39c207 Mon Sep 17 00:00:00 2001 From: tao wang Date: Tue, 31 Dec 2024 19:33:04 +0800 Subject: [PATCH] NEW:display the count of ext filamend load jira:[STUDIO-9243] Change-Id: Idc1ad4b47fe1eb313439eab287a6e4b622247558 --- resources/images/warning.svg | 3 + src/slic3r/GUI/SelectMachine.cpp | 164 +++++++++++++++++++++---------- src/slic3r/GUI/SelectMachine.hpp | 7 +- 3 files changed, 122 insertions(+), 52 deletions(-) create mode 100644 resources/images/warning.svg diff --git a/resources/images/warning.svg b/resources/images/warning.svg new file mode 100644 index 000000000..2cc3422fd --- /dev/null +++ b/resources/images/warning.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 3afe482f3..6626eca8e 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -451,37 +451,6 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) sizer_split_filament->Add(m_split_line_filament, 1, wxALIGN_CENTER_VERTICAL, 0); sizer_split_filament->Add(m_sizer_autorefill, 0, wxALIGN_CENTER, 0); - //wxBoxSizer* m_sizer_ams_mapping_tips = new wxBoxSizer(wxHORIZONTAL); - - - - /* ams_mapping_help_icon = new ScalableBitmap(this, "enable_ams", 16); - img_amsmapping_tip = new wxStaticBitmap(this, wxID_ANY, ams_mapping_help_icon->bmp(), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0); - m_sizer_ams_mapping_tips->Add(img_amsmapping_tip, 0, wxALIGN_CENTER | wxLEFT, FromDIP(5)); - - img_amsmapping_tip->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { - wxPoint img_pos = img_amsmapping_tip->ClientToScreen(wxPoint(0, 0)); - wxPoint popup_pos(img_pos.x, img_pos.y + img_amsmapping_tip->GetRect().height); - m_mapping_tutorial_popup.Position(popup_pos, wxSize(0, 0)); - m_mapping_tutorial_popup.Popup(); - - if (m_mapping_tutorial_popup.ClientToScreen(wxPoint(0, 0)).y < img_pos.y) { - m_mapping_tutorial_popup.Dismiss(); - popup_pos = wxPoint(img_pos.x, img_pos.y - m_mapping_tutorial_popup.GetRect().height); - m_mapping_tutorial_popup.Position(popup_pos, wxSize(0, 0)); - m_mapping_tutorial_popup.Popup(); - } - }); - - img_amsmapping_tip->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) { - m_mapping_tutorial_popup.Dismiss(); - }); - - - - - m_sizer_filament->Add(m_sizer_ams_mapping_tips, 0, wxALIGN_CENTER|wxLEFT, FromDIP(8));*/ - /*filament area*/ /*1 extruder*/ m_filament_panel = new StaticBox(this); @@ -556,9 +525,6 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_sizer_filament_2extruder->Add(m_filament_right_panel, 0, wxEXPAND, 0); m_sizer_filament_2extruder->Layout(); - - //m_filament_left_panel->Hide(); - //m_filament_right_panel->Hide(); m_filament_panel->Hide(); m_statictext_ams_msg = new Label(this, wxEmptyString); @@ -567,6 +533,44 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_statictext_ams_msg->SetFont(::Label::Body_13); m_statictext_ams_msg->Hide(); + /*ams mapping suggestions*/ + m_link_edit_nozzle = new Label(this, wxEmptyString); + m_link_edit_nozzle->SetFont(::Label::Body_13); + m_link_edit_nozzle->SetForegroundColour(0x00ae42); + m_link_edit_nozzle->SetBackgroundColour(*wxWHITE); + m_link_edit_nozzle->Bind(wxEVT_ENTER_WINDOW, [this](auto &e) { SetCursor(wxCURSOR_HAND); }); + m_link_edit_nozzle->Bind(wxEVT_LEAVE_WINDOW, [this](auto &e) { SetCursor(wxCURSOR_ARROW); }); + m_link_edit_nozzle->SetLabel(_L("Rearrange filaments of the left and right nozzles ->")); + + m_link_edit_nozzle->Bind(wxEVT_LEFT_DOWN, [this](auto &e) { + EndModal(wxID_CLOSE); + Plater * plater = wxGetApp().plater(); + wxCommandEvent evt(EVT_OPEN_FILAMENT_MAP_SETTINGS_DIALOG); + evt.SetEventObject(plater); + evt.SetInt(1); // 1 means from gcode viewer + wxPostEvent(plater, evt); + }); + + m_mapping_sugs_sizer = new wxBoxSizer(wxHORIZONTAL); + auto m_img_mapping_sugs = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap("warning", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16))); + auto m_txt_mapping_sugs = new Label(this, wxEmptyString); + m_txt_mapping_sugs->SetFont(::Label::Body_13); + m_txt_mapping_sugs->SetForegroundColour(wxColour(0xFF, 0x6F, 0x00)); + m_txt_mapping_sugs->SetBackgroundColour(*wxWHITE); + m_txt_mapping_sugs->SetLabel(_L("Your material arrangement method is not optimal.")); + m_mapping_sugs_sizer->Add(m_img_mapping_sugs, 0, wxALIGN_CENTER, 0); + m_mapping_sugs_sizer->Add(m_txt_mapping_sugs, 0, wxALIGN_CENTER, 0); + + m_change_filament_times_sizer = new wxBoxSizer(wxHORIZONTAL); + auto m_img_change_filament_times = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap("warning", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16))); + m_txt_change_filament_times = new Label(this, wxEmptyString); + m_txt_change_filament_times->SetFont(::Label::Body_13); + m_txt_change_filament_times->SetForegroundColour(wxColour(0xFF, 0x6F, 0x00)); + m_txt_change_filament_times->SetBackgroundColour(*wxWHITE); + m_txt_change_filament_times->SetLabel(wxEmptyString); + m_change_filament_times_sizer->Add(m_img_change_filament_times, 0, wxALIGN_CENTER, 0); + m_change_filament_times_sizer->Add(m_txt_change_filament_times, 0, wxALIGN_CENTER, 0); + /*Advanced Options*/ wxBoxSizer* sizer_split_options = new wxBoxSizer(wxHORIZONTAL); auto m_split_options_line = new wxPanel(this, wxID_ANY); @@ -825,6 +829,9 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_sizer_main->Add(m_sizer_filament_2extruder, 0, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15)); m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(6)); m_sizer_main->Add(m_statictext_ams_msg, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(15)); + m_sizer_main->Add(m_link_edit_nozzle, 0, wxLEFT|wxRIGHT, FromDIP(15)); + m_sizer_main->Add(m_mapping_sugs_sizer, 0, wxLEFT|wxRIGHT, FromDIP(15)); + m_sizer_main->Add(m_change_filament_times_sizer, 0, wxLEFT|wxRIGHT, FromDIP(15)); m_sizer_main->Add(sizer_split_options, 1, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15)); m_sizer_main->Add(sizer_advanced_options_title, 1, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15)); m_sizer_main->Add(m_sizer_options_timelapse, 0, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15)); @@ -1274,7 +1281,7 @@ bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_) } } sync_ams_mapping_result(m_ams_mapping_result); - return is_valid; + return is_valid; } return true; @@ -2639,6 +2646,8 @@ void SelectMachineDialog::on_set_finish_mapping(wxCommandEvent &evt) iter++; } } + + update_filament_change_count(); } void SelectMachineDialog::on_print_job_cancel(wxCommandEvent &evt) @@ -2990,6 +2999,11 @@ void SelectMachineDialog::on_selection_changed(wxCommandEvent &event) m_ams_mapping_valid = false; m_ams_mapping_result.clear(); + m_link_edit_nozzle->Show(false); + m_mapping_sugs_sizer->Show(false); + m_change_filament_times_sizer->Show(false); + m_txt_change_filament_times->Show(false); + auto selection = m_comboBox_printer->GetSelection(); DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev) return; @@ -3046,6 +3060,18 @@ void SelectMachineDialog::on_selection_changed(wxCommandEvent &event) // Has changed machine unrecoverably GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj); m_check_flag = false; + + /*check nozzle & filament is it the best*/ + if (obj->m_extder_data.total_extder_count > 1) { + auto stats = m_plater->get_partplate_list().get_current_fff_print().statistics_by_extruder(); + auto best = stats.stats_by_multi_extruder_best; + auto curr = stats.stats_by_multi_extruder_curr; + + if (curr.filament_flush_weight >= best.filament_flush_weight) { + m_link_edit_nozzle->Show(true); + m_mapping_sugs_sizer->Show(true); + } + } } else { BOOST_LOG_TRIVIAL(error) << "on_selection_changed dev_id not found"; return; @@ -3089,6 +3115,41 @@ void SelectMachineDialog::update_ams_check(MachineObject *obj) } } + +void SelectMachineDialog::update_filament_change_count() +{ + /*check filament change times*/ + PartPlate * part_plate = m_plater->get_partplate_list().get_curr_plate(); + PrintBase * print = nullptr; + GCodeResult *gcode_result = nullptr; + + + part_plate->get_print(&print, &gcode_result, NULL); + if (gcode_result && gcode_result->filament_change_count_map.size() > 0 && m_ams_mapping_result.size() > 0) { + + std::vector filament_ids; + for (auto mr : m_ams_mapping_result) { + if (mr.ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || mr.ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { filament_ids.push_back(mr.id); } + } + + int hand_changes_count = 0; + for (auto fi : filament_ids) { + for (auto counts : gcode_result->filament_change_count_map) { + if (counts.first.first == fi || counts.first.second == fi) { hand_changes_count += counts.second; } + } + } + + if (hand_changes_count > 0) { + m_change_filament_times_sizer->Show(true); + m_txt_change_filament_times->Show(true); + m_txt_change_filament_times->SetLabel(wxString::Format(_L("You picked both external and AMS filament, You will need to manually change filament %d times."), hand_changes_count)); + } + } + + Layout(); + Fit(); +} + void SelectMachineDialog::update_show_status() { // refreshing return @@ -3172,6 +3233,7 @@ void SelectMachineDialog::update_show_status() if (m_ams_mapping_result.empty()) { if (m_checkbox_list["use_ams"]->getValue() == "on") { do_ams_mapping(obj_); + update_filament_change_count(); } else { clean_ams_mapping = true; } @@ -3254,11 +3316,9 @@ void SelectMachineDialog::update_show_status() return; } - - // do ams mapping if no ams result - if (m_ams_mapping_result.empty()) { - do_ams_mapping(obj_); - } + //if (m_ams_mapping_result.empty()) { + // do_ams_mapping(obj_); + //} const auto& full_config = wxGetApp().preset_bundle->full_config(); size_t nozzle_nums = full_config.option("nozzle_diameter")->values.size(); @@ -3565,6 +3625,9 @@ void SelectMachineDialog::set_default() m_print_info = ""; m_comboBox_printer->SetValue(wxEmptyString); m_comboBox_printer->Enable(); + m_mapping_sugs_sizer->Show(false); + m_change_filament_times_sizer->Show(false); + m_txt_change_filament_times->Show(false); // rset status bar m_status_bar->reset(); @@ -4045,9 +4108,9 @@ void SelectMachineDialog::set_default_normal(const ThumbnailData &data) for (unsigned int r = 0; r < data.height; ++r) { unsigned int rr = (data.height - 1 - r) * data.width; for (unsigned int c = 0; c < data.width; ++c) { - unsigned char* px = (unsigned char*)data.pixels.data() + 4 * (rr + c); - image.SetRGB((int)c, (int)r, px[0], px[1], px[2]); - image.SetAlpha((int)c, (int)r, px[3]); + unsigned char *px = (unsigned char *) data.pixels.data() + 4 * (rr + c); + image.SetRGB((int) c, (int) r, px[0], px[1], px[2]); + image.SetAlpha((int) c, (int) r, px[3]); } } image = image.Rescale(FromDIP(198), FromDIP(198)); @@ -4057,12 +4120,12 @@ void SelectMachineDialog::set_default_normal(const ThumbnailData &data) m_basic_panel->Layout(); m_basic_panel->Fit(); - //disable pei bed - DeviceManager* dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager(); + // disable pei bed + DeviceManager *dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev_manager) return; - MachineObject* obj_ = dev_manager->get_selected_machine(); - wxSize screenSize = wxGetDisplaySize(); - auto dialogSize = this->GetSize(); + MachineObject *obj_ = dev_manager->get_selected_machine(); + wxSize screenSize = wxGetDisplaySize(); + auto dialogSize = this->GetSize(); #ifdef __WINDOWS__ @@ -4070,7 +4133,7 @@ void SelectMachineDialog::set_default_normal(const ThumbnailData &data) // basic info auto aprint_stats = m_plater->get_partplate_list().get_current_fff_print().print_statistics(); wxString time; - PartPlate* plate = m_plater->get_partplate_list().get_curr_plate(); + PartPlate *plate = m_plater->get_partplate_list().get_curr_plate(); if (plate) { if (plate->get_slice_result()) { time = wxString::Format("%s", short_time(get_time_dhms(plate->get_slice_result()->print_statistics.modes[0].time))); } } @@ -4078,8 +4141,7 @@ void SelectMachineDialog::set_default_normal(const ThumbnailData &data) char weight[64]; if (wxGetApp().app_config->get("use_inches") == "1") { ::sprintf(weight, " %.2f oz", aprint_stats.total_weight * 0.035274); - } - else { + } else { ::sprintf(weight, " %.2f g", aprint_stats.total_weight); } diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index 7c1671b45..3529b70dd 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -320,6 +320,8 @@ protected: wxBoxSizer* rename_sizer_v{ nullptr }; wxBoxSizer* rename_sizer_h{ nullptr }; wxBoxSizer* m_sizer_autorefill{ nullptr }; + wxBoxSizer* m_mapping_sugs_sizer{ nullptr }; + wxBoxSizer* m_change_filament_times_sizer{ nullptr }; ScalableButton* m_button_refresh{ nullptr }; Button* m_button_ensure{ nullptr }; wxStaticBitmap * m_rename_button{nullptr}; @@ -336,6 +338,7 @@ protected: wxPanel* m_panel_prepare{nullptr}; wxPanel* m_panel_finish{nullptr}; wxPanel* m_line_top{ nullptr }; + Label* m_link_edit_nozzle{ nullptr }; Label* m_st_txt_error_code{nullptr}; Label* m_st_txt_error_desc{nullptr}; Label* m_st_txt_extra_info{nullptr}; @@ -348,6 +351,7 @@ protected: Label* m_stext_time{ nullptr }; Label* m_stext_weight{ nullptr }; Label* m_statictext_ams_msg{ nullptr }; + Label* m_txt_change_filament_times{ nullptr }; Label* m_text_printer_msg{ nullptr }; wxStaticText* m_staticText_bed_title{ nullptr }; wxStaticText* m_stext_sending{ nullptr }; @@ -409,7 +413,8 @@ public: void reset_ams_material(); void update_show_status(); void update_ams_check(MachineObject* obj); - void on_rename_click(wxMouseEvent& event); + void update_filament_change_count(); + void on_rename_click(wxMouseEvent &event); void on_rename_enter(); void update_printer_combobox(wxCommandEvent& event); void on_cancel(wxCloseEvent& event);