mirror of
https://git.mirrors.martin98.com/https://github.com/bambulab/BambuStudio.git
synced 2025-08-06 02:16:03 +08:00
ENH: update the mapping algorithm, take a retry to mapping to an used tray
jira: [STUDIO-11971] Change-Id: I22e34193318386a954d57ea3597cd3909db0ecb4
This commit is contained in:
parent
6c1be5bddc
commit
59db0a2265
@ -1022,8 +1022,9 @@ int MachineObject::ams_filament_mapping(
|
||||
if (filaments.empty())
|
||||
return -1;
|
||||
|
||||
// tray_index : tray_color
|
||||
std::map<int, FilamentInfo> tray_filaments;
|
||||
/////////////////////////
|
||||
// Step 1: collect filaments in machine
|
||||
std::map<int, FilamentInfo> tray_filaments; // tray_index : tray_color
|
||||
bool left_nozzle_has_ams = false, right_nozzle_has_ams = false;
|
||||
for (auto ams = amsList.begin(); ams != amsList.end(); ams++) {
|
||||
std::string ams_id = ams->second->id;
|
||||
@ -1076,6 +1077,8 @@ int MachineObject::ams_filament_mapping(
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////
|
||||
// Step 2: collect the distances of filaments_in_slicing to filaments_in_machine
|
||||
char buffer[256];
|
||||
std::vector<std::vector<DisValue>> distance_map;
|
||||
|
||||
@ -1086,7 +1089,7 @@ int MachineObject::ams_filament_mapping(
|
||||
::sprintf(buffer, " AMS%02d", tray->second.id+1);
|
||||
line += std::string(buffer);
|
||||
}
|
||||
BOOST_LOG_TRIVIAL(info) << "ams_mapping_distance:" << line;
|
||||
BOOST_LOG_TRIVIAL(info) << "ams_mapping_distance:" << line;// Print the collected filaments
|
||||
|
||||
for (int i = 0; i < filaments.size(); i++) {
|
||||
std::vector<DisValue> rol;
|
||||
@ -1114,7 +1117,10 @@ int MachineObject::ams_filament_mapping(
|
||||
distance_map.push_back(rol);
|
||||
}
|
||||
|
||||
// mapping algorithm
|
||||
/////////////////////////
|
||||
// Step 3: do mapping algorithm
|
||||
|
||||
// setup the mapping result
|
||||
for (int i = 0; i < filaments.size(); i++) {
|
||||
FilamentInfo info;
|
||||
info.id = filaments[i].id;
|
||||
@ -1124,6 +1130,7 @@ int MachineObject::ams_filament_mapping(
|
||||
result.push_back(info);
|
||||
}
|
||||
|
||||
// traverse the mapping
|
||||
std::set<int> picked_src;
|
||||
std::set<int> picked_tar;
|
||||
for (int k = 0; k < distance_map.size(); k++) {
|
||||
@ -1133,6 +1140,8 @@ int MachineObject::ams_filament_mapping(
|
||||
for (int i = 0; i < distance_map.size(); i++) {
|
||||
if (picked_src.find(i) != picked_src.end())
|
||||
continue;
|
||||
|
||||
// try to mapping to different tray
|
||||
for (int j = 0; j < distance_map[i].size(); j++) {
|
||||
if (picked_tar.find(j) != picked_tar.end()){
|
||||
if (distance_map[i][j].is_same_color
|
||||
@ -1162,7 +1171,25 @@ int MachineObject::ams_filament_mapping(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// take a retry to mapping to used tray
|
||||
if (picked_src_idx < 0 || picked_tar_idx < 0) {
|
||||
for (int j = 0; j < distance_map[i].size(); j++) {
|
||||
if (distance_map[i][j].is_same_color && distance_map[i][j].is_type_match) {
|
||||
if (min_val > distance_map[i][j].distance) {
|
||||
min_val = distance_map[i][j].distance;
|
||||
picked_src_idx = i;
|
||||
picked_tar_idx = j;
|
||||
tray_filaments[picked_tar_idx].distance = min_val;
|
||||
} else if (min_val == distance_map[i][j].distance && filaments[picked_src_idx].filament_id != tray_filaments[picked_tar_idx].filament_id && filaments[i].filament_id == tray_filaments[j].filament_id) {
|
||||
picked_src_idx = i;
|
||||
picked_tar_idx = j;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (picked_src_idx >= 0 && picked_tar_idx >= 0) {
|
||||
auto tray = tray_filaments.find(distance_map[k][picked_tar_idx].tray_id);
|
||||
|
||||
@ -1189,8 +1216,6 @@ int MachineObject::ams_filament_mapping(
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<FilamentInfo> cache_map_result = result;
|
||||
|
||||
//check ams mapping result
|
||||
if (is_valid_mapping_result(result, true)) {
|
||||
return 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user