#4936 - Take toolpaths width and height from gcode decorations, if available

This commit is contained in:
enricoturri1966 2020-12-08 15:55:53 +01:00
parent 1185ec9d2a
commit 5bd443cd1f
7 changed files with 177 additions and 11 deletions

View File

@ -1014,9 +1014,14 @@ void GCode::_do_export(Print& print, FILE* file, ThumbnailsGeneratorCallback thu
m_last_height = 0.f;
m_last_layer_z = 0.f;
m_max_layer_z = 0.f;
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
m_last_width = 0.f;
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
m_last_mm3_per_mm = 0.;
#if !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
m_last_width = 0.f;
#endif // !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
// How many times will be change_layer() called?
@ -2701,6 +2706,14 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
gcode += buf;
}
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
if (last_was_wipe_tower || m_last_width != path.width) {
m_last_width = path.width;
sprintf(buf, ";%s%g\n", GCodeProcessor::Width_Tag.c_str(), m_last_width);
gcode += buf;
}
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
if (last_was_wipe_tower || (m_last_mm3_per_mm != path.mm3_per_mm)) {
m_last_mm3_per_mm = path.mm3_per_mm;
@ -2708,11 +2721,13 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
gcode += buf;
}
#if !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
if (last_was_wipe_tower || m_last_width != path.width) {
m_last_width = path.width;
sprintf(buf, ";%s%g\n", GCodeProcessor::Width_Tag.c_str(), m_last_width);
gcode += buf;
}
#endif // !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
if (last_was_wipe_tower || std::abs(m_last_height - path.height) > EPSILON) {

View File

@ -160,9 +160,14 @@ public:
m_volumetric_speed(0),
m_last_pos_defined(false),
m_last_extrusion_role(erNone),
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
m_last_width(0.0f),
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
m_last_mm3_per_mm(0.0),
#if !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
m_last_width(0.0f),
#endif // !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
m_brim_done(false),
m_second_layer_things_done(false),
@ -353,9 +358,14 @@ private:
float m_last_height{ 0.0f };
float m_last_layer_z{ 0.0f };
float m_max_layer_z{ 0.0f };
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
float m_last_width{ 0.0f };
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
double m_last_mm3_per_mm;
#if !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
float m_last_width{ 0.0f };
#endif // !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
Point m_last_pos;

View File

@ -40,8 +40,13 @@ const std::string GCodeProcessor::Estimated_Printing_Time_Placeholder_Tag = "; _
const float GCodeProcessor::Wipe_Width = 0.05f;
const float GCodeProcessor::Wipe_Height = 0.05f;
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
const std::string GCodeProcessor::Width_Tag = "WIDTH:";
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
#if !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
const std::string GCodeProcessor::Width_Tag = "WIDTH:";
#endif // !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
const std::string GCodeProcessor::Mm3_Per_Mm_Tag = "MM3_PER_MM:";
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
@ -739,6 +744,10 @@ void GCodeProcessor::reset()
m_feedrate = 0.0f;
m_width = 0.0f;
m_height = 0.0f;
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
m_forced_width = 0.0f;
m_forced_height = 0.0f;
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
m_mm3_per_mm = 0.0f;
m_fan_speed = 0.0f;
@ -1057,10 +1066,26 @@ void GCodeProcessor::process_tags(const std::string_view comment)
return;
}
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
if (!m_producers_enabled || m_producer == EProducer::PrusaSlicer) {
// height tag
if (starts_with(comment, Height_Tag)) {
if (!parse_number(comment.substr(Height_Tag.size()), m_forced_height))
BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ").";
return;
}
// width tag
if (starts_with(comment, Width_Tag)) {
if (!parse_number(comment.substr(Width_Tag.size()), m_forced_width))
BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ").";
return;
}
}
#else
if ((!m_producers_enabled || m_producer == EProducer::PrusaSlicer) &&
starts_with(comment, Height_Tag)) {
// height tag
if (! parse_number(comment.substr(Height_Tag.size()), m_height))
if (!parse_number(comment.substr(Height_Tag.size()), m_height))
BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ").";
return;
}
@ -1073,6 +1098,7 @@ void GCodeProcessor::process_tags(const std::string_view comment)
return;
}
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
// color change tag
if (starts_with(comment, Color_Change_Tag)) {
@ -1304,6 +1330,33 @@ bool GCodeProcessor::process_simplify3d_tags(const std::string_view comment)
}
// geometry
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
// ; tool
std::string tag = " tool";
pos = comment.find(tag);
if (pos == 0) {
const std::string_view data = comment.substr(pos + tag.length());
std::string h_tag = "H";
size_t h_start = data.find(h_tag);
size_t h_end = data.find_first_of(' ', h_start);
std::string w_tag = "W";
size_t w_start = data.find(w_tag);
size_t w_end = data.find_first_of(' ', w_start);
if (h_start != data.npos) {
if (!parse_number(data.substr(h_start + 1, (h_end != data.npos) ? h_end - h_start - 1 : h_end), m_forced_height))
BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ").";
}
if (w_start != data.npos) {
if (!parse_number(data.substr(w_start + 1, (w_end != data.npos) ? w_end - w_start - 1 : w_end), m_forced_width))
BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ").";
}
return true;
}
// ; layer
tag = " layer";
#else
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
// ; tool
std::string tag = " tool";
@ -1331,6 +1384,7 @@ bool GCodeProcessor::process_simplify3d_tags(const std::string_view comment)
// ; layer
std::string tag = " layer";
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
pos = comment.find(tag);
if (pos == 0) {
// skip lines "; layer end"
@ -1421,6 +1475,25 @@ bool GCodeProcessor::process_ideamaker_tags(const std::string_view comment)
}
// geometry
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
// width
tag = "WIDTH:";
pos = comment.find(tag);
if (pos != comment.npos) {
if (!parse_number(comment.substr(pos + tag.length()), m_forced_width))
BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ").";
return true;
}
// height
tag = "HEIGHT:";
pos = comment.find(tag);
if (pos != comment.npos) {
if (!parse_number(comment.substr(pos + tag.length()), m_forced_height))
BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ").";
return true;
}
#else
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
// width
tag = "WIDTH:";
@ -1440,6 +1513,7 @@ bool GCodeProcessor::process_ideamaker_tags(const std::string_view comment)
return true;
}
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
// layer
pos = comment.find("LAYER:");
@ -1656,6 +1730,20 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line)
m_mm3_per_mm_compare.update(area_toolpath_cross_section, m_extrusion_role);
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
if (m_forced_height > 0.0f)
m_height = m_forced_height;
else {
if (m_end_position[Z] > m_extruded_last_z + EPSILON) {
m_height = m_end_position[Z] - m_extruded_last_z;
m_extruded_last_z = m_end_position[Z];
}
}
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
m_height_compare.update(m_height, m_extrusion_role);
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
#else
if ((m_producers_enabled && m_producer != EProducer::PrusaSlicer) || m_height == 0.0f) {
if (m_end_position[Z] > m_extruded_last_z + EPSILON) {
m_height = m_end_position[Z] - m_extruded_last_z;
@ -1665,10 +1753,17 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line)
m_extruded_last_z = m_end_position[Z];
}
}
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
if (m_forced_width > 0.0f)
m_width = m_forced_width;
else if (m_extrusion_role == erExternalPerimeter)
#else
if (m_extrusion_role == erExternalPerimeter)
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
// cross section: rectangle
m_width = delta_pos[E] * static_cast<float>(M_PI * sqr(1.05 * filament_radius)) / (delta_xyz * m_height);
m_width = delta_pos[E] * static_cast<float>(M_PI * sqr(1.05f * filament_radius)) / (delta_xyz * m_height);
else if (m_extrusion_role == erBridgeInfill || m_extrusion_role == erNone)
// cross section: circle
m_width = static_cast<float>(m_filament_diameters[m_extruder_id]) * std::sqrt(delta_pos[E] / delta_xyz);
@ -1678,7 +1773,6 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line)
// clamp width to avoid artifacts which may arise from wrong values of m_height
m_width = std::min(m_width, 1.0f);
// m_width = std::min(m_width, 4.0f * m_height);
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
m_width_compare.update(m_width, m_extrusion_role);

