From f563df04f674ec01caeec25a4e807596e53232c9 Mon Sep 17 00:00:00 2001 From: harrierpigeon Date: Mon, 3 Aug 2026 01:52:43 -0500 Subject: [PATCH] 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. --- src/libslic3r/PrintConfig.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 2b513afe1d..b2984164ee 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -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::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::Auto)); def = this->add("first_layer_plane_offset", coFloat); def->label = L("Belt plane offset");