Refactoring

This commit is contained in:
enricoturri1966 2023-12-15 14:21:11 +01:00 committed by Lukas Matena
parent 137495dd88
commit f11fdf4432
17 changed files with 261 additions and 276 deletions

View File

@ -1176,9 +1176,9 @@ void GCodeViewer::load_as_gcode(const GCodeProcessorResult& gcode_result, const
m_viewer.load(std::move(data));
#if ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS
const uint32_t vertices_count = m_viewer.get_vertices_count();
const size_t vertices_count = m_viewer.get_vertices_count();
m_cog.reset();
for (uint32_t i = 1; i < vertices_count; ++i) {
for (size_t i = 1; i < vertices_count; ++i) {
const libvgcode::PathVertex& curr = m_viewer.get_vertex_at(i);
if (curr.type == libvgcode::EMoveType::Extrude &&
curr.role != libvgcode::EGCodeExtrusionRole::Skirt &&
@ -1539,9 +1539,10 @@ void GCodeViewer::render()
if (m_viewer.get_layers_count() > 0) {
render_legend(legend_height);
if (m_viewer.get_view_enabled_range()[1] != m_viewer.get_view_visible_range()[1]) {
m_sequential_view.marker.set_world_position(libvgcode::convert(m_viewer.get_current_vertex().position));
const libvgcode::PathVertex& curr_vertex = m_viewer.get_current_vertex();
m_sequential_view.marker.set_world_position(libvgcode::convert(curr_vertex.position));
m_sequential_view.marker.set_z_offset(m_z_offset);
m_sequential_view.render(legend_height, &m_viewer, m_viewer.get_current_vertex().gcode_id);
m_sequential_view.render(legend_height, &m_viewer, curr_vertex.gcode_id);
}
#else
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ -1611,7 +1612,7 @@ bool GCodeViewer::can_export_toolpaths() const
{
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#if ENABLE_NEW_GCODE_VIEWER
const std::array<uint32_t, 2>& visible_range = m_viewer.get_view_visible_range();
const libvgcode::Interval& visible_range = m_viewer.get_view_visible_range();
for (size_t i = visible_range[0]; i <= visible_range[1]; ++i) {
if (m_viewer.get_vertex_at(i).is_extrusion())
return true;
@ -1630,7 +1631,7 @@ void GCodeViewer::update_sequential_view_current(unsigned int first, unsigned in
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#if ENABLE_NEW_GCODE_VIEWER
m_viewer.set_view_visible_range(static_cast<uint32_t>(first), static_cast<uint32_t>(last));
const std::array<uint32_t, 2>& enabled_range = m_viewer.get_view_enabled_range();
const libvgcode::Interval& enabled_range = m_viewer.get_view_enabled_range();
wxGetApp().plater()->enable_preview_moves_slider(enabled_range[1] > enabled_range[0]);
#else
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ -1798,7 +1799,7 @@ public:
fprintf(f_mat.f, "# G-Code Toolpaths Materials\n");
fprintf(f_mat.f, "# Generated by %s-%s based on Slic3r\n", SLIC3R_APP_NAME, SLIC3R_VERSION);
const std::array<uint32_t, 2>& visible_range = m_viewer.get_view_visible_range();
const libvgcode::Interval& visible_range = m_viewer.get_view_visible_range();
for (size_t i = visible_range[0]; i <= visible_range[1]; ++i) {
const libvgcode::PathVertex& curr = m_viewer.get_vertex_at(i);
const libvgcode::PathVertex& next = m_viewer.get_vertex_at(i + 1);
@ -3989,7 +3990,7 @@ void GCodeViewer::render_new_toolpaths()
ImGui::TableSetColumnIndex(0);
imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "# enabled lines");
ImGui::TableSetColumnIndex(1);
const std::array<uint32_t, 2>& enabled_segments_range = m_viewer.get_enabled_segments_range();
const libvgcode::Interval& enabled_segments_range = m_viewer.get_enabled_segments_range();
imgui.text(std::to_string(m_viewer.get_enabled_segments_count()) + " [" + std::to_string(enabled_segments_range[0]) +
"-" + std::to_string(enabled_segments_range[1]) + "]");
@ -3997,7 +3998,7 @@ void GCodeViewer::render_new_toolpaths()
ImGui::TableSetColumnIndex(0);
imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "# enabled options");
ImGui::TableSetColumnIndex(1);
const std::array<uint32_t, 2>& enabled_options_range = m_viewer.get_enabled_options_range();
const libvgcode::Interval& enabled_options_range = m_viewer.get_enabled_options_range();
imgui.text(std::to_string(m_viewer.get_enabled_options_count()) + " [" + std::to_string(enabled_options_range[0]) +
"-" + std::to_string(enabled_options_range[1]) + "]");
@ -4007,14 +4008,14 @@ void GCodeViewer::render_new_toolpaths()
ImGui::TableSetColumnIndex(0);
imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "layers range");
ImGui::TableSetColumnIndex(1);
const std::array<uint32_t, 2>& layers_range = m_viewer.get_layers_view_range();
const libvgcode::Interval& layers_range = m_viewer.get_layers_view_range();
imgui.text(std::to_string(layers_range[0]) + " - " + std::to_string(layers_range[1]));
ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0);
imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "view range (full)");
ImGui::TableSetColumnIndex(1);
const std::array<uint32_t, 2>& full_view_range = m_viewer.get_view_full_range();
const libvgcode::Interval& full_view_range = m_viewer.get_view_full_range();
imgui.text(std::to_string(full_view_range[0]) + " - " + std::to_string(full_view_range[1]) + " | " +
std::to_string(m_viewer.get_vertex_at(full_view_range[0]).gcode_id) + " - " +
std::to_string(m_viewer.get_vertex_at(full_view_range[1]).gcode_id));
@ -4023,7 +4024,7 @@ void GCodeViewer::render_new_toolpaths()
ImGui::TableSetColumnIndex(0);
imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "view range (enabled)");
ImGui::TableSetColumnIndex(1);
const std::array<uint32_t, 2>& enabled_view_range = m_viewer.get_view_enabled_range();
const libvgcode::Interval& enabled_view_range = m_viewer.get_view_enabled_range();
imgui.text(std::to_string(enabled_view_range[0]) + " - " + std::to_string(enabled_view_range[1]) + " | " +
std::to_string(m_viewer.get_vertex_at(enabled_view_range[0]).gcode_id) + " - " +
std::to_string(m_viewer.get_vertex_at(enabled_view_range[1]).gcode_id));
@ -4032,7 +4033,7 @@ void GCodeViewer::render_new_toolpaths()
ImGui::TableSetColumnIndex(0);
imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "view range (visible)");
ImGui::TableSetColumnIndex(1);
const std::array<uint32_t, 2>& visible_view_range = m_viewer.get_view_visible_range();
const libvgcode::Interval& visible_view_range = m_viewer.get_view_visible_range();
imgui.text(std::to_string(visible_view_range[0]) + " - " + std::to_string(visible_view_range[1]) + " | " +
std::to_string(m_viewer.get_vertex_at(visible_view_range[0]).gcode_id) + " - " +
std::to_string(m_viewer.get_vertex_at(visible_view_range[1]).gcode_id));
@ -5152,8 +5153,8 @@ void GCodeViewer::render_legend(float& legend_height)
append_item(EItemType::Rect, libvgcode::convert(m_viewer.get_extrusion_role_color(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<uint32_t, 2> view_visible_range = m_viewer.get_view_visible_range();
const std::array<uint32_t, 2> view_enabled_range = m_viewer.get_view_enabled_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();
m_viewer.toggle_extrusion_role_visibility((libvgcode::EGCodeExtrusionRole)role);
std::optional<int> view_visible_range_min;
std::optional<int> view_visible_range_max;
@ -5884,8 +5885,8 @@ 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<uint32_t, 2> view_visible_range = m_viewer.get_view_visible_range();
const std::array<uint32_t, 2> view_enabled_range = m_viewer.get_view_enabled_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();
bool keep_visible_range = false;
#if ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS
switch (type)

View File

@ -1053,21 +1053,21 @@ public:
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#if ENABLE_NEW_GCODE_VIEWER
const std::array<uint32_t, 2>& get_gcode_view_full_range() const { return m_viewer.get_view_full_range(); }
const std::array<uint32_t, 2>& get_gcode_view_enabled_range() const { return m_viewer.get_view_enabled_range(); }
const std::array<uint32_t, 2>& get_gcode_view_visible_range() const { return m_viewer.get_view_visible_range(); }
libvgcode::PathVertex get_gcode_vertex_at(size_t id) const { return m_viewer.get_vertex_at(id); }
const libvgcode::Interval& get_gcode_view_full_range() const { return m_viewer.get_view_full_range(); }
const libvgcode::Interval& get_gcode_view_enabled_range() const { return m_viewer.get_view_enabled_range(); }
const libvgcode::Interval& get_gcode_view_visible_range() const { return m_viewer.get_view_visible_range(); }
const libvgcode::PathVertex& get_gcode_vertex_at(size_t id) const { return m_viewer.get_vertex_at(id); }
#endif // ENABLE_NEW_GCODE_VIEWER
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
bool is_contained_in_bed() const { return m_contained_in_bed; }
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#if ENABLE_NEW_GCODE_VIEWER
void set_view_type(libvgcode::EViewType type) { m_viewer.set_view_type(type); }
libvgcode::EViewType get_view_type() const { return m_viewer.get_view_type(); }
#else
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
EViewType get_view_type() const { return m_view_type; }
void set_view_type(EViewType type) {
if (type == EViewType::Count)
@ -1081,9 +1081,9 @@ public:
void set_toolpath_role_visibility_flags(unsigned int flags) { m_extrusions.role_visibility_flags = flags; }
unsigned int get_options_visibility_flags() const;
void set_options_visibility_from_flags(unsigned int flags);
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#endif // ENABLE_NEW_GCODE_VIEWER
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void set_layers_z_range(const std::array<unsigned int, 2>& layers_z_range);
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

View File

@ -744,10 +744,10 @@ public:
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#if ENABLE_NEW_GCODE_VIEWER
void update_gcode_sequential_view_current(unsigned int first, unsigned int last) { m_gcode_viewer.update_sequential_view_current(first, last); }
const std::array<uint32_t, 2>& get_gcode_view_full_range() const { return m_gcode_viewer.get_gcode_view_full_range(); }
const std::array<uint32_t, 2>& get_gcode_view_enabled_range() const { return m_gcode_viewer.get_gcode_view_enabled_range(); }
const std::array<uint32_t, 2>& get_gcode_view_visible_range() const { return m_gcode_viewer.get_gcode_view_visible_range(); }
libvgcode::PathVertex get_gcode_vertex_at(size_t id) const { return m_gcode_viewer.get_gcode_vertex_at(id); }
const libvgcode::Interval& get_gcode_view_full_range() const { return m_gcode_viewer.get_gcode_view_full_range(); }
const libvgcode::Interval& get_gcode_view_enabled_range() const { return m_gcode_viewer.get_gcode_view_enabled_range(); }
const libvgcode::Interval& get_gcode_view_visible_range() const { return m_gcode_viewer.get_gcode_view_visible_range(); }
const libvgcode::PathVertex& get_gcode_vertex_at(size_t id) const { return m_gcode_viewer.get_gcode_vertex_at(id); }
#else
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void update_gcode_sequential_view_current(unsigned int first, unsigned int last) { m_gcode_viewer.update_sequential_view_current(first, last); }

View File

@ -733,10 +733,10 @@ void Preview::update_moves_slider()
if (m_gcode_result->moves.empty())
return;
const std::array<uint32_t, 2>& range = m_canvas->get_gcode_view_enabled_range();
uint32_t last_gcode_id = m_canvas->get_gcode_vertex_at(static_cast<size_t>(range[0])).gcode_id;
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;
const size_t range_size = static_cast<size_t>(range[1] - range[0] + 1);
const size_t range_size = range[1] - range[0] + 1;
std::vector<double> values;
values.reserve(range_size);
std::vector<double> alternate_values;
@ -746,8 +746,8 @@ void Preview::update_moves_slider()
std::optional<uint32_t> 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<size_t>(i)).gcode_id;
for (size_t i = range[0]; i <= range[1]; ++i) {
const uint32_t gcode_id = m_canvas->get_gcode_vertex_at(i).gcode_id;
if (i > range[0]) {
// skip consecutive moves with same gcode id (resulting from processing G2 and G3 lines)
if (last_gcode_id == gcode_id) {

View File

@ -713,8 +713,7 @@ static void convert_objects_to_vertices(const Slic3r::SpanOfConstPtrs<Slic3r::Pr
layers.reserve(layers.size() + data.layers_zs.size());
std::copy(data.layers_zs.begin(), data.layers_zs.end(), std::back_inserter(layers));
}
std::sort(layers.begin(), layers.end(), [](float z1, float z2) { return z1 < z2; });
layers.erase(std::unique(layers.begin(), layers.end(), [](float z1, float z2) { return z1 == z2; }), layers.end());
Slic3r::sort_remove_duplicates(layers);
// collect extracted vertices layer by layer
float min_z = 0.0f;

View File

@ -22,7 +22,7 @@ struct PathVertex
//
// Segment end position
//
Vec3 position{ 0.0f, 0.0f, 0.0f };
Vec3 position{ FLT_MAX, FLT_MAX, FLT_MAX };
//
// Segment height
//
@ -102,6 +102,8 @@ struct PathVertex
bool is_custom_gcode() const;
};
static const PathVertex Dummy_Path_Vertex = PathVertex();
} // namespace libvgcode
//################################################################################################################################

View File

@ -54,6 +54,13 @@ using Color = std::array<uint8_t, 3>;
//
using AABox = std::array<Vec3, 2>;
//
// One dimensional natural numbers interval
// [0] -> min
// [1] -> max
//
using Interval = std::array<size_t, 2>;
//
// View types
//

View File

@ -40,9 +40,9 @@ public:
ETimeMode get_time_mode() const;
void set_time_mode(ETimeMode mode);
const std::array<uint32_t, 2>& get_layers_view_range() const;
void set_layers_view_range(const std::array<uint32_t, 2>& range);
void set_layers_view_range(uint32_t min, uint32_t max);
const Interval& get_layers_view_range() const;
void set_layers_view_range(const Interval& range);
void set_layers_view_range(Interval::value_type min, Interval::value_type max);
bool is_top_layer_only_view_range() const;
void set_top_layer_only_view_range(bool top_layer_only_view_range);
@ -64,9 +64,9 @@ public:
bool is_extrusion_role_visible(EGCodeExtrusionRole role) const;
void toggle_extrusion_role_visibility(EGCodeExtrusionRole role);
const std::array<uint32_t, 2>& get_view_full_range() const;
const std::array<uint32_t, 2>& get_view_enabled_range() const;
const std::array<uint32_t, 2>& get_view_visible_range() const;
const Interval& get_view_full_range() const;
const Interval& get_view_enabled_range() const;
const Interval& get_view_visible_range() const;
//
// min must be smaller than max
@ -77,17 +77,17 @@ public:
//
// Return the count of vertices used to render the toolpaths
//
uint32_t get_vertices_count() const;
size_t get_vertices_count() const;
//
// Return the vertex pointed by the max value of the view current range
//
PathVertex get_current_vertex() const;
const PathVertex& get_current_vertex() const;
//
// Return the vertex at the given index
//
PathVertex get_vertex_at(uint32_t id) const;
const PathVertex& get_vertex_at(size_t id) const;
Color get_vertex_color(const PathVertex& vertex) const;
@ -96,14 +96,14 @@ public:
//
size_t get_enabled_segments_count() const;
const std::array<uint32_t, 2>& get_enabled_segments_range() const;
const Interval& get_enabled_segments_range() const;
//
// Return the count of options enabled for rendering
//
size_t get_enabled_options_count() const;
const std::array<uint32_t, 2>& get_enabled_options_range() const;
const Interval& get_enabled_options_range() const;
//
// Return the count of detected extrusion roles

View File

@ -94,7 +94,7 @@ float Layers::get_layer_time(ETimeMode mode, size_t layer_id) const
float Layers::get_layer_z(size_t layer_id) const
{
return (layer_id < m_items.size()) ? m_items[layer_id].z : 0.0f;
return (layer_id < m_items.size()) ? m_items[layer_id].z : 0.0f;
}
size_t Layers::get_layer_id_at(float z) const
@ -103,17 +103,17 @@ size_t Layers::get_layer_id_at(float z) const
return std::distance(m_items.begin(), iter);
}
const std::array<uint32_t, 2>& Layers::get_view_range() const
const Interval& Layers::get_view_range() const
{
return m_view_range.get();
}
void Layers::set_view_range(const std::array<uint32_t, 2>& range)
void Layers::set_view_range(const Interval& range)
{
set_view_range(range[0], range[1]);
}
void Layers::set_view_range(uint32_t min, uint32_t max)
void Layers::set_view_range(Interval::value_type min, Interval::value_type max)
{
m_view_range.set(min, max);
}

View File

@ -10,7 +10,6 @@
#if ENABLE_NEW_GCODE_VIEWER
//################################################################################################################################
#include "../include/Types.hpp"
#include "Range.hpp"
namespace libvgcode {
@ -20,36 +19,36 @@ struct PathVertex;
class Layers
{
public:
void update(const PathVertex& vertex, uint32_t vertex_id);
void reset();
bool empty() const;
size_t count() const;
std::vector<float> get_times(ETimeMode mode) const;
std::vector<float> get_zs() const;
float get_layer_time(ETimeMode mode, size_t layer_id) const;
float get_layer_z(size_t layer_id) const;
size_t get_layer_id_at(float z) const;
const std::array<uint32_t, 2>& get_view_range() const;
void set_view_range(const std::array<uint32_t, 2>& range);
void set_view_range(uint32_t min, uint32_t max);
bool layer_contains_colorprint_options(size_t layer_id) const;
void update(const PathVertex& vertex, uint32_t vertex_id);
void reset();
bool empty() const;
size_t count() const;
std::vector<float> get_times(ETimeMode mode) const;
std::vector<float> get_zs() const;
float get_layer_time(ETimeMode mode, size_t layer_id) const;
float get_layer_z(size_t layer_id) const;
size_t get_layer_id_at(float z) const;
const Interval& get_view_range() const;
void set_view_range(const Interval& range);
void set_view_range(Interval::value_type min, Interval::value_type max);
bool layer_contains_colorprint_options(size_t layer_id) const;
private:
struct Item
{
float z{ 0.0f };
Range range;
std::array<float, Time_Modes_Count> times{ 0.0f, 0.0f };
bool contains_colorprint_options{ false };
};
std::vector<Item> m_items;
Range m_view_range;
struct Item
{
float z{ 0.0f };
Range range;
std::array<float, Time_Modes_Count> times{ 0.0f, 0.0f };
bool contains_colorprint_options{ false };
};
std::vector<Item> m_items;
Range m_view_range;
};
} // namespace libvgcode

View File

@ -18,68 +18,68 @@
namespace libvgcode {
const std::array<uint32_t, 2>& Range::get() const
const Interval& Range::get() const
{
return m_range;
return m_range;
}
void Range::set(const Range& other)
{
m_range = other.m_range;
m_range = other.m_range;
}
void Range::set(const std::array<uint32_t, 2>& range)
void Range::set(const Interval& range)
{
set(range[0], range[1]);
set(range[0], range[1]);
}
void Range::set(uint32_t min, uint32_t max)
void Range::set(Interval::value_type min, Interval::value_type max)
{
if (max < min)
std::swap(min, max);
m_range[0] = min;
m_range[1] = max;
if (max < min)
std::swap(min, max);
m_range[0] = min;
m_range[1] = max;
}
uint32_t Range::get_min() const
Interval::value_type Range::get_min() const
{
return m_range[0];
return m_range[0];
}
void Range::set_min(uint32_t min)
void Range::set_min(Interval::value_type min)
{
set(min, m_range[1]);
set(min, m_range[1]);
}
uint32_t Range::get_max() const
Interval::value_type Range::get_max() const
{
return m_range[1];
return m_range[1];
}
void Range::set_max(uint32_t max)
void Range::set_max(Interval::value_type max)
{
set(m_range[0], max);
set(m_range[0], max);
}
void Range::clamp(Range& other)
{
other.m_range[0] = std::clamp(other.m_range[0], m_range[0], m_range[1]);
other.m_range[1] = std::clamp(other.m_range[1], m_range[0], m_range[1]);
other.m_range[0] = std::clamp(other.m_range[0], m_range[0], m_range[1]);
other.m_range[1] = std::clamp(other.m_range[1], m_range[0], m_range[1]);
}
void Range::reset()
{
m_range = { 0, 0 };
m_range = { 0, 0 };
}
bool Range::operator == (const Range& other) const
{
return m_range == other.m_range;
return m_range == other.m_range;
}
bool Range::operator != (const Range& other) const
{
return m_range != other.m_range;
return m_range != other.m_range;
}
} // namespace libvgcode

View File

@ -10,38 +10,33 @@
#if ENABLE_NEW_GCODE_VIEWER
//################################################################################################################################
#include <array>
#include <cstdint>
#include "../include/Types.hpp"
namespace libvgcode {
class Range
{
public:
const std::array<uint32_t, 2>& get() const;
void set(const Range& other);
void set(const std::array<uint32_t, 2>& range);
void set(uint32_t min, uint32_t max);
uint32_t get_min() const;
void set_min(uint32_t min);
uint32_t get_max() const;
void set_max(uint32_t max);
// clamp the given range to stay inside this range
void clamp(Range& other);
void reset();
bool operator == (const Range& other) const;
bool operator != (const Range& other) const;
const Interval& get() const;
void set(const Range& other);
void set(const Interval& range);
void set(Interval::value_type min, Interval::value_type max);
Interval::value_type get_min() const;
void set_min(Interval::value_type min);
Interval::value_type get_max() const;
void set_max(Interval::value_type max);
// clamp the given range to stay inside this range
void clamp(Range& other);
void reset();
bool operator == (const Range& other) const;
bool operator != (const Range& other) const;
private:
//
// [0] = min
// [1] = max
//
std::array<uint32_t, 2> m_range{ 0, 0 };
Interval m_range{ 0, 0 };
};
} // namespace libvgcode

View File

@ -16,89 +16,89 @@
namespace libvgcode {
const std::array<uint32_t, 2>& ViewRange::get_full() const
const Interval& ViewRange::get_full() const
{
return m_full.get();
return m_full.get();
}
void ViewRange::set_full(const Range& other)
{
set_full(other.get());
set_full(other.get());
}
void ViewRange::set_full(const std::array<uint32_t, 2>& range)
void ViewRange::set_full(const Interval& range)
{
set_full(range[0], range[1]);
set_full(range[0], range[1]);
}
void ViewRange::set_full(uint32_t min, uint32_t max)
void ViewRange::set_full(Interval::value_type min, Interval::value_type max)
{
// is the full range being extended ?
const bool new_max = max > m_full.get_max();
m_full.set(min, max);
// force the enabled range to stay inside the modified full range
m_full.clamp(m_enabled);
// force the visible range to stay inside the modified enabled range
m_enabled.clamp(m_visible);
if (new_max)
// force the enabled range to fill the extended full range
m_enabled.set_max(max);
// is the full range being extended ?
const bool new_max = max > m_full.get_max();
m_full.set(min, max);
// force the enabled range to stay inside the modified full range
m_full.clamp(m_enabled);
// force the visible range to stay inside the modified enabled range
m_enabled.clamp(m_visible);
if (new_max)
// force the enabled range to fill the extended full range
m_enabled.set_max(max);
}
const std::array<uint32_t, 2>& ViewRange::get_enabled() const
const Interval& ViewRange::get_enabled() const
{
return m_enabled.get();
return m_enabled.get();
}
void ViewRange::set_enabled(const Range& other)
{
set_enabled(other.get());
set_enabled(other.get());
}
void ViewRange::set_enabled(const std::array<uint32_t, 2>& range)
void ViewRange::set_enabled(const Interval& range)
{
set_enabled(range[0], range[1]);
set_enabled(range[0], range[1]);
}
void ViewRange::set_enabled(uint32_t min, uint32_t max)
void ViewRange::set_enabled(Interval::value_type min, Interval::value_type max)
{
// is the enabled range being extended ?
const bool new_max = max > m_enabled.get_max();
m_enabled.set(min, max);
// force the visible range to stay inside the modified enabled range
m_enabled.clamp(m_visible);
if (new_max)
// force the visible range to fill the extended enabled range
m_visible.set_max(max);
// is the enabled range being extended ?
const bool new_max = max > m_enabled.get_max();
m_enabled.set(min, max);
// force the visible range to stay inside the modified enabled range
m_enabled.clamp(m_visible);
if (new_max)
// force the visible range to fill the extended enabled range
m_visible.set_max(max);
}
const std::array<uint32_t, 2>& ViewRange::get_visible() const
const Interval& ViewRange::get_visible() const
{
return m_visible.get();
return m_visible.get();
}
void ViewRange::set_visible(const Range& other)
{
set_visible(other.get());
set_visible(other.get());
}
void ViewRange::set_visible(const std::array<uint32_t, 2>& range)
void ViewRange::set_visible(const Interval& range)
{
set_visible(range[0], range[1]);
set_visible(range[0], range[1]);
}
void ViewRange::set_visible(uint32_t min, uint32_t max)
void ViewRange::set_visible(Interval::value_type min, Interval::value_type max)
{
m_visible.set(min, max);
// force the visible range to stay inside the enabled range
m_enabled.clamp(m_visible);
m_visible.set(min, max);
// force the visible range to stay inside the enabled range
m_enabled.clamp(m_visible);
}
void ViewRange::reset()
{
m_full.reset();
m_enabled.reset();
m_visible.reset();
m_full.reset();
m_enabled.reset();
m_visible.reset();
}
} // namespace libvgcode

View File

@ -17,43 +17,43 @@ namespace libvgcode {
class ViewRange
{
public:
const std::array<uint32_t, 2>& get_full() const;
void set_full(const Range& other);
void set_full(const std::array<uint32_t, 2>& range);
void set_full(uint32_t min, uint32_t max);
const Interval& get_full() const;
void set_full(const Range& other);
void set_full(const Interval& range);
void set_full(Interval::value_type min, Interval::value_type max);
const std::array<uint32_t, 2>& get_enabled() const;
void set_enabled(const Range& other);
void set_enabled(const std::array<uint32_t, 2>& range);
void set_enabled(uint32_t min, uint32_t max);
const Interval& get_enabled() const;
void set_enabled(const Range& other);
void set_enabled(const Interval& range);
void set_enabled(Interval::value_type min, Interval::value_type max);
const std::array<uint32_t, 2>& get_visible() const;
const Interval& get_visible() const;
void set_visible(const Range& other);
void set_visible(const std::array<uint32_t, 2>& range);
void set_visible(uint32_t min, uint32_t max);
void set_visible(const Interval& range);
void set_visible(Interval::value_type min, Interval::value_type max);
void reset();
void reset();
private:
//
// Full range
// The range of moves that could potentially be visible.
// It is usually equal to the enabled range, unless Settings::top_layer_only_view_range is set to true.
//
Range m_full;
//
// Full range
// The range of moves that could potentially be visible.
// It is usually equal to the enabled range, unless Settings::top_layer_only_view_range is set to true.
//
Range m_full;
//
// Enabled range
// The range of moves that are enabled for visualization.
// It is usually equal to the full range, unless Settings::top_layer_only_view_range is set to true.
//
Range m_enabled;
//
// Enabled range
// The range of moves that are enabled for visualization.
// It is usually equal to the full range, unless Settings::top_layer_only_view_range is set to true.
//
Range m_enabled;
//
// Visible range
// The range of moves that are currently rendered.
//
Range m_visible;
//
// Visible range
// The range of moves that are currently rendered.
//
Range m_visible;
};
} // namespace libvgcode

View File

@ -67,17 +67,17 @@ void Viewer::set_time_mode(ETimeMode mode)
m_impl->set_time_mode(mode);
}
const std::array<uint32_t, 2>& Viewer::get_layers_view_range() const
const Interval& Viewer::get_layers_view_range() const
{
return m_impl->get_layers_view_range();
}
void Viewer::set_layers_view_range(const std::array<uint32_t, 2>& range)
void Viewer::set_layers_view_range(const Interval& range)
{
m_impl->set_layers_view_range(range);
}
void Viewer::set_layers_view_range(uint32_t min, uint32_t max)
void Viewer::set_layers_view_range(Interval::value_type min, Interval::value_type max)
{
m_impl->set_layers_view_range(min, max);
}
@ -147,17 +147,17 @@ void Viewer::toggle_extrusion_role_visibility(EGCodeExtrusionRole role)
m_impl->toggle_extrusion_role_visibility(role);
}
const std::array<uint32_t, 2>& Viewer::get_view_full_range() const
const Interval& Viewer::get_view_full_range() const
{
return m_impl->get_view_full_range();
}
const std::array<uint32_t, 2>& Viewer::get_view_enabled_range() const
const Interval& Viewer::get_view_enabled_range() const
{
return m_impl->get_view_enabled_range();
}
const std::array<uint32_t, 2>& Viewer::get_view_visible_range() const
const Interval& Viewer::get_view_visible_range() const
{
return m_impl->get_view_visible_range();
}
@ -167,17 +167,17 @@ void Viewer::set_view_visible_range(uint32_t min, uint32_t max)
m_impl->set_view_visible_range(min, max);
}
uint32_t Viewer::get_vertices_count() const
size_t Viewer::get_vertices_count() const
{
return m_impl->get_vertices_count();
}
PathVertex Viewer::get_current_vertex() const
const PathVertex& Viewer::get_current_vertex() const
{
return m_impl->get_current_vertex();
}
PathVertex Viewer::get_vertex_at(uint32_t id) const
const PathVertex& Viewer::get_vertex_at(size_t id) const
{
return m_impl->get_vertex_at(id);
}
@ -192,7 +192,7 @@ size_t Viewer::get_enabled_segments_count() const
return m_impl->get_enabled_segments_count();
}
const std::array<uint32_t, 2>& Viewer::get_enabled_segments_range() const
const Interval& Viewer::get_enabled_segments_range() const
{
return m_impl->get_enabled_segments_range();
}
@ -202,7 +202,7 @@ size_t Viewer::get_enabled_options_count() const
return m_impl->get_enabled_options_count();
}
const std::array<uint32_t, 2>& Viewer::get_enabled_options_range() const
const Interval& Viewer::get_enabled_options_range() const
{
return m_impl->get_enabled_options_range();
}

