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:
@@ -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 ""
|
||||
|
||||
Reference in New Issue
Block a user