From fbb7eb77b4143574c294b6163811a03df697c92c Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 8 Feb 2024 12:36:01 +0100 Subject: [PATCH] SPE-1872: Actual speed profile extended to travel and wipe moves --- src/libslic3r/GCode/GCodeProcessor.cpp | 8 +- src/libvgcode/src/ViewerImpl.cpp | 6 +- src/slic3r/GUI/GCodeViewer.cpp | 192 ++++++++++++------------- 3 files changed, 105 insertions(+), 101 deletions(-) diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index bf89fa33fa..5d98f6715a 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -447,12 +447,14 @@ void GCodeProcessor::TimeMachine::calculate_time(size_t keep_last_n_blocks, floa // detect actual speed moves required to render toolpaths using actual speed if (mode == PrintEstimatedStatistics::ETimeMode::Normal) { GCodeProcessorResult::MoveVertex& curr_move = result.moves[block.move_id]; - if (curr_move.type != EMoveType::Extrude) - continue; + if (curr_move.type != EMoveType::Extrude && + curr_move.type != EMoveType::Travel && + curr_move.type != EMoveType::Wipe) + continue; assert(curr_move.actual_feedrate == 0.0f); const GCodeProcessorResult::MoveVertex& prev_move = result.moves[block.move_id - 1]; - const bool interpolate = (prev_move.type == EMoveType::Extrude); + const bool interpolate = (prev_move.type == curr_move.type); if (block.trapezoid.acceleration_distance() > EPSILON) { const float t = block.trapezoid.accelerate_until / block.distance; diff --git a/src/libvgcode/src/ViewerImpl.cpp b/src/libvgcode/src/ViewerImpl.cpp index 69abd0dbc2..460ae84e2d 100644 --- a/src/libvgcode/src/ViewerImpl.cpp +++ b/src/libvgcode/src/ViewerImpl.cpp @@ -1308,7 +1308,6 @@ void ViewerImpl::update_color_ranges() m_width_range.update(round_to_bin(v.width)); #if VGCODE_ENABLE_ET_SPE1872 m_volumetric_rate_range.update(round_to_bin(v.volumetric_rate())); - m_actual_volumetric_rate_range.update(round_to_bin(v.actual_volumetric_rate())); #else m_volumetric_rate_range.update(round_to_bin(v.volumetric_rate)); #endif // VGCODE_ENABLE_ET_SPE1872 @@ -1317,9 +1316,12 @@ void ViewerImpl::update_color_ranges() m_temperature_range.update(v.temperature); } #if VGCODE_ENABLE_ET_SPE1872 - if ((v.is_travel() && m_settings.options_visibility.at(EOptionType::Travels)) || v.is_extrusion()) { + if ((v.is_travel() && m_settings.options_visibility.at(EOptionType::Travels)) || + (v.is_wipe() && m_settings.options_visibility.at(EOptionType::Wipes)) || + v.is_extrusion()) { m_speed_range.update(v.feedrate); m_actual_speed_range.update(v.actual_feedrate); + m_actual_volumetric_rate_range.update(round_to_bin(v.actual_volumetric_rate())); } #else if ((v.is_travel() && m_settings.options_visibility.at(EOptionType::Travels)) || v.is_extrusion()) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 2e0a88b419..455e25a7f7 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1190,102 +1190,102 @@ void GCodeViewer::load_as_gcode(const GCodeProcessorResult& gcode_result, const // convert data from PrusaSlicer format to libvgcode format libvgcode::GCodeInputData data = libvgcode::convert(gcode_result, str_tool_colors, str_color_print_colors, m_viewer); -#define ENABLE_DATA_EXPORT 1 -#if ENABLE_DATA_EXPORT - auto extrusion_role_to_string = [](libvgcode::EGCodeExtrusionRole role) { - switch (role) { - case libvgcode::EGCodeExtrusionRole::None: { return "EGCodeExtrusionRole::None"; } - case libvgcode::EGCodeExtrusionRole::Perimeter: { return "EGCodeExtrusionRole::Perimeter"; } - case libvgcode::EGCodeExtrusionRole::ExternalPerimeter: { return "EGCodeExtrusionRole::ExternalPerimeter"; } - case libvgcode::EGCodeExtrusionRole::OverhangPerimeter: { return "EGCodeExtrusionRole::OverhangPerimeter"; } - case libvgcode::EGCodeExtrusionRole::InternalInfill: { return "EGCodeExtrusionRole::InternalInfill"; } - case libvgcode::EGCodeExtrusionRole::SolidInfill: { return "EGCodeExtrusionRole::SolidInfill"; } - case libvgcode::EGCodeExtrusionRole::TopSolidInfill: { return "EGCodeExtrusionRole::TopSolidInfill"; } - case libvgcode::EGCodeExtrusionRole::Ironing: { return "EGCodeExtrusionRole::Ironing"; } - case libvgcode::EGCodeExtrusionRole::BridgeInfill: { return "EGCodeExtrusionRole::BridgeInfill"; } - case libvgcode::EGCodeExtrusionRole::GapFill: { return "EGCodeExtrusionRole::GapFill"; } - case libvgcode::EGCodeExtrusionRole::Skirt: { return "EGCodeExtrusionRole::Skirt"; } - case libvgcode::EGCodeExtrusionRole::SupportMaterial: { return "EGCodeExtrusionRole::SupportMaterial"; } - case libvgcode::EGCodeExtrusionRole::SupportMaterialInterface: { return "EGCodeExtrusionRole::SupportMaterialInterface"; } - case libvgcode::EGCodeExtrusionRole::WipeTower: { return "EGCodeExtrusionRole::WipeTower"; } - case libvgcode::EGCodeExtrusionRole::Custom: { return "EGCodeExtrusionRole::Custom"; } - case libvgcode::EGCodeExtrusionRole::COUNT: { return "EGCodeExtrusionRole::COUNT"; } - } - }; - - auto move_type_to_string = [](libvgcode::EMoveType type) { - switch (type) { - case libvgcode::EMoveType::Noop: { return "EMoveType::Noop"; } - case libvgcode::EMoveType::Retract: { return "EMoveType::Retract"; } - case libvgcode::EMoveType::Unretract: { return "EMoveType::Unretract"; } - case libvgcode::EMoveType::Seam: { return "EMoveType::Seam"; } - case libvgcode::EMoveType::ToolChange: { return "EMoveType::ToolChange"; } - case libvgcode::EMoveType::ColorChange: { return "EMoveType::ColorChange"; } - case libvgcode::EMoveType::PausePrint: { return "EMoveType::PausePrint"; } - case libvgcode::EMoveType::CustomGCode: { return "EMoveType::CustomGCode"; } - case libvgcode::EMoveType::Travel: { return "EMoveType::Travel"; } - case libvgcode::EMoveType::Wipe: { return "EMoveType::Wipe"; } - case libvgcode::EMoveType::Extrude: { return "EMoveType::Extrude"; } - case libvgcode::EMoveType::COUNT: { return "EMoveType::COUNT"; } - } - }; - - FilePtr out{ boost::nowide::fopen("C:/prusa/slicer/test_output/spe1872/test.data", "wb") }; - if (out.f != nullptr) { - const size_t vertices_count = data.vertices.size(); - fwrite((void*)&vertices_count, 1, sizeof(size_t), out.f); - for (const libvgcode::PathVertex& v : data.vertices) { - fwrite((void*)&v.position[0], 1, sizeof(float), out.f); - fwrite((void*)&v.position[1], 1, sizeof(float), out.f); - fwrite((void*)&v.position[2], 1, sizeof(float), out.f); - fwrite((void*)&v.height, 1, sizeof(float), out.f); - fwrite((void*)&v.width, 1, sizeof(float), out.f); - fwrite((void*)&v.feedrate, 1, sizeof(float), out.f); -#if ENABLE_ET_SPE1872 - fwrite((void*)&v.actual_feedrate, 1, sizeof(float), out.f); - fwrite((void*)&v.mm3_per_mm, 1, sizeof(float), out.f); -#endif // ENABLE_ET_SPE1872 - fwrite((void*)&v.fan_speed, 1, sizeof(float), out.f); - fwrite((void*)&v.temperature, 1, sizeof(float), out.f); -#if !ENABLE_ET_SPE1872 - fwrite((void*)&v.volumetric_rate, 1, sizeof(float), out.f); -#endif // !ENABLE_ET_SPE1872 - fwrite((void*)&v.role, 1, sizeof(uint8_t), out.f); - fwrite((void*)&v.type, 1, sizeof(uint8_t), out.f); - fwrite((void*)&v.gcode_id, 1, sizeof(uint32_t), out.f); - fwrite((void*)&v.layer_id, 1, sizeof(uint32_t), out.f); - fwrite((void*)&v.extruder_id, 1, sizeof(uint32_t), out.f); - fwrite((void*)&v.color_id, 1, sizeof(uint32_t), out.f); - fwrite((void*)&v.times[0], 1, sizeof(float), out.f); - fwrite((void*)&v.times[1], 1, sizeof(float), out.f); -#if VGCODE_ENABLE_COG_AND_TOOL_MARKERS - const float weight = v.weight; -#else - const float weight = 0.0f; -#endif // VGCODE_ENABLE_COG_AND_TOOL_MARKERS - fwrite((void*)&weight, 1, sizeof(float), out.f); - } - - const uint8_t spiral_vase_mode = data.spiral_vase_mode ? 1 : 0; - fwrite((void*)&spiral_vase_mode, 1, sizeof(uint8_t), out.f); - - const size_t tool_colors_count = data.tools_colors.size(); - fwrite((void*)&tool_colors_count, 1, sizeof(size_t), out.f); - for (const libvgcode::Color& c : data.tools_colors) { - fwrite((void*)&c[0], 1, sizeof(uint8_t), out.f); - fwrite((void*)&c[1], 1, sizeof(uint8_t), out.f); - fwrite((void*)&c[2], 1, sizeof(uint8_t), out.f); - } - - const size_t color_print_colors_count = data.color_print_colors.size(); - fwrite((void*)&color_print_colors_count, 1, sizeof(size_t), out.f); - for (const libvgcode::Color& c : data.color_print_colors) { - fwrite((void*)&c[0], 1, sizeof(uint8_t), out.f); - fwrite((void*)&c[1], 1, sizeof(uint8_t), out.f); - fwrite((void*)&c[2], 1, sizeof(uint8_t), out.f); - } - } -#endif // ENABLE_DATA_EXPORT +//#define ENABLE_DATA_EXPORT 1 +//#if ENABLE_DATA_EXPORT +// auto extrusion_role_to_string = [](libvgcode::EGCodeExtrusionRole role) { +// switch (role) { +// case libvgcode::EGCodeExtrusionRole::None: { return "EGCodeExtrusionRole::None"; } +// case libvgcode::EGCodeExtrusionRole::Perimeter: { return "EGCodeExtrusionRole::Perimeter"; } +// case libvgcode::EGCodeExtrusionRole::ExternalPerimeter: { return "EGCodeExtrusionRole::ExternalPerimeter"; } +// case libvgcode::EGCodeExtrusionRole::OverhangPerimeter: { return "EGCodeExtrusionRole::OverhangPerimeter"; } +// case libvgcode::EGCodeExtrusionRole::InternalInfill: { return "EGCodeExtrusionRole::InternalInfill"; } +// case libvgcode::EGCodeExtrusionRole::SolidInfill: { return "EGCodeExtrusionRole::SolidInfill"; } +// case libvgcode::EGCodeExtrusionRole::TopSolidInfill: { return "EGCodeExtrusionRole::TopSolidInfill"; } +// case libvgcode::EGCodeExtrusionRole::Ironing: { return "EGCodeExtrusionRole::Ironing"; } +// case libvgcode::EGCodeExtrusionRole::BridgeInfill: { return "EGCodeExtrusionRole::BridgeInfill"; } +// case libvgcode::EGCodeExtrusionRole::GapFill: { return "EGCodeExtrusionRole::GapFill"; } +// case libvgcode::EGCodeExtrusionRole::Skirt: { return "EGCodeExtrusionRole::Skirt"; } +// case libvgcode::EGCodeExtrusionRole::SupportMaterial: { return "EGCodeExtrusionRole::SupportMaterial"; } +// case libvgcode::EGCodeExtrusionRole::SupportMaterialInterface: { return "EGCodeExtrusionRole::SupportMaterialInterface"; } +// case libvgcode::EGCodeExtrusionRole::WipeTower: { return "EGCodeExtrusionRole::WipeTower"; } +// case libvgcode::EGCodeExtrusionRole::Custom: { return "EGCodeExtrusionRole::Custom"; } +// case libvgcode::EGCodeExtrusionRole::COUNT: { return "EGCodeExtrusionRole::COUNT"; } +// } +// }; +// +// auto move_type_to_string = [](libvgcode::EMoveType type) { +// switch (type) { +// case libvgcode::EMoveType::Noop: { return "EMoveType::Noop"; } +// case libvgcode::EMoveType::Retract: { return "EMoveType::Retract"; } +// case libvgcode::EMoveType::Unretract: { return "EMoveType::Unretract"; } +// case libvgcode::EMoveType::Seam: { return "EMoveType::Seam"; } +// case libvgcode::EMoveType::ToolChange: { return "EMoveType::ToolChange"; } +// case libvgcode::EMoveType::ColorChange: { return "EMoveType::ColorChange"; } +// case libvgcode::EMoveType::PausePrint: { return "EMoveType::PausePrint"; } +// case libvgcode::EMoveType::CustomGCode: { return "EMoveType::CustomGCode"; } +// case libvgcode::EMoveType::Travel: { return "EMoveType::Travel"; } +// case libvgcode::EMoveType::Wipe: { return "EMoveType::Wipe"; } +// case libvgcode::EMoveType::Extrude: { return "EMoveType::Extrude"; } +// case libvgcode::EMoveType::COUNT: { return "EMoveType::COUNT"; } +// } +// }; +// +// FilePtr out{ boost::nowide::fopen("C:/prusa/slicer/test_output/spe1872/test.data", "wb") }; +// if (out.f != nullptr) { +// const size_t vertices_count = data.vertices.size(); +// fwrite((void*)&vertices_count, 1, sizeof(size_t), out.f); +// for (const libvgcode::PathVertex& v : data.vertices) { +// fwrite((void*)&v.position[0], 1, sizeof(float), out.f); +// fwrite((void*)&v.position[1], 1, sizeof(float), out.f); +// fwrite((void*)&v.position[2], 1, sizeof(float), out.f); +// fwrite((void*)&v.height, 1, sizeof(float), out.f); +// fwrite((void*)&v.width, 1, sizeof(float), out.f); +// fwrite((void*)&v.feedrate, 1, sizeof(float), out.f); +//#if ENABLE_ET_SPE1872 +// fwrite((void*)&v.actual_feedrate, 1, sizeof(float), out.f); +// fwrite((void*)&v.mm3_per_mm, 1, sizeof(float), out.f); +//#endif // ENABLE_ET_SPE1872 +// fwrite((void*)&v.fan_speed, 1, sizeof(float), out.f); +// fwrite((void*)&v.temperature, 1, sizeof(float), out.f); +//#if !ENABLE_ET_SPE1872 +// fwrite((void*)&v.volumetric_rate, 1, sizeof(float), out.f); +//#endif // !ENABLE_ET_SPE1872 +// fwrite((void*)&v.role, 1, sizeof(uint8_t), out.f); +// fwrite((void*)&v.type, 1, sizeof(uint8_t), out.f); +// fwrite((void*)&v.gcode_id, 1, sizeof(uint32_t), out.f); +// fwrite((void*)&v.layer_id, 1, sizeof(uint32_t), out.f); +// fwrite((void*)&v.extruder_id, 1, sizeof(uint32_t), out.f); +// fwrite((void*)&v.color_id, 1, sizeof(uint32_t), out.f); +// fwrite((void*)&v.times[0], 1, sizeof(float), out.f); +// fwrite((void*)&v.times[1], 1, sizeof(float), out.f); +//#if VGCODE_ENABLE_COG_AND_TOOL_MARKERS +// const float weight = v.weight; +//#else +// const float weight = 0.0f; +//#endif // VGCODE_ENABLE_COG_AND_TOOL_MARKERS +// fwrite((void*)&weight, 1, sizeof(float), out.f); +// } +// +// const uint8_t spiral_vase_mode = data.spiral_vase_mode ? 1 : 0; +// fwrite((void*)&spiral_vase_mode, 1, sizeof(uint8_t), out.f); +// +// const size_t tool_colors_count = data.tools_colors.size(); +// fwrite((void*)&tool_colors_count, 1, sizeof(size_t), out.f); +// for (const libvgcode::Color& c : data.tools_colors) { +// fwrite((void*)&c[0], 1, sizeof(uint8_t), out.f); +// fwrite((void*)&c[1], 1, sizeof(uint8_t), out.f); +// fwrite((void*)&c[2], 1, sizeof(uint8_t), out.f); +// } +// +// const size_t color_print_colors_count = data.color_print_colors.size(); +// fwrite((void*)&color_print_colors_count, 1, sizeof(size_t), out.f); +// for (const libvgcode::Color& c : data.color_print_colors) { +// fwrite((void*)&c[0], 1, sizeof(uint8_t), out.f); +// fwrite((void*)&c[1], 1, sizeof(uint8_t), out.f); +// fwrite((void*)&c[2], 1, sizeof(uint8_t), out.f); +// } +// } +//#endif // ENABLE_DATA_EXPORT // send data to the viewer m_viewer.reset_default_extrusion_roles_colors();