View File

@ -603,7 +603,7 @@ void ViewerImpl::update_enabled_entities()
{
std::vector<uint32_t> enabled_segments;
std::vector<uint32_t> enabled_options;
std::array<uint32_t, 2> range = m_view_range.get_visible();
Interval range = m_view_range.get_visible();
// when top layer only visualization is enabled, we need to render
// all the toolpaths in the other layers as grayed, so extend the range
@ -617,7 +617,7 @@ void ViewerImpl::update_enabled_entities()
if (m_settings.spiral_vase_mode) {
// when spiral vase mode is enabled and only one layer is shown, extend the range by one step
const std::array<uint32_t, 2>& layers_range = m_layers.get_view_range();
const Interval& layers_range = m_layers.get_view_range();
if (layers_range[0] > 0 && layers_range[0] == layers_range[1])
--range[0];
}
@ -765,17 +765,17 @@ void ViewerImpl::set_time_mode(ETimeMode mode)
m_settings.update_colors = true;
}
const std::array<uint32_t, 2>& ViewerImpl::get_layers_view_range() const
const Interval& ViewerImpl::get_layers_view_range() const
{
return m_layers.get_view_range();
}
void ViewerImpl::set_layers_view_range(const std::array<uint32_t, 2>& range)
void ViewerImpl::set_layers_view_range(const Interval& range)
{
set_layers_view_range(range[0], range[1]);
}
void ViewerImpl::set_layers_view_range(uint32_t min, uint32_t max)
void ViewerImpl::set_layers_view_range(Interval::value_type min, Interval::value_type max)
{
m_layers.set_view_range(min, max);
// force immediate update of the full range
@ -847,63 +847,49 @@ AABox ViewerImpl::get_bounding_box(EBBoxType type) const
bool ViewerImpl::is_option_visible(EOptionType type) const
{
try {
return m_settings.options_visibility.at(type);
}
catch (...) {
return false;
}
const auto it = m_settings.options_visibility.find(type);
return (it == m_settings.options_visibility.end()) ? false : it->second;
}
void ViewerImpl::toggle_option_visibility(EOptionType type)
{
try {
bool& value = m_settings.options_visibility.at(type);
value = !value;
auto it = m_settings.options_visibility.find(type);
if (it != m_settings.options_visibility.end()) {
it->second = !it->second;
update_view_full_range();
m_settings.update_enabled_entities = true;
m_settings.update_colors = true;
}
catch (...) {
// do nothing;
}
}
bool ViewerImpl::is_extrusion_role_visible(EGCodeExtrusionRole role) const
{
try {
return m_settings.extrusion_roles_visibility.at(role);
}
catch (...) {
return false;
}
const auto it = m_settings.extrusion_roles_visibility.find(role);
return (it == m_settings.extrusion_roles_visibility.end()) ? false : it->second;
}
void ViewerImpl::toggle_extrusion_role_visibility(EGCodeExtrusionRole role)
{
try {
bool& value = m_settings.extrusion_roles_visibility.at(role);
value = !value;
auto it = m_settings.extrusion_roles_visibility.find(role);
if (it != m_settings.extrusion_roles_visibility.end()) {
it->second = !it->second;
update_view_full_range();
m_settings.update_enabled_entities = true;
m_settings.update_colors = true;
}
catch (...) {
// do nothing;
}
}
const std::array<uint32_t, 2>& ViewerImpl::get_view_full_range() const
const Interval& ViewerImpl::get_view_full_range() const
{
return m_view_range.get_full();
}
const std::array<uint32_t, 2>& ViewerImpl::get_view_enabled_range() const
const Interval& ViewerImpl::get_view_enabled_range() const
{
return m_view_range.get_enabled();
}
const std::array<uint32_t, 2>& ViewerImpl::get_view_visible_range() const
const Interval& ViewerImpl::get_view_visible_range() const
{
return m_view_range.get_visible();
}
@ -923,14 +909,14 @@ size_t ViewerImpl::get_vertices_count() const
return m_vertices.size();
}
PathVertex ViewerImpl::get_current_vertex() const
const PathVertex& ViewerImpl::get_current_vertex() const
{
return m_vertices[m_view_range.get_visible()[1]];
return get_vertex_at(m_view_range.get_visible()[1]);
}
PathVertex ViewerImpl::get_vertex_at(size_t id) const
const PathVertex& ViewerImpl::get_vertex_at(size_t id) const
{
return (id < m_vertices.size()) ? m_vertices[id] : PathVertex();
return (id < m_vertices.size()) ? m_vertices[id] : Dummy_Path_Vertex;
}
Color ViewerImpl::get_vertex_color(const PathVertex& v) const
@ -942,7 +928,7 @@ Color ViewerImpl::get_vertex_color(const PathVertex& v) const
return Wipe_Color;
if (v.is_option())
return get_option_color(type_to_option(v.type));
return get_option_color(type_to_option(v.type));
switch (m_settings.view_type)
{
@ -1005,7 +991,7 @@ size_t ViewerImpl::get_enabled_segments_count() const
return m_enabled_segments_count;
}
const std::array<uint32_t, 2>& ViewerImpl::get_enabled_segments_range() const
const Interval& ViewerImpl::get_enabled_segments_range() const
{
return m_enabled_segments_range.get();
}
@ -1015,7 +1001,7 @@ size_t ViewerImpl::get_enabled_options_count() const
return m_enabled_options_count;
}
const std::array<uint32_t, 2>& ViewerImpl::get_enabled_options_range() const
const Interval& ViewerImpl::get_enabled_options_range() const
{
return m_enabled_options_range.get();
}
@ -1078,15 +1064,15 @@ void ViewerImpl::set_tool_colors(const std::vector<Color>& colors)
const Color& ViewerImpl::get_extrusion_role_color(EGCodeExtrusionRole role) const
{
auto it = m_extrusion_roles_colors.find(role);
return (it != m_extrusion_roles_colors.end()) ? m_extrusion_roles_colors.at(role) : Dummy_Color;
const auto it = m_extrusion_roles_colors.find(role);
return (it == m_extrusion_roles_colors.end()) ? Dummy_Color : it->second;
}
void ViewerImpl::set_extrusion_role_color(EGCodeExtrusionRole role, const Color& color)
{
auto it = m_extrusion_roles_colors.find(role);
if (it != m_extrusion_roles_colors.end())
m_extrusion_roles_colors[role] = color;
it->second = color;
}
void ViewerImpl::reset_default_extrusion_roles_colors()
@ -1096,15 +1082,15 @@ void ViewerImpl::reset_default_extrusion_roles_colors()
const Color& ViewerImpl::get_option_color(EOptionType type) const
{
auto it = m_options_colors.find(type);
return (it != m_options_colors.end()) ? m_options_colors.at(type) : Dummy_Color;
const auto it = m_options_colors.find(type);
return (it == m_options_colors.end()) ? Dummy_Color : it->second;
}
void ViewerImpl::set_option_color(EOptionType type, const Color& color)
{
auto it = m_options_colors.find(type);
if (it != m_options_colors.end())
m_options_colors[type] = color;
it->second = color;
}
void ViewerImpl::reset_default_options_colors()
@ -1114,15 +1100,15 @@ void ViewerImpl::reset_default_options_colors()
const Color& ViewerImpl::get_travel_move_color(ETravelMoveType type) const
{
auto it = m_travel_moves_colors.find(type);
return (it != m_travel_moves_colors.end()) ? m_travel_moves_colors.at(type) : Dummy_Color;
const auto it = m_travel_moves_colors.find(type);
return (it == m_travel_moves_colors.end()) ? Dummy_Color : it->second;
}
void ViewerImpl::set_travel_move_color(ETravelMoveType type, const Color& color)
{
auto it = m_travel_moves_colors.find(type);
if (it != m_travel_moves_colors.end())
m_travel_moves_colors[type] = color;
it->second = color;
}
void ViewerImpl::reset_default_travel_moves_colors()
@ -1162,12 +1148,8 @@ const ColorRange& ViewerImpl::get_volumetric_rate_range() const
const ColorRange& ViewerImpl::get_layer_time_range(EColorRangeType type) const
{
try {
return m_layer_time_range[static_cast<size_t>(type)];
}
catch (...) {
return ColorRange::Dummy_Color_Range;
}
return (static_cast<size_t>(type) < m_layer_time_range.size()) ?
m_layer_time_range[static_cast<size_t>(type)] : ColorRange::Dummy_Color_Range;
}
float ViewerImpl::get_travels_radius() const
@ -1290,7 +1272,7 @@ static bool is_visible(const PathVertex& v, const Settings& settings)
void ViewerImpl::update_view_full_range()
{
const std::array<uint32_t, 2>& layers_range = m_layers.get_view_range();
const Interval& layers_range = m_layers.get_view_range();
const bool travels_visible = m_settings.options_visibility.at(EOptionType::Travels);
const bool wipes_visible = m_settings.options_visibility.at(EOptionType::Wipes);
@ -1355,7 +1337,7 @@ void ViewerImpl::update_view_full_range()
m_view_range.set_full(Range());
if (m_settings.top_layer_only_view_range) {
const std::array<uint32_t, 2>& full_range = m_view_range.get_full();
const Interval& full_range = m_view_range.get_full();
auto top_first_it = m_vertices.begin() + full_range[0];
bool shortened = false;
while (top_first_it != m_vertices.end() && (top_first_it->layer_id < layers_range[1] || !is_visible(*top_first_it, m_settings))) {

View File

@ -77,9 +77,9 @@ public:
ETimeMode get_time_mode() const;
void set_time_mode(ETimeMode mode);
const std::array<uint32_t, 2>& get_layers_view_range() const;
void set_layers_view_range(const std::array<uint32_t, 2>& range);
void set_layers_view_range(uint32_t min, uint32_t max);
const Interval& get_layers_view_range() const;
void set_layers_view_range(const Interval& range);
void set_layers_view_range(Interval::value_type min, Interval::value_type max);
bool is_top_layer_only_view_range() const;
void set_top_layer_only_view_range(bool top_layer_only_view_range);
@ -101,21 +101,21 @@ public:
bool is_extrusion_role_visible(EGCodeExtrusionRole role) const;
void toggle_extrusion_role_visibility(EGCodeExtrusionRole role);
const std::array<uint32_t, 2>& get_view_full_range() const;
const std::array<uint32_t, 2>& get_view_enabled_range() const;
const std::array<uint32_t, 2>& get_view_visible_range() const;
const Interval& get_view_full_range() const;
const Interval& get_view_enabled_range() const;
const Interval& get_view_visible_range() const;
void set_view_visible_range(uint32_t min, uint32_t max);
size_t get_vertices_count() const;
PathVertex get_current_vertex() const;
PathVertex get_vertex_at(size_t id) const;
const PathVertex& get_current_vertex() const;
const PathVertex& get_vertex_at(size_t id) const;
Color get_vertex_color(const PathVertex& vertex) const;
size_t get_enabled_segments_count() const;
const std::array<uint32_t, 2>& get_enabled_segments_range() const;
const Interval& get_enabled_segments_range() const;
size_t get_enabled_options_count() const;
const std::array<uint32_t, 2>& get_enabled_options_range() const;
const Interval& get_enabled_options_range() const;
size_t get_extrusion_roles_count() const;
std::vector<EGCodeExtrusionRole> get_extrusion_roles() const;