mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-07-30 23:32:00 +08:00
New gcode visualization integration - Fixed toolpaths visible range when toggling options' visibility
This commit is contained in:
parent
13f9d6f28e
commit
eaa1920bac
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user