From 9650e679217d9dd25b286ad35fa702cd5c5aec5e Mon Sep 17 00:00:00 2001 From: SoftFever Date: Sun, 7 Jun 2026 17:46:53 +0800 Subject: [PATCH] Feature/fix profile variants issus (#14084) * add print variant validation * fix one profile error * fix more prifiles --- .../machine/Creality CR-10 V3 0.6 nozzle.json | 1 + .../machine/Thinker X400 0.2 nozzle.json | 1 + ...shforge Adventurer 4 Series HS nozzle.json | 2 +- .../Flashforge Adventurer 4 Series.json | 2 +- .../Flashforge Guider4 0.4 HF nozzle.json | 2 +- .../Flashforge Guider4 0.6 HF nozzle.json | 2 +- .../Flashforge Guider4 0.8 HF nozzle.json | 2 +- .../Flashforge Guider4 Pro 0.4 HF nozzle.json | 2 +- .../Flashforge Guider4 Pro 0.6 HF nozzle.json | 2 +- .../Flashforge Guider4 Pro 0.8 HF nozzle.json | 2 +- .../Qidi/process/fdm_process_n_common.json | 1 - ...RatRig V-Core 4 HYBRID 500 0.5 nozzle.json | 2 +- ...RatRig V-Core 4 HYBRID 500 0.8 nozzle.json | 2 +- src/libslic3r/PresetBundle.cpp | 35 +++++++++++++++++++ 14 files changed, 47 insertions(+), 11 deletions(-) diff --git a/resources/profiles/Creality/machine/Creality CR-10 V3 0.6 nozzle.json b/resources/profiles/Creality/machine/Creality CR-10 V3 0.6 nozzle.json index 0627ed394f..bdf429b11d 100644 --- a/resources/profiles/Creality/machine/Creality CR-10 V3 0.6 nozzle.json +++ b/resources/profiles/Creality/machine/Creality CR-10 V3 0.6 nozzle.json @@ -8,6 +8,7 @@ "printer_model": "Creality CR-10 V3", "printer_structure": "i3", "default_print_profile": "0.20mm Standard @Creality CR10V3 0.6", + "printer_variant": "0.6", "nozzle_diameter": [ "0.6" ], diff --git a/resources/profiles/Eryone/machine/Thinker X400 0.2 nozzle.json b/resources/profiles/Eryone/machine/Thinker X400 0.2 nozzle.json index 0a7fedb659..7d60fc9534 100644 --- a/resources/profiles/Eryone/machine/Thinker X400 0.2 nozzle.json +++ b/resources/profiles/Eryone/machine/Thinker X400 0.2 nozzle.json @@ -18,6 +18,7 @@ "nozzle_diameter": [ "0.2" ], + "printer_variant": "0.2", "retraction_length": [ "0.5" ] diff --git a/resources/profiles/Flashforge/machine/Flashforge Adventurer 4 Series HS nozzle.json b/resources/profiles/Flashforge/machine/Flashforge Adventurer 4 Series HS nozzle.json index 7380ddbac3..dcb24c7ab9 100644 --- a/resources/profiles/Flashforge/machine/Flashforge Adventurer 4 Series HS nozzle.json +++ b/resources/profiles/Flashforge/machine/Flashforge Adventurer 4 Series HS nozzle.json @@ -5,7 +5,7 @@ "from": "system", "setting_id": "GM002", "instantiation": "true", - "printer_variant": "HS", + "printer_variant": "0.4HS", "printer_model": "Flashforge Adventurer 4 Series", "default_print_profile": "0.20mm High-Speed @Flashforge AD4 HS Nozzle", "nozzle_diameter": [ diff --git a/resources/profiles/Flashforge/machine/Flashforge Adventurer 4 Series.json b/resources/profiles/Flashforge/machine/Flashforge Adventurer 4 Series.json index 29fc1e2a4b..8c5f7ec4bf 100644 --- a/resources/profiles/Flashforge/machine/Flashforge Adventurer 4 Series.json +++ b/resources/profiles/Flashforge/machine/Flashforge Adventurer 4 Series.json @@ -2,7 +2,7 @@ "type": "machine_model", "name": "Flashforge Adventurer 4 Series", "model_id": "Flashforge Adventurer 4 Series", - "nozzle_diameter": "0.3;0.4;0.6;HS", + "nozzle_diameter": "0.3;0.4;0.6;0.4HS", "machine_tech": "FFF", "family": "Flashforge", "host_type": "Flashforge", diff --git a/resources/profiles/Flashforge/machine/Flashforge Guider4 0.4 HF nozzle.json b/resources/profiles/Flashforge/machine/Flashforge Guider4 0.4 HF nozzle.json index effd982579..beda0488ee 100644 --- a/resources/profiles/Flashforge/machine/Flashforge Guider4 0.4 HF nozzle.json +++ b/resources/profiles/Flashforge/machine/Flashforge Guider4 0.4 HF nozzle.json @@ -156,7 +156,7 @@ "printer_settings_id": "Flashforge Guider4 0.4 HF nozzle", "printer_structure": "undefine", "printer_technology": "FFF", - "printer_variant": "0.4", + "printer_variant": "0.4HF", "printhost_authorization_type": "key", "printhost_ssl_ignore_revoke": "0", "printing_by_object_gcode": "", diff --git a/resources/profiles/Flashforge/machine/Flashforge Guider4 0.6 HF nozzle.json b/resources/profiles/Flashforge/machine/Flashforge Guider4 0.6 HF nozzle.json index 5a4ef0aafa..6cf091acde 100644 --- a/resources/profiles/Flashforge/machine/Flashforge Guider4 0.6 HF nozzle.json +++ b/resources/profiles/Flashforge/machine/Flashforge Guider4 0.6 HF nozzle.json @@ -156,7 +156,7 @@ "printer_settings_id": "Flashforge Guider4 0.6 HF nozzle", "printer_structure": "undefine", "printer_technology": "FFF", - "printer_variant": "0.6", + "printer_variant": "0.6HF", "printhost_authorization_type": "key", "printhost_ssl_ignore_revoke": "0", "printing_by_object_gcode": "", diff --git a/resources/profiles/Flashforge/machine/Flashforge Guider4 0.8 HF nozzle.json b/resources/profiles/Flashforge/machine/Flashforge Guider4 0.8 HF nozzle.json index 7a971abdd7..2ff0ba8522 100644 --- a/resources/profiles/Flashforge/machine/Flashforge Guider4 0.8 HF nozzle.json +++ b/resources/profiles/Flashforge/machine/Flashforge Guider4 0.8 HF nozzle.json @@ -156,7 +156,7 @@ "printer_settings_id": "Flashforge Guider4 0.8 HF nozzle", "printer_structure": "undefine", "printer_technology": "FFF", - "printer_variant": "0.6", + "printer_variant": "0.8HF", "printhost_authorization_type": "key", "printhost_ssl_ignore_revoke": "0", "printing_by_object_gcode": "", diff --git a/resources/profiles/Flashforge/machine/Flashforge Guider4 Pro 0.4 HF nozzle.json b/resources/profiles/Flashforge/machine/Flashforge Guider4 Pro 0.4 HF nozzle.json index c5e08583b4..105985515a 100644 --- a/resources/profiles/Flashforge/machine/Flashforge Guider4 Pro 0.4 HF nozzle.json +++ b/resources/profiles/Flashforge/machine/Flashforge Guider4 Pro 0.4 HF nozzle.json @@ -156,7 +156,7 @@ "printer_settings_id": "Flashforge Guider4 Pro 0.4 HF nozzle", "printer_structure": "undefine", "printer_technology": "FFF", - "printer_variant": "0.4", + "printer_variant": "0.4HF", "printhost_authorization_type": "key", "printhost_ssl_ignore_revoke": "0", "printing_by_object_gcode": "", diff --git a/resources/profiles/Flashforge/machine/Flashforge Guider4 Pro 0.6 HF nozzle.json b/resources/profiles/Flashforge/machine/Flashforge Guider4 Pro 0.6 HF nozzle.json index 33472eb6ce..78fcc22c12 100644 --- a/resources/profiles/Flashforge/machine/Flashforge Guider4 Pro 0.6 HF nozzle.json +++ b/resources/profiles/Flashforge/machine/Flashforge Guider4 Pro 0.6 HF nozzle.json @@ -156,7 +156,7 @@ "printer_settings_id": "Flashforge Guider4 Pro 0.6 HF nozzle", "printer_structure": "undefine", "printer_technology": "FFF", - "printer_variant": "0.6", + "printer_variant": "0.6HF", "printhost_authorization_type": "key", "printhost_ssl_ignore_revoke": "0", "printing_by_object_gcode": "", diff --git a/resources/profiles/Flashforge/machine/Flashforge Guider4 Pro 0.8 HF nozzle.json b/resources/profiles/Flashforge/machine/Flashforge Guider4 Pro 0.8 HF nozzle.json index a1d8eacb92..8f267e0daf 100644 --- a/resources/profiles/Flashforge/machine/Flashforge Guider4 Pro 0.8 HF nozzle.json +++ b/resources/profiles/Flashforge/machine/Flashforge Guider4 Pro 0.8 HF nozzle.json @@ -156,7 +156,7 @@ "printer_settings_id": "Flashforge Guider4 Pro 0.8 HF nozzle", "printer_structure": "undefine", "printer_technology": "FFF", - "printer_variant": "0.6", + "printer_variant": "0.8HF", "printhost_authorization_type": "key", "printhost_ssl_ignore_revoke": "0", "printing_by_object_gcode": "", diff --git a/resources/profiles/Qidi/process/fdm_process_n_common.json b/resources/profiles/Qidi/process/fdm_process_n_common.json index 28fcbe32a9..4fd6a2d9d1 100644 --- a/resources/profiles/Qidi/process/fdm_process_n_common.json +++ b/resources/profiles/Qidi/process/fdm_process_n_common.json @@ -39,7 +39,6 @@ "enable_support": "0", "filename_format": "{input_filename_base}.gcode", "fill_multiline": "1", - "first_x_layer_fan_speed": "0", "gap_infill_speed": [ "50" ], diff --git a/resources/profiles/Ratrig/machine/RatRig V-Core 4 HYBRID 500 0.5 nozzle.json b/resources/profiles/Ratrig/machine/RatRig V-Core 4 HYBRID 500 0.5 nozzle.json index fc4f97bf89..2419a4eab4 100644 --- a/resources/profiles/Ratrig/machine/RatRig V-Core 4 HYBRID 500 0.5 nozzle.json +++ b/resources/profiles/Ratrig/machine/RatRig V-Core 4 HYBRID 500 0.5 nozzle.json @@ -8,7 +8,7 @@ "printer_model": "RatRig V-Core 4 HYBRID 500", "printer_variant": "0.5", "nozzle_diameter": [ - "0.4" + "0.5" ], "printable_area": [ "0x0", diff --git a/resources/profiles/Ratrig/machine/RatRig V-Core 4 HYBRID 500 0.8 nozzle.json b/resources/profiles/Ratrig/machine/RatRig V-Core 4 HYBRID 500 0.8 nozzle.json index d348dd0096..a613589bd7 100644 --- a/resources/profiles/Ratrig/machine/RatRig V-Core 4 HYBRID 500 0.8 nozzle.json +++ b/resources/profiles/Ratrig/machine/RatRig V-Core 4 HYBRID 500 0.8 nozzle.json @@ -8,7 +8,7 @@ "printer_model": "RatRig V-Core 4 HYBRID 500", "printer_variant": "0.8", "nozzle_diameter": [ - "0.6" + "0.8" ], "printable_area": [ "0x0", diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 5cb2e1e5da..1ace4db685 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -6,6 +6,7 @@ #include "libslic3r.h" #include "I18N.hpp" #include "Utils.hpp" +#include "LocalesUtils.hpp" #include "Model.hpp" #include "libslic3r_version.h" @@ -2231,6 +2232,7 @@ std::pair PresetBundle::load_system_pre [&](const tbb::blocked_range& range) { for (size_t i = range.begin(); i < range.end(); ++i) { auto bundle = std::make_unique(); + bundle->set_is_validation_mode(validation_mode); try { auto result = bundle->load_vendor_configs_from_json( dir.string(), other_vendors[i], PresetBundle::LoadSystem, @@ -4982,6 +4984,39 @@ std::pair PresetBundle::load_vendor_configs_ reason = std::string("can not find printer_variant in vendor profile"); return reason; } + // An instantiation printer profile's nozzle_diameter must match the numeric (diameter) + // prefix of its printer_variant: "0.4" -> {0.4}, "0.8HF" -> {0.8} (a trailing + // non-numeric suffix such as "HF"/"HS" distinguishes a hardware sub-variant and is + // ignored here), and for multi-nozzle printers "0.4+0.6" -> {0.4, 0.6}. + // Note: a variant may legitimately repeat across presets of the same model (e.g. speed + // modes, IDEX copy/mirror, or different control boards), so only the diameter is + // validated, not variant uniqueness. Validation-only so the app keeps loading existing + // profiles unchanged. + if (validation_mode && instantiation == "true") { + const auto *nd = config.option("nozzle_diameter"); + std::set nozzles, variant_nozzles; + if (nd != nullptr) + nozzles.insert(nd->values.begin(), nd->values.end()); + std::vector variant_tokens; + boost::algorithm::split(variant_tokens, printer_variant, boost::algorithm::is_any_of("+")); + bool variant_ok = true; // printer_variant is already guaranteed non-empty above + for (const std::string &tok : variant_tokens) { + size_t consumed = 0; + double d = string_to_double_decimal_point(tok, &consumed); + // Require a leading numeric diameter; a trailing suffix (e.g. "HF") is allowed. + if (consumed == 0) { variant_ok = false; break; } + variant_nozzles.insert(d); + } + if (!variant_ok || variant_nozzles != nozzles) { + ++m_errors; + BOOST_LOG_TRIVIAL(error) << "Error in a Vendor Config Bundle \"" << path << "\": The printer preset \"" << + preset_name << "\" has printer_variant \"" << printer_variant << + "\" that does not match its nozzle_diameter \"" << (nd ? nd->serialize() : std::string()) << "\". " + "printer_variant must begin with the nozzle diameter, optionally followed by a non-numeric suffix " + "(e.g. \"0.4\", \"0.8HF\"); for multi-nozzle printers, join the per-nozzle diameters with \"+\" in " + "nozzle order (e.g. \"0.4+0.6\")."; + } + } } const Preset *preset_existing = presets_collection->find_preset(preset_name, false); if (preset_existing != nullptr) {