mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-07-31 21:41:59 +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 (imgui.draw_radio_button(name, 1.5f * icon_size, active, draw_callback)) {
|
||||||
#if ENABLE_NEW_GCODE_VIEWER
|
#if ENABLE_NEW_GCODE_VIEWER
|
||||||
const libvgcode::Interval& view_visible_range = m_viewer.get_view_visible_range();
|
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 libvgcode::Interval view_enabled_range = m_viewer.get_view_enabled_range();
|
||||||
bool keep_visible_range = false;
|
const bool keep_visible_range = view_visible_range != view_enabled_range;
|
||||||
#if ENABLE_COG_AND_TOOL_MARKERS
|
#if ENABLE_COG_AND_TOOL_MARKERS
|
||||||
if (type == Preview::OptionType::Shells)
|
if (type == Preview::OptionType::Shells)
|
||||||
m_shells.visible = !active;
|
m_shells.visible = !active;
|
||||||
else {
|
else
|
||||||
m_viewer.toggle_option_visibility(libvgcode::convert(type));
|
m_viewer.toggle_option_visibility(libvgcode::convert(type));
|
||||||
if (view_visible_range != view_enabled_range)
|
|
||||||
keep_visible_range = true;
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case Preview::OptionType::CenterOfGravity: { m_cog.set_visible(!active); break; }
|
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::ToolMarker: { m_sequential_view.marker.set_visible(!active); break; }
|
||||||
case Preview::OptionType::Shells: { m_shells.visible = !active; break; }
|
case Preview::OptionType::Shells: { m_shells.visible = !active; break; }
|
||||||
default: {
|
default: {
|
||||||
m_viewer.toggle_option_visibility(libvgcode::convert(type));
|
m_viewer.toggle_option_visibility(libvgcode::convert(type));
|
||||||
if (view_visible_range != view_enabled_range)
|
break;
|
||||||
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]);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
#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);
|
wxGetApp().plater()->update_preview_moves_slider(view_visible_range_min, view_visible_range_max);
|
||||||
#else
|
#else
|
||||||
unsigned int new_flags = set_flag(flags, flag, !active);
|
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();
|
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;
|
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;
|
const size_t range_size = range[1] - range[0] + 1;
|
||||||
std::vector<double> values;
|
std::vector<double> values;
|
||||||
@ -750,28 +754,33 @@ void Preview::update_moves_slider()
|
|||||||
|
|
||||||
for (size_t i = range[0]; i <= range[1]; ++i) {
|
for (size_t i = range[0]; i <= range[1]; ++i) {
|
||||||
const uint32_t gcode_id = m_canvas->get_gcode_vertex_at(i).gcode_id;
|
const uint32_t gcode_id = m_canvas->get_gcode_vertex_at(i).gcode_id;
|
||||||
|
bool skip = false;
|
||||||
if (i > range[0]) {
|
if (i > range[0]) {
|
||||||
// skip consecutive moves with same gcode id (resulting from processing G2 and G3 lines)
|
// skip consecutive moves with same gcode id (resulting from processing G2 and G3 lines)
|
||||||
if (last_gcode_id == gcode_id) {
|
if (last_gcode_id == gcode_id) {
|
||||||
values.back() = static_cast<double>(i + 1);
|
values.back() = static_cast<double>(i + 1);
|
||||||
alternate_values.back() = static_cast<double>(gcode_id);
|
skip = true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
last_gcode_id = gcode_id;
|
last_gcode_id = gcode_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
values.emplace_back(static_cast<double>(i + 1));
|
if (!skip) {
|
||||||
alternate_values.emplace_back(static_cast<double>(gcode_id));
|
values.emplace_back(static_cast<double>(i + 1));
|
||||||
if (visible_range_min.has_value() && i + 1 == visible_range_min)
|
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;
|
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;
|
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_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() ? static_cast<int>(*visible_range_max_id) : static_cast<int>(values.size()) - 1;
|
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->SetSliderValues(values);
|
||||||
m_moves_slider->SetSliderAlternateValues(alternate_values);
|
m_moves_slider->SetSliderAlternateValues(alternate_values);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user