aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/example.cfg7
-rw-r--r--klippy/extruder.py27
2 files changed, 21 insertions, 13 deletions
diff --git a/config/example.cfg b/config/example.cfg
index 09f6c9ad..2119b3c9 100644
--- a/config/example.cfg
+++ b/config/example.cfg
@@ -120,9 +120,10 @@ filament_diameter: 3.500
# extruder. This parameter must be provided.
#max_extrude_cross_section:
# Maximum area of the cross section of an extrusion line (in
-# mm^2). If a move requests an extrusion rate that would exceed this
-# value it will cause an error to be returned. The default is: 4.0 *
-# nozzle_diameter^2
+# mm^2). This setting prevents excessive amounts of extrusion during
+# relatively small XY moves. If a move requests an extrusion rate
+# that would exceed this value it will cause an error to be
+# returned. The default is: 4.0 * nozzle_diameter^2
#max_extrude_only_distance: 50.0
# Maximum length (in mm of raw filament) that an extrude only move
# may be. If an extrude only move requests a distance greater than
diff --git a/klippy/extruder.py b/klippy/extruder.py
index fb317414..45ed3bfc 100644
--- a/klippy/extruder.py
+++ b/klippy/extruder.py
@@ -16,11 +16,11 @@ class PrinterExtruder:
self.nozzle_diameter = config.getfloat('nozzle_diameter', above=0.)
filament_diameter = config.getfloat(
'filament_diameter', minval=self.nozzle_diameter)
- filament_area = math.pi * (filament_diameter * .5)**2
+ self.filament_area = math.pi * (filament_diameter * .5)**2
max_cross_section = config.getfloat(
'max_extrude_cross_section', 4. * self.nozzle_diameter**2
, above=0.)
- self.max_extrude_ratio = max_cross_section / filament_area
+ self.max_extrude_ratio = max_cross_section / self.filament_area
toolhead = printer.objects['toolhead']
max_velocity, max_accel = toolhead.get_max_velocity()
self.max_e_velocity = self.config.getfloat(
@@ -57,22 +57,29 @@ class PrinterExtruder:
move.extrude_r = move.axes_d[3] / move.move_d
move.extrude_max_corner_v = 0.
if not self.heater.can_extrude:
- raise homing.EndstopMoveError(
- move.end_pos, "Extrude below minimum temp")
+ raise homing.EndstopError(
+ "Extrude below minimum temp\n"
+ "See the 'min_extrude_temp' config option for details")
if not move.is_kinematic_move or move.extrude_r < 0.:
# Extrude only move (or retraction move) - limit accel and velocity
if abs(move.axes_d[3]) > self.max_e_dist:
- raise homing.EndstopMoveError(
- move.end_pos, "Extrude move too long")
+ raise homing.EndstopError(
+ "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))
inv_extrude_r = 1. / abs(move.extrude_r)
move.limit_speed(self.max_e_velocity * inv_extrude_r
, self.max_e_accel * inv_extrude_r)
elif (move.extrude_r > self.max_extrude_ratio
and move.axes_d[3] > self.nozzle_diameter*self.max_extrude_ratio):
- logging.debug("Overextrude: %s vs %s" % (
- move.extrude_r, self.max_extrude_ratio))
- raise homing.EndstopMoveError(
- move.end_pos, "Move exceeds maximum extrusion cross section")
+ area = move.axes_d[3] * self.filament_area / move.move_d
+ logging.debug("Overextrude: %s vs %s (area=%.3f dist=%.3f)",
+ move.extrude_r, self.max_extrude_ratio,
+ area, move.move_d)
+ raise homing.EndstopError(
+ "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):
extrude = move.axes_d[3]
prev_extrude = prev_move.axes_d[3]