From 41078e6555a2397f1150aa8edb1d028b52f993a8 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Tue, 20 Dec 2022 22:24:42 +0800 Subject: [PATCH] refactor and improve layer time display --- src/libslic3r/GCode/GCodeProcessor.cpp | 6 +++- src/slic3r/GUI/GCodeViewer.cpp | 39 ++++++++++++++++++-------- src/slic3r/GUI/GCodeViewer.hpp | 10 +++++-- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index bafb8e390..2d6dd75e5 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -1424,6 +1424,10 @@ void GCodeProcessor::finalize(bool post_process) m_used_filaments.process_caches(this); update_estimated_times_stats(); + auto time_mode = m_result.print_statistics.modes[static_cast(PrintEstimatedStatistics::ETimeMode::Normal)]; + + auto it = std::find_if(time_mode.roles_times.begin(), time_mode.roles_times.end(), [](const std::pair& item) { return erCustom == item.first; }); + auto prepare_time = (it != time_mode.roles_times.end()) ? it->second : 0.0f; //update times for results 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); std::vector& layer_times = m_result.print_statistics.modes[static_cast(PrintEstimatedStatistics::ETimeMode::Normal)].layers_times; 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 m_result.moves[i].layer_duration = 0; } diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 1a36f761b..d767c41a8 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -255,6 +255,8 @@ GCodeViewer::Color GCodeViewer::Extrusions::Range::get_color_at(float value) con { // Input value scaled to the colors range 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 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; } -float GCodeViewer::Extrusions::Range::step_size(bool is_log) const { - if (is_log) +float GCodeViewer::Extrusions::Range::step_size() const { + if (log_scale) { float min_range = min; if (min_range == 0) @@ -285,6 +287,13 @@ float GCodeViewer::Extrusions::Range::step_size(bool is_log) const { return (max - min) / (static_cast(Range_Colors.size()) - 1.0f); } +float GCodeViewer::Extrusions::Range::get_value_at_step(int step) const { + if (!log_scale) + return min + static_cast(step) * step_size(); + else + return std::exp(std::log(min) + static_cast(step) * step_size()); + +} GCodeViewer::SequentialRangeCap::~SequentialRangeCap() { if (ibo > 0) 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 flow = ImGui::ColorMarkerStart + _u8L("Flow: ") + 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 temperature = ImGui::ColorMarkerStart + _u8L("Temperature: ") + ImGui::ColorMarkerEnd; 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); 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: break; } @@ -1157,8 +1173,10 @@ void GCodeViewer::refresh(const GCodeProcessorResult& gcode_result, const std::v if (curr.extrusion_role != erCustom || is_visible(erCustom)) 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_log.update_from(curr.layer_duration); + } [[fallthrough]]; } 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::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::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::Tool: { color = m_tools.m_tool_colors[path.extruder_id]; break; } 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) { char buf[1024]; ::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); } else { - const float step_size = range.step_size(is_log); + const float step_size = range.step_size(); for (int i = static_cast(Range_Colors.size()) - 1; i >= 0; --i) { - if (!is_log) - append_range_item(i, range.min + static_cast(i) * step_size, decimals); - else - append_range_item(i, std::exp(std::log(range.min) + static_cast(i) * step_size),decimals); + append_range_item(i, range.get_value_at_step(i), 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::Temperature: { append_range(m_extrusions.ranges.temperature, 0); 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::Tool: { diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 15d0a7026..980ca8bc3 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -399,19 +399,21 @@ class GCodeViewer float min; float max; unsigned int count; + bool log_scale; Range() { reset(); } - void update_from(const float value) { if (value != max && value != min) ++count; min = std::min(min, 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; + float get_value_at_step(int step) const; + }; struct Ranges @@ -430,6 +432,7 @@ class GCodeViewer Range temperature; // Color mapping by layer time. Range layer_duration; + Range layer_duration_log; void reset() { height.reset(); width.reset(); @@ -438,6 +441,7 @@ class GCodeViewer volumetric_rate.reset(); temperature.reset(); layer_duration.reset(); + layer_duration_log.reset(true); } };