diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 55fde9a11..f19f54b1c 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -866,7 +866,28 @@ void MachineObject::get_ams_colors(std::vector &ams_colors) { } } -int MachineObject::ams_filament_mapping(std::vector filaments, std::vector &result, bool ext_first, bool ext_second, std::vector exclude_id) +void MachineObject::parse_tray_info(int ams_id, int slot_id, AmsTray tray, FilamentInfo& result) { + result.color = tray.color; + result.type = tray.get_filament_type(); + result.filament_id = tray.setting_id; + result.ctype = tray.ctype; + result.colors = tray.cols; + + /*for new ams mapping*/ + result.ams_id = std::to_string(ams_id); + result.slot_id = std::to_string(slot_id); + + if (ams_id == VIRTUAL_TRAY_MAIN_ID || ams_id == VIRTUAL_TRAY_DEPUTY_ID){ + result.tray_id = atoi(tray.id.c_str()); + result.id = atoi(tray.id.c_str()); + } + else{ + result.id = ams_id * 4 + slot_id; + } + +} + +int MachineObject::ams_filament_mapping(std::vector filaments, std::vector &result, std::vector map_opt, std::vector exclude_id) { if (filaments.empty()) return -1; @@ -875,7 +896,6 @@ int MachineObject::ams_filament_mapping(std::vector filaments, std std::map tray_filaments; for (auto ams = amsList.begin(); ams != amsList.end(); ams++) { - std::string ams_id = ams->second->id; FilamentInfo info; for (auto tray = ams->second->trayList.begin(); tray != ams->second->trayList.end(); tray++) { @@ -888,47 +908,21 @@ int MachineObject::ams_filament_mapping(std::vector filaments, std continue; } // push - if (tray->second->is_tray_info_ready()) { - info.color = tray->second->color; - info.type = tray->second->get_filament_type(); - info.id = tray_index; - info.filament_id = tray->second->setting_id; - info.ctype = tray->second->ctype; - info.colors = tray->second->cols; - - /*for new ams mapping*/ - info.ams_id = ams->first.c_str(); - info.slot_id = tray->first.c_str(); - } + if (tray->second->is_tray_info_ready()) + parse_tray_info(ams_id, tray_id, *(tray->second), info); //first: left,nozzle=1,map=1 second: right,nozzle=0,map=2 - if ((!ext_first && !ext_second) || (ams->second->nozzle == 0 && ext_second) || (ams->second->nozzle == 1 && ext_first)) - { + if ((ams->second->nozzle == 0 && map_opt[MappingOption::USE_RIGHT_AMS]) || (ams->second->nozzle == 1 && map_opt[MappingOption::USE_LEFT_AMS])) tray_filaments.emplace(std::make_pair(tray_index, info)); - } } } - if (ext_first || ext_second) - { - for (auto tray : vt_slot) - { - if ((tray.id == std::to_string(VIRTUAL_TRAY_MAIN_ID) && ext_second) || (tray.id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID) && ext_first)) - { + if (map_opt[MappingOption::USE_RIGHT_EXT] || map_opt[MappingOption::USE_LEFT_EXT]){ + for (auto tray : vt_slot){ + if ((tray.id == std::to_string(VIRTUAL_TRAY_MAIN_ID) && map_opt[MappingOption::USE_RIGHT_EXT]) + || (tray.id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID) && map_opt[MappingOption::USE_LEFT_EXT])){ FilamentInfo info; - info.color = tray.color; - //info.color = "EEEEEEFF"; - info.type = tray.get_filament_type(); - //info.type = "PLA"; //temp change - info.tray_id = atoi(tray.id.c_str()); - info.id = atoi(tray.id.c_str()); - info.filament_id = tray.setting_id; - info.ctype = tray.ctype; - info.colors = tray.cols; - - /*for new ams mapping*/ - info.ams_id = tray.id.c_str(); - info.slot_id = std::to_string(0); + parse_tray_info(atoi(tray.id.c_str()), 0, tray, info); tray_filaments.emplace(std::make_pair(info.tray_id, info)); } } diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 030555686..aea8ea57f 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -435,6 +435,13 @@ public: UpdateToDate }; + enum MappingOption { + USE_LEFT_AMS = 0, + USE_RIGHT_AMS, + USE_LEFT_EXT, + USE_RIGHT_EXT + }; + class ExtrusionRatioInfo { public: @@ -572,7 +579,8 @@ public: bool is_support_amx_ext_mix_mapping(); void get_ams_colors(std::vector& ams_colors); - int ams_filament_mapping(std::vector filaments, std::vector &result, bool ext_first = false, bool ext_second = false, std::vector exclude_id = std::vector()); + void parse_tray_info(int ams_id, int sot_id, AmsTray tray, FilamentInfo& result); + int ams_filament_mapping(std::vector filaments, std::vector &result, std::vector map_opt, std::vector exclude_id = std::vector()); bool is_valid_mapping_result(std::vector& result, bool check_empty_slot = false); // exceed index start with 0 bool is_mapping_exceed_filament(std::vector& result, int &exceed_index); diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 731105ce9..348c9b9e9 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -1955,149 +1955,57 @@ bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_) m_filaments_map = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_filament_maps(); int filament_result = 0; - if (nozzle_nums > 1) - { - //get nozzle property, the nozzles are same?, wait fill - if (!is_two_nozzle_same()) - { - std::vector m_ams_mapping_result_first; - std::vector m_ams_mapping_result_second; - std::vector m_filament_first; - std::vector m_filament_second; - for (auto it = m_filaments.begin(); it != m_filaments.end(); it++) - { - if (it->id < 0 || it->id > m_filaments_map.size()) - { + std::vector map_opt; //four values: use_left_ams, use_right_ams, use_left_ext, use_right_ext + if (nozzle_nums > 1){ + //get nozzle property, the nozzles are same? + if (!can_hybrid_mapping(obj_->m_nozzle_data)){ + std::vector m_ams_mapping_result_left, m_ams_mapping_result_right; + std::vector m_filament_left, m_filament_right; + for (auto it = m_filaments.begin(); it != m_filaments.end(); it++){ + if (it->id < 0 || it->id > m_filaments_map.size()){ BOOST_LOG_TRIVIAL(info) << "error: do_ams_mapping: m_filaments[].it" << it->id; BOOST_LOG_TRIVIAL(info) << "m_filaments_map.size()" << m_filaments_map.size(); return false; } if (m_filaments_map[it->id] == 1) - { - m_filament_first.push_back(*it); - } + m_filament_left.push_back(*it); else if (m_filaments_map[it->id] == 2) - { - m_filament_second.push_back(*it); - } + m_filament_right.push_back(*it); } - std::vector temp_result_first; - std::vector temp_result_second; - int result_first = obj_->ams_filament_mapping(m_filament_first, m_ams_mapping_result_first, true, false); - int result_second = obj_->ams_filament_mapping(m_filament_second, m_ams_mapping_result_second, false, true); + map_opt = {true, false, true, false}; //four values: use_left_ams, use_right_ams, use_left_ext, use_right_ext + int result_first = obj_->ams_filament_mapping(m_filament_left, m_ams_mapping_result_left, map_opt); + map_opt = { false, true, false, true }; + int result_second = obj_->ams_filament_mapping(m_filament_right, m_ams_mapping_result_right, map_opt); - m_ams_mapping_result.clear(); - auto iter_first = m_ams_mapping_result_first.begin(); - auto iter_second = m_ams_mapping_result_second.begin(); - auto it = m_filaments.begin(); - while (it != m_filaments.end() && iter_first != m_ams_mapping_result_first.end() && iter_second != m_ams_mapping_result_second.end()) - { - if (it->id < 0 || it->id >= m_filaments_map.size()) - { - break; - } - if (m_filaments_map[it->id] == 1) - { - m_ams_mapping_result.push_back(*iter_first); - iter_first++; - it++; - } - else - { - m_ams_mapping_result.push_back(*iter_second); - iter_second++; - it++; - } - } - while (iter_first != m_ams_mapping_result_first.end()) - { - m_ams_mapping_result.push_back(*iter_first); - iter_first++; - } - while (iter_second != m_ams_mapping_result_second.end()) - { - m_ams_mapping_result.push_back(*iter_second); - iter_second++; - } + //m_ams_mapping_result.clear(); + m_ams_mapping_result.resize(m_ams_mapping_result_left.size() + m_ams_mapping_result_right.size()); + std::merge(m_ams_mapping_result_left.begin(), m_ams_mapping_result_left.end(), m_ams_mapping_result_right.begin(), + m_ams_mapping_result_right.end(), m_ams_mapping_result.begin(), + [](const FilamentInfo& f1, const FilamentInfo& f2) { + return f1.id < f2.id; // Merge based on age + }); filament_result = (result_first && result_second); } + //can hybrid mapping else { - filament_result = obj_->ams_filament_mapping(m_filaments, m_ams_mapping_result, true, true); - } - - for (auto it = m_ams_mapping_result.begin(); it != m_ams_mapping_result.end(); it++) - { - if (it->ams_id == "") - { - if (m_filaments_map[it->id] == 1) - { - if (obj_->vt_slot.size() == 2) - { - it->ams_id = std::to_string(VIRTUAL_TRAY_DEPUTY_ID); - it->color = obj_->vt_slot[1].color; - it->type = obj_->vt_slot[1].type; - it->colors = obj_->vt_slot[1].cols; - it->tray_id = VIRTUAL_TRAY_DEPUTY_ID; - } - else - { - it->ams_id = std::to_string(VIRTUAL_TRAY_MAIN_ID); - it->color = obj_->vt_slot[0].color; - it->type = obj_->vt_slot[0].type; - it->colors = obj_->vt_slot[0].cols; - it->tray_id = VIRTUAL_TRAY_MAIN_ID; - } - it->slot_id = "0"; - } - else if (m_filaments_map[it->id] == 2) - { - it->ams_id = std::to_string(VIRTUAL_TRAY_MAIN_ID); - it->color = obj_->vt_slot[0].color; - it->type = obj_->vt_slot[0].type; - it->colors = obj_->vt_slot[0].cols; - it->slot_id = "0"; - it->tray_id = VIRTUAL_TRAY_MAIN_ID; - } - } + map_opt = { true, true, true, true }; //four values: use_left_ams, use_right_ams, use_left_ext, use_right_ext + filament_result = obj_->ams_filament_mapping(m_filaments, m_ams_mapping_result, map_opt); } + //When filaments cannot be matched automatically, whether to use ext for automatic supply + //auto_supply_with_ext(obj_->vt_slot); } + //single nozzle else { - if (obj_->is_support_amx_ext_mix_mapping()) - { - filament_result = obj_->ams_filament_mapping(m_filaments, m_ams_mapping_result, false, true); - for (auto it = m_ams_mapping_result.begin(); it != m_ams_mapping_result.end(); it++) - { - if (it->ams_id == "") - { - it->ams_id = VIRTUAL_TRAY_MAIN_ID; - it->color = obj_->vt_slot[0].color; - it->type = obj_->vt_slot[0].type; - it->colors = obj_->vt_slot[0].cols; - it->slot_id = "0"; - it->tray_id = VIRTUAL_TRAY_MAIN_ID; - } - } + if (obj_->is_support_amx_ext_mix_mapping()){ + map_opt = { false, true, false, true }; //four values: use_left_ams, use_right_ams, use_left_ext, use_right_ext + filament_result = obj_->ams_filament_mapping(m_filaments, m_ams_mapping_result, map_opt); + //auto_supply_with_ext(obj_->vt_slot); } else { - filament_result = obj_->ams_filament_mapping(m_filaments, m_ams_mapping_result, false, false); - if (obj_->amsList.empty()) - { - for (auto it = m_ams_mapping_result.begin(); it != m_ams_mapping_result.end(); it++) - { - if (it->ams_id == "") - { - it->ams_id = VIRTUAL_TRAY_MAIN_ID; - it->color = obj_->vt_slot[0].color; - it->type = obj_->vt_slot[0].type; - it->colors = obj_->vt_slot[0].cols; - it->slot_id = "0"; - it->tray_id = VIRTUAL_TRAY_MAIN_ID; - } - } - } + map_opt = { false, true, false, false }; + filament_result = obj_->ams_filament_mapping(m_filaments, m_ams_mapping_result, map_opt); } - } if (filament_result == 0) { @@ -2216,11 +2124,56 @@ bool SelectMachineDialog::get_ams_mapping_result(std::string &mapping_array_str, return true; } -bool SelectMachineDialog::is_two_nozzle_same() { - //if two extruder are same and can be mix-used, return true - //else return false - //wait to fill - return false; +bool SelectMachineDialog::can_hybrid_mapping(NozzleData data) { + if (data.total_nozzle_count <= 1 || data.nozzles.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. + //Therefore, some adjustments need to be made. + std::vectorflow_type_of_machine; + for (auto it = data.nozzles.rbegin(); it != data.nozzles.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"; + flow_type_of_machine.push_back(type_str); + } + //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); + std::string base_name = base_printer->name; + auto flow_data = wxGetApp().app_config->get_nozzle_volume_types_from_config(base_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; + + //Only when all preset nozzle types and machine nozzle types are exactly the same, return true. + auto type = flow_types[0]; + for (int i = 0; i < flow_types.size(); i++){ + if (flow_types[i] != type || flow_type_of_machine[i] != type) + return false; + } + return true; +} + +//When filaments cannot be matched automatically, whether to use ext for automatic supply +void SelectMachineDialog::auto_supply_with_ext(std::vector slots) { + if (slots.size() <= 0) return; + + for (int i = 0; i < m_ams_mapping_result.size(); i++) { + auto it = m_ams_mapping_result[i]; + if (it.ams_id == "") { + AmsTray slot(""); + if (m_filaments_map[it.id] == 1 && slots.size() > 1) slot = slots[1]; + else if (m_filaments_map[it.id] == 2) slot = slots[0]; + if (slot.id.empty()) continue; + m_ams_mapping_result[i].ams_id = slot.id; + m_ams_mapping_result[i].color = slot.color; + m_ams_mapping_result[i].type = slot.type; + m_ams_mapping_result[i].colors = slot.cols; + m_ams_mapping_result[i].tray_id = atoi(slot.id.c_str()); + m_ams_mapping_result[i].slot_id = "0"; + } + } } void SelectMachineDialog::prepare(int print_plate_idx) @@ -4410,7 +4363,7 @@ void SelectMachineDialog::reset_and_sync_ams_list() size_t nozzle_nums = full_config.option("nozzle_diameter")->values.size(); if (nozzle_nums > 1) { - if (is_two_nozzle_same()) + if (obj_ && can_hybrid_mapping(obj_->m_nozzle_data)) { m_mapping_popup.set_show_type(ShowType::LEFT_AND_RIGHT); } diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index 56779d42d..2df188d33 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -333,6 +333,7 @@ enum PrintDialogStatus { PrintStatusTimelapseWarning }; + std::string get_print_status_info(PrintDialogStatus status); class SelectMachineDialog : public DPIDialog @@ -539,7 +540,8 @@ public: bool Show(bool show); bool do_ams_mapping(MachineObject* obj_); bool get_ams_mapping_result(std::string& mapping_array_str, std::string& mapping_array_str2, std::string& ams_mapping_info); - bool is_two_nozzle_same(); + bool can_hybrid_mapping(NozzleData data); + void auto_supply_with_ext(std::vector slots); PrintFromType get_print_type() {return m_print_type;}; wxString format_steel_name(std::string name);