#ifndef slic3r_LocalZOrderOptimizer_hpp_ #define slic3r_LocalZOrderOptimizer_hpp_ #include #include #include namespace Slic3r { namespace LocalZOrderOptimizer { inline bool bucket_contains_extruder(const std::vector &extruders, int extruder_id) { return extruder_id >= 0 && std::find(extruders.begin(), extruders.end(), static_cast(extruder_id)) != extruders.end(); } inline std::vector order_bucket_extruders(std::vector extruders, int current_extruder, int preferred_last_extruder = -1) { extruders.erase(std::unique(extruders.begin(), extruders.end()), extruders.end()); if (extruders.empty()) return extruders; if (current_extruder >= 0) { auto current_it = std::find(extruders.begin(), extruders.end(), static_cast(current_extruder)); if (current_it != extruders.end()) std::rotate(extruders.begin(), current_it, extruders.end()); } if (preferred_last_extruder >= 0 && extruders.size() > 1 && static_cast(extruders.front()) != preferred_last_extruder) { auto preferred_it = std::find(extruders.begin() + 1, extruders.end(), static_cast(preferred_last_extruder)); if (preferred_it != extruders.end()) std::rotate(preferred_it, preferred_it + 1, extruders.end()); } return extruders; } inline std::vector order_pass_group(const std::vector> &group_extruders, int current_extruder) { std::vector remaining(group_extruders.size()); std::iota(remaining.begin(), remaining.end(), size_t(0)); std::vector ordered; ordered.reserve(group_extruders.size()); int active_extruder = current_extruder; while (!remaining.empty()) { auto next_it = std::find_if(remaining.begin(), remaining.end(), [&](size_t idx) { return bucket_contains_extruder(group_extruders[idx], active_extruder); }); if (next_it == remaining.end()) next_it = remaining.begin(); const size_t next_idx = *next_it; ordered.push_back(next_idx); const std::vector ordered_bucket = order_bucket_extruders(group_extruders[next_idx], active_extruder); if (!ordered_bucket.empty()) active_extruder = static_cast(ordered_bucket.back()); remaining.erase(next_it); } return ordered; } } // namespace LocalZOrderOptimizer } // namespace Slic3r #endif