diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index e5c30b9261..196cf08c21 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -969,7 +969,7 @@ private: //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_NEW_GCODE_VIEWER libvgcode::Viewer m_new_viewer; - bool m_use_new_viewer{ false }; + bool m_use_new_viewer{ true }; #endif // ENABLE_NEW_GCODE_VIEWER //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ diff --git a/src/slic3r/GUI/LibVGCode/Layers.cpp b/src/slic3r/GUI/LibVGCode/Layers.cpp index 879de7518b..0e55932103 100644 --- a/src/slic3r/GUI/LibVGCode/Layers.cpp +++ b/src/slic3r/GUI/LibVGCode/Layers.cpp @@ -9,6 +9,8 @@ ///|/ #include "Layers.hpp" +#include "PathVertex.hpp" + //################################################################################################################################ // PrusaSlicer development only -> !!!TO BE REMOVED!!! #if ENABLE_NEW_GCODE_VIEWER @@ -18,33 +20,46 @@ namespace libvgcode { -void Layers::update(uint32_t layer_id, uint32_t vertex_id) +static bool is_colorprint_option(const PathVertex& v) { - if (m_ranges.empty() || layer_id == m_ranges.size()) { + return v.type == EMoveType::PausePrint || v.type == EMoveType::CustomGCode; +} + +void Layers::update(const PathVertex& vertex, uint32_t vertex_id) +{ + + if (m_items.empty() || vertex.layer_id == m_items.size()) { // this code assumes that gcode paths are sent sequentially, one layer after the other - assert(layer_id == static_cast(m_ranges.size())); - Range& range = m_ranges.emplace_back(Range()); - range.set(vertex_id, 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.contains_colorprint_options |= is_colorprint_option(vertex); } else { - Range& range = m_ranges.back(); - range.set(range.get()[0], vertex_id); + Item& item = m_items.back(); + item.range.set(item.range.get()[0], vertex_id); + item.contains_colorprint_options |= is_colorprint_option(vertex); } } void Layers::reset() { - m_ranges.clear(); + m_items.clear(); } bool Layers::empty() const { - return m_ranges.empty(); + return m_items.empty(); } -size_t Layers::size() const +size_t Layers::get_layers_count() const { - return m_ranges.size(); + return m_items.size(); +} + +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; } } // namespace libvgcode diff --git a/src/slic3r/GUI/LibVGCode/Layers.hpp b/src/slic3r/GUI/LibVGCode/Layers.hpp index f585cc8b7a..8194a9c8ab 100644 --- a/src/slic3r/GUI/LibVGCode/Layers.hpp +++ b/src/slic3r/GUI/LibVGCode/Layers.hpp @@ -16,17 +16,29 @@ namespace libvgcode { +struct PathVertex; + class Layers { public: - void update(uint32_t layer_id, uint32_t vertex_id); + void update(const PathVertex& vertex, uint32_t vertex_id); void reset(); bool empty() const; - size_t size() const; + size_t get_layers_count() const; + + bool layer_contains_colorprint_options(uint32_t layer_id) const; private: - std::vector m_ranges; + struct Item + { + Range range; + bool contains_colorprint_options{ false }; + + Item() = default; + }; + + std::vector m_items; }; } // namespace libvgcode diff --git a/src/slic3r/GUI/LibVGCode/ViewerImpl.cpp b/src/slic3r/GUI/LibVGCode/ViewerImpl.cpp index f7ae8354b6..e2467644e2 100644 --- a/src/slic3r/GUI/LibVGCode/ViewerImpl.cpp +++ b/src/slic3r/GUI/LibVGCode/ViewerImpl.cpp @@ -607,7 +607,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(static_cast(curr.layer_id), static_cast(m_vertices.size())); + m_layers.update(vertex, static_cast(m_vertices.size())); } } @@ -616,7 +616,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(static_cast(curr.layer_id), static_cast(m_vertices.size())); + m_layers.update(vertex, static_cast(m_vertices.size())); #if !ENABLE_NEW_GCODE_NO_COG_AND_TOOL_MARKERS // updates calculation for center of gravity @@ -738,7 +738,7 @@ void ViewerImpl::load(const Slic3r::GCodeProcessorResult& gcode_result, const GC } if (!m_layers.empty()) - set_layers_range(0, static_cast(m_layers.size() - 1)); + set_layers_range(0, static_cast(m_layers.get_layers_count() - 1)); update_view_global_range(); m_settings.update_colors = true; } @@ -833,8 +833,7 @@ void ViewerImpl::update_colors() const uint32_t top_layer_id = m_settings.top_layer_only_view ? m_layers_range.get()[1] : 0; 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] = (m_vertices[i].layer_id < top_layer_id) ? encode_color(Dummy_Color) : encode_color(select_color(m_vertices[i])); } // update gpu buffer for colors @@ -1332,7 +1331,7 @@ Color ViewerImpl::select_color(const PathVertex& v) const } case EViewType::ColorPrint: { - return m_tool_colors[v.color_id % m_tool_colors.size()]; + return m_layers.layer_contains_colorprint_options(v.layer_id) ? Dummy_Color : m_tool_colors[v.color_id % m_tool_colors.size()]; } default: { break; } }