From 50daf0b5ca05ef394a7c149b151115eb326c1779 Mon Sep 17 00:00:00 2001 From: "zhimin.zeng" Date: Tue, 24 Dec 2024 20:10:09 +0800 Subject: [PATCH] ENH: add nozzle initialization check jira: none Change-Id: I9378295113c78c1775fa396d592501758d888182 (cherry picked from commit 9c1d6b206722523d79cf07bec25d7866844e4eae) --- src/slic3r/GUI/Plater.cpp | 56 ++++++++++++++++++++++++++------- src/slic3r/GUI/Plater.hpp | 4 ++- src/slic3r/Utils/CalibUtils.cpp | 5 ++- 3 files changed, 52 insertions(+), 13 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index b568216738..5ca129f973 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -467,7 +467,7 @@ struct Sidebar::priv void jump_to_object(ObjectDataViewModelNode* item); void can_search(); - void sync_extruder_list(); + bool sync_extruder_list(); void update_sync_status(const MachineObject* obj); #ifdef _WIN32 @@ -1083,7 +1083,7 @@ void ExtruderGroup::update_ams() GUI::wxGetApp().plater()->update_machine_sync_status(); } -void Sidebar::priv::sync_extruder_list() +bool Sidebar::priv::sync_extruder_list() { auto printer_tab = dynamic_cast(wxGetApp().get_tab(Preset::TYPE_PRINTER)); printer_tab->set_extruder_volume_type(0, NozzleVolumeType::nvtHighFlow); @@ -1092,14 +1092,17 @@ void Sidebar::priv::sync_extruder_list() if (obj == nullptr || !obj->is_info_ready()) { MessageDialog dlg(this->plater, _L("Please select a printer in 'Device' page first."), _L("Sync extruder infomation"), wxOK); dlg.ShowModal(); - return; + return false; } if (obj->m_extder_data.extders.size() != 2) { MessageDialog dlg(this->plater, _L("The currently connected printer does not have two extruders."), _L("Sync extruder infomation"), wxOK | wxICON_WARNING); dlg.ShowModal(); - return; + return false; } + if (!check_printer_initialized(obj)) + return false; + std::string machine_print_name = obj->printer_type; PresetBundle *preset_bundle = wxGetApp().preset_bundle; std::string target_model_id = preset_bundle->printers.get_selected_preset().get_printer_type(preset_bundle); @@ -1108,11 +1111,11 @@ void Sidebar::priv::sync_extruder_list() MessageDialog dlg(this->plater, _L("The currently selected machine preset is inconsistent with the connected printer type.\n" "Are you sure to continue syncing?"), _L("Sync extruder infomation"), wxICON_WARNING | wxYES | wxNO); if (dlg.ShowModal() == wxID_NO) { - return; + return false; } if (!this->plater) - return; + return false; this->plater->update_objects_position_when_select_preset([&obj, machine_preset]() { Tab *printer_tab = GUI::wxGetApp().get_tab(Preset::Type::TYPE_PRINTER); @@ -1142,6 +1145,7 @@ void Sidebar::priv::sync_extruder_list() AMSCountPopupWindow::SetAMSCount(main_index, main_4, main_1); AMSCountPopupWindow::UpdateAMSCount(0, left_extruder); AMSCountPopupWindow::UpdateAMSCount(1, right_extruder); + return true; } void Sidebar::priv::update_sync_status(const MachineObject *obj) @@ -2517,9 +2521,9 @@ std::map Sidebar::build_filament_ams_list(MachineObject return filament_ams_list; } -void Sidebar::sync_extruder_list() +bool Sidebar::sync_extruder_list() { - p->sync_extruder_list(); + return p->sync_extruder_list(); } void Sidebar::update_sync_status(const MachineObject *obj) @@ -8971,9 +8975,10 @@ bool Plater::priv::check_ams_status_impl() } dlg(q); dlg.Fit(); if (dlg.ShowModal() == wxID_YES) { - GUI::wxGetApp().sidebar().sync_extruder_list(); - wxPostEvent(q, SimpleEvent(EVT_GLTOOLBAR_SLICE_PLATE)); - wxGetApp().mainframe->m_tabpanel->SetSelection(MainFrame::TabPosition::tpPreview); + if (GUI::wxGetApp().sidebar().sync_extruder_list()) { + wxPostEvent(q, SimpleEvent(EVT_GLTOOLBAR_SLICE_PLATE)); + wxGetApp().mainframe->m_tabpanel->SetSelection(MainFrame::TabPosition::tpPreview); + } return false; } } @@ -12836,6 +12841,35 @@ Preset *get_printer_preset(MachineObject *obj) return printer_preset; } +bool check_printer_initialized(MachineObject *obj) +{ + if (!obj) + return false; + + bool has_been_initialized = true; + for (const Extder& extruder : obj->m_extder_data.extders) { + if (extruder.current_nozzle_flow_type == NozzleFlowType::NONE_FLOWTYPE) { + has_been_initialized = false; + break; + } + if (extruder.current_nozzle_type == NozzleType::ntUndefine) { + has_been_initialized = false; + break; + } + } + + if (!has_been_initialized) { + MessageDialog dlg(wxGetApp().plater(), _L("It is detected that the nozzle type is not set. please set the nozzle first and then perform the current operation again."), _L("Warning"), wxOK | wxICON_WARNING); + dlg.ShowModal(); + + PrinterPartsDialog* print_parts_dlg = new PrinterPartsDialog(nullptr); + print_parts_dlg->update_machine_obj(obj); + print_parts_dlg->ShowModal(); + return false; + } + return true; +} + // Following lambda generates a combined mesh for export with normals pointing outwards. TriangleMesh Plater::combine_mesh_fff(const ModelObject& mo, int instance_id, std::function notify_func) { diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 46cdb20e6b..e65de18990 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -166,7 +166,7 @@ public: void load_ams_list(std::string const & device, MachineObject* obj); std::map build_filament_ams_list(MachineObject* obj); void sync_ams_list(); - void sync_extruder_list(); + bool sync_extruder_list(); bool should_sync_extruder_list(MachineObject* obj); void update_sync_status(const MachineObject* obj); // Orca @@ -868,6 +868,8 @@ private: std::vector get_min_flush_volumes(const DynamicPrintConfig &full_config, size_t nozzle_id); Preset *get_printer_preset(MachineObject *obj); + +bool check_printer_initialized(MachineObject* obj); } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/Utils/CalibUtils.cpp b/src/slic3r/Utils/CalibUtils.cpp index 3fe431bce5..7c4e2468db 100644 --- a/src/slic3r/Utils/CalibUtils.cpp +++ b/src/slic3r/Utils/CalibUtils.cpp @@ -173,7 +173,7 @@ static bool is_same_nozzle_type(const DynamicPrintConfig &full_config, const Mac if (abs(filament_nozzle_hrc) > abs(printer_nozzle_hrc)) { BOOST_LOG_TRIVIAL(info) << "filaments hardness mismatch: printer_nozzle_hrc = " << printer_nozzle_hrc << ", filament_nozzle_hrc = " << filament_nozzle_hrc; std::string filament_type = full_config.opt_string("filament_type", 0); - error_msg = wxString::Format(_L("*Printing %s material with %s may cause nozzle damage"), filament_type, to_wstring_name(NozzleTypeEumnToStr[obj->m_extder_data.extders[0].current_nozzle_type])); + error_msg = wxString::Format(_L("Printing %1s material with %2s nozzle may cause nozzle damage."), filament_type, to_wstring_name(NozzleTypeEumnToStr[obj->m_extder_data.extders[0].current_nozzle_type])); error_msg += "\n"; MessageDialog msg_dlg(nullptr, error_msg, wxEmptyString, wxICON_WARNING | wxOK | wxCANCEL); @@ -205,6 +205,9 @@ static bool check_nozzle_diameter_and_type(const DynamicPrintConfig &full_config return false; } + if (!check_printer_initialized(obj)) + return false; + // P1P/S if (obj->m_extder_data.extders[0].current_nozzle_type == NozzleType::ntUndefine) return true;