diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 067d4c27fe..0c3194fd8f 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -4811,8 +4811,16 @@ void GCodeViewer::render_legend(float& legend_height) append_item(EItemType::Rect, libvgcode::convert(libvgcode::Extrusion_Roles_Colors[static_cast(role)]), labels[i], visible, times[i], percents[i], max_time_percent, offsets, used_filaments_m[i], used_filaments_g[i], [this, role]() { + const std::array view_visible_range = m_new_viewer.get_view_visible_range(); + const std::array view_enabled_range = m_new_viewer.get_view_enabled_range(); m_new_viewer.toggle_extrusion_role_visibility((libvgcode::EGCodeExtrusionRole)role); - wxGetApp().plater()->update_preview_moves_slider(); + std::optional view_visible_range_min; + std::optional view_visible_range_max; + if (view_visible_range != view_enabled_range) { + view_visible_range_min = static_cast(view_visible_range[0]); + view_visible_range_max = static_cast(view_visible_range[1]); + } + wxGetApp().plater()->update_preview_moves_slider(view_visible_range_min, view_visible_range_max); wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); } ); @@ -5527,20 +5535,38 @@ void GCodeViewer::render_legend(float& legend_height) if (imgui.draw_radio_button(name, 1.5f * icon_size, active, draw_callback)) { //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_NEW_GCODE_VIEWER + const std::array view_visible_range = m_new_viewer.get_view_visible_range(); + const std::array view_enabled_range = m_new_viewer.get_view_enabled_range(); + bool keep_visible_range = false; #if ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS switch (type) { case Preview::OptionType::CenterOfGravity: { m_cog.set_visible(!active); break; } case Preview::OptionType::ToolMarker: { m_sequential_view.marker.set_visible(!active); break; } case Preview::OptionType::Shells: { m_shells.visible = !active; break; } - default: { m_new_viewer.toggle_option_visibility(libvgcode::convert(type)); break; } + default: { + m_new_viewer.toggle_option_visibility(libvgcode::convert(type)); + if (view_visible_range != view_enabled_range) + keep_visible_range = true; + break; + } } #else if (type == Preview::OptionType::Shells) m_shells.visible = !active; - else + else { m_new_viewer.toggle_option_visibility(libvgcode::convert(type)); + if (view_visible_range != view_enabled_range) + keep_visible_range = true; + } #endif // ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS + std::optional view_visible_range_min; + std::optional view_visible_range_max; + if (keep_visible_range) { + view_visible_range_min = static_cast(view_visible_range[0]); + view_visible_range_max = static_cast(view_visible_range[1]); + } + wxGetApp().plater()->update_preview_moves_slider(view_visible_range_min, view_visible_range_max); #else //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ unsigned int new_flags = set_flag(flags, flag, !active); @@ -5554,10 +5580,10 @@ void GCodeViewer::render_legend(float& legend_height) bool keep_last = m_sequential_view.current.last != m_sequential_view.global.last; wxGetApp().plater()->get_current_canvas3D()->refresh_gcode_preview_render_paths(keep_first, keep_last); } + wxGetApp().plater()->update_preview_moves_slider(); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_NEW_GCODE_VIEWER //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - wxGetApp().plater()->update_preview_moves_slider(); } if (ImGui::IsItemHovered()) { diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 5c9485d4f9..56c530063b 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -710,7 +710,15 @@ void Preview::update_layers_slider_from_canvas(wxKeyEvent& event) event.Skip(); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_NEW_GCODE_VIEWER +void Preview::update_moves_slider(std::optional visible_range_min, std::optional visible_range_max) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void Preview::update_moves_slider() +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_NEW_GCODE_VIEWER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_NEW_GCODE_VIEWER @@ -723,6 +731,10 @@ void Preview::update_moves_slider() std::vector alternate_values; alternate_values.reserve(range_size); + std::optional visible_range_min_id; + std::optional visible_range_max_id; + uint32_t counter = 0; + for (uint32_t i = range[0]; i <= range[1]; ++i) { const uint32_t gcode_id = m_canvas->get_gcode_vertex_at(static_cast(i)).gcode_id; if (i > range[0]) { @@ -738,12 +750,20 @@ void Preview::update_moves_slider() values.emplace_back(static_cast(i + 1)); alternate_values.emplace_back(static_cast(gcode_id)); + if (visible_range_min.has_value() && i + 1 == visible_range_min) + visible_range_min_id = counter; + else if (visible_range_max.has_value() && i + 1 == visible_range_max) + visible_range_max_id = counter; + ++counter; } + const int span_min_id = visible_range_min_id.has_value() ? static_cast(*visible_range_min_id) : 0; + const int span_max_id = visible_range_max_id.has_value() ? static_cast(*visible_range_max_id) : static_cast(values.size()) - 1; + m_moves_slider->SetSliderValues(values); m_moves_slider->SetSliderAlternateValues(alternate_values); - m_moves_slider->SetMaxValue(int(values.size()) - 1); - m_moves_slider->SetSelectionSpan(values.front() - 1 - range[0], values.back() - 1 - range[0]); + m_moves_slider->SetMaxValue(static_cast(values.size()) - 1); + m_moves_slider->SetSelectionSpan(span_min_id, span_max_id); #else //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ const GCodeViewer::SequentialView& view = m_canvas->get_gcode_sequential_view(); diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index eb4bfbe846..4a1adae79d 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -149,7 +149,15 @@ public: bool is_loaded() const { return m_loaded; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_NEW_GCODE_VIEWER + void update_moves_slider(std::optional visible_range_min = std::nullopt, std::optional visible_range_max = std::nullopt); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void update_moves_slider(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_NEW_GCODE_VIEWER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void enable_moves_slider(bool enable); void move_moves_slider(wxKeyEvent& evt); void hide_layers_slider(); diff --git a/src/slic3r/GUI/LibVGCode/src/ViewRange.cpp b/src/slic3r/GUI/LibVGCode/src/ViewRange.cpp index 78adb42f3e..70fac55987 100644 --- a/src/slic3r/GUI/LibVGCode/src/ViewRange.cpp +++ b/src/slic3r/GUI/LibVGCode/src/ViewRange.cpp @@ -40,12 +40,9 @@ void ViewRange::set_full(uint32_t min, uint32_t max) m_full.clamp(m_enabled); // force the visible range to stay inside the modified enabled range m_enabled.clamp(m_visible); - if (new_max) { + if (new_max) // force the enabled range to fill the extended full range m_enabled.set_max(max); - // force the visible range to fill the extended enabled range - m_visible.set_max(max); - } } const std::array& ViewRange::get_enabled() const diff --git a/src/slic3r/GUI/LibVGCode/src/ViewerImpl.cpp b/src/slic3r/GUI/LibVGCode/src/ViewerImpl.cpp index 7843ed6496..bcf244ca2b 100644 --- a/src/slic3r/GUI/LibVGCode/src/ViewerImpl.cpp +++ b/src/slic3r/GUI/LibVGCode/src/ViewerImpl.cpp @@ -397,6 +397,9 @@ void ViewerImpl::reset() m_cog_marker.reset(); #endif // !ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS + m_enabled_segments_count = 0; + m_enabled_options_count = 0; + delete_textures(m_enabled_options_tex_id); delete_buffers(m_enabled_options_buf_id); @@ -642,7 +645,7 @@ void ViewerImpl::update_colors() const uint32_t top_layer_id = m_settings.top_layer_only_view_range ? m_layers.get_view_range()[1] : 0; const bool color_top_layer_only = m_view_range.get_full()[1] != m_view_range.get_visible()[1]; std::vector colors(m_vertices.size()); - for (size_t i = 0; i < m_vertices.size(); i++) { + for (size_t i = 0; i < m_vertices.size(); ++i) { colors[i] = (color_top_layer_only && m_vertices[i].layer_id < top_layer_id && (!m_settings.spiral_vase_mode || i != m_view_range.get_enabled()[0])) ? encode_color(Dummy_Color) : encode_color(select_color(m_vertices[i])); @@ -801,7 +804,7 @@ void ViewerImpl::toggle_option_visibility(EOptionType type) try { bool& value = m_settings.options_visibility.at(type); value = !value; - m_settings.update_view_full_range = true; + update_view_full_range(); m_settings.update_enabled_entities = true; m_settings.update_colors = true; } @@ -855,7 +858,7 @@ void ViewerImpl::set_view_visible_range(uint32_t min, uint32_t max) // when calling m_view_range.set_visible() update_view_full_range(); m_view_range.set_visible(min, max); - m_settings.update_enabled_entities = true; + update_enabled_entities(); m_settings.update_colors = true; } @@ -1165,7 +1168,10 @@ void ViewerImpl::update_view_full_range() } } - m_view_range.set_full(std::distance(m_vertices.begin(), first_it), std::distance(m_vertices.begin(), last_it)); + if (first_it != last_it) + m_view_range.set_full(std::distance(m_vertices.begin(), first_it), std::distance(m_vertices.begin(), last_it)); + else + m_view_range.set_full(Range()); if (m_settings.top_layer_only_view_range) { const std::array& full_range = m_view_range.get_full(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index cd446795b3..d48fb8d81b 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -393,7 +393,15 @@ struct Plater::priv void set_preview_layers_slider_values_range(int bottom, int top); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_NEW_GCODE_VIEWER + void update_preview_moves_slider(std::optional visible_range_min = std::nullopt, std::optional visible_range_max = std::nullopt); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void update_preview_moves_slider(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_NEW_GCODE_VIEWER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void enable_preview_moves_slider(bool enable); void reset_gcode_toolpaths(); @@ -3316,10 +3324,21 @@ void Plater::priv::set_preview_layers_slider_values_range(int bottom, int top) preview->set_layers_slider_values_range(bottom, top); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_NEW_GCODE_VIEWER +void Plater::priv::update_preview_moves_slider(std::optional visible_range_min, std::optional visible_range_max) +{ + preview->update_moves_slider(visible_range_min, visible_range_max); +} +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void Plater::priv::update_preview_moves_slider() { preview->update_moves_slider(); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_NEW_GCODE_VIEWER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void Plater::priv::enable_preview_moves_slider(bool enable) { @@ -6779,10 +6798,21 @@ void Plater::set_preview_layers_slider_values_range(int bottom, int top) p->set_preview_layers_slider_values_range(bottom, top); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_NEW_GCODE_VIEWER +void Plater::update_preview_moves_slider(std::optional visible_range_min, std::optional visible_range_max) +{ + p->update_preview_moves_slider(visible_range_min, visible_range_max); +} +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void Plater::update_preview_moves_slider() { p->update_preview_moves_slider(); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_NEW_GCODE_VIEWER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void Plater::enable_preview_moves_slider(bool enable) { diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 7455227597..fc04af070f 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -336,7 +336,15 @@ public: void set_preview_layers_slider_values_range(int bottom, int top); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_NEW_GCODE_VIEWER + void update_preview_moves_slider(std::optional visible_range_min = std::nullopt, std::optional visible_range_max = std::nullopt); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void update_preview_moves_slider(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_NEW_GCODE_VIEWER +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void enable_preview_moves_slider(bool enable); void reset_gcode_toolpaths();