mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-07-23 19:02:10 +00:00
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:
@@ -418,3 +418,25 @@ TEST_CASE("Sequential printing follows model order", "[Print]")
|
||||
|
||||
REQUIRE_THAT(first_object_peak_z, Catch::Matchers::WithinAbs(20.0, 0.3));
|
||||
}
|
||||
|
||||
// A sequential (by-object) print must publish the print-level nozzle group result just
|
||||
// like a by-layer print, so custom g-code can index the per-nozzle placeholder tables
|
||||
// (e.g. nozzle_diameter_at_nozzle_id[]) instead of failing on an empty vector.
|
||||
TEST_CASE("Sequential printing publishes the nozzle group result", "[Print][MultiNozzle]")
|
||||
{
|
||||
SECTION("process() publishes the result") {
|
||||
Print print;
|
||||
Model model;
|
||||
place_two_cubes_apart(60.0, { { "print_sequence", "by object" } }, print, model);
|
||||
print.process();
|
||||
REQUIRE(print.get_layered_nozzle_group_result() != nullptr);
|
||||
}
|
||||
|
||||
SECTION("start g-code can index the per-nozzle diameter table") {
|
||||
const std::string gcode = slice_two_cubes_arranged({
|
||||
{ "print_sequence", "by object" },
|
||||
{ "machine_start_gcode", "{if nozzle_diameter_at_nozzle_id[0] > 0}; SEQ-ND-OK\n{endif}" },
|
||||
});
|
||||
CHECK(gcode.find("; SEQ-ND-OK") != std::string::npos);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user