diff --git a/src/slic3r/Utils/QidiPrinterAgent.cpp b/src/slic3r/Utils/QidiPrinterAgent.cpp index 6b05480194..22b8d37735 100644 --- a/src/slic3r/Utils/QidiPrinterAgent.cpp +++ b/src/slic3r/Utils/QidiPrinterAgent.cpp @@ -188,7 +188,13 @@ bool QidiPrinterAgent::fetch_slot_info(const std::string& base_url, } else if (!setting_id.empty() && has_visible_base_preset(bundle->filaments, setting_id)) { tray.tray_info_idx = setting_id; } else { - tray.tray_info_idx = bundle->filaments.filament_id_by_type(tray.tray_type); + // Retired QD_* protocol ids forward to their minted successors via the shipped ledger. + const std::string successor = setting_id.empty() ? std::string() + : resolve_filament_id_succession(setting_id); + if (!successor.empty() && has_visible_base_preset(bundle->filaments, successor)) + tray.tray_info_idx = successor; + else + tray.tray_info_idx = bundle->filaments.filament_id_by_type(tray.tray_type); } // Look up color from dictionary @@ -324,6 +330,10 @@ void QidiPrinterAgent::parse_filament_sections(const std::string& content, std:: std::string QidiPrinterAgent::map_filament_type_to_setting_id(const std::string& filament_type) { + // These QD_* protocol ids no longer appear on any preset: they are retired ledger keys + // that parse_box_status resolves through resolve_filament_id_succession(). Each literal + // must stay a ledger key whose chain ends at a live preset id — + // scripts/tests/test_filament_id.py parses this function and enforces that. const std::string upper = trim_and_upper(filament_type); if (upper == "PLA") { diff --git a/tests/libslic3r/test_filament_id_succession.cpp b/tests/libslic3r/test_filament_id_succession.cpp index 36268277f8..12fa82f9bb 100644 --- a/tests/libslic3r/test_filament_id_succession.cpp +++ b/tests/libslic3r/test_filament_id_succession.cpp @@ -34,6 +34,14 @@ TEST_CASE("filament_id succession follows forwarding chains", "[Preset][filament CHECK(follow_filament_id_succession("OFchainB", forwards) == "OFlive00"); CHECK(follow_filament_id_succession("OFchainC", forwards) == "OFlive00"); } + + // QidiPrinterAgent resolves device-composed QD_* protocol ids through this same walk; + // the map key format carries no OF assumption. + SECTION("device-protocol QD_* keys forward like any other id") { + const std::map qd = {{"QD_2_1_11", "OFnew001"}}; + CHECK(follow_filament_id_succession("QD_2_1_11", qd) == "OFnew001"); + CHECK(follow_filament_id_succession("QD_2_1_12", qd).empty()); + } } // Cycles are a ledger-validation error (script check 9) and never ship, but the client