docs(imex): record that the primary-routing refusal is a scope choice

The rule's comment claimed the plate "is not printable as configured: the
primary tool executes the toolpaths while the flow and temperatures were
computed for a filament it cannot load". That is not what the emitter does. It
never uses the declared primary -- it re-derives an effective one from the
filament actually in use -- so a plate whose only filament sits on a Span tool
sharing the primary's gantry produces coherent G-code and would print.

The refusal is still correct, but it rests on intent rather than physics: a
parallel mode exists to run carriages in parallel, and a single-colour plate
riding one span lane is not that. Left as a physical-impossibility claim, the
rule reads as a false positive to anyone who checks it against the emitter --
a review already flagged it as one -- and the obvious "fix" is to relax it.

Say which it is, and keep the genuinely-broken case distinct: a filament routed
to a head outside the mode's active tools still yields a stuck-hot nozzle, and
that one is not a matter of taste.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Clifford Garwood
2026-08-27 09:04:50 -04:00
co-authored by Claude Opus 5
parent 018091f43b
commit 2473ca7496
+11 -4
View File
@@ -1401,10 +1401,17 @@ StringObjectException Print::validate(std::vector<StringObjectException> *warnin
// so nothing detected the mismatch. collect_imex_warnings() computes the same
// condition and discards it into a display fallback.
//
// Blocks rather than warns, matching the multi-color rule above. The plate is not
// printable as configured: the primary tool executes the toolpaths while the flow
// and temperatures were computed for a filament it cannot load. Where the routed
// head is also absent from the mode's active tools, the 1st->2nd layer temperature
// Blocks rather than warns, matching the multi-color rule above -- but on intent,
// not on physics, and the distinction matters to anyone tempted to relax it. The
// emitter does not use the declared primary: it re-derives an effective one from
// the filament actually in use (GCode.cpp's initial_extruder_id -> pem lookups), so
// a plate whose only filament sits on a Span tool sharing the primary's gantry does
// produce coherent G-code. It is refused anyway. A parallel mode exists to run
// carriages in parallel; a single-colour plate riding one span lane is not that, and
// silently accepting it would make the mode's declared roster meaningless.
//
// Where the routed head is absent from the mode's active tools the plate is broken
// outright, not merely off-intent: the 1st->2nd layer temperature
// branch (GCode.cpp, mutually exclusive with the standard path) skips it too, so
// that head holds nozzle_temperature_initial_layer for the whole job. First-layer
// temperatures are unaffected -- _print_first_layer_extruder_temperatures is not