Belt: never start a scarf joint seam below the layer

A scarf joint begins one layer height below the current layer and ramps
up along the wall. On a tilted belt that start is a step backwards along
the belt axis, into the previous layer's wall at the seam: 0.283 mm per
0.2 mm layer at 45 degrees. With an aligned seam the nozzle rams the same
spot on every layer. A BabyBelt Pro benchy with seam_slope_type=external
showed 601 such back-steps from layer 107 on, and in the field the belt
"jumped backwards" and the head knocked the part loose.

Belt printers now skip the scarf in GCode::extrude_loop, and the process
tab greys the scarf controls out for them, as it already does for arc
fitting. The regression test slices a cube on a belt with the scarf
enabled and checks the belt axis never steps back by a layer pitch.
This commit is contained in:
harrierpigeon
2026-09-30 15:44:18 -05:00
parent ad6afce67b
commit 6cf747808c
3 changed files with 61 additions and 3 deletions
+6 -1
View File
@@ -7661,8 +7661,13 @@ std::string GCode::extrude_loop(const ExtrusionLoop& loop_ref,
loop.split_at(last_pos, false);
const auto seam_scarf_type = m_config.seam_slope_type.value;
// Belt printers never get a scarf joint. The scarf starts one layer height
// below the layer, which on a tilted belt is a step backwards along the belt
// axis into the previous layer's wall at the seam (0.28 mm at 45 degrees per
// 0.2 mm layer); with an aligned seam that ram repeats at the same spot on
// every layer and knocks the part loose.
bool enable_seam_slope = ((seam_scarf_type == SeamScarfType::External && !is_hole) || seam_scarf_type == SeamScarfType::All) &&
!m_config.spiral_mode &&
!m_config.spiral_mode && !m_config.belt_printer.value &&
(loop.role() == erExternalPerimeter || (loop.role() == erPerimeter && m_config.seam_slope_inner_walls)) &&
layer_id() > 0;
const auto nozzle_diameter = EXTRUDER_CONFIG(nozzle_diameter);