belt: default first_layer_plane to Auto, not BeltAffine

BeltAffine activates the FirstLayerPlane evaluator unconditionally, so on a
non-belt printer on_first_layer(point) stopped agreeing with the legacy
slicing-layer-0 test. Every per-path first-layer call site in _extrude then
took the non-first-layer branch, and first-layer speeds were skipped: brim
came out at the volumetric fallback (24.6 mm/s) instead of initial_layer_speed
(10 mm/s). This is the shared speed path, so it affected all printers on this
branch, not just belt ones.

Auto resolves to BeltAffine only when belt_printer is set with a non-zero
slicing rotation, and to XY (evaluator inactive, legacy behaviour) otherwise --
exactly what the option's own description already promised.

Caught by "Brim uses first layer speed" (upstream #14616), which arrived with
the upstream merge; the bad default dates back to a9bae54f20 (#30). Verified
against a pristine upstream/main build, which passes the same test.

tests/fff_print: 100/100 test cases, 1085 assertions (was 99/100).
Both belt regression tests still pass, confirming Auto still resolves to
BeltAffine for belt printers.

Note: this changes a config default. Projects and profiles that stored
first_layer_plane explicitly are unaffected; those relying on the default will
now get correct first-layer speeds on non-belt printers, so their G-code
changes accordingly.
This commit is contained in:
harrierpigeon
2026-08-03 01:52:43 -05:00
parent 613dad92a1
commit f563df04f6

View File

@@ -7209,7 +7209,13 @@ void PrintConfigDef::init_fff_params()
def->enum_values = {"auto", "xy", "yz", "xz", "belt_affine"};
def->enum_labels = {L("Auto"), L("XY (machine bed)"), L("YZ"), L("XZ"), L("Belt affine plane")};
def->mode = comExpert;
def->set_default_value(new ConfigOptionEnum<FirstLayerPlaneMode>(FirstLayerPlaneMode::BeltAffine));
// Auto, not BeltAffine: BeltAffine activates the plane evaluator unconditionally, so on a
// non-belt printer on_first_layer(point) stopped agreeing with the legacy slicing-layer-0
// test and first-layer speeds were skipped (brim printed at the volumetric fallback rather
// than initial_layer_speed). Auto resolves to BeltAffine only when belt_printer is set with
// a non-zero slicing rotation, and to XY (evaluator inactive, legacy behaviour) otherwise --
// which is what this option's own description promises.
def->set_default_value(new ConfigOptionEnum<FirstLayerPlaneMode>(FirstLayerPlaneMode::Auto));
def = this->add("first_layer_plane_offset", coFloat);
def->label = L("Belt plane offset");