SPE-1872: Added visualization of actual volumetric flow rate

This commit is contained in:
enricoturri1966 2024-02-07 09:50:17 +01:00 committed by Lukas Matena
parent 268b5860fd
commit 0ba4a67af2
8 changed files with 99 additions and 44 deletions

View File

@ -4155,8 +4155,13 @@ void GCodeProcessor::post_process()
++m_times_cache_id;
}
#if ENABLE_ET_SPE1872
if (it == m_machine.g1_times_cache.end() || it->id > g1_lines_counter)
return ret;
#else
if (it->id > g1_lines_counter)
return ret;
#endif // ENABLE_ET_SPE1872
// search for internal G1 lines
if (GCodeReader::GCodeLine::cmd_is(line, "G2") || GCodeReader::GCodeLine::cmd_is(line, "G3")) {

View File

@ -157,6 +157,9 @@ namespace Slic3r {
bool internal_only{ false };
float volumetric_rate() const { return feedrate * mm3_per_mm; }
#if ENABLE_ET_SPE1872
float actual_volumetric_rate() const { return actual_feedrate * mm3_per_mm; }
#endif // ENABLE_ET_SPE1872
};
std::string filename;

View File

@ -50,6 +50,12 @@ struct PathVertex
// Segment volumetric rate
//
float volumetric_rate{ 0.0f };
#if VGCODE_ENABLE_ET_SPE1872
//
// Segment actual volumetric rate
//
float actual_volumetric_rate{ 0.0f };
#endif // VGCODE_ENABLE_ET_SPE1872
#if VGCODE_ENABLE_COG_AND_TOOL_MARKERS
//
// Segment weight

View File

@ -90,6 +90,9 @@ enum class EViewType : uint8_t
FanSpeed,
Temperature,
VolumetricFlowRate,
#if VGCODE_ENABLE_ET_SPE1872
ActualVolumetricFlowRate,
#endif // VGCODE_ENABLE_ET_SPE1872
LayerTimeLinear,
LayerTimeLogarithmic,
Tool,

View File

@ -987,6 +987,12 @@ Color ViewerImpl::get_vertex_color(const PathVertex& v) const
{
return v.is_travel() ? get_option_color(move_type_to_option(v.type)) : m_volumetric_rate_range.get_color_at(v.volumetric_rate);
}
#if VGCODE_ENABLE_ET_SPE1872
case EViewType::ActualVolumetricFlowRate:
{
return v.is_travel() ? get_option_color(move_type_to_option(v.type)) : m_actual_volumetric_rate_range.get_color_at(v.actual_volumetric_rate);
}
#endif // VGCODE_ENABLE_ET_SPE1872
case EViewType::LayerTimeLinear:
{
return v.is_travel() ? get_option_color(move_type_to_option(v.type)) :
@ -1078,6 +1084,9 @@ const ColorRange& ViewerImpl::get_color_range(EViewType type) const
case EViewType::FanSpeed: { return m_fan_speed_range; }
case EViewType::Temperature: { return m_temperature_range; }
case EViewType::VolumetricFlowRate: { return m_volumetric_rate_range; }
#if VGCODE_ENABLE_ET_SPE1872
case EViewType::ActualVolumetricFlowRate: { return m_actual_volumetric_rate_range; }
#endif // VGCODE_ENABLE_ET_SPE1872
case EViewType::LayerTimeLinear: { return m_layer_time_range[0]; }
case EViewType::LayerTimeLogarithmic: { return m_layer_time_range[1]; }
default: { return ColorRange::DUMMY_COLOR_RANGE; }
@ -1097,6 +1106,9 @@ void ViewerImpl::set_color_range_palette(EViewType type, const Palette& palette)
case EViewType::FanSpeed: { m_fan_speed_range.set_palette(palette); }
case EViewType::Temperature: { m_temperature_range.set_palette(palette); }
case EViewType::VolumetricFlowRate: { m_volumetric_rate_range.set_palette(palette); }
#if VGCODE_ENABLE_ET_SPE1872
case EViewType::ActualVolumetricFlowRate: { m_actual_volumetric_rate_range.set_palette(palette); }
#endif // VGCODE_ENABLE_ET_SPE1872
case EViewType::LayerTimeLinear: { m_layer_time_range[0].set_palette(palette); }
case EViewType::LayerTimeLogarithmic: { m_layer_time_range[1].set_palette(palette); }
default: { break; }
@ -1135,6 +1147,9 @@ size_t ViewerImpl::get_used_cpu_memory() const
ret += m_fan_speed_range.size_in_bytes_cpu();
ret += m_temperature_range.size_in_bytes_cpu();
ret += m_volumetric_rate_range.size_in_bytes_cpu();
#if VGCODE_ENABLE_ET_SPE1872
ret += m_actual_volumetric_rate_range.size_in_bytes_cpu();
#endif // VGCODE_ENABLE_ET_SPE1872
for (size_t i = 0; i < COLOR_RANGE_TYPES_COUNT; ++i) {
ret += m_layer_time_range[i].size_in_bytes_cpu();
}
@ -1275,6 +1290,9 @@ void ViewerImpl::update_color_ranges()
m_fan_speed_range.reset();
m_temperature_range.reset();
m_volumetric_rate_range.reset();
#if VGCODE_ENABLE_ET_SPE1872
m_actual_volumetric_rate_range.reset();
#endif // VGCODE_ENABLE_ET_SPE1872
m_layer_time_range[0].reset(); // ColorRange::EType::Linear
m_layer_time_range[1].reset(); // ColorRange::EType::Logarithmic
@ -1285,6 +1303,9 @@ void ViewerImpl::update_color_ranges()
if (!v.is_custom_gcode() || m_settings.extrusion_roles_visibility.at(EGCodeExtrusionRole::Custom)) {
m_width_range.update(round_to_bin(v.width));
m_volumetric_rate_range.update(round_to_bin(v.volumetric_rate));
#if VGCODE_ENABLE_ET_SPE1872
m_actual_volumetric_rate_range.update(round_to_bin(v.actual_volumetric_rate));
#endif // VGCODE_ENABLE_ET_SPE1872
}
m_fan_speed_range.update(v.fan_speed);
m_temperature_range.update(v.temperature);

View File

@ -290,6 +290,9 @@ private:
ColorRange m_fan_speed_range;
ColorRange m_temperature_range;
ColorRange m_volumetric_rate_range;
#if VGCODE_ENABLE_ET_SPE1872
ColorRange m_actual_volumetric_rate_range;
#endif // VGCODE_ENABLE_ET_SPE1872
std::array<ColorRange, COLOR_RANGE_TYPES_COUNT> m_layer_time_range{
ColorRange(EColorRangeType::Linear), ColorRange(EColorRangeType::Logarithmic)
};

View File

@ -1200,11 +1200,14 @@ void GCodeViewer::load_as_gcode(const GCodeProcessorResult& gcode_result, const
// 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_speed, 1, sizeof(float), out.f);
// fwrite((void*)&v.actual_feedrate, 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);
// fwrite((void*)&v.volumetric_rate, 1, sizeof(float), out.f);
//#if ENABLE_ET_SPE1872
// fwrite((void*)&v.actual_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);
@ -4984,8 +4987,8 @@ void GCodeViewer::render_legend(float& legend_height)
#endif // ENABLE_NEW_GCODE_VIEWER
#if ENABLE_ET_SPE1872
view_options = { _u8L("Feature type"), _u8L("Height (mm)"), _u8L("Width (mm)"), _u8L("Speed (mm/s)"), _u8L("Actual speed (mm/s)"),
_u8L("Fan speed (%)"), _u8L("Temperature (°C)"), _u8L("Volumetric flow rate (mm³/s)"), _u8L("Layer time (linear)"),
_u8L("Layer time (logarithmic)"), _u8L("Tool"), _u8L("Color Print") };
_u8L("Fan speed (%)"), _u8L("Temperature (°C)"), _u8L("Volumetric flow rate (mm³/s)"), _u8L("Actual volumetric flow rate (mm³/s)"),
_u8L("Layer time (linear)"), _u8L("Layer time (logarithmic)"), _u8L("Tool"), _u8L("Color Print") };
view_options_id = { static_cast<int>(libvgcode::EViewType::FeatureType),
static_cast<int>(libvgcode::EViewType::Height),
static_cast<int>(libvgcode::EViewType::Width),
@ -4994,6 +4997,7 @@ void GCodeViewer::render_legend(float& legend_height)
static_cast<int>(libvgcode::EViewType::FanSpeed),
static_cast<int>(libvgcode::EViewType::Temperature),
static_cast<int>(libvgcode::EViewType::VolumetricFlowRate),
static_cast<int>(libvgcode::EViewType::ActualVolumetricFlowRate),
static_cast<int>(libvgcode::EViewType::LayerTimeLinear),
static_cast<int>(libvgcode::EViewType::LayerTimeLogarithmic),
static_cast<int>(libvgcode::EViewType::Tool),
@ -5008,7 +5012,8 @@ void GCodeViewer::render_legend(float& legend_height)
else {
#if ENABLE_ET_SPE1872
view_options = { _u8L("Feature type"), _u8L("Height (mm)"), _u8L("Width (mm)"), _u8L("Speed (mm/s)"), _u8L("Actual speed (mm/s)"),
_u8L("Fan speed (%)"), _u8L("Temperature (°C)"), _u8L("Volumetric flow rate (mm³/s)"), _u8L("Tool"), _u8L("Color Print") };
_u8L("Fan speed (%)"), _u8L("Temperature (°C)"), _u8L("Volumetric flow rate (mm³/s)"), _u8L("Actual volumetric flow rate (mm³/s)"),
_u8L("Tool"), _u8L("Color Print") };
view_options_id = { static_cast<int>(libvgcode::EViewType::FeatureType),
static_cast<int>(libvgcode::EViewType::Height),
static_cast<int>(libvgcode::EViewType::Width),
@ -5017,6 +5022,7 @@ void GCodeViewer::render_legend(float& legend_height)
static_cast<int>(libvgcode::EViewType::FanSpeed),
static_cast<int>(libvgcode::EViewType::Temperature),
static_cast<int>(libvgcode::EViewType::VolumetricFlowRate),
static_cast<int>(libvgcode::EViewType::ActualVolumetricFlowRate),
static_cast<int>(libvgcode::EViewType::Tool),
static_cast<int>(libvgcode::EViewType::ColorPrint) };
#if ENABLE_NEW_GCODE_VIEWER
@ -5161,6 +5167,9 @@ void GCodeViewer::render_legend(float& legend_height)
case libvgcode::EViewType::FanSpeed: { append_range(m_viewer.get_color_range(libvgcode::EViewType::FanSpeed), 0); break; }
case libvgcode::EViewType::Temperature: { append_range(m_viewer.get_color_range(libvgcode::EViewType::Temperature), 0); break; }
case libvgcode::EViewType::VolumetricFlowRate: { append_range(m_viewer.get_color_range(libvgcode::EViewType::VolumetricFlowRate), 3); break; }
#if ENABLE_ET_SPE1872
case libvgcode::EViewType::ActualVolumetricFlowRate: { append_range(m_viewer.get_color_range(libvgcode::EViewType::ActualVolumetricFlowRate), 3); break; }
#endif // ENABLE_ET_SPE1872
case libvgcode::EViewType::LayerTimeLinear: { append_time_range(m_viewer.get_color_range(libvgcode::EViewType::LayerTimeLinear)); break; }
case libvgcode::EViewType::LayerTimeLogarithmic: { append_time_range(m_viewer.get_color_range(libvgcode::EViewType::LayerTimeLogarithmic)); break; }
case libvgcode::EViewType::Tool: {
@ -5561,7 +5570,12 @@ void GCodeViewer::render_legend(float& legend_height)
}
#if ENABLE_NEW_GCODE_VIEWER
#if ENABLE_ET_SPE1872
if (new_view_type == libvgcode::EViewType::Width || new_view_type == libvgcode::EViewType::VolumetricFlowRate ||
new_view_type == libvgcode::EViewType::ActualVolumetricFlowRate) {
#else
if (new_view_type == libvgcode::EViewType::Width || new_view_type == libvgcode::EViewType::VolumetricFlowRate) {
#endif // ENABLE_ET_SPE1872
const std::vector<libvgcode::EGCodeExtrusionRole>& roles = m_viewer.get_extrusion_roles();
const auto custom_it = std::find(roles.begin(), roles.end(), libvgcode::EGCodeExtrusionRole::Custom);
if (custom_it != roles.end()) {

View File

@ -215,12 +215,12 @@ GCodeInputData convert(const Slic3r::GCodeProcessorResult& result, const std::ve
#if ENABLE_ET_SPE1872
#if VGCODE_ENABLE_COG_AND_TOOL_MARKERS
const libvgcode::PathVertex vertex = { convert(prev.position), height, width, curr.feedrate, prev.actual_feedrate,
curr.fan_speed, curr.temperature, curr.volumetric_rate(), 0.0f, convert(curr.extrusion_role), curr_type,
static_cast<uint32_t>(curr.gcode_id), static_cast<uint32_t>(curr.layer_id),
curr.fan_speed, curr.temperature, curr.volumetric_rate(), prev.actual_volumetric_rate(), 0.0f,
convert(curr.extrusion_role), curr_type, static_cast<uint32_t>(curr.gcode_id), static_cast<uint32_t>(curr.layer_id),
static_cast<uint8_t>(curr.extruder_id), static_cast<uint8_t>(curr.cp_color_id), { 0.0f, 0.0f } };
#else
const libvgcode::PathVertex vertex = { convert(prev.position), height, width, curr.feedrate, prev.actual_feedrate,
curr.fan_speed, curr.temperature, curr.volumetric_rate(), convert(curr.extrusion_role), curr_type,
curr.fan_speed, curr.temperature, curr.volumetric_rate(), prev.actual_volumetric_rate(), convert(curr.extrusion_role), curr_type,
static_cast<uint32_t>(curr.gcode_id), static_cast<uint32_t>(curr.layer_id),
static_cast<uint8_t>(curr.extruder_id), static_cast<uint8_t>(curr.cp_color_id), { 0.0f, 0.0f } };
#endif // VGCODE_ENABLE_COG_AND_TOOL_MARKERS
@ -244,15 +244,15 @@ GCodeInputData convert(const Slic3r::GCodeProcessorResult& result, const std::ve
#if ENABLE_ET_SPE1872
#if VGCODE_ENABLE_COG_AND_TOOL_MARKERS
const libvgcode::PathVertex vertex = { convert(curr.position), height, width, curr.feedrate, curr.actual_feedrate,
curr.fan_speed, curr.temperature, curr.volumetric_rate(),
curr.fan_speed, curr.temperature, curr.volumetric_rate(), curr.actual_volumetric_rate(),
result.filament_densities[curr.extruder_id] * curr.mm3_per_mm * (curr.position - prev.position).norm(),
convert(curr.extrusion_role), curr_type, static_cast<uint32_t>(curr.gcode_id), static_cast<uint32_t>(curr.layer_id),
static_cast<uint8_t>(curr.extruder_id), static_cast<uint8_t>(curr.cp_color_id), curr.time };
#else
const libvgcode::PathVertex vertex = { convert(curr.position), height, width, curr.feedrate, curr.actual_feedrate,
curr.fan_speed, curr.temperature, curr.volumetric_rate(), convert(curr.extrusion_role), curr_type,
static_cast<uint32_t>(curr.gcode_id), static_cast<uint32_t>(curr.layer_id), static_cast<uint8_t>(curr.extruder_id),
static_cast<uint8_t>(curr.cp_color_id), curr.time };
curr.fan_speed, curr.temperature, curr.volumetric_rate(), curr.actual_volumetric_rate(), convert(curr.extrusion_role),
curr_type, static_cast<uint32_t>(curr.gcode_id), static_cast<uint32_t>(curr.layer_id),
static_cast<uint8_t>(curr.extruder_id), static_cast<uint8_t>(curr.cp_color_id), curr.time };
#endif // VGCODE_ENABLE_COG_AND_TOOL_MARKERS
#else
#if VGCODE_ENABLE_COG_AND_TOOL_MARKERS
@ -293,11 +293,11 @@ static void convert_lines_to_vertices(const Slic3r::Lines& lines, const std::vec
#if ENABLE_ET_SPE1872
#if VGCODE_ENABLE_COG_AND_TOOL_MARKERS
libvgcode::PathVertex vertex = { convert(Slic3r::Vec3f(a.x(), a.y(), top_z)), heights[i], widths[i], 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, extrusion_role, EMoveType::Noop, 0, static_cast<uint32_t>(layer_id),
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, extrusion_role, EMoveType::Noop, 0, static_cast<uint32_t>(layer_id),
static_cast<uint8_t>(extruder_id), static_cast<uint8_t>(color_id), { 0.0f, 0.0f } };
#else
libvgcode::PathVertex vertex = { convert(Slic3r::Vec3f(a.x(), a.y(), top_z)), heights[i], widths[i], 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, extrusion_role, EMoveType::Noop, 0, static_cast<uint32_t>(layer_id),
0.0f, 0.0f, 0.0f, 0.0f, extrusion_role, EMoveType::Noop, 0, static_cast<uint32_t>(layer_id),
static_cast<uint8_t>(extruder_id), static_cast<uint8_t>(color_id), { 0.0f, 0.0f } };
#endif // VGCODE_ENABLE_COG_AND_TOOL_MARKERS
#else
@ -321,11 +321,11 @@ static void convert_lines_to_vertices(const Slic3r::Lines& lines, const std::vec
#if ENABLE_ET_SPE1872
#if VGCODE_ENABLE_COG_AND_TOOL_MARKERS
const libvgcode::PathVertex vertex = { convert(Slic3r::Vec3f(b.x(), b.y(), top_z)), heights[i], widths[i], 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, extrusion_role, EMoveType::Extrude, 0, static_cast<uint32_t>(layer_id),
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, extrusion_role, EMoveType::Extrude, 0, static_cast<uint32_t>(layer_id),
static_cast<uint8_t>(extruder_id), static_cast<uint8_t>(color_id), { 0.0f, 0.0f } };
#else
const libvgcode::PathVertex vertex = { convert(Slic3r::Vec3f(b.x(), b.y(), top_z)), heights[i], widths[i], 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, extrusion_role, EMoveType::Extrude, 0, static_cast<uint32_t>(layer_id),
0.0f, 0.0f, 0.0f, 0.0f, extrusion_role, EMoveType::Extrude, 0, static_cast<uint32_t>(layer_id),
static_cast<uint8_t>(extruder_id), static_cast<uint8_t>(color_id), { 0.0f, 0.0f } };
#endif // VGCODE_ENABLE_COG_AND_TOOL_MARKERS
#else