From 81bab138b5c5ff8cfeaa709926c8888624ab164f Mon Sep 17 00:00:00 2001 From: "xun.zhang" Date: Tue, 12 Sep 2023 11:51:53 +0800 Subject: [PATCH] ENH: seperate wipe tower weight from model jira:STUDIO-4353 Signed-off-by: xun.zhang Change-Id: Ia8a030314ab995c57a0990d08a966382f6f0eecc --- src/libslic3r/GCode.cpp | 15 ++++ src/libslic3r/GCode/GCodeProcessor.cpp | 80 +++++++++++++----- src/libslic3r/GCode/GCodeProcessor.hpp | 17 +++- src/libslic3r/GCode/WipeTower.cpp | 4 +- src/slic3r/GUI/GCodeViewer.cpp | 107 +++++++++++++++++++------ 5 files changed, 176 insertions(+), 47 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index ce94665e1..6459d0151 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1002,6 +1002,21 @@ namespace DoExport { total_cost += weight * extruder->filament_cost() * 0.001; } + for (auto volume : result.print_statistics.wipe_tower_volumes_per_extruder) { + total_extruded_volume += volume.second; + + size_t extruder_id = volume.first; + auto extruder = std::find_if(extruders.begin(), extruders.end(), [extruder_id](const Extruder& extr) {return extr.id() == extruder_id; }); + if (extruder == extruders.end()) + continue; + + double s = PI * sqr(0.5* extruder->filament_diameter()); + double weight = volume.second * extruder->filament_density() * 0.001; + total_used_filament += volume.second/s; + total_weight += weight; + total_cost += weight * extruder->filament_cost() * 0.001; + } + print_statistics.total_extruded_volume = total_extruded_volume; print_statistics.total_used_filament = total_used_filament; print_statistics.total_weight = total_weight; diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 9ef2f1dc3..b43302316 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -58,7 +58,8 @@ const std::vector GCodeProcessor::Reserved_Tags = { "_GP_LAST_LINE_M73_PLACEHOLDER", "_GP_ESTIMATED_PRINTING_TIME_PLACEHOLDER", "_GP_TOTAL_LAYER_NUMBER_PLACEHOLDER", - "_DURING_PRINT_EXHAUST_FAN" + " WIPE_TOWER_START", + " WIPE_TOWER_END" }; const std::string GCodeProcessor::Flush_Start_Tag = " FLUSH_START"; @@ -698,22 +699,30 @@ void GCodeProcessor::UsedFilaments::reset() color_change_cache = 0.0f; volumes_per_color_change = std::vector(); - tool_change_cache = 0.0f; + model_extrude_cache = 0.0f; volumes_per_extruder.clear(); flush_per_filament.clear(); role_cache = 0.0f; filaments_per_role.clear(); + + wipe_tower_cache = 0.0f; + wipe_tower_volume_per_extruder.clear(); } -void GCodeProcessor::UsedFilaments::increase_caches(double extruded_volume) +void GCodeProcessor::UsedFilaments::increase_model_caches(double extruded_volume) { color_change_cache += extruded_volume; - tool_change_cache += extruded_volume; + model_extrude_cache += extruded_volume; role_cache += extruded_volume; } +void GCodeProcessor::UsedFilaments::increase_wipe_tower_caches(double extruded_volume) +{ + wipe_tower_cache += extruded_volume; +} + void GCodeProcessor::UsedFilaments::process_color_change_cache() { if (color_change_cache != 0.0f) { @@ -722,15 +731,27 @@ void GCodeProcessor::UsedFilaments::process_color_change_cache() } } -void GCodeProcessor::UsedFilaments::process_extruder_cache(GCodeProcessor* processor) +void GCodeProcessor::UsedFilaments::process_model_cache(GCodeProcessor* processor) { size_t active_extruder_id = processor->m_extruder_id; - if (tool_change_cache != 0.0f) { + if (model_extrude_cache != 0.0f) { if (volumes_per_extruder.find(active_extruder_id) != volumes_per_extruder.end()) - volumes_per_extruder[active_extruder_id] += tool_change_cache; + volumes_per_extruder[active_extruder_id] += model_extrude_cache; else - volumes_per_extruder[active_extruder_id] = tool_change_cache; - tool_change_cache = 0.0f; + volumes_per_extruder[active_extruder_id] = model_extrude_cache; + model_extrude_cache = 0.0f; + } +} + +void GCodeProcessor::UsedFilaments::process_wipe_tower_cache(GCodeProcessor* processor) +{ + size_t active_extruder_id = processor->m_extruder_id; + if (wipe_tower_cache != 0.0f) { + if (wipe_tower_volume_per_extruder.find(active_extruder_id) != wipe_tower_volume_per_extruder.end()) + wipe_tower_volume_per_extruder[active_extruder_id] += wipe_tower_cache; + else + wipe_tower_volume_per_extruder[active_extruder_id] = wipe_tower_cache; + wipe_tower_cache = 0.0f; } } @@ -765,8 +786,9 @@ void GCodeProcessor::UsedFilaments::process_role_cache(GCodeProcessor* processor void GCodeProcessor::UsedFilaments::process_caches(GCodeProcessor* processor) { process_color_change_cache(); - process_extruder_cache(processor); + process_model_cache(processor); process_role_cache(processor); + process_wipe_tower_cache(processor); } #if ENABLE_GCODE_VIEWER_STATISTICS @@ -1266,6 +1288,7 @@ void GCodeProcessor::reset() m_cached_position.reset(); m_wiping = false; m_flushing = false; + m_wipe_tower = false; m_remaining_volume = 0.f; // BBS: arc move related data m_move_path_type = EMovePathType::Noop_move; @@ -2042,6 +2065,17 @@ void GCodeProcessor::process_tags(const std::string_view comment, bool producers return; } + if (boost::starts_with(comment, reserved_tag(ETags::Wipe_Tower_Start))) { + m_wipe_tower = true; + return; + } + + if (boost::starts_with(comment, reserved_tag(ETags::Wipe_Tower_End))) { + m_wipe_tower = false; + m_used_filaments.process_wipe_tower_cache(this); + return; + } + //BBS: flush start tag if (boost::starts_with(comment, GCodeProcessor::Flush_Start_Tag)) { m_flushing = true; @@ -2731,10 +2765,13 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) float delta_xyz = std::sqrt(sqr(delta_pos[X]) + sqr(delta_pos[Y]) + sqr(delta_pos[Z])); float volume_extruded_filament = area_filament_cross_section * delta_pos[E]; float area_toolpath_cross_section = volume_extruded_filament / delta_xyz; - - // save extruded volume to the cache - m_used_filaments.increase_caches(volume_extruded_filament); - + if (m_wipe_tower) { + m_used_filaments.increase_wipe_tower_caches(volume_extruded_filament); + } + else { + // save extruded volume to the cache + m_used_filaments.increase_model_caches(volume_extruded_filament); + } // volume extruded filament / tool displacement = area toolpath cross section m_mm3_per_mm = area_toolpath_cross_section; #if ENABLE_GCODE_VIEWER_DATA_CHECKING @@ -3188,10 +3225,14 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line) if (type == EMoveType::Extrude) { float volume_extruded_filament = area_filament_cross_section * delta_pos[E]; float area_toolpath_cross_section = volume_extruded_filament / delta_xyz; - - //BBS: save extruded volume to the cache - m_used_filaments.increase_caches(volume_extruded_filament); - + if (m_wipe_tower) { + //BBS: save wipe tower volume to the cache + m_used_filaments.increase_wipe_tower_caches(volume_extruded_filament); + } + else { + //BBS: save extruded volume to the cache + m_used_filaments.increase_model_caches(volume_extruded_filament); + } //BBS: volume extruded filament / tool displacement = area toolpath cross section m_mm3_per_mm = area_toolpath_cross_section; #if ENABLE_GCODE_VIEWER_DATA_CHECKING @@ -4236,7 +4277,7 @@ void GCodeProcessor::process_filaments(CustomGCode::Type code) m_used_filaments.process_color_change_cache(); if (code == CustomGCode::ToolChange) { - m_used_filaments.process_extruder_cache(this); + m_used_filaments.process_model_cache(this); //BBS: reset remaining filament m_remaining_volume = m_nozzle_volume; } @@ -4269,6 +4310,7 @@ void GCodeProcessor::update_estimated_times_stats() m_result.print_statistics.volumes_per_color_change = m_used_filaments.volumes_per_color_change; m_result.print_statistics.volumes_per_extruder = m_used_filaments.volumes_per_extruder; + m_result.print_statistics.wipe_tower_volumes_per_extruder = m_used_filaments.wipe_tower_volume_per_extruder; m_result.print_statistics.flush_per_filament = m_used_filaments.flush_per_filament; m_result.print_statistics.used_filaments_per_role = m_used_filaments.filaments_per_role; } diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index e8245129a..1f0080983 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -72,6 +72,7 @@ namespace Slic3r { std::vector volumes_per_color_change; std::map volumes_per_extruder; + std::map wipe_tower_volumes_per_extruder; //BBS: the flush amount of every filament std::map flush_per_filament; std::map> used_filaments_per_role; @@ -87,6 +88,7 @@ namespace Slic3r { } volumes_per_color_change.clear(); volumes_per_color_change.shrink_to_fit(); + wipe_tower_volumes_per_extruder.clear(); volumes_per_extruder.clear(); flush_per_filament.clear(); used_filaments_per_role.clear(); @@ -256,7 +258,8 @@ namespace Slic3r { Last_Line_M73_Placeholder, Estimated_Printing_Time_Placeholder, Total_Layer_Number_Placeholder, - During_Print_Exhaust_Fan + Wipe_Tower_Start, + Wipe_Tower_End, }; static const std::string& reserved_tag(ETags tag) { return Reserved_Tags[static_cast(tag)]; } @@ -467,9 +470,12 @@ namespace Slic3r { double color_change_cache; std::vector volumes_per_color_change; - double tool_change_cache; + double model_extrude_cache; std::map volumes_per_extruder; + double wipe_tower_cache; + std::mapwipe_tower_volume_per_extruder; + //BBS: the flush amount of every filament std::map flush_per_filament; @@ -478,10 +484,12 @@ namespace Slic3r { void reset(); - void increase_caches(double extruded_volume); + void increase_model_caches(double extruded_volume); + void increase_wipe_tower_caches(double extruded_volume); void process_color_change_cache(); - void process_extruder_cache(GCodeProcessor* processor); + void process_model_cache(GCodeProcessor* processor); + void process_wipe_tower_cache(GCodeProcessor* processor); void update_flush_per_filament(size_t extrude_id, float flush_length); void process_role_cache(GCodeProcessor* processor); void process_caches(GCodeProcessor* processor); @@ -630,6 +638,7 @@ namespace Slic3r { CachedPosition m_cached_position; bool m_wiping; bool m_flushing; + bool m_wipe_tower; float m_remaining_volume; //BBS: x, y offset for gcode generated diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index f88e0d56a..3d8a3700f 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -770,6 +770,7 @@ WipeTower::ToolChangeResult WipeTower::tool_change(size_t tool, bool extrude_per "; CP TOOLCHANGE START\n") .comment_with_value(" toolchange #", m_num_tool_changes + 1); // the number is zero-based + if (tool != (unsigned)(-1)) writer.append(std::string("; material : " + (m_current_tool < m_filpar.size() ? m_filpar[m_current_tool].material : "(NONE)") + " -> " + m_filpar[tool].material + "\n").c_str()) .append(";--------------------\n"); @@ -787,6 +788,7 @@ WipeTower::ToolChangeResult WipeTower::tool_change(size_t tool, bool extrude_per // Ram the hot material out of the melt zone, retract the filament into the cooling tubes and let it cool. if (tool != (unsigned int)-1){ // This is not the last change. + writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Wipe_Tower_Start) + "\n"); toolchange_Unload(writer, cleaning_box, m_filpar[m_current_tool].material, is_first_layer() ? m_filpar[tool].nozzle_temperature_initial_layer : m_filpar[tool].nozzle_temperature); toolchange_Change(writer, tool, m_filpar[tool].material); // Change the tool, set a speed override for soluble and flex materials. @@ -806,8 +808,8 @@ WipeTower::ToolChangeResult WipeTower::tool_change(size_t tool, bool extrude_per writer.travel(Vec2f(0, 0)); writer.travel(initial_position); } - toolchange_Wipe(writer, cleaning_box, wipe_length); // Wipe the newly loaded filament until the end of the assigned wipe area. + writer.append(";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Wipe_Tower_End) + "\n"); ++ m_num_tool_changes; } else toolchange_Unload(writer, cleaning_box, m_filpar[m_current_tool].material, m_filpar[m_current_tool].nozzle_temperature); diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index eb68952b1..218337a0e 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -936,9 +936,9 @@ void GCodeViewer::update_by_mode(ConfigOptionMode mode) view_type_items.push_back(EViewType::LayerTime); view_type_items.push_back(EViewType::FanSpeed); view_type_items.push_back(EViewType::Temperature); - if (mode == ConfigOptionMode::comDevelop) { - view_type_items.push_back(EViewType::Tool); - } + //if (mode == ConfigOptionMode::comDevelop) { + // view_type_items.push_back(EViewType::Tool); + //} for (int i = 0; i < view_type_items.size(); i++) { view_type_items_str.push_back(get_view_type_string(view_type_items[i])); @@ -951,9 +951,9 @@ void GCodeViewer::update_by_mode(ConfigOptionMode mode) options_items.push_back(EMoveType::Retract); options_items.push_back(EMoveType::Unretract); options_items.push_back(EMoveType::Wipe); - if (mode == ConfigOptionMode::comDevelop) { - options_items.push_back(EMoveType::Tool_change); - } + //if (mode == ConfigOptionMode::comDevelop) { + // options_items.push_back(EMoveType::Tool_change); + //} //BBS: seam is not real move and extrusion, put at last line options_items.push_back(EMoveType::Seam); } @@ -4692,8 +4692,17 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv std::vector flushed_filaments_m; std::vector flushed_filaments_g; double total_flushed_filament_m = 0, total_flushed_filament_g = 0; - bool show_model_used_filaments = true; - bool show_flushed_filaments = true; + std::vector wipe_tower_used_filaments_m; + std::vector wipe_tower_used_filaments_g; + double total_wipe_tower_used_filament_m = 0, total_wipe_tower_used_filament_g = 0; + struct ColumnData { + enum { + Model = 1, + Flushed = 2, + WipeTower = 4, + }; + }; + int displayed_columns = ColumnData::Model | ColumnData::Flushed | ColumnData::WipeTower; const PrintStatistics& ps = wxGetApp().plater()->get_partplate_list().get_current_fff_print().print_statistics(); double koef = imperial_units ? GizmoObjectManipulation::in_to_mm : 1000.0; double unit_conver = imperial_units ? GizmoObjectManipulation::oz_to_g : 1; @@ -4782,7 +4791,19 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv total_model_used_filament_g += model_used_filament_g; } if (model_used_filaments_m.size() == 0 || model_used_filaments_g.size() == 0) - show_model_used_filaments = false; + displayed_columns &= ~ColumnData::Model; + + for (size_t extruder_id : m_extruder_ids) { + if (m_print_statistics.wipe_tower_volumes_per_extruder.find(extruder_id) == m_print_statistics.wipe_tower_volumes_per_extruder.end()) continue; + double volume = m_print_statistics.wipe_tower_volumes_per_extruder.at(extruder_id); + auto [wipe_tower_used_filament_m, wipe_tower_used_filament_g] = get_used_filament_from_volume(volume, extruder_id); + wipe_tower_used_filaments_m.push_back(wipe_tower_used_filament_m); + wipe_tower_used_filaments_g.push_back(wipe_tower_used_filament_g); + total_wipe_tower_used_filament_m += wipe_tower_used_filament_m; + total_wipe_tower_used_filament_g += wipe_tower_used_filament_g; + } + if (wipe_tower_used_filaments_m.size() == 0 || wipe_tower_used_filaments_g.size() == 0) + displayed_columns &= ~ColumnData::WipeTower; for (size_t extruder_id : m_extruder_ids) { if (m_print_statistics.flush_per_filament.find(extruder_id) == m_print_statistics.flush_per_filament.end()) continue; @@ -4794,18 +4815,27 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv total_flushed_filament_g += flushed_filament_g; } if (flushed_filaments_m.size() == 0 || flushed_filaments_g.size() == 0) - show_flushed_filaments = false; + displayed_columns &= ~ColumnData::Flushed; std::vector total_filaments; char buffer[64]; ::sprintf(buffer, imperial_units ? "%.2f in\n%.2f oz" : "%.2f m\n%.2f g", ps.total_used_filament / /*1000*/koef, ps.total_weight / unit_conver); total_filaments.push_back(buffer); - offsets = calculate_offsets({ {_u8L("Filament"), {""}}, {_u8L("Model"), total_filaments}, {_u8L("Flushed"), total_filaments}, /*{_u8L("Tower"), total_filaments},*/ {_u8L("Total"), total_filaments} }, icon_size); - if (m_extruder_ids.size() <= 1 || !show_flushed_filaments) + + if (displayed_columns == ColumnData::Model) { + offsets = calculate_offsets({ {_u8L("Filament"), {""}}, {_u8L("Model"), total_filaments}, {_u8L("Flushed"), total_filaments}, {_u8L("Total"), total_filaments} }, icon_size); append_headers({ {_u8L("Filament"), offsets[0]}, {_u8L("Model"), offsets[2]}}); - else - append_headers({ {_u8L("Filament"), offsets[0]}, {_u8L("Model"), offsets[1]}, {_u8L("Flushed"), offsets[2]}, /*{_u8L("Tower"), offsets[3]},*/ {_u8L("Total"), offsets[3]}});// to add Tower + } + if (displayed_columns == (ColumnData::Model | ColumnData::Flushed)) { + offsets = calculate_offsets({ {_u8L("Filament"), {""}}, {_u8L("Model"), total_filaments}, {_u8L("Flushed"), total_filaments}, {_u8L("Total"), total_filaments} }, icon_size); + append_headers({ {_u8L("Filament"), offsets[0]}, {_u8L("Model"), offsets[1]}, {_u8L("Flushed"), offsets[2]}, {_u8L("Total"), offsets[3]} }); + } + if (displayed_columns == (ColumnData::Model | ColumnData::Flushed | ColumnData::WipeTower)) { + offsets = calculate_offsets({ {_u8L("Filament"), {""}}, {_u8L("Model"), total_filaments}, {_u8L("Flushed"), total_filaments}, {_u8L("Tower"), total_filaments}, {_u8L("Total"), total_filaments} }, icon_size); + append_headers({ {_u8L("Filament"), offsets[0]}, {_u8L("Model"), offsets[1]}, {_u8L("Flushed"), offsets[2]}, {_u8L("Tower"), offsets[3]}, {_u8L("Total"), offsets[4]} }); + } + break; } default: { break; } @@ -4976,7 +5006,12 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv columns_offsets.push_back({ std::to_string(extruder_idx + 1), offsets[0] }); char buf[64]; - if (show_flushed_filaments) { + if (displayed_columns == ColumnData::Model) { + char buf[64]; + ::sprintf(buf, imperial_units ? "%.2f in %.2f oz" : "%.2f m %.2f g", model_used_filaments_m[i], model_used_filaments_g[i] / unit_conver); + columns_offsets.push_back({ buf, offsets[2] }); + } + if (displayed_columns == (ColumnData::Model | ColumnData::Flushed)) { ::sprintf(buf, imperial_units ? "%.2f in\n%.2f oz" : "%.2f m\n%.2f g", model_used_filaments_m[i], model_used_filaments_g[i] / unit_conver); columns_offsets.push_back({ buf, offsets[1] }); @@ -4984,15 +5019,25 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv columns_offsets.push_back({ buf, offsets[2] }); ::sprintf(buf, imperial_units ? "%.2f in\n%.2f oz" : "%.2f m\n%.2f g", (model_used_filaments_m[i] + flushed_filaments_m[i]), - (model_used_filaments_g[i] + flushed_filaments_g[i]) / unit_conver); + (model_used_filaments_g[i] + flushed_filaments_g[i]) / unit_conver); columns_offsets.push_back({ buf, offsets[3] }); } - else { - char buf[64]; - ::sprintf(buf, imperial_units ? "%.2f in %.2f oz" : "%.2f m %.2f g", model_used_filaments_m[i], model_used_filaments_g[i] / unit_conver); - columns_offsets.push_back({buf, offsets[2]}); + if (displayed_columns == (ColumnData::Model | ColumnData::Flushed | ColumnData::WipeTower)) { + ::sprintf(buf, imperial_units ? "%.2f in\n%.2f oz" : "%.2f m\n%.2f g", model_used_filaments_m[i], model_used_filaments_g[i] / unit_conver); + columns_offsets.push_back({ buf, offsets[1] }); + + ::sprintf(buf, imperial_units ? "%.2f in\n%.2f oz" : "%.2f m\n%.2f g", flushed_filaments_m[i], flushed_filaments_g[i] / unit_conver); + columns_offsets.push_back({ buf, offsets[2] }); + + ::sprintf(buf, imperial_units ? "%.2f in\n%.2f oz" : "%.2f m\n%.2f g", wipe_tower_used_filaments_m[i], wipe_tower_used_filaments_g[i] / unit_conver); + columns_offsets.push_back({ buf, offsets[3] }); + + ::sprintf(buf, imperial_units ? "%.2f in\n%.2f oz" : "%.2f m\n%.2f g", (model_used_filaments_m[i] + flushed_filaments_m[i] + wipe_tower_used_filaments_m[i]), + (model_used_filaments_g[i] + flushed_filaments_g[i] + wipe_tower_used_filaments_g[i]) / unit_conver); + columns_offsets.push_back({ buf, offsets[4] }); } + append_item(EItemType::Rect, m_tools.m_tool_colors[extruder_idx], columns_offsets, false, filament_visible, [this, extruder_idx]() { m_tools.m_tool_visibles[extruder_idx] = !m_tools.m_tool_visibles[extruder_idx]; // update buffers' render paths @@ -5038,13 +5083,13 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv std::vector> columns_offsets; columns_offsets.push_back({ _u8L("Total"), offsets[0] }); - if (!show_flushed_filaments) { + if (displayed_columns == ColumnData::Model) { ::sprintf(buf, imperial_units ? "%.2f in %.2f oz" : "%.2f m %.2f g", total_model_used_filament_m, total_model_used_filament_g / unit_conver); columns_offsets.push_back({ buf, offsets[2] }); append_item(EItemType::None, m_tools.m_tool_colors[0], columns_offsets); } - else { + if (displayed_columns == (ColumnData::Model | ColumnData::Flushed)) { ::sprintf(buf, imperial_units ? "%.2f in\n%.2f oz" : "%.2f m\n%.2f g", total_model_used_filament_m, total_model_used_filament_g / unit_conver); columns_offsets.push_back({ buf, offsets[1] }); @@ -5052,9 +5097,25 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv columns_offsets.push_back({ buf, offsets[2] }); bool imperial_units = wxGetApp().app_config->get("use_inches") == "1"; - ::sprintf(buf, imperial_units ? "%.2f in\n%.2f oz" : "%.2f m\n%.2f g", total_model_used_filament_m + total_flushed_filament_m, (total_model_used_filament_g + total_flushed_filament_g) / unit_conver); + ::sprintf(buf, imperial_units ? "%.2f in\n%.2f oz" : "%.2f m\n%.2f g", total_model_used_filament_m + total_flushed_filament_m , (total_model_used_filament_g + total_flushed_filament_g) / unit_conver); columns_offsets.push_back({ buf, offsets[3] }); + append_item(EItemType::None, m_tools.m_tool_colors[0], columns_offsets); + } + if (displayed_columns == (ColumnData::Model | ColumnData::Flushed | ColumnData::WipeTower)) { + ::sprintf(buf, imperial_units ? "%.2f in\n%.2f oz" : "%.2f m\n%.2f g", total_model_used_filament_m, total_model_used_filament_g / unit_conver); + columns_offsets.push_back({ buf, offsets[1] }); + + ::sprintf(buf, imperial_units ? "%.2f in\n%.2f oz" : "%.2f m\n%.2f g", total_flushed_filament_m, total_flushed_filament_g / unit_conver); + columns_offsets.push_back({ buf, offsets[2] }); + + ::sprintf(buf, imperial_units ? "%.2f in\n%.2f oz" : "%.2f m\n%.2f g", total_wipe_tower_used_filament_m, total_wipe_tower_used_filament_g / unit_conver); + columns_offsets.push_back({ buf, offsets[3] }); + + bool imperial_units = wxGetApp().app_config->get("use_inches") == "1"; + ::sprintf(buf, imperial_units ? "%.2f in\n%.2f oz" : "%.2f m\n%.2f g", total_model_used_filament_m + total_flushed_filament_m + total_wipe_tower_used_filament_m, (total_model_used_filament_g + total_flushed_filament_g + total_wipe_tower_used_filament_g) / unit_conver); + columns_offsets.push_back({ buf, offsets[4] }); + append_item(EItemType::None, m_tools.m_tool_colors[0], columns_offsets); } }