New gcode visualization integration - Fixed toolpaths visible range when toggling options' visibility

This commit is contained in:
enricoturri1966 2024-01-08 14:37:09 +01:00 committed by Lukas Matena
parent 13f9d6f28e
commit eaa1920bac
2 changed files with 37 additions and 37 deletions

View File

@ -5600,37 +5600,28 @@ 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 libvgcode::Interval& view_visible_range = m_viewer.get_view_visible_range();
const libvgcode::Interval& view_enabled_range = m_viewer.get_view_enabled_range();
bool keep_visible_range = false;
const libvgcode::Interval view_visible_range = m_viewer.get_view_visible_range();
const libvgcode::Interval view_enabled_range = m_viewer.get_view_enabled_range();
const bool keep_visible_range = view_visible_range != view_enabled_range;
#if ENABLE_COG_AND_TOOL_MARKERS
if (type == Preview::OptionType::Shells)
m_shells.visible = !active;
else {
m_viewer.toggle_option_visibility(libvgcode::convert(type));
if (view_visible_range != view_enabled_range)
keep_visible_range = true;
}
if (type == Preview::OptionType::Shells)
m_shells.visible = !active;
else
m_viewer.toggle_option_visibility(libvgcode::convert(type));
#else
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_viewer.toggle_option_visibility(libvgcode::convert(type));
if (view_visible_range != view_enabled_range)
keep_visible_range = true;
break;
}
}
#endif // ENABLE_COG_AND_TOOL_MARKERS
std::optional<int> view_visible_range_min;
std::optional<int> view_visible_range_max;
if (keep_visible_range) {
view_visible_range_min = static_cast<int>(view_visible_range[0]);
view_visible_range_max = static_cast<int>(view_visible_range[1]);
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_viewer.toggle_option_visibility(libvgcode::convert(type));
break;
}
}
#endif // ENABLE_COG_AND_TOOL_MARKERS
std::optional<int> view_visible_range_min = keep_visible_range ? std::optional<int>{ static_cast<int>(view_visible_range[0]) } : std::nullopt;
std::optional<int> view_visible_range_max = keep_visible_range ? std::optional<int>{ static_cast<int>(view_visible_range[1]) } : std::nullopt;
wxGetApp().plater()->update_preview_moves_slider(view_visible_range_min, view_visible_range_max);
#else
unsigned int new_flags = set_flag(flags, flag, !active);

View File

@ -737,6 +737,10 @@ void Preview::update_moves_slider()
const libvgcode::Interval& range = m_canvas->get_gcode_view_enabled_range();
uint32_t last_gcode_id = m_canvas->get_gcode_vertex_at(range[0]).gcode_id;
std::optional<uint32_t> gcode_id_min = visible_range_min.has_value() ?
std::optional<uint32_t>{ m_canvas->get_gcode_vertex_at(*visible_range_min).gcode_id } : std::nullopt;
std::optional<uint32_t> gcode_id_max = visible_range_max.has_value() ?
std::optional<uint32_t>{ m_canvas->get_gcode_vertex_at(*visible_range_max).gcode_id } : std::nullopt;
const size_t range_size = range[1] - range[0] + 1;
std::vector<double> values;
@ -750,28 +754,33 @@ void Preview::update_moves_slider()
for (size_t i = range[0]; i <= range[1]; ++i) {
const uint32_t gcode_id = m_canvas->get_gcode_vertex_at(i).gcode_id;
bool skip = false;
if (i > range[0]) {
// skip consecutive moves with same gcode id (resulting from processing G2 and G3 lines)
if (last_gcode_id == gcode_id) {
values.back() = static_cast<double>(i + 1);
alternate_values.back() = static_cast<double>(gcode_id);
continue;
skip = true;
}
else
last_gcode_id = gcode_id;
}
values.emplace_back(static_cast<double>(i + 1));
alternate_values.emplace_back(static_cast<double>(gcode_id));
if (visible_range_min.has_value() && i + 1 == visible_range_min)
if (!skip) {
values.emplace_back(static_cast<double>(i + 1));
alternate_values.emplace_back(static_cast<double>(gcode_id));
}
if (gcode_id_min.has_value() && alternate_values.back() == static_cast<double>(*gcode_id_min))
visible_range_min_id = counter;
else if (visible_range_max.has_value() && i + 1 == visible_range_max)
else if (gcode_id_max.has_value() && alternate_values.back() == static_cast<double>(*gcode_id_max))
visible_range_max_id = counter;
++counter;
if (!skip)
++counter;
}
const int span_min_id = visible_range_min_id.has_value() ? static_cast<int>(*visible_range_min_id) : 0;
const int span_max_id = visible_range_max_id.has_value() ? static_cast<int>(*visible_range_max_id) : static_cast<int>(values.size()) - 1;
const int span_min_id = visible_range_min_id.has_value() ? std::max(0, static_cast<int>(*visible_range_min_id) - 1) : 0;
const int span_max_id = visible_range_max_id.has_value() ? std::max(0, static_cast<int>(*visible_range_max_id) - 1) : static_cast<int>(values.size()) - 1;
m_moves_slider->SetSliderValues(values);
m_moves_slider->SetSliderAlternateValues(alternate_values);