Skew should apply per-segment
Segmented moves can account for skew points off the edge, while long regular cartesian moves may be off if the skewed destination point is outside movement bounds. Followup to #8729
This commit is contained in:
parent
17b05c150c
commit
eca1509cb2
@ -411,12 +411,19 @@
|
|||||||
// We don't want additional apply_leveling() performed by regular buffer_line or buffer_line_kinematic,
|
// We don't want additional apply_leveling() performed by regular buffer_line or buffer_line_kinematic,
|
||||||
// so we call buffer_segment directly here. Per-segmented leveling and kinematics performed first.
|
// so we call buffer_segment directly here. Per-segmented leveling and kinematics performed first.
|
||||||
|
|
||||||
inline void _O2 ubl_buffer_segment_raw(const float (&raw)[XYZE], const float &fr) {
|
inline void _O2 ubl_buffer_segment_raw(const float (&in_raw)[XYZE], const float &fr) {
|
||||||
|
|
||||||
|
#if ENABLED(SKEW_CORRECTION)
|
||||||
|
float raw[XYZE] = { in_raw[X_AXIS], in_raw[Y_AXIS], in_raw[Z_AXIS], in_raw[E_AXIS] };
|
||||||
|
planner.skew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]);
|
||||||
|
#else
|
||||||
|
const float (&raw)[XYZE] = in_raw;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLED(DELTA) // apply delta inverse_kinematics
|
#if ENABLED(DELTA) // apply delta inverse_kinematics
|
||||||
|
|
||||||
DELTA_RAW_IK();
|
DELTA_RAW_IK();
|
||||||
planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS], fr, active_extruder);
|
planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], in_raw[E_AXIS], fr, active_extruder);
|
||||||
|
|
||||||
#elif IS_SCARA // apply scara inverse_kinematics (should be changed to save raw->logical->raw)
|
#elif IS_SCARA // apply scara inverse_kinematics (should be changed to save raw->logical->raw)
|
||||||
|
|
||||||
@ -429,11 +436,11 @@
|
|||||||
scara_oldB = delta[B_AXIS];
|
scara_oldB = delta[B_AXIS];
|
||||||
float s_feedrate = max(adiff, bdiff) * scara_feed_factor;
|
float s_feedrate = max(adiff, bdiff) * scara_feed_factor;
|
||||||
|
|
||||||
planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS], s_feedrate, active_extruder);
|
planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], in_raw[E_AXIS], s_feedrate, active_extruder);
|
||||||
|
|
||||||
#else // CARTESIAN
|
#else // CARTESIAN
|
||||||
|
|
||||||
planner.buffer_segment(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], raw[E_AXIS], fr, active_extruder);
|
planner.buffer_segment(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], in_raw[E_AXIS], fr, active_extruder);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -456,19 +463,11 @@
|
|||||||
* Returns true if did NOT move, false if moved (requires current_position update).
|
* Returns true if did NOT move, false if moved (requires current_position update).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool _O2 unified_bed_leveling::prepare_segmented_line_to(const float (&in_target)[XYZE], const float &feedrate) {
|
bool _O2 unified_bed_leveling::prepare_segmented_line_to(const float (&rtarget)[XYZE], const float &feedrate) {
|
||||||
|
|
||||||
if (!position_is_reachable(in_target[X_AXIS], in_target[Y_AXIS])) // fail if moving outside reachable boundary
|
if (!position_is_reachable(rtarget[X_AXIS], rtarget[Y_AXIS])) // fail if moving outside reachable boundary
|
||||||
return true; // did not move, so current_position still accurate
|
return true; // did not move, so current_position still accurate
|
||||||
|
|
||||||
#if ENABLED(SKEW_CORRECTION)
|
|
||||||
// For skew correction just adjust the destination point and we're done
|
|
||||||
float rtarget[XYZE] = { in_target[X_AXIS], in_target[Y_AXIS], in_target[Z_AXIS], in_target[E_AXIS] };
|
|
||||||
planner.skew(rtarget[X_AXIS], rtarget[Y_AXIS], rtarget[Z_AXIS]);
|
|
||||||
#else
|
|
||||||
const float (&rtarget)[XYZE] = in_target;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const float total[XYZE] = {
|
const float total[XYZE] = {
|
||||||
rtarget[X_AXIS] - current_position[X_AXIS],
|
rtarget[X_AXIS] - current_position[X_AXIS],
|
||||||
rtarget[Y_AXIS] - current_position[Y_AXIS],
|
rtarget[Y_AXIS] - current_position[Y_AXIS],
|
||||||
@ -513,10 +512,6 @@
|
|||||||
current_position[E_AXIS]
|
current_position[E_AXIS]
|
||||||
};
|
};
|
||||||
|
|
||||||
#if ENABLED(SKEW_CORRECTION)
|
|
||||||
planner.skew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Only compute leveling per segment if ubl active and target below z_fade_height.
|
// Only compute leveling per segment if ubl active and target below z_fade_height.
|
||||||
if (!planner.leveling_active || !planner.leveling_active_at_z(rtarget[Z_AXIS])) { // no mesh leveling
|
if (!planner.leveling_active || !planner.leveling_active_at_z(rtarget[Z_AXIS])) { // no mesh leveling
|
||||||
while (--segments) {
|
while (--segments) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user