Add zhop to PA pattern (#2952)

The current PA pattern implementation does not lift the nozzle
when moving.  The way the pattern is drawn means that the nozzle
is often dragged over already printed lines, which can pull the
pattern off the bed, or damage the lines already drawn. As a
result I often see failed prints with the PA pattern, or moderate
damage to already drawn lines.
This change adds a 1 layer hop between each move to eliminate
nozzle drag.
This commit is contained in:
stew675 2023-12-02 19:37:33 -06:00 committed by GitHub
parent a6c927d87f
commit ab2a2d5725
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -557,6 +557,9 @@ void CalibPressureAdvancePattern::generate_custom_gcodes(const DynamicPrintConfi
// draw pressure advance pattern // draw pressure advance pattern
for (int i = 0; i < m_num_layers; ++i) { for (int i = 0; i < m_num_layers; ++i) {
const double layer_height = height_first_layer() + (i * height_layer());
const double zhop_height = layer_height + height_layer();
if (i > 0) { if (i > 0) {
gcode << "; end pressure advance pattern for layer\n"; gcode << "; end pressure advance pattern for layer\n";
CustomGCode::Item item; CustomGCode::Item item;
@ -568,7 +571,6 @@ void CalibPressureAdvancePattern::generate_custom_gcodes(const DynamicPrintConfi
gcode = std::stringstream(); // reset for next layer contents gcode = std::stringstream(); // reset for next layer contents
gcode << "; start pressure advance pattern for layer\n"; gcode << "; start pressure advance pattern for layer\n";
const double layer_height = height_first_layer() + (i * height_layer());
gcode << m_writer.travel_to_z(layer_height, "Move to layer height"); gcode << m_writer.travel_to_z(layer_height, "Move to layer height");
} }
@ -606,7 +608,9 @@ void CalibPressureAdvancePattern::generate_custom_gcodes(const DynamicPrintConfi
double initial_x = to_x; double initial_x = to_x;
double initial_y = to_y; double initial_y = to_y;
gcode << m_writer.travel_to_z(zhop_height, "z-hop before move");
gcode << move_to(Vec2d(to_x, to_y), m_writer, "Move to pattern start"); gcode << move_to(Vec2d(to_x, to_y), m_writer, "Move to pattern start");
gcode << m_writer.travel_to_z(layer_height, "undo z-hop");
for (int j = 0; j < num_patterns; ++j) { for (int j = 0; j < num_patterns; ++j) {
// increment pressure advance // increment pressure advance
@ -631,15 +635,21 @@ void CalibPressureAdvancePattern::generate_custom_gcodes(const DynamicPrintConfi
if (k != wall_count() - 1) { if (k != wall_count() - 1) {
// perimeters not done yet. move to next perimeter // perimeters not done yet. move to next perimeter
to_x += line_spacing_angle(); to_x += line_spacing_angle();
gcode << m_writer.travel_to_z(zhop_height, "z-hop before move");
gcode << move_to(Vec2d(to_x, to_y), m_writer, "Move to start next pattern wall"); gcode << move_to(Vec2d(to_x, to_y), m_writer, "Move to start next pattern wall");
gcode << m_writer.travel_to_z(layer_height, "undo z-hop");
} else if (j != num_patterns - 1) { } else if (j != num_patterns - 1) {
// patterns not done yet. move to next pattern // patterns not done yet. move to next pattern
to_x += m_pattern_spacing + line_width(); to_x += m_pattern_spacing + line_width();
gcode << m_writer.travel_to_z(zhop_height, "z-hop before move");
gcode << move_to(Vec2d(to_x, to_y), m_writer, "Move to next pattern"); gcode << move_to(Vec2d(to_x, to_y), m_writer, "Move to next pattern");
gcode << m_writer.travel_to_z(layer_height, "undo z-hop");
} else if (i != m_num_layers - 1) { } else if (i != m_num_layers - 1) {
// layers not done yet. move back to start // layers not done yet. move back to start
to_x = initial_x; to_x = initial_x;
gcode << m_writer.travel_to_z(zhop_height, "z-hop before move");
gcode << move_to(Vec2d(to_x, to_y), m_writer, "Move back to start position"); gcode << move_to(Vec2d(to_x, to_y), m_writer, "Move back to start position");
gcode << m_writer.travel_to_z(layer_height, "undo z-hop");
} else { } else {
// everything done // everything done
} }