120 {
121 if (filaments.empty())
122 return -1;
123
125
126 std::map<int, FilamentInfo> tray_filaments;
127 bool left_nozzle_has_ams = false, right_nozzle_has_ams = false;
128
129 const auto& ams_list = obj->GetFilaSystem()->GetAmsList();
130 for (auto ams = ams_list.begin(); ams != ams_list.end(); ams++)
131 {
132 std::string ams_id = ams->second->GetAmsId();
133 auto ams_type = ams->second->GetAmsType();
134
136 {
138 }
139 for (auto tray = ams->second->GetTrays().begin(); tray != ams->second->GetTrays().end(); tray++)
140 {
141 int ams_id = atoi(ams->first.c_str());
142 int tray_id = atoi(tray->first.c_str());
143 int tray_index = 0;
145 {
146 tray_index = ams_id * 4 + tray_id;
147 }
149 {
151 }
153 {
154 tray_index = ams_id + tray_id;
155 }
156 else
157 {
158 assert(0);
159 }
160
161
162 for (int i = 0; i < exclude_id.size(); i++)
163 {
164 if (tray_index == exclude_id[i])
165 continue;
166 }
167
168 FilamentInfo info;
169 if (tray->second->is_tray_info_ready())
170 {
172 }
173
174
177 if (right_ams_valid || left_ams_valid)
178 {
179 tray_filaments.emplace(std::make_pair(tray_index, info));
180 if (right_ams_valid)
181 {
182 right_nozzle_has_ams = true;
183 }
184 if (left_ams_valid)
185 {
186 left_nozzle_has_ams = true;
187 }
188 }
189 }
190 }
191
193 {
194 for (auto tray : obj->vt_slot)
195 {
198 if (right_ext_valid || left_ext_valid)
199 {
200 if (nozzle_has_ams_then_ignore_ext)
201 {
202 if (right_ext_valid && right_nozzle_has_ams)
203 {
204 continue;
205 }
206 if (left_ext_valid && left_nozzle_has_ams)
207 {
208 continue;
209 }
210 }
211 FilamentInfo info;
213 tray_filaments.emplace(std::make_pair(info.tray_id, info));
214 }
215 }
216 }
217
219
220 char buffer[256];
221 std::vector<std::vector<DisValue>> distance_map;
222
223
224 ::sprintf(buffer, "F(id)");
225 std::string line = std::string(buffer);
226 for (auto tray = tray_filaments.begin(); tray != tray_filaments.end(); tray++)
227 {
228 ::sprintf(buffer, " AMS%02d", tray->second.id + 1);
229 line += std::string(buffer);
230 }
231 BOOST_LOG_TRIVIAL(info) << "ams_mapping_distance:" << line;
232
233 for (int i = 0; i < filaments.size(); i++)
234 {
235 std::vector<DisValue> rol;
236 ::sprintf(buffer, "F(%02d)", filaments[i].id + 1);
237 line = std::string(buffer);
238 for (auto tray = tray_filaments.begin(); tray != tray_filaments.end(); tray++)
239 {
240 DisValue val;
241 val.tray_id = tray->second.id;
242 wxColour c = wxColour(filaments[i].color);
245 if (filaments[i].type != tray->second.type)
246 {
247 val.distance = 999999;
248 val.is_type_match = false;
249 }
250 else
251 {
252 if (c.Alpha() != tray_c.Alpha())
253 val.distance = 999999;
254 val.is_type_match = true;
255 }
256 ::sprintf(buffer, " %6.0f", val.distance);
257 line += std::string(buffer);
258 rol.push_back(val);
259 }
260 BOOST_LOG_TRIVIAL(info) << "ams_mapping_distance:" << line;
261 distance_map.push_back(rol);
262 }
263
265
266
267
268 for (int i = 0; i < filaments.size(); i++)
269 {
270 FilamentInfo info;
271 info.id = filaments[i].id;
272 info.tray_id = -1;
273 info.type = filaments[i].type;
274 info.filament_id = filaments[i].filament_id;
275 result.push_back(info);
276 }
277
278
279 std::set<int> picked_src;
280 std::set<int> picked_tar;
281 for (int k = 0; k < distance_map.size(); k++)
282 {
283 float min_val = std::numeric_limits<float>::max();
284 int picked_src_idx = -1;
285 int picked_tar_idx = -1;
286 for (int i = 0; i < distance_map.size(); i++)
287 {
288 if (picked_src.find(i) != picked_src.end())
289 continue;
290
291
292 for (int j = 0; j < distance_map[i].size(); j++)
293 {
294 if (picked_tar.find(j) != picked_tar.end())
295 {
296 if (distance_map[i][j].is_same_color
297 && distance_map[i][j].is_type_match
298 && distance_map[i][j].distance < (float)0.0001)
299 {
300 min_val = distance_map[i][j].distance;
301 picked_src_idx = i;
302 picked_tar_idx = j;
303 tray_filaments[picked_tar_idx].distance = min_val;
304 }
305 continue;
306 }
307
308 if (distance_map[i][j].is_same_color
309 && distance_map[i][j].is_type_match)
310 {
311 if (min_val > distance_map[i][j].distance)
312 {
313
314 min_val = distance_map[i][j].distance;
315 picked_src_idx = i;
316 picked_tar_idx = j;
317 tray_filaments[picked_tar_idx].distance = min_val;
318 }
319 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)
320 {
321
322 picked_src_idx = i;
323 picked_tar_idx = j;
324 }
325 }
326 }
327
328
329 if (picked_src_idx < 0 || picked_tar_idx < 0)
330 {
331 for (int j = 0; j < distance_map[i].size(); j++)
332 {
333 if (distance_map[i][j].is_same_color && distance_map[i][j].is_type_match)
334 {
335 if (min_val > distance_map[i][j].distance)
336 {
337 min_val = distance_map[i][j].distance;
338 picked_src_idx = i;
339 picked_tar_idx = j;
340 tray_filaments[picked_tar_idx].distance = min_val;
341 }
342 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)
343 {
344 picked_src_idx = i;
345 picked_tar_idx = j;
346 }
347 }
348 }
349 }
350 }
351
352 if (picked_src_idx >= 0 && picked_tar_idx >= 0)
353 {
354 auto tray = tray_filaments.find(distance_map[k][picked_tar_idx].tray_id);
355
356 if (tray != tray_filaments.end())
357 {
358 result[picked_src_idx].tray_id = tray->first;
359
360 result[picked_src_idx].color = tray->second.color;
361 result[picked_src_idx].type = tray->second.type;
362 result[picked_src_idx].distance = tray->second.distance;
363 result[picked_src_idx].filament_id = tray->second.filament_id;
364 result[picked_src_idx].ctype = tray->second.ctype;
365 result[picked_src_idx].colors = tray->second.colors;
366
367
368 result[picked_src_idx].ams_id = tray->second.ams_id;
369 result[picked_src_idx].slot_id = tray->second.slot_id;
370 }
371
372 ::sprintf(buffer, "ams_mapping, picked F(%02d) AMS(%02d), distance=%6.0f", picked_src_idx + 1, picked_tar_idx + 1,
373 distance_map[picked_src_idx][picked_tar_idx].distance);
374 BOOST_LOG_TRIVIAL(info) << std::string(buffer);
375 picked_src.insert(picked_src_idx);
376 picked_tar.insert(picked_tar_idx);
377 }
378 }
379
380
382 auto ext_tray = tray_filaments.begin();
383 for (auto & r : result) {
384 if (r.tray_id < 0) {
385 r.tray_id = ext_tray->first;
386
387 r.color = ext_tray->second.color;
388 r.type = ext_tray->second.type;
389 r.distance = ext_tray->second.distance;
390 r.filament_id = ext_tray->second.filament_id;
391 r.ctype = ext_tray->second.ctype;
392 r.colors = ext_tray->second.colors;
393
394
395 r.ams_id = ext_tray->second.ams_id;
396 r.slot_id = ext_tray->second.slot_id;
397 }
398 }
399 }
400
401
403 {
404 return 0;
405 }
406
407
408
409
410
411
412 return 0;
413 }
static unsigned int count
Definition AuxiliaryDataViewModel.cpp:246
#define DEPUTY_EXTRUDER_ID
Definition DevDefs.h:102
#define AMS_LITE_MIXED_TRAY_INDEX_OFFSET
Definition DevDefs.h:96
#define VIRTUAL_TRAY_DEPUTY_ID
Definition DevDefs.h:90
#define VIRTUAL_TRAY_MAIN_ID
Definition DevDefs.h:89
#define MAIN_EXTRUDER_ID
Definition DevDefs.h:101
static wxColour decode_color(const std::string &color)
Definition DevFilaSystem.cpp:38
static constexpr AmsType AMS_LITE_MIXED
Definition DevFilaSystem.h:148
static constexpr AmsType EXT_SPOOL
Definition DevFilaSystem.h:143
static constexpr AmsType AMS
Definition DevFilaSystem.h:144
static constexpr AmsType N3F
Definition DevFilaSystem.h:146
static constexpr AmsType AMS_LITE
Definition DevFilaSystem.h:145
static constexpr AmsType N3S
Definition DevFilaSystem.h:147
static bool is_valid_mapping_result(const MachineObject *obj, std::vector< FilamentInfo > &result, bool check_empty_slot=false)
Definition DevMapping.cpp:25
static bool IsVirtualSlot(int ams_id)
Definition DevDefs.h:165
float calc_color_distance(wxColour c1, wxColour c2)
Definition GuiColor.cpp:28
static void _parse_tray_info(int ams_id, int slot_id, DevAms::AmsType type, DevAmsTray tray, FilamentInfo &result)
Definition DevMapping.cpp:85
@ USE_RIGHT_AMS
Definition DevMapping.h:16
@ USE_LEFT_AMS
Definition DevMapping.h:15
@ USE_LEFT_EXT
Definition DevMapping.h:17
@ USE_RIGHT_EXT
Definition DevMapping.h:18