Fix UBL mesh inset Z position (#20538)
This commit is contained in:
parent
094e822070
commit
c1b900aae9
|
@ -122,20 +122,29 @@ class unified_bed_leveling {
|
||||||
|
|
||||||
FORCE_INLINE static void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; }
|
FORCE_INLINE static void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; }
|
||||||
|
|
||||||
|
static int8_t cell_index_x_raw(const float &x) {
|
||||||
|
return FLOOR((x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int8_t cell_index_y_raw(const float &y) {
|
||||||
|
return FLOOR((y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int8_t cell_index_x_valid(const float &x) {
|
||||||
|
return WITHIN(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X - 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int8_t cell_index_y_valid(const float &y) {
|
||||||
|
return WITHIN(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y - 2));
|
||||||
|
}
|
||||||
|
|
||||||
static int8_t cell_index_x(const float &x) {
|
static int8_t cell_index_x(const float &x) {
|
||||||
const int8_t cx = (x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST);
|
return constrain(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X) - 2);
|
||||||
return constrain(cx, 0, (GRID_MAX_POINTS_X) - 1); // -1 is appropriate if we want all movement to the X_MAX
|
}
|
||||||
} // position. But with this defined this way, it is possible
|
|
||||||
// to extrapolate off of this point even further out. Probably
|
|
||||||
// that is OK because something else should be keeping that from
|
|
||||||
// happening and should not be worried about at this level.
|
|
||||||
static int8_t cell_index_y(const float &y) {
|
static int8_t cell_index_y(const float &y) {
|
||||||
const int8_t cy = (y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST);
|
return constrain(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y) - 2);
|
||||||
return constrain(cy, 0, (GRID_MAX_POINTS_Y) - 1); // -1 is appropriate if we want all movement to the Y_MAX
|
}
|
||||||
} // position. But with this defined this way, it is possible
|
|
||||||
// to extrapolate off of this point even further out. Probably
|
|
||||||
// that is OK because something else should be keeping that from
|
|
||||||
// happening and should not be worried about at this level.
|
|
||||||
|
|
||||||
static inline xy_int8_t cell_indexes(const float &x, const float &y) {
|
static inline xy_int8_t cell_indexes(const float &x, const float &y) {
|
||||||
return { cell_index_x(x), cell_index_y(y) };
|
return { cell_index_x(x), cell_index_y(y) };
|
||||||
|
|
|
@ -56,39 +56,32 @@
|
||||||
// A move within the same cell needs no splitting
|
// A move within the same cell needs no splitting
|
||||||
if (istart == iend) {
|
if (istart == iend) {
|
||||||
|
|
||||||
// For a move off the bed, use a constant Z raise
|
FINAL_MOVE:
|
||||||
if (!WITHIN(iend.x, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(iend.y, 0, GRID_MAX_POINTS_Y - 1)) {
|
|
||||||
|
|
||||||
// Note: There is no Z Correction in this case. We are off the grid and don't know what
|
|
||||||
// a reasonable correction would be. If the user has specified a UBL_Z_RAISE_WHEN_OFF_MESH
|
|
||||||
// value, that will be used instead of a calculated (Bi-Linear interpolation) correction.
|
|
||||||
|
|
||||||
|
// When UBL_Z_RAISE_WHEN_OFF_MESH is disabled Z correction is extrapolated from the edge of the mesh
|
||||||
#ifdef UBL_Z_RAISE_WHEN_OFF_MESH
|
#ifdef UBL_Z_RAISE_WHEN_OFF_MESH
|
||||||
|
// For a move off the UBL mesh, use a constant Z raise
|
||||||
|
if (!cell_index_x_valid(end.x) || !cell_index_y_valid(end.y)) {
|
||||||
|
|
||||||
|
// Note: There is no Z Correction in this case. We are off the mesh and don't know what
|
||||||
|
// a reasonable correction would be, UBL_Z_RAISE_WHEN_OFF_MESH will be used instead of
|
||||||
|
// a calculated (Bi-Linear interpolation) correction.
|
||||||
|
|
||||||
end.z += UBL_Z_RAISE_WHEN_OFF_MESH;
|
end.z += UBL_Z_RAISE_WHEN_OFF_MESH;
|
||||||
#endif
|
|
||||||
planner.buffer_segment(end, scaled_fr_mm_s, extruder);
|
planner.buffer_segment(end, scaled_fr_mm_s, extruder);
|
||||||
current_position = destination;
|
current_position = destination;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
FINAL_MOVE:
|
|
||||||
|
|
||||||
// The distance is always MESH_X_DIST so multiply by the constant reciprocal.
|
// The distance is always MESH_X_DIST so multiply by the constant reciprocal.
|
||||||
const float xratio = (end.x - mesh_index_to_xpos(iend.x)) * RECIPROCAL(MESH_X_DIST);
|
const float xratio = (end.x - mesh_index_to_xpos(iend.x)) * RECIPROCAL(MESH_X_DIST),
|
||||||
|
yratio = (end.y - mesh_index_to_ypos(iend.y)) * RECIPROCAL(MESH_Y_DIST),
|
||||||
float z1, z2;
|
z1 = z_values[iend.x][iend.y ] + xratio * (z_values[iend.x + 1][iend.y ] - z_values[iend.x][iend.y ]),
|
||||||
if (iend.x >= GRID_MAX_POINTS_X - 1)
|
z2 = z_values[iend.x][iend.y + 1] + xratio * (z_values[iend.x + 1][iend.y + 1] - z_values[iend.x][iend.y + 1]);
|
||||||
z1 = z2 = 0.0;
|
|
||||||
else {
|
|
||||||
z1 = z_values[iend.x ][iend.y ] + xratio *
|
|
||||||
(z_values[iend.x + 1][iend.y ] - z_values[iend.x][iend.y ]),
|
|
||||||
z2 = z_values[iend.x ][iend.y + 1] + xratio *
|
|
||||||
(z_values[iend.x + 1][iend.y + 1] - z_values[iend.x][iend.y + 1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// X cell-fraction done. Interpolate the two Z offsets with the Y fraction for the final Z offset.
|
// X cell-fraction done. Interpolate the two Z offsets with the Y fraction for the final Z offset.
|
||||||
const float yratio = (end.y - mesh_index_to_ypos(iend.y)) * RECIPROCAL(MESH_Y_DIST),
|
const float z0 = (z1 + (z2 - z1) * yratio) * planner.fade_scaling_factor_for_z(end.z);
|
||||||
z0 = iend.y < GRID_MAX_POINTS_Y - 1 ? (z1 + (z2 - z1) * yratio) * planner.fade_scaling_factor_for_z(end.z) : 0.0;
|
|
||||||
|
|
||||||
// Undefined parts of the Mesh in z_values[][] are NAN.
|
// Undefined parts of the Mesh in z_values[][] are NAN.
|
||||||
// Replace NAN corrections with 0.0 to prevent NAN propagation.
|
// Replace NAN corrections with 0.0 to prevent NAN propagation.
|
||||||
|
|
Loading…
Reference in a new issue