From a3322bdd4517fdfc44596e3d0b7299bb871affa1 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 10 Nov 2023 14:39:03 +0100 Subject: [PATCH] New gcode visualization: layers times refactoring --- src/slic3r/GUI/GCodeViewer.cpp | 10 ++--- src/slic3r/GUI/LibVGCode/Layers.cpp | 26 +++++++++++- src/slic3r/GUI/LibVGCode/Layers.hpp | 13 +++--- src/slic3r/GUI/LibVGCode/ViewRange.cpp | 24 +++++------ src/slic3r/GUI/LibVGCode/ViewRange.hpp | 16 +++---- src/slic3r/GUI/LibVGCode/ViewerImpl.cpp | 55 +++++++++---------------- src/slic3r/GUI/LibVGCode/ViewerImpl.hpp | 2 - 7 files changed, 76 insertions(+), 70 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index eba75fa573..ea8fc233d1 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1426,7 +1426,7 @@ void GCodeViewer::refresh(const GCodeProcessorResult& gcode_result, const std::v //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_NEW_GCODE_VIEWER for (size_t i = 0; i < static_cast(libvgcode::ETimeMode::COUNT); ++i) { - const std::vector layers_times = m_new_viewer.get_layers_times(static_cast(i)); + const std::vector layers_times = get_layers_times(static_cast(i)); for (size_t j = 0; j < layers_times.size(); ++j) { m_extrusions.ranges.layer_time[i].update_from(layers_times[j]); } @@ -3088,7 +3088,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool case libvgcode::EViewType::Temperature: { color = m_extrusions.ranges.temperature.get_color_at(path.temperature); break; } case libvgcode::EViewType::LayerTimeLinear: case libvgcode::EViewType::LayerTimeLogarithmic: { - const std::vector layers_times = m_new_viewer.get_layers_times(); + const std::vector layers_times = get_layers_times(); if (!layers_times.empty() && m_layers.size() == layers_times.size()) { const Path::Sub_Path& sub_path = path.sub_paths.front(); double z = static_cast(sub_path.first.position.z()); @@ -4584,7 +4584,7 @@ void GCodeViewer::render_legend(float& legend_height) std::vector view_options_id; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_NEW_GCODE_VIEWER - const std::vector layers_times = m_new_viewer.get_layers_times(); + const std::vector layers_times = get_layers_times(); if (!layers_times.empty() && m_layers.size() == layers_times.size()) { #else //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -5246,9 +5246,9 @@ void GCodeViewer::render_legend(float& legend_height) imgui.title(time_title + ":"); if (ImGui::BeginTable("Times", 2)) { - //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_NEW_GCODE_VIEWER - const std::vector layers_times = m_new_viewer.get_layers_times(); + const std::vector layers_times = get_layers_times(); if (!layers_times.empty()) add_strings_row_to_table(_u8L("First layer") + ":", ImGuiWrapper::COL_ORANGE_LIGHT, short_time_ui(get_time_dhms(layers_times.front())), ImGuiWrapper::to_ImVec4(ColorRGBA::WHITE())); diff --git a/src/slic3r/GUI/LibVGCode/Layers.cpp b/src/slic3r/GUI/LibVGCode/Layers.cpp index 0e55932103..71ceb134b4 100644 --- a/src/slic3r/GUI/LibVGCode/Layers.cpp +++ b/src/slic3r/GUI/LibVGCode/Layers.cpp @@ -25,7 +25,7 @@ static bool is_colorprint_option(const PathVertex& v) return v.type == EMoveType::PausePrint || v.type == EMoveType::CustomGCode; } -void Layers::update(const PathVertex& vertex, uint32_t vertex_id) +void Layers::update(const PathVertex& vertex, const std::array(ETimeMode::COUNT)>& times, uint32_t vertex_id) { if (m_items.empty() || vertex.layer_id == m_items.size()) { @@ -33,11 +33,15 @@ void Layers::update(const PathVertex& vertex, uint32_t vertex_id) assert(vertex.layer_id == static_cast(m_items.size())); Item& item = m_items.emplace_back(Item()); item.range.set(vertex_id, vertex_id); + item.times = times; item.contains_colorprint_options |= is_colorprint_option(vertex); } else { Item& item = m_items.back(); item.range.set(item.range.get()[0], vertex_id); + for (size_t i = 0; i < static_cast(ETimeMode::COUNT); ++i) { + item.times[i] += times[i]; + } item.contains_colorprint_options |= is_colorprint_option(vertex); } } @@ -52,11 +56,29 @@ bool Layers::empty() const return m_items.empty(); } -size_t Layers::get_layers_count() const +size_t Layers::count() const { return m_items.size(); } +float Layers::get_time(ETimeMode mode, uint32_t layer_id) const +{ + return (mode < ETimeMode::COUNT&& layer_id < static_cast(m_items.size())) ? + m_items[layer_id].times[static_cast(mode)] : 0.0f; +} + +std::vector Layers::get_times(ETimeMode mode) const +{ + std::vector ret; + if (mode < ETimeMode::COUNT) { + const size_t mode_id = static_cast(mode); + for (const Item& item : m_items) { + ret.emplace_back(item.times[mode_id]); + } + } + return ret; +} + bool Layers::layer_contains_colorprint_options(uint32_t layer_id) const { return (layer_id < static_cast(m_items.size())) ? m_items[layer_id].contains_colorprint_options : false; diff --git a/src/slic3r/GUI/LibVGCode/Layers.hpp b/src/slic3r/GUI/LibVGCode/Layers.hpp index 8194a9c8ab..15e3de9e6a 100644 --- a/src/slic3r/GUI/LibVGCode/Layers.hpp +++ b/src/slic3r/GUI/LibVGCode/Layers.hpp @@ -10,10 +10,9 @@ #if ENABLE_NEW_GCODE_VIEWER //################################################################################################################################ +#include "Types.hpp" #include "Range.hpp" -#include - namespace libvgcode { struct PathVertex; @@ -21,11 +20,14 @@ struct PathVertex; class Layers { public: - void update(const PathVertex& vertex, uint32_t vertex_id); + void update(const PathVertex& vertex, const std::array(ETimeMode::COUNT)>& times, uint32_t vertex_id); void reset(); bool empty() const; - size_t get_layers_count() const; + size_t count() const; + + float get_time(ETimeMode mode, uint32_t layer_id) const; + std::vector get_times(ETimeMode mode) const; bool layer_contains_colorprint_options(uint32_t layer_id) const; @@ -33,9 +35,8 @@ private: struct Item { Range range; + std::array(ETimeMode::COUNT)> times{ 0.0f, 0.0f }; bool contains_colorprint_options{ false }; - - Item() = default; }; std::vector m_items; diff --git a/src/slic3r/GUI/LibVGCode/ViewRange.cpp b/src/slic3r/GUI/LibVGCode/ViewRange.cpp index 6ba6cdc3f3..1f4837cd01 100644 --- a/src/slic3r/GUI/LibVGCode/ViewRange.cpp +++ b/src/slic3r/GUI/LibVGCode/ViewRange.cpp @@ -16,44 +16,44 @@ namespace libvgcode { -const std::array& ViewRange::get_current_range() const +const std::array& ViewRange::get_current() const { return m_current.get(); } -void ViewRange::set_current_range(const Range& other) +void ViewRange::set_current(const Range& other) { - set_current_range(other.get()); + set_current(other.get()); } -void ViewRange::set_current_range(const std::array& range) +void ViewRange::set_current(const std::array& range) { - set_current_range(range[0], range[1]); + set_current(range[0], range[1]); } -void ViewRange::set_current_range(uint32_t min, uint32_t max) +void ViewRange::set_current(uint32_t min, uint32_t max) { m_current.set(min, max); // force the current range to stay inside the modified global range m_global.clamp(m_current); } -const std::array& ViewRange::get_global_range() const +const std::array& ViewRange::get_global() const { return m_global.get(); } -void ViewRange::set_global_range(const Range& other) +void ViewRange::set_global(const Range& other) { - set_global_range(other.get()); + set_global(other.get()); } -void ViewRange::set_global_range(const std::array& range) +void ViewRange::set_global(const std::array& range) { - set_global_range(range[0], range[1]); + set_global(range[0], range[1]); } -void ViewRange::set_global_range(uint32_t min, uint32_t max) +void ViewRange::set_global(uint32_t min, uint32_t max) { // is the global range being extended ? const bool new_max = max > m_global.get()[1]; diff --git a/src/slic3r/GUI/LibVGCode/ViewRange.hpp b/src/slic3r/GUI/LibVGCode/ViewRange.hpp index ade871d70b..912c688813 100644 --- a/src/slic3r/GUI/LibVGCode/ViewRange.hpp +++ b/src/slic3r/GUI/LibVGCode/ViewRange.hpp @@ -17,15 +17,15 @@ namespace libvgcode { class ViewRange { public: - const std::array& get_current_range() const; - void set_current_range(const Range& other); - void set_current_range(const std::array& range); - void set_current_range(uint32_t min, uint32_t max); + const std::array& get_current() const; + void set_current(const Range& other); + void set_current(const std::array& range); + void set_current(uint32_t min, uint32_t max); - const std::array& get_global_range() const; - void set_global_range(const Range& other); - void set_global_range(const std::array& range); - void set_global_range(uint32_t min, uint32_t max); + const std::array& get_global() const; + void set_global(const Range& other); + void set_global(const std::array& range); + void set_global(uint32_t min, uint32_t max); void reset(); diff --git a/src/slic3r/GUI/LibVGCode/ViewerImpl.cpp b/src/slic3r/GUI/LibVGCode/ViewerImpl.cpp index 7d5af03cb3..a6cfa71139 100644 --- a/src/slic3r/GUI/LibVGCode/ViewerImpl.cpp +++ b/src/slic3r/GUI/LibVGCode/ViewerImpl.cpp @@ -520,13 +520,11 @@ void ViewerImpl::reset() m_layers.reset(); m_layers_range.reset(); m_view_range.reset(); - m_old_current_range.reset(); m_extrusion_roles.reset(); m_travels_time = { 0.0f, 0.0f }; m_vertices.clear(); m_vertices_map.clear(); m_valid_lines_bitset.clear(); - m_layers_times = std::array, static_cast(ETimeMode::COUNT)>(); #if !ENABLE_NEW_GCODE_NO_COG_AND_TOOL_MARKERS m_cog_marker.reset(); #endif // !ENABLE_NEW_GCODE_NO_COG_AND_TOOL_MARKERS @@ -607,7 +605,7 @@ void ViewerImpl::load(const Slic3r::GCodeProcessorResult& gcode_result, const GC static_cast(curr.layer_id) }; m_vertices_map.emplace_back(static_cast(i) - seams_count); m_vertices.emplace_back(vertex); - m_layers.update(vertex, static_cast(m_vertices.size())); + m_layers.update(vertex, { 0.0f, 0.0f }, static_cast(m_vertices.size())); } } @@ -616,7 +614,7 @@ void ViewerImpl::load(const Slic3r::GCodeProcessorResult& gcode_result, const GC static_cast(curr.cp_color_id), static_cast(curr.layer_id) }; m_vertices_map.emplace_back(static_cast(i) - seams_count); m_vertices.emplace_back(vertex); - m_layers.update(vertex, static_cast(m_vertices.size())); + m_layers.update(vertex, curr.time, static_cast(m_vertices.size())); #if !ENABLE_NEW_GCODE_NO_COG_AND_TOOL_MARKERS // updates calculation for center of gravity @@ -639,19 +637,6 @@ void ViewerImpl::load(const Slic3r::GCodeProcessorResult& gcode_result, const GC } else m_extrusion_roles.add(curr_role, curr.time); - - if (curr.layer_id >= m_layers_times[0].size()) { - const size_t curr_size = m_layers_times[0].size(); - for (size_t i = 0; i < static_cast(ETimeMode::COUNT); ++i) { - m_layers_times[i].resize(curr.layer_id + 1); - for (size_t j = curr_size; j < m_layers_times[i].size(); ++j) { - m_layers_times[i][j] = 0.0f; - } - } - } - for (size_t i = 0; i < static_cast(ETimeMode::COUNT); ++i) { - m_layers_times[i].back() += curr.time[i]; - } } m_vertices_map.shrink_to_fit(); m_vertices.shrink_to_fit(); @@ -738,7 +723,7 @@ void ViewerImpl::load(const Slic3r::GCodeProcessorResult& gcode_result, const GC } if (!m_layers.empty()) - set_layers_range(0, static_cast(m_layers.get_layers_count() - 1)); + set_layers_range(0, static_cast(m_layers.count() - 1)); update_view_global_range(); m_settings.update_colors = true; } @@ -747,13 +732,13 @@ void ViewerImpl::update_enabled_entities() { std::vector enabled_segments; std::vector enabled_options; - std::array range = m_view_range.get_current_range(); + std::array range = m_view_range.get_current(); // when top layer only visualization is enabled, we need to render // all the toolpaths in the other layers as grayed, so extend the range // to contain them if (m_settings.top_layer_only_view_range) - range[0] = m_view_range.get_global_range()[0]; + range[0] = m_view_range.get_global()[0]; // to show the options at the current tool marker position we need to extend the range by one extra step if (m_vertices[range[1]].is_option() && range[1] < static_cast(m_vertices.size()) - 1) @@ -831,7 +816,7 @@ void ViewerImpl::update_colors() update_color_ranges(); const uint32_t top_layer_id = m_settings.top_layer_only_view_range ? m_layers_range.get()[1] : 0; - const bool color_top_layer_only = m_view_range.get_global_range()[1] != m_view_range.get_current_range()[1]; + const bool color_top_layer_only = m_view_range.get_global()[1] != m_view_range.get_current()[1]; std::vector colors(m_vertices.size()); for (size_t i = 0; i < m_vertices.size(); i++) { colors[i] = (color_top_layer_only && m_vertices[i].layer_id < top_layer_id) ? encode_color(Dummy_Color) : encode_color(select_color(m_vertices[i])); @@ -987,12 +972,12 @@ void ViewerImpl::toggle_extrusion_role_visibility(EGCodeExtrusionRole role) const std::array& ViewerImpl::get_view_current_range() const { - return m_view_range.get_current_range(); + return m_view_range.get_current(); } const std::array& ViewerImpl::get_view_global_range() const { - return m_view_range.get_global_range(); + return m_view_range.get_global(); } void ViewerImpl::set_view_current_range(uint32_t min, uint32_t max) @@ -1030,15 +1015,14 @@ void ViewerImpl::set_view_current_range(uint32_t min, uint32_t max) Range new_range; new_range.set(min_id, max_id); - if (m_old_current_range != new_range) { + if (m_view_range.get_current() != new_range.get()) { if (m_settings.update_view_global_range) { // force update of global range, if required, to avoid clamping the current range with global old values // when calling set_current_range() update_view_global_range(); m_settings.update_view_global_range = false; } - m_view_range.set_current_range(new_range); - m_old_current_range = new_range; + m_view_range.set_current(new_range); m_settings.update_enabled_entities = true; m_settings.update_colors = true; } @@ -1051,7 +1035,7 @@ size_t ViewerImpl::get_vertices_count() const PathVertex ViewerImpl::get_current_vertex() const { - return m_vertices[m_view_range.get_current_range()[1]]; + return m_vertices[m_view_range.get_current()[1]]; } PathVertex ViewerImpl::get_vertex_at(size_t id) const @@ -1096,7 +1080,7 @@ std::vector ViewerImpl::get_layers_times() const std::vector ViewerImpl::get_layers_times(ETimeMode mode) const { - return (mode < ETimeMode::COUNT) ? m_layers_times[static_cast(mode)] : std::vector(); + return m_layers.get_times(mode); } size_t ViewerImpl::get_tool_colors_count() const @@ -1226,7 +1210,7 @@ void ViewerImpl::update_view_global_range() } if (first_it == m_vertices.end()) - m_view_range.set_global_range(0, 0); + m_view_range.set_global(0, 0); else { if (travels_visible) { // if the global range starts with a travel move, extend it to the travel start @@ -1266,7 +1250,7 @@ void ViewerImpl::update_view_global_range() } } - m_view_range.set_global_range(std::distance(m_vertices.begin(), first_it), std::distance(m_vertices.begin(), last_it)); + m_view_range.set_global(std::distance(m_vertices.begin(), first_it), std::distance(m_vertices.begin(), last_it)); } } @@ -1296,9 +1280,10 @@ void ViewerImpl::update_color_ranges() m_speed_range.update(v.feedrate); } - for (size_t i = 0; i < m_layers_times.size(); ++i) { - for (const float time : m_layers_times[static_cast(m_settings.time_mode)]) { - m_layer_time_range[i].update(time); + const std::vector times = m_layers.get_times(m_settings.time_mode); + for (size_t i = 0; i < m_layer_time_range.size(); ++i) { + for (float t : times) { + m_layer_time_range[i].update(t); } } } @@ -1354,12 +1339,12 @@ Color ViewerImpl::select_color(const PathVertex& v) const case EViewType::LayerTimeLinear: { assert(!v.is_travel() || role < Travels_Colors.size()); - return v.is_travel() ? Travels_Colors[role] : m_layer_time_range[0].get_color_at(m_layers_times[static_cast(m_settings.time_mode)][v.layer_id]); + return v.is_travel() ? Travels_Colors[role] : m_layer_time_range[0].get_color_at(m_layers.get_time(m_settings.time_mode, v.layer_id)); } case EViewType::LayerTimeLogarithmic: { assert(!v.is_travel() || role < Travels_Colors.size()); - return v.is_travel() ? Travels_Colors[role] : m_layer_time_range[1].get_color_at(m_layers_times[static_cast(m_settings.time_mode)][v.layer_id]); + return v.is_travel() ? Travels_Colors[role] : m_layer_time_range[1].get_color_at(m_layers.get_time(m_settings.time_mode, v.layer_id)); } case EViewType::Tool: { diff --git a/src/slic3r/GUI/LibVGCode/ViewerImpl.hpp b/src/slic3r/GUI/LibVGCode/ViewerImpl.hpp index 72408fb961..c467a5ae41 100644 --- a/src/slic3r/GUI/LibVGCode/ViewerImpl.hpp +++ b/src/slic3r/GUI/LibVGCode/ViewerImpl.hpp @@ -154,10 +154,8 @@ private: Layers m_layers; Range m_layers_range; ViewRange m_view_range; - Range m_old_current_range; ExtrusionRoles m_extrusion_roles; std::array(ETimeMode::COUNT)> m_travels_time{ 0.0f, 0.0f }; - std::array, static_cast(ETimeMode::COUNT)> m_layers_times; // // The OpenGL element used to represent all toolpath segments