toolhead: Initial support for adding extra axes to toolhead moves

Add a new add_extra_axes() to support adding additional axes.  Once
called, toolhead.get_position() will return a list object with more
than 4 items, and toolhead.move() requires the same size list.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor
2025-03-21 22:14:13 -04:00
parent 9dbfc76d9d
commit bb281834b0
2 changed files with 61 additions and 32 deletions

View File

@@ -199,24 +199,25 @@ class PrinterExtruder:
return self.trapq
def stats(self, eventtime):
return self.heater.stats(eventtime)
def check_move(self, move):
axis_r = move.axes_r[3]
def check_move(self, move, ea_index):
if not self.heater.can_extrude:
raise self.printer.command_error(
"Extrude below minimum temp\n"
"See the 'min_extrude_temp' config option for details")
axis_r = move.axes_r[ea_index]
axis_d = move.axes_d[ea_index]
if (not move.axes_d[0] and not move.axes_d[1]) or axis_r < 0.:
# Extrude only move (or retraction move) - limit accel and velocity
if abs(move.axes_d[3]) > self.max_e_dist:
if abs(axis_d) > self.max_e_dist:
raise self.printer.command_error(
"Extrude only move too long (%.3fmm vs %.3fmm)\n"
"See the 'max_extrude_only_distance' config"
" option for details" % (move.axes_d[3], self.max_e_dist))
" option for details" % (axis_d, self.max_e_dist))
inv_extrude_r = 1. / abs(axis_r)
move.limit_speed(self.max_e_velocity * inv_extrude_r,
self.max_e_accel * inv_extrude_r)
elif axis_r > self.max_extrude_ratio:
if move.axes_d[3] <= self.nozzle_diameter * self.max_extrude_ratio:
if axis_d <= self.nozzle_diameter * self.max_extrude_ratio:
# Permit extrusion if amount extruded is tiny
return
area = axis_r * self.filament_area
@@ -226,13 +227,13 @@ class PrinterExtruder:
"Move exceeds maximum extrusion (%.3fmm^2 vs %.3fmm^2)\n"
"See the 'max_extrude_cross_section' config option for details"
% (area, self.max_extrude_ratio * self.filament_area))
def calc_junction(self, prev_move, move):
diff_r = move.axes_r[3] - prev_move.axes_r[3]
def calc_junction(self, prev_move, move, ea_index):
diff_r = move.axes_r[ea_index] - prev_move.axes_r[ea_index]
if diff_r:
return (self.instant_corner_v / abs(diff_r))**2
return move.max_cruise_v2
def process_move(self, print_time, move):
axis_r = move.axes_r[3]
def process_move(self, print_time, move, ea_index):
axis_r = move.axes_r[ea_index]
accel = move.accel * axis_r
start_v = move.start_v * axis_r
cruise_v = move.cruise_v * axis_r
@@ -242,10 +243,10 @@ class PrinterExtruder:
# Queue movement (x is extruder movement, y is pressure advance flag)
self.trapq_append(self.trapq, print_time,
move.accel_t, move.cruise_t, move.decel_t,
move.start_pos[3], 0., 0.,
move.start_pos[ea_index], 0., 0.,
1., can_pressure_advance, 0.,
start_v, cruise_v, accel)
self.last_position = move.end_pos[3]
self.last_position = move.end_pos[ea_index]
def find_past_position(self, print_time):
if self.extruder_stepper is None:
return 0.
@@ -285,11 +286,11 @@ class PrinterExtruder:
class DummyExtruder:
def __init__(self, printer):
self.printer = printer
def check_move(self, move):
def check_move(self, move, ea_index):
raise move.move_error("Extrude when no extruder present")
def find_past_position(self, print_time):
return 0.
def calc_junction(self, prev_move, move):
def calc_junction(self, prev_move, move, ea_index):
return move.max_cruise_v2
def get_name(self):
return ""