New gcode visualization: layers times refactoring

This commit is contained in:
enricoturri1966 2023-11-10 14:39:03 +01:00 committed by Lukas Matena
parent 39c39798a8
commit a3322bdd45
7 changed files with 76 additions and 70 deletions

View File

@ -1426,7 +1426,7 @@ void GCodeViewer::refresh(const GCodeProcessorResult& gcode_result, const std::v
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#if ENABLE_NEW_GCODE_VIEWER #if ENABLE_NEW_GCODE_VIEWER
for (size_t i = 0; i < static_cast<size_t>(libvgcode::ETimeMode::COUNT); ++i) { for (size_t i = 0; i < static_cast<size_t>(libvgcode::ETimeMode::COUNT); ++i) {
const std::vector<float> layers_times = m_new_viewer.get_layers_times(static_cast<libvgcode::ETimeMode>(i)); const std::vector<float> layers_times = get_layers_times(static_cast<libvgcode::ETimeMode>(i));
for (size_t j = 0; j < layers_times.size(); ++j) { for (size_t j = 0; j < layers_times.size(); ++j) {
m_extrusions.ranges.layer_time[i].update_from(layers_times[j]); m_extrusions.ranges.layer_time[i].update_from(layers_times[j]);
} }
@ -3088,7 +3088,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool
case libvgcode::EViewType::Temperature: { color = m_extrusions.ranges.temperature.get_color_at(path.temperature); break; } case libvgcode::EViewType::Temperature: { color = m_extrusions.ranges.temperature.get_color_at(path.temperature); break; }
case libvgcode::EViewType::LayerTimeLinear: case libvgcode::EViewType::LayerTimeLinear:
case libvgcode::EViewType::LayerTimeLogarithmic: { case libvgcode::EViewType::LayerTimeLogarithmic: {
const std::vector<float> layers_times = m_new_viewer.get_layers_times(); const std::vector<float> layers_times = get_layers_times();
if (!layers_times.empty() && m_layers.size() == layers_times.size()) { if (!layers_times.empty() && m_layers.size() == layers_times.size()) {
const Path::Sub_Path& sub_path = path.sub_paths.front(); const Path::Sub_Path& sub_path = path.sub_paths.front();
double z = static_cast<double>(sub_path.first.position.z()); double z = static_cast<double>(sub_path.first.position.z());
@ -4584,7 +4584,7 @@ void GCodeViewer::render_legend(float& legend_height)
std::vector<int> view_options_id; std::vector<int> view_options_id;
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#if ENABLE_NEW_GCODE_VIEWER #if ENABLE_NEW_GCODE_VIEWER
const std::vector<float> layers_times = m_new_viewer.get_layers_times(); const std::vector<float> layers_times = get_layers_times();
if (!layers_times.empty() && m_layers.size() == layers_times.size()) { if (!layers_times.empty() && m_layers.size() == layers_times.size()) {
#else #else
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ -5248,7 +5248,7 @@ void GCodeViewer::render_legend(float& legend_height)
if (ImGui::BeginTable("Times", 2)) { if (ImGui::BeginTable("Times", 2)) {
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#if ENABLE_NEW_GCODE_VIEWER #if ENABLE_NEW_GCODE_VIEWER
const std::vector<float> layers_times = m_new_viewer.get_layers_times(); const std::vector<float> layers_times = get_layers_times();
if (!layers_times.empty()) if (!layers_times.empty())
add_strings_row_to_table(_u8L("First layer") + ":", ImGuiWrapper::COL_ORANGE_LIGHT, add_strings_row_to_table(_u8L("First layer") + ":", ImGuiWrapper::COL_ORANGE_LIGHT,
short_time_ui(get_time_dhms(layers_times.front())), ImGuiWrapper::to_ImVec4(ColorRGBA::WHITE())); short_time_ui(get_time_dhms(layers_times.front())), ImGuiWrapper::to_ImVec4(ColorRGBA::WHITE()));

View File

@ -25,7 +25,7 @@ static bool is_colorprint_option(const PathVertex& v)
return v.type == EMoveType::PausePrint || v.type == EMoveType::CustomGCode; return v.type == EMoveType::PausePrint || v.type == EMoveType::CustomGCode;
} }
void Layers::update(const PathVertex& vertex, uint32_t vertex_id) void Layers::update(const PathVertex& vertex, const std::array<float, static_cast<size_t>(ETimeMode::COUNT)>& times, uint32_t vertex_id)
{ {
if (m_items.empty() || vertex.layer_id == m_items.size()) { if (m_items.empty() || vertex.layer_id == m_items.size()) {
@ -33,11 +33,15 @@ void Layers::update(const PathVertex& vertex, uint32_t vertex_id)
assert(vertex.layer_id == static_cast<uint32_t>(m_items.size())); assert(vertex.layer_id == static_cast<uint32_t>(m_items.size()));
Item& item = m_items.emplace_back(Item()); Item& item = m_items.emplace_back(Item());
item.range.set(vertex_id, vertex_id); item.range.set(vertex_id, vertex_id);
item.times = times;
item.contains_colorprint_options |= is_colorprint_option(vertex); item.contains_colorprint_options |= is_colorprint_option(vertex);
} }
else { else {
Item& item = m_items.back(); Item& item = m_items.back();
item.range.set(item.range.get()[0], vertex_id); item.range.set(item.range.get()[0], vertex_id);
for (size_t i = 0; i < static_cast<size_t>(ETimeMode::COUNT); ++i) {
item.times[i] += times[i];
}
item.contains_colorprint_options |= is_colorprint_option(vertex); item.contains_colorprint_options |= is_colorprint_option(vertex);
} }
} }
@ -52,11 +56,29 @@ bool Layers::empty() const
return m_items.empty(); return m_items.empty();
} }
size_t Layers::get_layers_count() const size_t Layers::count() const
{ {
return m_items.size(); return m_items.size();
} }
float Layers::get_time(ETimeMode mode, uint32_t layer_id) const
{
return (mode < ETimeMode::COUNT&& layer_id < static_cast<uint32_t>(m_items.size())) ?
m_items[layer_id].times[static_cast<size_t>(mode)] : 0.0f;
}
std::vector<float> Layers::get_times(ETimeMode mode) const
{
std::vector<float> ret;
if (mode < ETimeMode::COUNT) {
const size_t mode_id = static_cast<size_t>(mode);
for (const Item& item : m_items) {
ret.emplace_back(item.times[mode_id]);
}
}
return ret;
}
bool Layers::layer_contains_colorprint_options(uint32_t layer_id) const bool Layers::layer_contains_colorprint_options(uint32_t layer_id) const
{ {
return (layer_id < static_cast<uint32_t>(m_items.size())) ? m_items[layer_id].contains_colorprint_options : false; return (layer_id < static_cast<uint32_t>(m_items.size())) ? m_items[layer_id].contains_colorprint_options : false;

View File

@ -10,10 +10,9 @@
#if ENABLE_NEW_GCODE_VIEWER #if ENABLE_NEW_GCODE_VIEWER
//################################################################################################################################ //################################################################################################################################
#include "Types.hpp"
#include "Range.hpp" #include "Range.hpp"
#include <vector>
namespace libvgcode { namespace libvgcode {
struct PathVertex; struct PathVertex;
@ -21,11 +20,14 @@ struct PathVertex;
class Layers class Layers
{ {
public: public:
void update(const PathVertex& vertex, uint32_t vertex_id); void update(const PathVertex& vertex, const std::array<float, static_cast<size_t>(ETimeMode::COUNT)>& times, uint32_t vertex_id);
void reset(); void reset();
bool empty() const; bool empty() const;
size_t get_layers_count() const; size_t count() const;
float get_time(ETimeMode mode, uint32_t layer_id) const;
std::vector<float> get_times(ETimeMode mode) const;
bool layer_contains_colorprint_options(uint32_t layer_id) const; bool layer_contains_colorprint_options(uint32_t layer_id) const;
@ -33,9 +35,8 @@ private:
struct Item struct Item
{ {
Range range; Range range;
std::array<float, static_cast<size_t>(ETimeMode::COUNT)> times{ 0.0f, 0.0f };
bool contains_colorprint_options{ false }; bool contains_colorprint_options{ false };
Item() = default;
}; };
std::vector<Item> m_items; std::vector<Item> m_items;

View File

@ -16,44 +16,44 @@
namespace libvgcode { namespace libvgcode {
const std::array<uint32_t, 2>& ViewRange::get_current_range() const const std::array<uint32_t, 2>& ViewRange::get_current() const
{ {
return m_current.get(); return m_current.get();
} }
void ViewRange::set_current_range(const Range& other) void ViewRange::set_current(const Range& other)
{ {
set_current_range(other.get()); set_current(other.get());
} }
void ViewRange::set_current_range(const std::array<uint32_t, 2>& range) void ViewRange::set_current(const std::array<uint32_t, 2>& range)
{ {
set_current_range(range[0], range[1]); set_current(range[0], range[1]);
} }
void ViewRange::set_current_range(uint32_t min, uint32_t max) void ViewRange::set_current(uint32_t min, uint32_t max)
{ {
m_current.set(min, max); m_current.set(min, max);
// force the current range to stay inside the modified global range // force the current range to stay inside the modified global range
m_global.clamp(m_current); m_global.clamp(m_current);
} }
const std::array<uint32_t, 2>& ViewRange::get_global_range() const const std::array<uint32_t, 2>& ViewRange::get_global() const
{ {
return m_global.get(); return m_global.get();
} }
void ViewRange::set_global_range(const Range& other) void ViewRange::set_global(const Range& other)
{ {
set_global_range(other.get()); set_global(other.get());
} }
void ViewRange::set_global_range(const std::array<uint32_t, 2>& range) void ViewRange::set_global(const std::array<uint32_t, 2>& range)
{ {
set_global_range(range[0], range[1]); set_global(range[0], range[1]);
} }
void ViewRange::set_global_range(uint32_t min, uint32_t max) void ViewRange::set_global(uint32_t min, uint32_t max)
{ {
// is the global range being extended ? // is the global range being extended ?
const bool new_max = max > m_global.get()[1]; const bool new_max = max > m_global.get()[1];

View File

@ -17,15 +17,15 @@ namespace libvgcode {
class ViewRange class ViewRange
{ {
public: public:
const std::array<uint32_t, 2>& get_current_range() const; const std::array<uint32_t, 2>& get_current() const;
void set_current_range(const Range& other); void set_current(const Range& other);
void set_current_range(const std::array<uint32_t, 2>& range); void set_current(const std::array<uint32_t, 2>& range);
void set_current_range(uint32_t min, uint32_t max); void set_current(uint32_t min, uint32_t max);
const std::array<uint32_t, 2>& get_global_range() const; const std::array<uint32_t, 2>& get_global() const;
void set_global_range(const Range& other); void set_global(const Range& other);
void set_global_range(const std::array<uint32_t, 2>& range); void set_global(const std::array<uint32_t, 2>& range);
void set_global_range(uint32_t min, uint32_t max); void set_global(uint32_t min, uint32_t max);
void reset(); void reset();

View File

@ -520,13 +520,11 @@ void ViewerImpl::reset()
m_layers.reset(); m_layers.reset();
m_layers_range.reset(); m_layers_range.reset();
m_view_range.reset(); m_view_range.reset();
m_old_current_range.reset();
m_extrusion_roles.reset(); m_extrusion_roles.reset();
m_travels_time = { 0.0f, 0.0f }; m_travels_time = { 0.0f, 0.0f };
m_vertices.clear(); m_vertices.clear();
m_vertices_map.clear(); m_vertices_map.clear();
m_valid_lines_bitset.clear(); m_valid_lines_bitset.clear();
m_layers_times = std::array<std::vector<float>, static_cast<size_t>(ETimeMode::COUNT)>();
#if !ENABLE_NEW_GCODE_NO_COG_AND_TOOL_MARKERS #if !ENABLE_NEW_GCODE_NO_COG_AND_TOOL_MARKERS
m_cog_marker.reset(); m_cog_marker.reset();
#endif // !ENABLE_NEW_GCODE_NO_COG_AND_TOOL_MARKERS #endif // !ENABLE_NEW_GCODE_NO_COG_AND_TOOL_MARKERS
@ -607,7 +605,7 @@ void ViewerImpl::load(const Slic3r::GCodeProcessorResult& gcode_result, const GC
static_cast<uint32_t>(curr.layer_id) }; static_cast<uint32_t>(curr.layer_id) };
m_vertices_map.emplace_back(static_cast<uint32_t>(i) - seams_count); m_vertices_map.emplace_back(static_cast<uint32_t>(i) - seams_count);
m_vertices.emplace_back(vertex); m_vertices.emplace_back(vertex);
m_layers.update(vertex, static_cast<uint32_t>(m_vertices.size())); m_layers.update(vertex, { 0.0f, 0.0f }, static_cast<uint32_t>(m_vertices.size()));
} }
} }
@ -616,7 +614,7 @@ void ViewerImpl::load(const Slic3r::GCodeProcessorResult& gcode_result, const GC
static_cast<uint8_t>(curr.cp_color_id), static_cast<uint32_t>(curr.layer_id) }; static_cast<uint8_t>(curr.cp_color_id), static_cast<uint32_t>(curr.layer_id) };
m_vertices_map.emplace_back(static_cast<uint32_t>(i) - seams_count); m_vertices_map.emplace_back(static_cast<uint32_t>(i) - seams_count);
m_vertices.emplace_back(vertex); m_vertices.emplace_back(vertex);
m_layers.update(vertex, static_cast<uint32_t>(m_vertices.size())); m_layers.update(vertex, curr.time, static_cast<uint32_t>(m_vertices.size()));
#if !ENABLE_NEW_GCODE_NO_COG_AND_TOOL_MARKERS #if !ENABLE_NEW_GCODE_NO_COG_AND_TOOL_MARKERS
// updates calculation for center of gravity // updates calculation for center of gravity
@ -639,19 +637,6 @@ void ViewerImpl::load(const Slic3r::GCodeProcessorResult& gcode_result, const GC
} }
else else
m_extrusion_roles.add(curr_role, curr.time); m_extrusion_roles.add(curr_role, curr.time);
if (curr.layer_id >= m_layers_times[0].size()) {
const size_t curr_size = m_layers_times[0].size();
for (size_t i = 0; i < static_cast<size_t>(ETimeMode::COUNT); ++i) {
m_layers_times[i].resize(curr.layer_id + 1);
for (size_t j = curr_size; j < m_layers_times[i].size(); ++j) {
m_layers_times[i][j] = 0.0f;
}
}
}
for (size_t i = 0; i < static_cast<size_t>(ETimeMode::COUNT); ++i) {
m_layers_times[i].back() += curr.time[i];
}
} }
m_vertices_map.shrink_to_fit(); m_vertices_map.shrink_to_fit();
m_vertices.shrink_to_fit(); m_vertices.shrink_to_fit();
@ -738,7 +723,7 @@ void ViewerImpl::load(const Slic3r::GCodeProcessorResult& gcode_result, const GC
} }
if (!m_layers.empty()) if (!m_layers.empty())
set_layers_range(0, static_cast<uint32_t>(m_layers.get_layers_count() - 1)); set_layers_range(0, static_cast<uint32_t>(m_layers.count() - 1));
update_view_global_range(); update_view_global_range();
m_settings.update_colors = true; m_settings.update_colors = true;
} }
@ -747,13 +732,13 @@ void ViewerImpl::update_enabled_entities()
{ {
std::vector<uint32_t> enabled_segments; std::vector<uint32_t> enabled_segments;
std::vector<uint32_t> enabled_options; std::vector<uint32_t> enabled_options;
std::array<uint32_t, 2> range = m_view_range.get_current_range(); std::array<uint32_t, 2> range = m_view_range.get_current();
// when top layer only visualization is enabled, we need to render // when top layer only visualization is enabled, we need to render
// all the toolpaths in the other layers as grayed, so extend the range // all the toolpaths in the other layers as grayed, so extend the range
// to contain them // to contain them
if (m_settings.top_layer_only_view_range) if (m_settings.top_layer_only_view_range)
range[0] = m_view_range.get_global_range()[0]; range[0] = m_view_range.get_global()[0];
// to show the options at the current tool marker position we need to extend the range by one extra step // to show the options at the current tool marker position we need to extend the range by one extra step
if (m_vertices[range[1]].is_option() && range[1] < static_cast<uint32_t>(m_vertices.size()) - 1) if (m_vertices[range[1]].is_option() && range[1] < static_cast<uint32_t>(m_vertices.size()) - 1)
@ -831,7 +816,7 @@ void ViewerImpl::update_colors()
update_color_ranges(); update_color_ranges();
const uint32_t top_layer_id = m_settings.top_layer_only_view_range ? m_layers_range.get()[1] : 0; const uint32_t top_layer_id = m_settings.top_layer_only_view_range ? m_layers_range.get()[1] : 0;
const bool color_top_layer_only = m_view_range.get_global_range()[1] != m_view_range.get_current_range()[1]; const bool color_top_layer_only = m_view_range.get_global()[1] != m_view_range.get_current()[1];
std::vector<float> colors(m_vertices.size()); std::vector<float> 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) ? encode_color(Dummy_Color) : encode_color(select_color(m_vertices[i])); colors[i] = (color_top_layer_only && m_vertices[i].layer_id < top_layer_id) ? encode_color(Dummy_Color) : encode_color(select_color(m_vertices[i]));
@ -987,12 +972,12 @@ void ViewerImpl::toggle_extrusion_role_visibility(EGCodeExtrusionRole role)
const std::array<uint32_t, 2>& ViewerImpl::get_view_current_range() const const std::array<uint32_t, 2>& ViewerImpl::get_view_current_range() const
{ {
return m_view_range.get_current_range(); return m_view_range.get_current();
} }
const std::array<uint32_t, 2>& ViewerImpl::get_view_global_range() const const std::array<uint32_t, 2>& ViewerImpl::get_view_global_range() const
{ {
return m_view_range.get_global_range(); return m_view_range.get_global();
} }
void ViewerImpl::set_view_current_range(uint32_t min, uint32_t max) void ViewerImpl::set_view_current_range(uint32_t min, uint32_t max)
@ -1030,15 +1015,14 @@ void ViewerImpl::set_view_current_range(uint32_t min, uint32_t max)
Range new_range; Range new_range;
new_range.set(min_id, max_id); new_range.set(min_id, max_id);
if (m_old_current_range != new_range) { if (m_view_range.get_current() != new_range.get()) {
if (m_settings.update_view_global_range) { if (m_settings.update_view_global_range) {
// force update of global range, if required, to avoid clamping the current range with global old values // force update of global range, if required, to avoid clamping the current range with global old values
// when calling set_current_range() // when calling set_current_range()
update_view_global_range(); update_view_global_range();
m_settings.update_view_global_range = false; m_settings.update_view_global_range = false;
} }
m_view_range.set_current_range(new_range); m_view_range.set_current(new_range);
m_old_current_range = new_range;
m_settings.update_enabled_entities = true; m_settings.update_enabled_entities = true;
m_settings.update_colors = true; m_settings.update_colors = true;
} }
@ -1051,7 +1035,7 @@ size_t ViewerImpl::get_vertices_count() const
PathVertex ViewerImpl::get_current_vertex() const PathVertex ViewerImpl::get_current_vertex() const
{ {
return m_vertices[m_view_range.get_current_range()[1]]; return m_vertices[m_view_range.get_current()[1]];
} }
PathVertex ViewerImpl::get_vertex_at(size_t id) const PathVertex ViewerImpl::get_vertex_at(size_t id) const
@ -1096,7 +1080,7 @@ std::vector<float> ViewerImpl::get_layers_times() const
std::vector<float> ViewerImpl::get_layers_times(ETimeMode mode) const std::vector<float> ViewerImpl::get_layers_times(ETimeMode mode) const
{ {
return (mode < ETimeMode::COUNT) ? m_layers_times[static_cast<size_t>(mode)] : std::vector<float>(); return m_layers.get_times(mode);
} }
size_t ViewerImpl::get_tool_colors_count() const size_t ViewerImpl::get_tool_colors_count() const
@ -1226,7 +1210,7 @@ void ViewerImpl::update_view_global_range()
} }
if (first_it == m_vertices.end()) if (first_it == m_vertices.end())
m_view_range.set_global_range(0, 0); m_view_range.set_global(0, 0);
else { else {
if (travels_visible) { if (travels_visible) {
// if the global range starts with a travel move, extend it to the travel start // if the global range starts with a travel move, extend it to the travel start
@ -1266,7 +1250,7 @@ void ViewerImpl::update_view_global_range()
} }
} }
m_view_range.set_global_range(std::distance(m_vertices.begin(), first_it), std::distance(m_vertices.begin(), last_it)); m_view_range.set_global(std::distance(m_vertices.begin(), first_it), std::distance(m_vertices.begin(), last_it));
} }
} }
@ -1296,9 +1280,10 @@ void ViewerImpl::update_color_ranges()
m_speed_range.update(v.feedrate); m_speed_range.update(v.feedrate);
} }
for (size_t i = 0; i < m_layers_times.size(); ++i) { const std::vector<float> times = m_layers.get_times(m_settings.time_mode);
for (const float time : m_layers_times[static_cast<uint8_t>(m_settings.time_mode)]) { for (size_t i = 0; i < m_layer_time_range.size(); ++i) {
m_layer_time_range[i].update(time); for (float t : times) {
m_layer_time_range[i].update(t);
} }
} }
} }
@ -1354,12 +1339,12 @@ Color ViewerImpl::select_color(const PathVertex& v) const
case EViewType::LayerTimeLinear: case EViewType::LayerTimeLinear:
{ {
assert(!v.is_travel() || role < Travels_Colors.size()); assert(!v.is_travel() || role < Travels_Colors.size());
return v.is_travel() ? Travels_Colors[role] : m_layer_time_range[0].get_color_at(m_layers_times[static_cast<size_t>(m_settings.time_mode)][v.layer_id]); return v.is_travel() ? Travels_Colors[role] : m_layer_time_range[0].get_color_at(m_layers.get_time(m_settings.time_mode, v.layer_id));
} }
case EViewType::LayerTimeLogarithmic: case EViewType::LayerTimeLogarithmic:
{ {
assert(!v.is_travel() || role < Travels_Colors.size()); assert(!v.is_travel() || role < Travels_Colors.size());
return v.is_travel() ? Travels_Colors[role] : m_layer_time_range[1].get_color_at(m_layers_times[static_cast<size_t>(m_settings.time_mode)][v.layer_id]); return v.is_travel() ? Travels_Colors[role] : m_layer_time_range[1].get_color_at(m_layers.get_time(m_settings.time_mode, v.layer_id));
} }
case EViewType::Tool: case EViewType::Tool:
{ {

View File

@ -154,10 +154,8 @@ private:
Layers m_layers; Layers m_layers;
Range m_layers_range; Range m_layers_range;
ViewRange m_view_range; ViewRange m_view_range;
Range m_old_current_range;
ExtrusionRoles m_extrusion_roles; ExtrusionRoles m_extrusion_roles;
std::array<float, static_cast<size_t>(ETimeMode::COUNT)> m_travels_time{ 0.0f, 0.0f }; std::array<float, static_cast<size_t>(ETimeMode::COUNT)> m_travels_time{ 0.0f, 0.0f };
std::array<std::vector<float>, static_cast<size_t>(ETimeMode::COUNT)> m_layers_times;
// //
// The OpenGL element used to represent all toolpath segments // The OpenGL element used to represent all toolpath segments