mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	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); | ||||
| 
 | ||||
|     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
 | ||||
|     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<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) | ||||
|             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; | ||||
|     } | ||||
|  |  | |||
|  | @ -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<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() { | ||||
|     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<int>(Range_Colors.size()) - 1; i >= 0; --i) { | ||||
|                 if (!is_log) | ||||
|                     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); | ||||
|                 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: | ||||
|     { | ||||
|  |  | |||
|  | @ -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); | ||||
|             } | ||||
|         }; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 SoftFever
						SoftFever