diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index f14f1eb0a1..5e0ab15849 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -606,13 +606,24 @@ VendorType PresetBundle::get_current_vendor_type() { auto t = VendorType::Unknown; auto config = &printers.get_edited_preset().config; + const auto* printer_model = config->opt("printer_model"); + if (printer_model == nullptr) { + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ": printer_model is " + << (config->has("printer_model") ? "not a string" : "missing") + << ", vendor type is Unknown"; + return t; + } + std::string vendor_name; - for (auto vendor_profile : vendors) { - for (auto vendor_model : vendor_profile.second.models) - if (vendor_model.name == config->opt_string("printer_model")) { + for (const auto& vendor_profile : vendors) { + for (const auto& vendor_model : vendor_profile.second.models) { + if (vendor_model.name == printer_model->value) { vendor_name = vendor_profile.first; break; } + } + if (!vendor_name.empty()) + break; } if (!vendor_name.empty()) { @@ -3779,7 +3790,17 @@ int PresetBundle::get_printer_extruder_count() const { const Preset& printer_preset = this->printers.get_edited_preset(); - int count = printer_preset.config.option("nozzle_diameter")->values.size(); + const auto* nozzle_diameter = printer_preset.config.option("nozzle_diameter"); + if (nozzle_diameter == nullptr) { + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ": nozzle_diameter is missing, using 1 extruder"; + return 1; + } + if (nozzle_diameter->values.empty()) { + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ": nozzle_diameter is empty, using 1 extruder"; + return 1; + } + + int count = int(nozzle_diameter->values.size()); return count; } diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index d9172510b6..6b30dfa9cd 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -5851,16 +5851,20 @@ void GUI_App::reload_settings() return; } BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << __LINE__ << " cloud user preset number is: " << user_presets.size(); - // Check the user presets for any system vendors that need to be installed - for (auto data : user_presets) { - if (!check_preset_parent_available(data)) - add_pending_vendor_preset(data); - } - load_pending_vendors(); - preset_bundle->load_user_presets(*app_config, user_presets, ForwardCompatibilitySubstitutionRule::Enable); - preset_bundle->save_user_presets(*app_config, get_delete_cache_presets()); - // Orca: settings changed, refresh ui to reflect the new preset values - auto refresh_synced_ui = [this] { + auto refresh_synced_ui = [this, user_presets = std::move(user_presets)]() mutable { + if (is_closing() || !preset_bundle || !app_config || !mainframe) + return; + + // Check the user presets for any system vendors that need to be installed + for (auto data : user_presets) { + if (!check_preset_parent_available(data)) + add_pending_vendor_preset(data); + } + load_pending_vendors(); + preset_bundle->load_user_presets(*app_config, user_presets, ForwardCompatibilitySubstitutionRule::Enable); + preset_bundle->save_user_presets(*app_config, get_delete_cache_presets()); + + // Orca: settings changed, refresh ui to reflect the new preset values mainframe->update_side_preset_ui(); for (auto tab : tabs_list) { tab->reload_config(); diff --git a/tests/libslic3r/test_preset_bundle_loading.cpp b/tests/libslic3r/test_preset_bundle_loading.cpp index a00e8f9a63..e2bf930767 100644 --- a/tests/libslic3r/test_preset_bundle_loading.cpp +++ b/tests/libslic3r/test_preset_bundle_loading.cpp @@ -100,3 +100,33 @@ TEST_CASE("Legacy bundle import without bundle metadata stays in the user preset CHECK(fs::equivalent(fs::path(imported->file).parent_path().parent_path(), user_root / PRESET_PRINT_NAME)); } +TEST_CASE("Current vendor type tolerates missing printer model", "[Preset][Bundle]") +{ + PresetBundle bundle; + + VendorProfile orca_vendor("ORCA"); + VendorProfile::PrinterModel model; + model.name = "Orca Test"; + orca_vendor.models.emplace_back(model); + bundle.vendors.emplace("ORCA", std::move(orca_vendor)); + + bundle.printers.get_edited_preset().config.erase("printer_model"); + + CHECK(bundle.get_current_vendor_type() == VendorType::Unknown); +} + +TEST_CASE("Printer extruder count tolerates missing nozzle diameter", "[Preset][Bundle]") +{ + PresetBundle bundle; + DynamicPrintConfig& config = bundle.printers.get_edited_preset().config; + + config.erase("nozzle_diameter"); + CHECK(bundle.get_printer_extruder_count() == 1); + + config.set_key_value("nozzle_diameter", new ConfigOptionFloats()); + CHECK(bundle.get_printer_extruder_count() == 1); + + config.set_key_value("nozzle_diameter", new ConfigOptionFloats({ 0.4, 0.6 })); + CHECK(bundle.get_printer_extruder_count() == 2); +} +