From 2473ca74969a88c212ba0b1fc2c6b986f6abc1c5 Mon Sep 17 00:00:00 2001 From: Clifford Garwood Date: Thu, 27 Aug 2026 09:04:50 -0400 Subject: [PATCH] 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) --- src/libslic3r/Print.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index c21edd9ac6..ec40a8f76b 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1401,10 +1401,17 @@ StringObjectException Print::validate(std::vector *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