From 39c39798a856e60f3b922c015006cbb2f7449198 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 10 Nov 2023 11:52:27 +0100 Subject: [PATCH] A bunch of fixes for the new gcode visualization --- src/slic3r/GUI/GCodeViewer.cpp | 39 ++++++++++++-- src/slic3r/GUI/LibVGCode/Settings.hpp | 2 +- src/slic3r/GUI/LibVGCode/ViewRange.cpp | 2 +- src/slic3r/GUI/LibVGCode/Viewer.cpp | 8 +-- src/slic3r/GUI/LibVGCode/Viewer.hpp | 4 +- src/slic3r/GUI/LibVGCode/ViewerImpl.cpp | 69 +++++++++++++++++++------ src/slic3r/GUI/LibVGCode/ViewerImpl.hpp | 4 +- 7 files changed, 98 insertions(+), 30 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 5a1575050c..eba75fa573 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -742,6 +742,17 @@ void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, s break; } } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_NEW_GCODE_VIEWER + size_t last_block_id = first_block_id; + for (size_t i = last_block_id; i < cumulative_lines_counts.size(); ++i) { + if (*m_cache_range.max <= cumulative_lines_counts[i]) { + last_block_id = i; + break; + } + } +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ size_t last_block_id = 0; for (size_t i = 0; i < cumulative_lines_counts.size(); ++i) { if (*m_cache_range.max <= cumulative_lines_counts[i]) { @@ -749,6 +760,9 @@ void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, s break; } } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_NEW_GCODE_VIEWER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ assert(last_block_id >= first_block_id); FilePtr file(boost::nowide::fopen(m_filename.c_str(), "rb")); @@ -785,11 +799,23 @@ void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, s } const size_t ref_id = (i == 0) ? 0 : i - 1; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_NEW_GCODE_VIEWER const size_t first_line_id = (i == 0) ? *m_cache_range.min : (*m_cache_range.min > cumulative_lines_counts[ref_id]) ? *m_cache_range.min - cumulative_lines_counts[ref_id] : 1; const size_t last_line_id = (*m_cache_range.max <= cumulative_lines_counts[i]) ? (i == 0) ? *m_cache_range.max : *m_cache_range.max - cumulative_lines_counts[ref_id] : m_lines_ends[i].size(); assert(last_line_id >= first_line_id); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + const size_t first_line_id = (i == 0) ? *m_cache_range.min : + (*m_cache_range.min > cumulative_lines_counts[ref_id]) ? *m_cache_range.min - cumulative_lines_counts[ref_id] : 1; + const size_t last_line_id = (*m_cache_range.max <= cumulative_lines_counts[i]) ? + (i == 0) ? *m_cache_range.max : *m_cache_range.max - cumulative_lines_counts[ref_id] : m_lines_ends[i].size(); + assert(last_line_id >= first_line_id); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_NEW_GCODE_VIEWER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ for (size_t j = first_line_id; j <= last_line_id; ++j) { const size_t begin = (j == 1) ? 0 : m_lines_ends[i][j - 2]; @@ -811,14 +837,19 @@ void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, s } } } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_NEW_GCODE_VIEWER + assert(m_lines_cache.size() == m_cache_range.size()); +#endif // ENABLE_NEW_GCODE_VIEWER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }; static const ImVec4 LINE_NUMBER_COLOR = ImGuiWrapper::COL_ORANGE_LIGHT; static const ImVec4 SELECTION_RECT_COLOR = ImGuiWrapper::COL_ORANGE_DARK; - static const ImVec4 COMMAND_COLOR = { 0.8f, 0.8f, 0.0f, 1.0f }; + static const ImVec4 COMMAND_COLOR = { 0.8f, 0.8f, 0.0f, 1.0f }; static const ImVec4 PARAMETERS_COLOR = { 1.0f, 1.0f, 1.0f, 1.0f }; - static const ImVec4 COMMENT_COLOR = { 0.7f, 0.7f, 0.7f, 1.0f }; - static const ImVec4 ELLIPSIS_COLOR = { 0.0f, 0.7f, 0.0f, 1.0f }; + static const ImVec4 COMMENT_COLOR = { 0.7f, 0.7f, 0.7f, 1.0f }; + static const ImVec4 ELLIPSIS_COLOR = { 0.0f, 0.7f, 0.0f, 1.0f }; if (!m_visible || m_filename.empty() || m_lines_ends.empty() || curr_line_id == 0) return; @@ -1178,7 +1209,7 @@ void GCodeViewer::load(const GCodeProcessorResult& gcode_result, const Print& pr { //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_NEW_GCODE_VIEWER - m_new_viewer.set_top_layer_only_view(get_app_config()->get_bool("seq_top_layer_only")); + m_new_viewer.set_top_layer_only_view_range(get_app_config()->get_bool("seq_top_layer_only")); std::vector tool_colors; if (m_new_viewer.get_view_type() == libvgcode::EViewType::Tool && !gcode_result.extruder_colors.empty()) diff --git a/src/slic3r/GUI/LibVGCode/Settings.hpp b/src/slic3r/GUI/LibVGCode/Settings.hpp index bbd09fae39..93c6061f9d 100644 --- a/src/slic3r/GUI/LibVGCode/Settings.hpp +++ b/src/slic3r/GUI/LibVGCode/Settings.hpp @@ -23,7 +23,7 @@ struct Settings bool update_colors{ true }; EViewType view_type{ EViewType::FeatureType }; ETimeMode time_mode{ ETimeMode::Normal }; - bool top_layer_only_view{ false }; + bool top_layer_only_view_range{ false }; std::map options_visibility{ { { EOptionType::Travels, false }, diff --git a/src/slic3r/GUI/LibVGCode/ViewRange.cpp b/src/slic3r/GUI/LibVGCode/ViewRange.cpp index 058e4bf243..6ba6cdc3f3 100644 --- a/src/slic3r/GUI/LibVGCode/ViewRange.cpp +++ b/src/slic3r/GUI/LibVGCode/ViewRange.cpp @@ -67,8 +67,8 @@ void ViewRange::set_global_range(uint32_t min, uint32_t max) void ViewRange::reset() { - m_global.reset(); m_current.reset(); + m_global.reset(); } } // namespace libvgcode diff --git a/src/slic3r/GUI/LibVGCode/Viewer.cpp b/src/slic3r/GUI/LibVGCode/Viewer.cpp index df1acc13b4..118f76e0b6 100644 --- a/src/slic3r/GUI/LibVGCode/Viewer.cpp +++ b/src/slic3r/GUI/LibVGCode/Viewer.cpp @@ -73,14 +73,14 @@ void Viewer::set_layers_range(uint32_t min, uint32_t max) m_impl.set_layers_range(min, max); } -bool Viewer::is_top_layer_only_view() const +bool Viewer::is_top_layer_only_view_range() const { - return m_impl.is_top_layer_only_view(); + return m_impl.is_top_layer_only_view_range(); } -void Viewer::set_top_layer_only_view(bool top_layer_only_view) +void Viewer::set_top_layer_only_view_range(bool top_layer_only_view_range) { - m_impl.set_top_layer_only_view(top_layer_only_view); + m_impl.set_top_layer_only_view_range(top_layer_only_view_range); } bool Viewer::is_option_visible(EOptionType type) const diff --git a/src/slic3r/GUI/LibVGCode/Viewer.hpp b/src/slic3r/GUI/LibVGCode/Viewer.hpp index a86288d2f3..8aed980462 100644 --- a/src/slic3r/GUI/LibVGCode/Viewer.hpp +++ b/src/slic3r/GUI/LibVGCode/Viewer.hpp @@ -49,8 +49,8 @@ public: void set_layers_range(const std::array& range); void set_layers_range(uint32_t min, uint32_t max); - bool is_top_layer_only_view() const; - void set_top_layer_only_view(bool top_layer_only_view); + bool is_top_layer_only_view_range() const; + void set_top_layer_only_view_range(bool top_layer_only_view_range); bool is_option_visible(EOptionType type) const; void toggle_option_visibility(EOptionType type); diff --git a/src/slic3r/GUI/LibVGCode/ViewerImpl.cpp b/src/slic3r/GUI/LibVGCode/ViewerImpl.cpp index e2467644e2..7d5af03cb3 100644 --- a/src/slic3r/GUI/LibVGCode/ViewerImpl.cpp +++ b/src/slic3r/GUI/LibVGCode/ViewerImpl.cpp @@ -752,11 +752,11 @@ void ViewerImpl::update_enabled_entities() // 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) + if (m_settings.top_layer_only_view_range) range[0] = m_view_range.get_global_range()[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()) + if (m_vertices[range[1]].is_option() && range[1] < static_cast(m_vertices.size()) - 1) ++range[1]; for (uint32_t i = range[0]; i < range[1]; ++i) { @@ -830,10 +830,11 @@ void ViewerImpl::update_colors() { update_color_ranges(); - const uint32_t top_layer_id = m_settings.top_layer_only_view ? m_layers_range.get()[1] : 0; + 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]; std::vector colors(m_vertices.size()); for (size_t i = 0; i < m_vertices.size(); i++) { - colors[i] = (m_vertices[i].layer_id < top_layer_id) ? encode_color(Dummy_Color) : encode_color(select_color(m_vertices[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])); } // update gpu buffer for colors @@ -892,9 +893,9 @@ const std::array& ViewerImpl::get_layers_range() const return m_layers_range.get(); } -bool ViewerImpl::is_top_layer_only_view() const +bool ViewerImpl::is_top_layer_only_view_range() const { - return m_settings.top_layer_only_view; + return m_settings.top_layer_only_view_range; } bool ViewerImpl::is_option_visible(EOptionType type) const @@ -946,9 +947,9 @@ void ViewerImpl::set_layers_range(uint32_t min, uint32_t max) m_settings.update_colors = true; } -void ViewerImpl::set_top_layer_only_view(bool top_layer_only_view) +void ViewerImpl::set_top_layer_only_view_range(bool top_layer_only_view_range) { - m_settings.top_layer_only_view = top_layer_only_view; + m_settings.top_layer_only_view_range = top_layer_only_view_range; m_settings.update_colors = true; } @@ -1030,9 +1031,16 @@ void ViewerImpl::set_view_current_range(uint32_t min, uint32_t max) new_range.set(min_id, max_id); if (m_old_current_range != new_range) { + 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_settings.update_enabled_entities = true; + m_settings.update_colors = true; } } @@ -1186,16 +1194,34 @@ void ViewerImpl::set_tool_marker_alpha(float alpha) } #endif // !ENABLE_NEW_GCODE_NO_COG_AND_TOOL_MARKERS +static bool is_visible(EMoveType type, const Settings& settings) +{ + try + { + return ((type == EMoveType::Travel && !settings.options_visibility.at(EOptionType::Travels)) || + (type == EMoveType::Wipe && !settings.options_visibility.at(EOptionType::Wipes)) || + (type == EMoveType::Retract && !settings.options_visibility.at(EOptionType::Retractions)) || + (type == EMoveType::Unretract && !settings.options_visibility.at(EOptionType::Unretractions)) || + (type == EMoveType::Seam && !settings.options_visibility.at(EOptionType::Seams)) || + (type == EMoveType::ToolChange && !settings.options_visibility.at(EOptionType::ToolChanges)) || + (type == EMoveType::ColorChange && !settings.options_visibility.at(EOptionType::ColorChanges)) || + (type == EMoveType::PausePrint && !settings.options_visibility.at(EOptionType::PausePrints)) || + (type == EMoveType::CustomGCode && !settings.options_visibility.at(EOptionType::CustomGCodes))) ? false : true; + } + catch (...) + { + return false; + } +} + void ViewerImpl::update_view_global_range() { const std::array& layers_range = m_layers_range.get(); const bool travels_visible = m_settings.options_visibility.at(EOptionType::Travels); auto first_it = m_vertices.begin(); - while (first_it != m_vertices.end() && ( - first_it->layer_id < layers_range[0] || - first_it->is_option() || - (first_it->is_travel() && !travels_visible))) { + while (first_it != m_vertices.end() && + (first_it->layer_id < layers_range[0] || !is_visible(first_it->type, m_settings))) { ++first_it; } @@ -1213,18 +1239,29 @@ void ViewerImpl::update_view_global_range() while (last_it != m_vertices.end() && last_it->layer_id <= layers_range[1]) { ++last_it; } + if (last_it != first_it) + --last_it; - // remove trailing options, if any + // remove disabled trailing options, if any auto rev_first_it = std::make_reverse_iterator(first_it); + if (rev_first_it != m_vertices.rbegin()) + --rev_first_it; auto rev_last_it = std::make_reverse_iterator(last_it); - while (rev_last_it != rev_first_it && rev_last_it->is_option()) { + if (rev_last_it != m_vertices.rbegin()) + --rev_last_it; + + bool reduced = false; + while (rev_last_it != rev_first_it && !is_visible(rev_last_it->type, m_settings)) { ++rev_last_it; + reduced = true; } - last_it = rev_last_it.base(); + if (reduced && rev_last_it != m_vertices.rend()) + last_it = rev_last_it.base() - 1; + if (travels_visible) { // if the global range ends with a travel move, extend it to the travel end - while (last_it != m_vertices.end() && last_it->is_travel()) { + while (last_it != m_vertices.end() && last_it + 1 != m_vertices.end() && last_it->is_travel()) { ++last_it; } } diff --git a/src/slic3r/GUI/LibVGCode/ViewerImpl.hpp b/src/slic3r/GUI/LibVGCode/ViewerImpl.hpp index a58929db34..72408fb961 100644 --- a/src/slic3r/GUI/LibVGCode/ViewerImpl.hpp +++ b/src/slic3r/GUI/LibVGCode/ViewerImpl.hpp @@ -82,7 +82,7 @@ public: EViewType get_view_type() const; ETimeMode get_time_mode() const; const std::array& get_layers_range() const; - bool is_top_layer_only_view() const; + bool is_top_layer_only_view_range() const; bool is_option_visible(EOptionType type) const; bool is_extrusion_role_visible(EGCodeExtrusionRole role) const; @@ -93,7 +93,7 @@ public: void set_time_mode(ETimeMode mode); void set_layers_range(const std::array& range); void set_layers_range(uint32_t min, uint32_t max); - void set_top_layer_only_view(bool top_layer_only_view); + void set_top_layer_only_view_range(bool top_layer_only_view_range); void toggle_option_visibility(EOptionType type); void toggle_extrusion_role_visibility(EGCodeExtrusionRole role);