GCodeProcessor -> Use decorations to detect toolpaths height for gcode files generated by PrusaSlicer
This commit is contained in:
parent
cbe93815b2
commit
e10d1eba54
@ -944,6 +944,20 @@ void GCodeProcessor::process_tags(const std::string& comment)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!m_producers_enabled || m_producer == EProducer::PrusaSlicer) {
|
||||||
|
// height tag
|
||||||
|
pos = comment.find(Height_Tag);
|
||||||
|
if (pos != comment.npos) {
|
||||||
|
try {
|
||||||
|
m_height = std::stof(comment.substr(pos + Height_Tag.length()));
|
||||||
|
}
|
||||||
|
catch (...) {
|
||||||
|
BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ").";
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
|
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
|
||||||
// width tag
|
// width tag
|
||||||
pos = comment.find(Width_Tag);
|
pos = comment.find(Width_Tag);
|
||||||
@ -956,18 +970,6 @@ void GCodeProcessor::process_tags(const std::string& comment)
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// height tag
|
|
||||||
pos = comment.find(Height_Tag);
|
|
||||||
if (pos != comment.npos) {
|
|
||||||
try {
|
|
||||||
m_height_compare.last_tag_value = std::stof(comment.substr(pos + Height_Tag.length()));
|
|
||||||
}
|
|
||||||
catch (...) {
|
|
||||||
BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ").";
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
|
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
|
||||||
|
|
||||||
// color change tag
|
// color change tag
|
||||||
@ -1416,12 +1418,12 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line)
|
|||||||
type = EMoveType::Travel;
|
type = EMoveType::Travel;
|
||||||
|
|
||||||
if (type == EMoveType::Extrude) {
|
if (type == EMoveType::Extrude) {
|
||||||
float d_xyz = std::sqrt(sqr(delta_pos[X]) + sqr(delta_pos[Y]) + sqr(delta_pos[Z]));
|
float delta_xyz = std::sqrt(sqr(delta_pos[X]) + sqr(delta_pos[Y]) + sqr(delta_pos[Z]));
|
||||||
float filament_diameter = (static_cast<size_t>(m_extruder_id) < m_filament_diameters.size()) ? m_filament_diameters[m_extruder_id] : m_filament_diameters.back();
|
float filament_diameter = (static_cast<size_t>(m_extruder_id) < m_filament_diameters.size()) ? m_filament_diameters[m_extruder_id] : m_filament_diameters.back();
|
||||||
float filament_radius = 0.5f * filament_diameter;
|
float filament_radius = 0.5f * filament_diameter;
|
||||||
float area_filament_cross_section = static_cast<float>(M_PI) * sqr(filament_radius);
|
float area_filament_cross_section = static_cast<float>(M_PI) * sqr(filament_radius);
|
||||||
float volume_extruded_filament = area_filament_cross_section * delta_pos[E];
|
float volume_extruded_filament = area_filament_cross_section * delta_pos[E];
|
||||||
float area_toolpath_cross_section = volume_extruded_filament / d_xyz;
|
float area_toolpath_cross_section = volume_extruded_filament / delta_xyz;
|
||||||
|
|
||||||
// volume extruded filament / tool displacement = area toolpath cross section
|
// volume extruded filament / tool displacement = area toolpath cross section
|
||||||
m_mm3_per_mm = area_toolpath_cross_section;
|
m_mm3_per_mm = area_toolpath_cross_section;
|
||||||
@ -1429,6 +1431,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line)
|
|||||||
m_mm3_per_mm_compare.update(area_toolpath_cross_section, m_extrusion_role);
|
m_mm3_per_mm_compare.update(area_toolpath_cross_section, m_extrusion_role);
|
||||||
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
|
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
|
||||||
|
|
||||||
|
if (m_producers_enabled && m_producer != EProducer::PrusaSlicer) {
|
||||||
if (m_end_position[Z] > m_extruded_last_z + EPSILON) {
|
if (m_end_position[Z] > m_extruded_last_z + EPSILON) {
|
||||||
m_height = m_end_position[Z] - m_extruded_last_z;
|
m_height = m_end_position[Z] - m_extruded_last_z;
|
||||||
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
|
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
|
||||||
@ -1436,16 +1439,20 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line)
|
|||||||
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
|
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
|
||||||
m_extruded_last_z = m_end_position[Z];
|
m_extruded_last_z = m_end_position[Z];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (m_extrusion_role == erExternalPerimeter)
|
if (m_extrusion_role == erExternalPerimeter)
|
||||||
// cross section: rectangle
|
// cross section: rectangle
|
||||||
m_width = delta_pos[E] * static_cast<float>(M_PI * sqr(1.05 * filament_radius)) / (d_xyz * m_height);
|
m_width = delta_pos[E] * static_cast<float>(M_PI * sqr(1.05 * filament_radius)) / (delta_xyz * m_height);
|
||||||
else if (m_extrusion_role == erBridgeInfill || m_extrusion_role == erNone)
|
else if (m_extrusion_role == erBridgeInfill || m_extrusion_role == erNone)
|
||||||
// cross section: circle
|
// cross section: circle
|
||||||
m_width = static_cast<float>(m_filament_diameters[m_extruder_id]) * std::sqrt(delta_pos[E] / d_xyz);
|
m_width = static_cast<float>(m_filament_diameters[m_extruder_id]) * std::sqrt(delta_pos[E] / delta_xyz);
|
||||||
else
|
else
|
||||||
// cross section: rectangle + 2 semicircles
|
// cross section: rectangle + 2 semicircles
|
||||||
m_width = delta_pos[E] * static_cast<float>(M_PI * sqr(filament_radius)) / (d_xyz * m_height) + static_cast<float>(1.0 - 0.25 * M_PI) * m_height;
|
m_width = delta_pos[E] * static_cast<float>(M_PI * sqr(filament_radius)) / (delta_xyz * m_height) + static_cast<float>(1.0 - 0.25 * M_PI) * m_height;
|
||||||
|
|
||||||
|
// clamp width to avoid artifacts which may arise from wrong values of m_height
|
||||||
|
m_width = std::min(m_width, 4.0f * m_height);
|
||||||
|
|
||||||
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
|
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
|
||||||
m_width_compare.update(m_width, m_extrusion_role);
|
m_width_compare.update(m_width, m_extrusion_role);
|
||||||
|
Loading…
Reference in New Issue
Block a user