refactor and improve layer time display
This commit is contained in:
parent
1eb54c49a6
commit
41078e6555
3 changed files with 39 additions and 16 deletions
|
@ -1424,6 +1424,10 @@ void GCodeProcessor::finalize(bool post_process)
|
||||||
m_used_filaments.process_caches(this);
|
m_used_filaments.process_caches(this);
|
||||||
|
|
||||||
update_estimated_times_stats();
|
update_estimated_times_stats();
|
||||||
|
auto time_mode = m_result.print_statistics.modes[static_cast<size_t>(PrintEstimatedStatistics::ETimeMode::Normal)];
|
||||||
|
|
||||||
|
auto it = std::find_if(time_mode.roles_times.begin(), time_mode.roles_times.end(), [](const std::pair<ExtrusionRole, float>& item) { return erCustom == item.first; });
|
||||||
|
auto prepare_time = (it != time_mode.roles_times.end()) ? it->second : 0.0f;
|
||||||
|
|
||||||
//update times for results
|
//update times for results
|
||||||
for (size_t i = 0; i < m_result.moves.size(); i++) {
|
for (size_t i = 0; i < m_result.moves.size(); i++) {
|
||||||
|
@ -1431,7 +1435,7 @@ void GCodeProcessor::finalize(bool post_process)
|
||||||
size_t layer_id = size_t(m_result.moves[i].layer_duration);
|
size_t layer_id = size_t(m_result.moves[i].layer_duration);
|
||||||
std::vector<float>& layer_times = m_result.print_statistics.modes[static_cast<size_t>(PrintEstimatedStatistics::ETimeMode::Normal)].layers_times;
|
std::vector<float>& layer_times = m_result.print_statistics.modes[static_cast<size_t>(PrintEstimatedStatistics::ETimeMode::Normal)].layers_times;
|
||||||
if (layer_times.size() > layer_id - 1 && layer_id > 0)
|
if (layer_times.size() > layer_id - 1 && layer_id > 0)
|
||||||
m_result.moves[i].layer_duration = layer_times[layer_id - 1];
|
m_result.moves[i].layer_duration = layer_id == 1 ? std::max(0.f,layer_times[layer_id - 1] - prepare_time) : layer_times[layer_id - 1];
|
||||||
else
|
else
|
||||||
m_result.moves[i].layer_duration = 0;
|
m_result.moves[i].layer_duration = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -255,6 +255,8 @@ GCodeViewer::Color GCodeViewer::Extrusions::Range::get_color_at(float value) con
|
||||||
{
|
{
|
||||||
// Input value scaled to the colors range
|
// Input value scaled to the colors range
|
||||||
const float step = step_size();
|
const float step = step_size();
|
||||||
|
if(log_scale)
|
||||||
|
value = std::log(value);
|
||||||
const float global_t = (step != 0.0f) ? std::max(0.0f, value - min) / step : 0.0f; // lower limit of 0.0f
|
const float global_t = (step != 0.0f) ? std::max(0.0f, value - min) / step : 0.0f; // lower limit of 0.0f
|
||||||
|
|
||||||
const size_t color_max_idx = Range_Colors.size() - 1;
|
const size_t color_max_idx = Range_Colors.size() - 1;
|
||||||
|
@ -274,8 +276,8 @@ GCodeViewer::Color GCodeViewer::Extrusions::Range::get_color_at(float value) con
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
float GCodeViewer::Extrusions::Range::step_size(bool is_log) const {
|
float GCodeViewer::Extrusions::Range::step_size() const {
|
||||||
if (is_log)
|
if (log_scale)
|
||||||
{
|
{
|
||||||
float min_range = min;
|
float min_range = min;
|
||||||
if (min_range == 0)
|
if (min_range == 0)
|
||||||
|
@ -285,6 +287,13 @@ float GCodeViewer::Extrusions::Range::step_size(bool is_log) const {
|
||||||
return (max - min) / (static_cast<float>(Range_Colors.size()) - 1.0f);
|
return (max - min) / (static_cast<float>(Range_Colors.size()) - 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float GCodeViewer::Extrusions::Range::get_value_at_step(int step) const {
|
||||||
|
if (!log_scale)
|
||||||
|
return min + static_cast<float>(step) * step_size();
|
||||||
|
else
|
||||||
|
return std::exp(std::log(min) + static_cast<float>(step) * step_size());
|
||||||
|
|
||||||
|
}
|
||||||
GCodeViewer::SequentialRangeCap::~SequentialRangeCap() {
|
GCodeViewer::SequentialRangeCap::~SequentialRangeCap() {
|
||||||
if (ibo > 0)
|
if (ibo > 0)
|
||||||
glsafe(::glDeleteBuffers(1, &ibo));
|
glsafe(::glDeleteBuffers(1, &ibo));
|
||||||
|
@ -377,7 +386,6 @@ void GCodeViewer::SequentialView::Marker::render(int canvas_width, int canvas_he
|
||||||
std::string speed = ImGui::ColorMarkerStart + _u8L("Speed: ") + ImGui::ColorMarkerEnd;
|
std::string speed = ImGui::ColorMarkerStart + _u8L("Speed: ") + ImGui::ColorMarkerEnd;
|
||||||
std::string flow = ImGui::ColorMarkerStart + _u8L("Flow: ") + ImGui::ColorMarkerEnd;
|
std::string flow = ImGui::ColorMarkerStart + _u8L("Flow: ") + ImGui::ColorMarkerEnd;
|
||||||
std::string layer_time = ImGui::ColorMarkerStart + _u8L("Layer Time: ") + ImGui::ColorMarkerEnd;
|
std::string layer_time = ImGui::ColorMarkerStart + _u8L("Layer Time: ") + ImGui::ColorMarkerEnd;
|
||||||
std::string layer_time_log = ImGui::ColorMarkerStart + _u8L("Layer Time (log): ") + ImGui::ColorMarkerEnd;
|
|
||||||
std::string fanspeed = ImGui::ColorMarkerStart + _u8L("Fan Speed: ") + ImGui::ColorMarkerEnd;
|
std::string fanspeed = ImGui::ColorMarkerStart + _u8L("Fan Speed: ") + ImGui::ColorMarkerEnd;
|
||||||
std::string temperature = ImGui::ColorMarkerStart + _u8L("Temperature: ") + ImGui::ColorMarkerEnd;
|
std::string temperature = ImGui::ColorMarkerStart + _u8L("Temperature: ") + ImGui::ColorMarkerEnd;
|
||||||
const float item_size = imgui.calc_text_size("X: 000.000 ").x;
|
const float item_size = imgui.calc_text_size("X: 000.000 ").x;
|
||||||
|
@ -450,6 +458,14 @@ void GCodeViewer::SequentialView::Marker::render(int canvas_width, int canvas_he
|
||||||
imgui.text(buf);
|
imgui.text(buf);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case EViewType::LayerTime:
|
||||||
|
case EViewType::LayerTimeLog: {
|
||||||
|
ImGui::SameLine(window_padding + item_size + item_spacing);
|
||||||
|
sprintf(buf, "%s%.1f", layer_time.c_str(), it->layer_duration);
|
||||||
|
ImGui::PushItemWidth(item_size);
|
||||||
|
imgui.text(buf);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1157,8 +1173,10 @@ void GCodeViewer::refresh(const GCodeProcessorResult& gcode_result, const std::v
|
||||||
if (curr.extrusion_role != erCustom || is_visible(erCustom))
|
if (curr.extrusion_role != erCustom || is_visible(erCustom))
|
||||||
m_extrusions.ranges.volumetric_rate.update_from(round_to_bin(curr.volumetric_rate()));
|
m_extrusions.ranges.volumetric_rate.update_from(round_to_bin(curr.volumetric_rate()));
|
||||||
|
|
||||||
if (curr.layer_duration > 0.f)
|
if (curr.layer_duration > 0.f) {
|
||||||
m_extrusions.ranges.layer_duration.update_from(curr.layer_duration);
|
m_extrusions.ranges.layer_duration.update_from(curr.layer_duration);
|
||||||
|
m_extrusions.ranges.layer_duration_log.update_from(curr.layer_duration);
|
||||||
|
}
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
}
|
}
|
||||||
case EMoveType::Travel:
|
case EMoveType::Travel:
|
||||||
|
@ -3219,7 +3237,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool
|
||||||
case EViewType::FanSpeed: { color = m_extrusions.ranges.fan_speed.get_color_at(path.fan_speed); break; }
|
case EViewType::FanSpeed: { color = m_extrusions.ranges.fan_speed.get_color_at(path.fan_speed); break; }
|
||||||
case EViewType::Temperature: { color = m_extrusions.ranges.temperature.get_color_at(path.temperature); break; }
|
case EViewType::Temperature: { color = m_extrusions.ranges.temperature.get_color_at(path.temperature); break; }
|
||||||
case EViewType::LayerTime: { color = m_extrusions.ranges.layer_duration.get_color_at(path.layer_time); break; }
|
case EViewType::LayerTime: { color = m_extrusions.ranges.layer_duration.get_color_at(path.layer_time); break; }
|
||||||
case EViewType::LayerTimeLog: { color = m_extrusions.ranges.layer_duration.get_color_at(path.layer_time); break; }
|
case EViewType::LayerTimeLog: { color = m_extrusions.ranges.layer_duration_log.get_color_at(path.layer_time); break; }
|
||||||
case EViewType::VolumetricRate: { color = m_extrusions.ranges.volumetric_rate.get_color_at(path.volumetric_rate); break; }
|
case EViewType::VolumetricRate: { color = m_extrusions.ranges.volumetric_rate.get_color_at(path.volumetric_rate); break; }
|
||||||
case EViewType::Tool: { color = m_tools.m_tool_colors[path.extruder_id]; break; }
|
case EViewType::Tool: { color = m_tools.m_tool_colors[path.extruder_id]; break; }
|
||||||
case EViewType::ColorPrint: {
|
case EViewType::ColorPrint: {
|
||||||
|
@ -4237,7 +4255,7 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
auto append_range = [append_item](const Extrusions::Range& range, unsigned int decimals, bool is_log = false) {
|
auto append_range = [append_item](const Extrusions::Range& range, unsigned int decimals) {
|
||||||
auto append_range_item = [append_item](int i, float value, unsigned int decimals) {
|
auto append_range_item = [append_item](int i, float value, unsigned int decimals) {
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
::sprintf(buf, "%.*f", decimals, value);
|
::sprintf(buf, "%.*f", decimals, value);
|
||||||
|
@ -4252,12 +4270,9 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
|
||||||
append_range_item(0, range.min, decimals);
|
append_range_item(0, range.min, decimals);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const float step_size = range.step_size(is_log);
|
const float step_size = range.step_size();
|
||||||
for (int i = static_cast<int>(Range_Colors.size()) - 1; i >= 0; --i) {
|
for (int i = static_cast<int>(Range_Colors.size()) - 1; i >= 0; --i) {
|
||||||
if (!is_log)
|
append_range_item(i, range.get_value_at_step(i), decimals);
|
||||||
append_range_item(i, range.min + static_cast<float>(i) * step_size, decimals);
|
|
||||||
else
|
|
||||||
append_range_item(i, std::exp(std::log(range.min) + static_cast<float>(i) * step_size),decimals);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4627,7 +4642,7 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
|
||||||
case EViewType::FanSpeed: { append_range(m_extrusions.ranges.fan_speed, 0); break; }
|
case EViewType::FanSpeed: { append_range(m_extrusions.ranges.fan_speed, 0); break; }
|
||||||
case EViewType::Temperature: { append_range(m_extrusions.ranges.temperature, 0); break; }
|
case EViewType::Temperature: { append_range(m_extrusions.ranges.temperature, 0); break; }
|
||||||
case EViewType::LayerTime: { append_range(m_extrusions.ranges.layer_duration, true); break; }
|
case EViewType::LayerTime: { append_range(m_extrusions.ranges.layer_duration, true); break; }
|
||||||
case EViewType::LayerTimeLog: { append_range(m_extrusions.ranges.layer_duration, true, true); break; }
|
case EViewType::LayerTimeLog: { append_range(m_extrusions.ranges.layer_duration_log, true); break; }
|
||||||
case EViewType::VolumetricRate: { append_range(m_extrusions.ranges.volumetric_rate, 2); break; }
|
case EViewType::VolumetricRate: { append_range(m_extrusions.ranges.volumetric_rate, 2); break; }
|
||||||
case EViewType::Tool:
|
case EViewType::Tool:
|
||||||
{
|
{
|
||||||
|
|
|
@ -399,19 +399,21 @@ class GCodeViewer
|
||||||
float min;
|
float min;
|
||||||
float max;
|
float max;
|
||||||
unsigned int count;
|
unsigned int count;
|
||||||
|
bool log_scale;
|
||||||
|
|
||||||
Range() { reset(); }
|
Range() { reset(); }
|
||||||
|
|
||||||
void update_from(const float value) {
|
void update_from(const float value) {
|
||||||
if (value != max && value != min)
|
if (value != max && value != min)
|
||||||
++count;
|
++count;
|
||||||
min = std::min(min, value);
|
min = std::min(min, value);
|
||||||
max = std::max(max, value);
|
max = std::max(max, value);
|
||||||
}
|
}
|
||||||
void reset() { min = FLT_MAX; max = -FLT_MAX; count = 0; }
|
void reset(bool log = false) { min = FLT_MAX; max = -FLT_MAX; count = 0; log_scale = false; log_scale = log; }
|
||||||
|
|
||||||
float step_size(bool is_log = false) const;
|
float step_size() const;
|
||||||
Color get_color_at(float value) const;
|
Color get_color_at(float value) const;
|
||||||
|
float get_value_at_step(int step) const;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Ranges
|
struct Ranges
|
||||||
|
@ -430,6 +432,7 @@ class GCodeViewer
|
||||||
Range temperature;
|
Range temperature;
|
||||||
// Color mapping by layer time.
|
// Color mapping by layer time.
|
||||||
Range layer_duration;
|
Range layer_duration;
|
||||||
|
Range layer_duration_log;
|
||||||
void reset() {
|
void reset() {
|
||||||
height.reset();
|
height.reset();
|
||||||
width.reset();
|
width.reset();
|
||||||
|
@ -438,6 +441,7 @@ class GCodeViewer
|
||||||
volumetric_rate.reset();
|
volumetric_rate.reset();
|
||||||
temperature.reset();
|
temperature.reset();
|
||||||
layer_duration.reset();
|
layer_duration.reset();
|
||||||
|
layer_duration_log.reset(true);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue