From c9bf6f088a8b273d4149dc318e46292801cc9e94 Mon Sep 17 00:00:00 2001 From: yw4z Date: Tue, 10 Mar 2026 18:54:44 +0300 Subject: [PATCH] Remove duplicate items from actual speed plot (#12711) * init * update --- src/slic3r/GUI/GCodeViewer.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 443757a117..fe47b581c3 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1629,7 +1629,29 @@ void GCodeViewer::update_sequential_view_current(unsigned int first, unsigned in levels.push_back(std::make_pair(value, libvgcode::convert(color_range.get_color_at(value)))); levels.back().second.a(0.5f); } - m_sequential_view.marker.set_actual_speed_data(actual_speed_data); + + // ORCA Compress consecutive duplicate speeds with 0.1 precision + auto sameSpeed = [](float a, float b) { + return static_cast(std::roundf(a * 10.0f)) == static_cast(std::roundf(b * 10.0f)); + }; + std::vector compressed; + if (!actual_speed_data.empty()) { + compressed.push_back(actual_speed_data[0]); + for (int i = 1; i < (int)actual_speed_data.size(); ++i) { + const bool same_as_prev = sameSpeed(actual_speed_data[i].speed, actual_speed_data[i - 1].speed); + const bool same_as_next = (i + 1 < (int)actual_speed_data.size()) && sameSpeed(actual_speed_data[i].speed, actual_speed_data[i + 1].speed); + if (!same_as_prev) { + if (!sameSpeed(compressed.back().speed, actual_speed_data[i - 1].speed)) + compressed.push_back(actual_speed_data[i - 1]); + compressed.push_back(actual_speed_data[i]); + } else if (!same_as_next) + compressed.push_back(actual_speed_data[i]); + } + if (compressed.back().pos != actual_speed_data.back().pos) + compressed.push_back(actual_speed_data.back()); + } + + m_sequential_view.marker.set_actual_speed_data(compressed); m_sequential_view.marker.set_actual_speed_y_range(std::make_pair(interval[0], interval[1])); m_sequential_view.marker.set_actual_speed_levels(levels); }