fix(engine): publish the nozzle group result for sequential prints

The Print-level LayeredNozzleGroupResult had a single producer, the
by-layer branch of ToolOrdering, which is gated to non-sequential prints.
The by-object branch in Print::process computed a grouping only in auto
map modes and never stored it, so a sequential slice exported with a null
group result: the per-nozzle placeholder tables came up empty and any
start g-code indexing nozzle_diameter_at_nozzle_id[] aborted with
"Indexing an empty vector variable". A prior by-layer slice masked the
bug by leaving its (never cleared) result on the Print.

Now the by-object branch runs get_recommended_filament_maps in every
static map mode (in manual modes the result mirrors the user's
assignment, deviations throw as in by-layer) and publishes it
print-wide. The config write-back stays gated to auto modes: in manual
modes it would only re-store the pre-slice values.

Regression test: a two-object by-object print must publish a non-null
group result and resolve nozzle_diameter_at_nozzle_id[] in start g-code
(both fail without the fix). Suites green (libslic3r 48929/162,
fff_print 633/60); 18-fixture byte gate identical; the by-object repro
project goes from the export error to valid g-code, determinism x2.
This commit is contained in:
SoftFever
2026-07-12 00:46:15 +08:00
parent c65b0540a3
commit 780b2f1ebe
4 changed files with 36 additions and 9 deletions

View File

@@ -2116,7 +2116,8 @@ void ToolOrdering::reorder_extruders_for_minimum_flush_volume(bool reorder_first
{
// Orca: the ToolOrdering member is stored unconditionally, but the Print-level store is gated
// behind a not-sequential check. There is no is_sequential_print() here, so it is mirrored
// with the same predicate the branch above uses.
// with the same predicate the branch above uses. Sequential prints publish their result
// from the by-object branch in Print::process instead.
const bool not_sequential = print_config->print_sequence != PrintSequence::ByObject ||
(m_print && m_print->objects().size() == 1);
if (m_print != nullptr && not_sequential)