From 92a59a60b47b9fbfb91c8f658a07f4e0e5e1f9f6 Mon Sep 17 00:00:00 2001 From: "zhimin.zeng" Date: Tue, 27 Sep 2022 11:26:13 +0800 Subject: [PATCH] FIX: Incorrect color of a layer after slicing Change-Id: I8b53d4cdf23d8f3389b1063ec84572ede3706ca2 (cherry picked from commit 608150a1b823e5c728540dc62df9a03571acfe9a) --- src/libslic3r/Print.cpp | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 41ac19659..12aec6321 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -46,17 +46,24 @@ void dfs_get_all_sorted_extruders(const std::vector>& { if (sorted_extruders.size() == all_extruders.size()) { volumes_to_extruder_order.insert(std::pair(flush_volume, sorted_extruders)); + return; } for (auto extruder_id : all_extruders) { - auto itor = std::find(sorted_extruders.begin(), sorted_extruders.end(), extruder_id); - if (itor == sorted_extruders.end()) { - float delta_flush_volume = wipe_volumes[sorted_extruders.back()][extruder_id]; - flush_volume += delta_flush_volume; + if (sorted_extruders.empty()) { sorted_extruders.push_back(extruder_id); dfs_get_all_sorted_extruders(wipe_volumes, all_extruders, sorted_extruders, flush_volume, volumes_to_extruder_order); - flush_volume -= delta_flush_volume; sorted_extruders.pop_back(); + } else { + auto itor = std::find(sorted_extruders.begin(), sorted_extruders.end(), extruder_id); + if (itor == sorted_extruders.end()) { + float delta_flush_volume = wipe_volumes[sorted_extruders.back()][extruder_id]; + flush_volume += delta_flush_volume; + sorted_extruders.push_back(extruder_id); + dfs_get_all_sorted_extruders(wipe_volumes, all_extruders, sorted_extruders, flush_volume, volumes_to_extruder_order); + flush_volume -= delta_flush_volume; + sorted_extruders.pop_back(); + } } } } @@ -65,10 +72,13 @@ std::vector get_extruders_order(const std::vector all_extruders, unsigned int start_extruder_id) { - std::vector sorted_extruders; - sorted_extruders.push_back(start_extruder_id); - std::map> volumes_to_extruder_order; if (all_extruders.size() > 1) { + std::vector sorted_extruders; + auto iter = std::find(all_extruders.begin(), all_extruders.end(), start_extruder_id); + if (iter != all_extruders.end()) { + sorted_extruders.push_back(start_extruder_id); + } + std::map> volumes_to_extruder_order; dfs_get_all_sorted_extruders(wipe_volumes, all_extruders, sorted_extruders, 0, volumes_to_extruder_order); if(volumes_to_extruder_order.size() > 0) return volumes_to_extruder_order.begin()->second;