From 49fdaf2f5d31b1b6ef629b7d4e0c35dd6bdbf66e Mon Sep 17 00:00:00 2001 From: tao wang Date: Sat, 26 Oct 2024 14:30:18 +0800 Subject: [PATCH] NEW:support new nozzle and extder data jira:[new nozzle data] Change-Id: Ief37b42794ce1469163fcd8227431ec77957508e (cherry picked from commit db8ae4ccb3069347e1303de104302357bc352754) --- .../GUI/CalibrationWizardPresetPage.cpp | 2 +- src/slic3r/GUI/DeviceManager.cpp | 31 ++++++- src/slic3r/GUI/DeviceManager.hpp | 16 ++++ src/slic3r/GUI/PrintOptionsDialog.cpp | 23 +++++- src/slic3r/GUI/PrintOptionsDialog.hpp | 7 ++ src/slic3r/GUI/SelectMachine.cpp | 80 +++++++++++++------ src/slic3r/GUI/SelectMachine.hpp | 1 + 7 files changed, 132 insertions(+), 28 deletions(-) diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp index b4c856efa5..4eecd05fc2 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp @@ -1789,7 +1789,7 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj) if (obj->is_multi_extruders()) { for (int i = 0; i < m_comboBox_nozzle_volume_types.size(); ++i) { m_comboBox_nozzle_volume_types[i]->Show(); - m_comboBox_nozzle_volume_types[i]->SetSelection(0); + m_comboBox_nozzle_volume_types[i]->SetSelection(obj->m_extder_data.extders[i].current_nozzle_flow_type); } if (!obj->is_main_extruder_on_left() && m_main_extruder_on_left) { diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 51c52ad5ea..f6f1bcf375 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -2063,6 +2063,19 @@ int MachineObject::command_set_printer_nozzle(std::string nozzle_type, float dia return this->publish_json(j.dump()); } +int MachineObject::command_set_printer_nozzle2(int id, std::string nozzle_type, float diameter, int flow) +{ + nozzle_setting_hold_count = HOLD_COUNT_MAX * 2; + BOOST_LOG_TRIVIAL(info) << "command_set_printer_nozzle2, nozzle_type = " << nozzle_type << " diameter = " << diameter; + json j; + j["print"]["command"] = "set_nozzle"; + j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["print"]["id"] = id; + j["print"]["type"] = "type"; + j["print"]["diameter"] = diameter; + return this->publish_json(j.dump()); +} + int MachineObject::command_set_work_light(LIGHT_EFFECT effect, int on_time, int off_time, int loops, int interval) { @@ -5708,6 +5721,19 @@ void MachineObject::parse_new_info(json print) nozzle_obj.id = njon["id"].get(); if (type.length() >= 4) { + if (type.substr(0, 1) == std::string("H")) { + nozzle_obj.tool_type = NozzleToolType::H_TOOL; + } + else if (type.substr(0, 1) == std::string("C")) { + nozzle_obj.tool_type = NozzleToolType::C_TOOL; + } + + if (type.substr(1, 1) == std::string("S")) { + nozzle_obj.nozzle_flow = NozzleFlowType::S_FLOW; + } else if (type.substr(1, 1) == std::string("H")) { + nozzle_obj.nozzle_flow = NozzleFlowType::H_FLOW; + } + if (type.substr(2, 2) == std::string("00")) { nozzle_obj.nozzle_type = NozzleType::ntStainlessSteel; } else if (type.substr(2, 2) == std::string("01")) { @@ -5785,11 +5811,13 @@ void MachineObject::parse_new_info(json print) if (extder_obj.nozzle_id == 0xff) { extder_obj.current_nozzle_type = NozzleType::ntUndefine; extder_obj.current_nozzle_diameter = 0.4f; + extder_obj.current_nozzle_flow_type = NozzleFlowType::NONE_FLOWTYPE; } else { for (auto i = 0; i < m_nozzle_data.nozzles.size(); i++) { if (m_nozzle_data.nozzles[i].id == extder_obj.nozzle_id) { extder_obj.current_nozzle_type = m_nozzle_data.nozzles[i].nozzle_type; extder_obj.current_nozzle_diameter = m_nozzle_data.nozzles[i].diameter; + extder_obj.current_nozzle_flow_type = m_nozzle_data.nozzles[i].nozzle_flow; } } } @@ -5828,7 +5856,8 @@ bool MachineObject::is_nozzle_data_invalid() for (const auto &ext : m_extder_data.extders) { if (ext.current_nozzle_type == NozzleType::ntUndefine || - ext.current_nozzle_diameter <= 0.0f) { + ext.current_nozzle_diameter <= 0.0f || + ext.current_nozzle_flow_type == NozzleFlowType::NONE_FLOWTYPE) { return true; } } diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 246de84e59..ae4805a027 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -146,6 +146,17 @@ enum AirDuctType { AIR_DOOR_TYPE }; +enum NozzleFlowType{ + NONE_FLOWTYPE, + S_FLOW, + H_FLOW +}; + +enum NozzleToolType { + NONE_TOOLTYPE, + H_TOOL, + C_TOOL +}; struct AmsSlot { @@ -156,6 +167,8 @@ struct AmsSlot struct Nozzle { int id; + NozzleToolType tool_type; // H nozzle or Cut + NozzleFlowType nozzle_flow; // 0-common 1-high flow NozzleType nozzle_type; // 0-stainless_steel 1-hardened_steel float diameter = {0.4f}; // 0-0.2mm 1-0.4mm 2-0.6 mm3-0.8mm int max_temp = 0; @@ -174,6 +187,7 @@ struct Extder { int id; // 0-right 1-left + int enable_change_nozzle{0}; int ext_has_filament{0}; int buffer_has_filament{0}; int nozzle_exist{0}; @@ -196,6 +210,7 @@ struct Extder //current nozzle NozzleType current_nozzle_type{NozzleType::ntUndefine}; // 0-hardened_steel 1-stainless_steel float current_nozzle_diameter = {0.4f}; // 0-0.2mm 1-0.4mm 2-0.6 mm3-0.8mm + NozzleFlowType current_nozzle_flow_type{NozzleFlowType::NONE_FLOWTYPE};//0-common 1-high flow }; struct ExtderData @@ -1010,6 +1025,7 @@ public: int command_pushing(std::string cmd); int command_clean_print_error(std::string task_id, int print_error); int command_set_printer_nozzle(std::string nozzle_type, float diameter); + int command_set_printer_nozzle2(int id, std::string nozzle_type, float diameter, int flow); int command_get_access_code(); diff --git a/src/slic3r/GUI/PrintOptionsDialog.cpp b/src/slic3r/GUI/PrintOptionsDialog.cpp index 5a66338803..1a3a9dc8f4 100644 --- a/src/slic3r/GUI/PrintOptionsDialog.cpp +++ b/src/slic3r/GUI/PrintOptionsDialog.cpp @@ -483,7 +483,13 @@ PrinterPartsDialog::PrinterPartsDialog(wxWindow* parent) nozzle_type->Wrap(-1); ID_NOZZLE_TYPE_CHECKBOX_SINGLE = wxNewId(); + ID_NOZZLE_TYPE_CHECKBOX_LEFT = wxNewId(); + ID_NOZZLE_TYPE_CHECKBOX_RIGHT = wxNewId(); ID_NOZZLE_DIAMETER_CHECKBOX_SINGLE = wxNewId(); + ID_NOZZLE_DIAMETER_CHECKBOX_LEFT = wxNewId(); + ID_NOZZLE_DIAMETER_CHECKBOX_RIGHT = wxNewId(); + ID_NOZZLE_FLOW_CHECKBOX_LEFT = wxNewId(); + ID_NOZZLE_FLOW_CHECKBOX_RIGHT = wxNewId(); nozzle_type_checkbox = new ComboBox(single_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(140), -1), 0, NULL, wxCB_READONLY); nozzle_type_checkbox->Append(nozzle_type_map[NozzleType::ntHardenedSteel]); @@ -578,7 +584,7 @@ PrinterPartsDialog::PrinterPartsDialog(wxWindow* parent) multiple_right_nozzle_type->SetMaxSize(wxSize(FromDIP(80), -1)); multiple_right_nozzle_type->SetForegroundColour(STATIC_TEXT_CAPTION_COL); - multiple_right_nozzle_type_checkbox = new ComboBox(multiple_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(140), -1), 0, NULL, wxCB_READONLY); + multiple_right_nozzle_type_checkbox = new ComboBox(multiple_panel, ID_NOZZLE_TYPE_CHECKBOX_RIGHT, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(140), -1), 0, NULL, wxCB_READONLY); multiple_right_nozzle_type_checkbox->Append(_L("Stainless Steel")); multiple_right_nozzle_type_checkbox->Append(_L("Hardened Steel")); multiple_right_nozzle_type_checkbox->SetSelection(0); @@ -634,9 +640,24 @@ PrinterPartsDialog::PrinterPartsDialog(wxWindow* parent) nozzle_type_checkbox->Connect(wxEVT_COMBOBOX, wxCommandEventHandler(PrinterPartsDialog::set_nozzle_data), NULL, this); nozzle_diameter_checkbox->Connect(wxEVT_COMBOBOX, wxCommandEventHandler(PrinterPartsDialog::set_nozzle_data), NULL, this); + multiple_left_nozzle_type_checkbox->Connect(wxEVT_COMBOBOX, wxCommandEventHandler(PrinterPartsDialog::set_nozzle_data), NULL, this); + multiple_left_nozzle_diameter_checkbox->Connect(wxEVT_COMBOBOX, wxCommandEventHandler(PrinterPartsDialog::set_nozzle_data), NULL, this); + multiple_left_nozzle_flow_checkbox->Connect(wxEVT_COMBOBOX, wxCommandEventHandler(PrinterPartsDialog::set_nozzle_data), NULL, this); + + multiple_right_nozzle_type_checkbox->Connect(wxEVT_COMBOBOX, wxCommandEventHandler(PrinterPartsDialog::set_nozzle_data), NULL, this); + multiple_right_nozzle_diameter_checkbox->Connect(wxEVT_COMBOBOX, wxCommandEventHandler(PrinterPartsDialog::set_nozzle_data), NULL, this); + multiple_right_nozzle_flow_checkbox->Connect(wxEVT_COMBOBOX, wxCommandEventHandler(PrinterPartsDialog::set_nozzle_data), NULL, this); + nozzle_type_checkbox->SetId(ID_NOZZLE_TYPE_CHECKBOX_SINGLE); + multiple_left_nozzle_type_checkbox->SetId(ID_NOZZLE_TYPE_CHECKBOX_LEFT); + multiple_right_nozzle_type_checkbox->SetId(ID_NOZZLE_TYPE_CHECKBOX_RIGHT); nozzle_diameter_checkbox->SetId(ID_NOZZLE_DIAMETER_CHECKBOX_SINGLE); + multiple_left_nozzle_diameter_checkbox->SetId(ID_NOZZLE_DIAMETER_CHECKBOX_LEFT); + multiple_right_nozzle_diameter_checkbox->SetId(ID_NOZZLE_DIAMETER_CHECKBOX_RIGHT); + + multiple_left_nozzle_flow_checkbox->SetId(ID_NOZZLE_FLOW_CHECKBOX_LEFT); + multiple_right_nozzle_flow_checkbox->SetId(ID_NOZZLE_FLOW_CHECKBOX_RIGHT); } PrinterPartsDialog::~PrinterPartsDialog() diff --git a/src/slic3r/GUI/PrintOptionsDialog.hpp b/src/slic3r/GUI/PrintOptionsDialog.hpp index 694118aed4..af808e6478 100644 --- a/src/slic3r/GUI/PrintOptionsDialog.hpp +++ b/src/slic3r/GUI/PrintOptionsDialog.hpp @@ -22,8 +22,15 @@ class PrinterPartsDialog : public DPIDialog { protected: wxWindowID ID_NOZZLE_TYPE_CHECKBOX_SINGLE; + wxWindowID ID_NOZZLE_TYPE_CHECKBOX_LEFT; + wxWindowID ID_NOZZLE_TYPE_CHECKBOX_RIGHT; wxWindowID ID_NOZZLE_DIAMETER_CHECKBOX_SINGLE; + wxWindowID ID_NOZZLE_DIAMETER_CHECKBOX_LEFT; + wxWindowID ID_NOZZLE_DIAMETER_CHECKBOX_RIGHT; + + wxWindowID ID_NOZZLE_FLOW_CHECKBOX_LEFT; + wxWindowID ID_NOZZLE_FLOW_CHECKBOX_RIGHT; MachineObject* obj{ nullptr }; diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 78edd405f0..5aa2b8e743 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -1316,7 +1316,7 @@ bool SelectMachineDialog::can_hybrid_mapping(ExtderData data) { for (auto it = data.extders.rbegin(); it != data.extders.rend(); it++){ //exist field is not updated, wait add //if (it->exist < 3) return false; - std::string type_str = /*it->flow_type ? "Big Traffic" :*/ "Normal"; + std::string type_str = it->current_nozzle_flow_type ? "Big Traffic" : "Normal"; flow_type_of_machine.push_back(type_str); } //get the nozzle type of preset --> flow_types @@ -1362,24 +1362,49 @@ bool SelectMachineDialog::is_nozzle_type_match(ExtderData data) { if (data.total_extder_count <= 1 || data.extders.size() <= 1 || !wxGetApp().preset_bundle) return false; - //The default two extruders are left, right, but the order of the extruders on the machine is right, left. - std::vectorflow_type_of_machine; - for (auto it = data.extders.begin(); it != data.extders.end(); it++) { - std::string str_flow = /*it->flow_type ? "Big Traffic" :*/ "Normal"; - flow_type_of_machine.push_back(str_flow); + //check nozzle used + auto used_filaments = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_used_extruders(); // 1 based + auto filament_maps = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_filament_maps(); // 1 based + std::map used_extruders_flow; + std::vector used_extruders; // 0 based + for (auto f : used_filaments) { + int filament_extruder = filament_maps[f - 1] - 1; + if (std::find(used_extruders.begin(), used_extruders.end(), filament_extruder) == used_extruders.end()) used_extruders.emplace_back(filament_extruder); } - //get the nozzle type of preset --> flow_types - const Preset& current_printer = wxGetApp().preset_bundle->printers.get_selected_preset(); - const Preset* base_printer = wxGetApp().preset_bundle->printers.get_preset_base(current_printer); - auto flow_data = wxGetApp().app_config->get_nozzle_volume_types_from_config(base_printer->name); - std::vector flow_types; - boost::split(flow_types, flow_data, boost::is_any_of(",")); - if (flow_types.size() <= 1 || flow_types.size() != flow_type_of_machine.size()) return false; + std::sort(used_extruders.begin(), used_extruders.end()); + + auto nozzle_volume_type_opt = dynamic_cast(wxGetApp().preset_bundle->project_config.option("nozzle_volume_type")); + for (auto i = 0; i < used_extruders.size(); i++) { + if (nozzle_volume_type_opt) { + NozzleVolumeType nozzle_volume_type = (NozzleVolumeType) (nozzle_volume_type_opt->get_at(used_extruders[i])); + if (nozzle_volume_type == NozzleVolumeType::nvtNormal) { used_extruders_flow[used_extruders[i]] = "Normal";} + else {used_extruders_flow[used_extruders[i]] = "Big Traffic";} + } + } + + vector map_extruders = {1, 0}; + + + // The default two extruders are left, right, but the order of the extruders on the machine is right, left. + std::vector flow_type_of_machine; + for (auto it = data.extders.begin(); it != data.extders.end(); it++) { + if (it->current_nozzle_flow_type == NozzleFlowType::H_FLOW) { + flow_type_of_machine.push_back("Big Traffic"); + } else if (it->current_nozzle_flow_type == NozzleFlowType::S_FLOW){ + flow_type_of_machine.push_back("Normal"); + } + } //Only when all preset nozzle types and machine nozzle types are exactly the same, return true. - for (int i = 0; i < flow_types.size(); i++) { - if (flow_types[i] != flow_type_of_machine[i]) return false; + for (std::map::iterator it = used_extruders_flow.begin(); it!= used_extruders_flow.end(); it++) { + int target_machine_nozzle_id = map_extruders[it->first]; + + if (target_machine_nozzle_id <= flow_type_of_machine.size()) { + if (flow_type_of_machine[target_machine_nozzle_id] != used_extruders_flow[it->first]) { + return false; + } + } } return true; } @@ -1579,6 +1604,11 @@ void SelectMachineDialog::show_status(PrintDialogStatus status, std::vector("nozzle_diameter")->values.size(); //the nozzle type of preset and machine are different - if (nozzle_nums > 1 && !is_nozzle_type_match(obj_->m_extder_data)) { - show_status(PrintDialogStatus::PrintStatusNozzleMatchInvalid); - return; + if (nozzle_nums > 1) { + if (!obj_->is_nozzle_data_invalid()) { + show_status(PrintDialogStatus::PrintStatusNozzleDataInvalid); + return; + } + + if (!is_nozzle_type_match(obj_->m_extder_data)) { + show_status(PrintDialogStatus::PrintStatusNozzleMatchInvalid); + return; + } } if (!m_mapping_popup.m_supporting_mix_print && nozzle_nums == 1) @@ -3606,13 +3643,6 @@ void SelectMachineDialog::reset_and_sync_ams_list() } } - /*if (extruders.size() <= 10) { - m_sizer_ams_mapping->SetCols(extruders.size()); - } - else { - m_sizer_ams_mapping->SetCols(10); - }*/ - if (use_double_extruder) { m_filament_left_panel->Show(); diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index 5cb47b0fac..509c24cdf2 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -75,6 +75,7 @@ enum PrintDialogStatus { PrintStatusAmsMappingU0Invalid, PrintStatusAmsMappingMixInvalid, PrintStatusNozzleMatchInvalid, + PrintStatusNozzleDataInvalid, PrintStatusAmsMappingValid, PrintStatusAmsMappingByOrder, PrintStatusRefreshingMachineList,