View File

@ -84,8 +84,13 @@ namespace Slic3r {
static const float Wipe_Width;
static const float Wipe_Height;
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
static const std::string Width_Tag;
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
#if !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
static const std::string Width_Tag;
#endif // !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
static const std::string Mm3_Per_Mm_Tag;
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
@ -401,6 +406,10 @@ namespace Slic3r {
float m_feedrate; // mm/s
float m_width; // mm
float m_height; // mm
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
float m_forced_width; // mm
float m_forced_height; // mm
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
float m_mm3_per_mm;
float m_fan_speed; // percentage
ExtrusionRole m_extrusion_role;

View File

@ -46,12 +46,12 @@ public:
m_gcode += buf;
sprintf(buf, ";%s%s\n", GCodeProcessor::Extrusion_Role_Tag.c_str(), ExtrusionEntity::role_to_string(erWipeTower).c_str());
m_gcode += buf;
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE || ENABLE_GCODE_VIEWER_DATA_CHECKING
change_analyzer_line_width(line_width);
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE || ENABLE_GCODE_VIEWER_DATA_CHECKING
}
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
WipeTowerWriter& change_analyzer_line_width(float line_width) {
// adds tag for analyzer:
char buf[64];
@ -59,6 +59,18 @@ public:
m_gcode += buf;
return *this;
}
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
#if !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
WipeTowerWriter& change_analyzer_line_width(float line_width) {
// adds tag for analyzer:
char buf[64];
sprintf(buf, ";%s%f\n", GCodeProcessor::Width_Tag.c_str(), line_width);
m_gcode += buf;
return *this;
}
#endif // !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
WipeTowerWriter& change_analyzer_mm3_per_mm(float len, float e) {
static const float area = float(M_PI) * 1.75f * 1.75f / 4.f;
@ -862,12 +874,12 @@ void WipeTower::toolchange_Unload(
const float line_width = m_perimeter_width * m_filpar[m_current_tool].ramming_line_width_multiplicator; // desired ramming line thickness
const float y_step = line_width * m_filpar[m_current_tool].ramming_step_multiplicator * m_extra_spacing; // spacing between lines in mm
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE || ENABLE_GCODE_VIEWER_DATA_CHECKING
writer.append("; CP TOOLCHANGE UNLOAD\n")
.change_analyzer_line_width(line_width);
#else
writer.append("; CP TOOLCHANGE UNLOAD\n");
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE || ENABLE_GCODE_VIEWER_DATA_CHECKING
unsigned i = 0; // iterates through ramming_speed
m_left_to_right = true; // current direction of ramming
@ -930,9 +942,9 @@ void WipeTower::toolchange_Unload(
}
}
Vec2f end_of_ramming(writer.x(),writer.y());
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE || ENABLE_GCODE_VIEWER_DATA_CHECKING
writer.change_analyzer_line_width(m_perimeter_width); // so the next lines are not affected by ramming_line_width_multiplier
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE || ENABLE_GCODE_VIEWER_DATA_CHECKING
// Retraction:
float old_x = writer.x();

View File

@ -91,4 +91,11 @@
#define ENABLE_PREVIEW_TYPE_CHANGE (1 && ENABLE_2_3_0_BETA2)
//===================
// 2.3.0.beta3 techs
//===================
#define ENABLE_2_3_0_BETA3 1
#define ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE (1 && ENABLE_2_3_0_BETA3)
#endif // _prusaslicer_technologies_h_

View File

@ -103,6 +103,12 @@ void GCodeViewer::IBuffer::reset()
bool GCodeViewer::Path::matches(const GCodeProcessor::MoveVertex& move) const
{
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
auto matches_percent = [](float value1, float value2, float max_percent) {
return std::abs(value2 - value1) / value1 <= max_percent;
};
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
switch (move.type)
{
case EMoveType::Tool_change:
@ -113,10 +119,17 @@ bool GCodeViewer::Path::matches(const GCodeProcessor::MoveVertex& move) const
case EMoveType::Unretract:
case EMoveType::Extrude: {
// use rounding to reduce the number of generated paths
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
return type == move.type && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id && role == move.extrusion_role &&
move.position[2] <= first.position[2] && feedrate == move.feedrate && fan_speed == move.fan_speed &&
height == round_to_nearest(move.height, 2) && width == round_to_nearest(move.width, 2) &&
matches_percent(volumetric_rate, move.volumetric_rate(), 0.05f);
#else
return type == move.type && move.position[2] <= first.position[2] && role == move.extrusion_role && height == round_to_nearest(move.height, 2) &&
width == round_to_nearest(move.width, 2) && feedrate == move.feedrate && fan_speed == move.fan_speed &&
volumetric_rate == round_to_nearest(move.volumetric_rate(), 2) && extruder_id == move.extruder_id &&
cp_color_id == move.cp_color_id;
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
}
case EMoveType::Travel: {
return type == move.type && feedrate == move.feedrate && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id;
@ -143,9 +156,15 @@ void GCodeViewer::TBuffer::add_path(const GCodeProcessor::MoveVertex& move, unsi
{
Path::Endpoint endpoint = { b_id, i_id, s_id, move.position };
// use rounding to reduce the number of generated paths
#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
paths.push_back({ move.type, move.extrusion_role, endpoint, endpoint, move.delta_extruder,
round_to_nearest(move.height, 2), round_to_nearest(move.width, 2), move.feedrate, move.fan_speed,
move.volumetric_rate(), move.extruder_id, move.cp_color_id });
#else
paths.push_back({ move.type, move.extrusion_role, endpoint, endpoint, move.delta_extruder,
round_to_nearest(move.height, 2), round_to_nearest(move.width, 2), move.feedrate, move.fan_speed,
round_to_nearest(move.volumetric_rate(), 2), move.extruder_id, move.cp_color_id });
#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
}
GCodeViewer::Color GCodeViewer::Extrusions::Range::get_color_at(float value) const