From d782141ca511b2f21dd9ab1e71ea8857a6172373 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Sat, 31 Jan 2026 19:32:35 +0800 Subject: [PATCH] Add handling for unknown filament IDs and improve filament type resolution --- src/libslic3r/Preset.hpp | 1 + src/libslic3r/PresetBundle.cpp | 46 ++++++++++++++++++++-- src/slic3r/GUI/Plater.cpp | 10 +++++ src/slic3r/Utils/MoonrakerPrinterAgent.cpp | 2 +- 4 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/Preset.hpp b/src/libslic3r/Preset.hpp index 65da5d5e26..efb6571090 100644 --- a/src/libslic3r/Preset.hpp +++ b/src/libslic3r/Preset.hpp @@ -52,6 +52,7 @@ #define BBL_JSON_KEY_BASE_ID "base_id" #define BBL_JSON_KEY_USER_ID "user_id" #define BBL_JSON_KEY_FILAMENT_ID "filament_id" +#define UNKNOWN_FILAMENT_ID "__unknown__" #define ORCA_JSON_KEY_UPDATE_TIME "updated_time" #define ORCA_JSON_KEY_CREATED_TIME "created_time" #define BBL_JSON_KEY_INHERITS "inherits" diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index f45c4e0653..a8ea9a6a20 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -2404,11 +2404,41 @@ unsigned int PresetBundle::sync_ams_list(std::vector(haystack[pos - 1]))); + bool end_ok = (pos + needle.size() >= haystack.size() || + !std::isalnum(static_cast(haystack[pos + needle.size()]))); + if (start_ok && end_ok) + return true; + pos = haystack.find(needle, pos + 1); + } + return false; + }; + // Find the longest-matching preset type to prefer e.g. "PA-CF" over "PA". + size_t best_len = 0; + for (auto it = filaments.begin(); it != filaments.end(); ++it) { + if (!it->is_compatible || !it->is_system || !boost::algorithm::starts_with(it->name, "Generic ")) + continue; + auto preset_type = boost::to_upper_copy(it->config.opt_string("filament_type", 0u)); + if (preset_type.size() > best_len && contains_word(upper_type, preset_type)) { + iter = it; + best_len = preset_type.size(); + filament_type = "Generic " + it->config.opt_string("filament_type", 0u); + } + } + } } if (iter == filaments.end()) { // Prefer old selection @@ -2422,8 +2452,13 @@ unsigned int PresetBundle::sync_ams_list(std::vectorname : filaments.first_visible().name; result_colors.push_back("#CECECE"); result_color_types.push_back("1"); - result_presets.push_back(this->filaments.first_visible().name); + result_presets.push_back(fallback_name); result_multi_colors.push_back({"#CECECE"}); } } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 7bfd3da5dc..c1691296dc 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3473,6 +3473,16 @@ void Sidebar::sync_ams_list(bool is_from_big_sync_btn) dlg.ShowModal(); return; } + // Replace unknown filament IDs with the resolved preset's filament_id + auto &filaments = wxGetApp().preset_bundle->filaments; + auto &filament_presets = wxGetApp().preset_bundle->filament_presets; + for (size_t i = 0; i < list2.size() && i < filament_presets.size(); ++i) { + if (list2[i] == UNKNOWN_FILAMENT_ID) { + const Preset *resolved = filaments.find_preset(filament_presets[i]); + if (resolved) + list2[i] = resolved->filament_id; + } + } ams_filament_ids = boost::algorithm::join(list2, ","); wxGetApp().app_config ->set("ams_filament_ids", p->ams_list_device, ams_filament_ids); if (!unknowns.empty()) { diff --git a/src/slic3r/Utils/MoonrakerPrinterAgent.cpp b/src/slic3r/Utils/MoonrakerPrinterAgent.cpp index b150b7df96..0e0ec418ac 100644 --- a/src/slic3r/Utils/MoonrakerPrinterAgent.cpp +++ b/src/slic3r/Utils/MoonrakerPrinterAgent.cpp @@ -775,7 +775,7 @@ std::string MoonrakerPrinterAgent::map_filament_type_to_generic_id(const std::st if (upper == "SBS") return "OFLSBS99"; // Unknown material - return "__unknown__"; + return UNKNOWN_FILAMENT_ID; } int MoonrakerPrinterAgent::handle_request(const std::string& dev_id, const std::string& json_str)