diff --git a/src/slic3r/GUI/AMSMaterialsSetting.cpp b/src/slic3r/GUI/AMSMaterialsSetting.cpp index 19a32c2d21..4a429a4a5a 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.cpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.cpp @@ -863,7 +863,15 @@ void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_mi std::set filament_id_set; PresetBundle * preset_bundle = wxGetApp().preset_bundle; std::ostringstream stream; - stream << std::fixed << std::setprecision(1) << obj->GetExtderSystem()->GetNozzleDiameter(0); + // Defensive: this dialog is opened only from StatusPanel (BBL-only) today, so the fallback fires + // only during the brief BBL startup window before firmware reports nozzle info. Without this, + // the "0.0" lookup string returns an empty set and the filament dropdown goes blank. + float machine_diameter = obj->GetExtderSystem()->GetNozzleDiameter(0); + if (machine_diameter == 0.0f && preset_bundle) { + const ConfigOption *opt = preset_bundle->printers.get_selected_preset().config.option("nozzle_diameter"); + if (opt) machine_diameter = static_cast(opt)->values[0]; + } + stream << std::fixed << std::setprecision(1) << machine_diameter; std::string nozzle_diameter_str = stream.str(); std::set printer_names = preset_bundle->get_printer_names_by_printer_type_and_nozzle(DevPrinterConfigUtil::get_printer_display_name(obj->printer_type), nozzle_diameter_str); @@ -1101,8 +1109,17 @@ void AMSMaterialsSetting::on_select_filament(wxCommandEvent &evt) PresetBundle* preset_bundle = wxGetApp().preset_bundle; if (preset_bundle) { std::ostringstream stream; - if (obj) - stream << std::fixed << std::setprecision(1) << obj->GetExtderSystem()->GetNozzleDiameter(0); + if (obj) { + // Defensive: this dialog is opened only from StatusPanel (BBL-only) today, so the fallback fires + // only during the brief BBL startup window before firmware reports nozzle info. Without this, + // the "0.0" lookup string returns an empty set and filament lookup yields no results. + float machine_diameter = obj->GetExtderSystem()->GetNozzleDiameter(0); + if (machine_diameter == 0.0f) { + const ConfigOption *opt = preset_bundle->printers.get_selected_preset().config.option("nozzle_diameter"); + if (opt) machine_diameter = static_cast(opt)->values[0]; + } + stream << std::fixed << std::setprecision(1) << machine_diameter; + } std::string nozzle_diameter_str = stream.str(); std::set printer_names = preset_bundle->get_printer_names_by_printer_type_and_nozzle(DevPrinterConfigUtil::get_printer_display_name(obj->printer_type), nozzle_diameter_str); diff --git a/src/slic3r/GUI/CaliHistoryDialog.cpp b/src/slic3r/GUI/CaliHistoryDialog.cpp index 1dee391ae1..a485aaeb52 100644 --- a/src/slic3r/GUI/CaliHistoryDialog.cpp +++ b/src/slic3r/GUI/CaliHistoryDialog.cpp @@ -644,7 +644,14 @@ wxArrayString NewCalibrationHistoryDialog::get_all_filaments(const MachineObject std::set filament_id_set; std::set printer_names; std::ostringstream stream; - stream << std::fixed << std::setprecision(1) << obj->GetExtderSystem()->GetNozzleDiameter(0); + // If the machine didn't report a nozzle diameter (0.0 = unknown), fall back to the currently + // selected printer preset so the filament list isn't empty. + float machine_diameter = obj->GetExtderSystem()->GetNozzleDiameter(0); + if (machine_diameter == 0.0f && preset_bundle) { + const ConfigOption *opt = preset_bundle->printers.get_selected_preset().config.option("nozzle_diameter"); + if (opt) machine_diameter = static_cast(opt)->values[0]; + } + stream << std::fixed << std::setprecision(1) << machine_diameter; std::string nozzle_diameter_str = stream.str(); for (auto printer_it = preset_bundle->printers.begin(); printer_it != preset_bundle->printers.end(); printer_it++) { diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index a015c8624e..00c2ed65ff 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6850,12 +6850,12 @@ std::vector Plater::priv::load_files(const std::vector& input_ double preset_nozzle_diameter = 0.4; const ConfigOption *opt = printer_preset.config.option("nozzle_diameter"); if (opt) preset_nozzle_diameter = static_cast(opt)->values[0]; - float machine_nozzle_diameter = obj->GetExtderSystem()->GetNozzleDiameter(0); std::string machine_type = obj->printer_type; if (obj->is_support_upgrade_kit && obj->installed_upgrade_kit) machine_type = "C12"; - if (printer_preset.get_current_printer_type(preset_bundle) != machine_type || !is_approx((float) preset_nozzle_diameter, machine_nozzle_diameter)) { + bool nozzle_mismatch = !obj->GetExtderSystem()->NozzleDiameterMatchesOrUnknown(0, (float) preset_nozzle_diameter); + if (printer_preset.get_current_printer_type(preset_bundle) != machine_type || nozzle_mismatch) { Preset *machine_preset = get_printer_preset(obj); if (machine_preset != nullptr) { std::string printer_model = machine_preset->config.option("printer_model")->value; @@ -9566,7 +9566,7 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt) const auto& extruders = obj->GetExtderSystem()->GetExtruders(); for (const DevExtder &extruder : extruders) { - if (!is_approx(extruder.GetNozzleDiameter(), float(preset_nozzle_diameter))) { + if (!obj->GetExtderSystem()->NozzleDiameterMatchesOrUnknown(extruder.GetExtId(), float(preset_nozzle_diameter))) { same_nozzle_diameter = false; } } diff --git a/src/slic3r/GUI/SyncAmsInfoDialog.cpp b/src/slic3r/GUI/SyncAmsInfoDialog.cpp index ca373d4e16..582c220c2f 100644 --- a/src/slic3r/GUI/SyncAmsInfoDialog.cpp +++ b/src/slic3r/GUI/SyncAmsInfoDialog.cpp @@ -1912,58 +1912,6 @@ bool SyncAmsInfoDialog::is_blocking_printing(MachineObject *obj_) return false; } -bool SyncAmsInfoDialog::is_same_nozzle_diameters(NozzleType &tag_nozzle_type, float &nozzle_diameter) -{ - bool is_same_nozzle_diameters = true; - - float preset_nozzle_diameters; - std::string preset_nozzle_type; - - DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (!dev) return true; - - MachineObject *obj_ = dev->get_selected_machine(); - if (obj_ == nullptr) return true; - - try { - PresetBundle *preset_bundle = wxGetApp().preset_bundle; - auto opt_nozzle_diameters = preset_bundle->printers.get_edited_preset().config.option("nozzle_diameter"); - - const ConfigOptionEnumsGenericNullable *nozzle_type = preset_bundle->printers.get_edited_preset().config.option("nozzle_type"); - std::vector preset_nozzle_types(nozzle_type->size()); - for (size_t idx = 0; idx < nozzle_type->size(); ++idx) preset_nozzle_types[idx] = NozzleTypeEumnToStr[NozzleType(nozzle_type->values[idx])]; - - std::vector machine_nozzle_types(obj_->GetExtderSystem()->GetTotalExtderCount()); - for (size_t idx = 0; idx < obj_->GetExtderSystem()->GetTotalExtderCount(); ++idx) machine_nozzle_types[idx] = obj_->GetExtderSystem()->GetNozzleType(idx); - - auto used_filaments = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_used_filaments(); // 1 based - auto filament_maps = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_real_filament_maps(preset_bundle->project_config); // 1 based - - std::vector used_extruders; // 0 based - for (auto f : used_filaments) { - int filament_extruder = filament_maps[f - 1] - 1; - if (std::find(used_extruders.begin(), used_extruders.end(), filament_extruder) == used_extruders.end()) used_extruders.emplace_back(filament_extruder); - } - std::sort(used_extruders.begin(), used_extruders.end()); - - // TODO [tao wang] : add idx mapping - tag_nozzle_type = obj_->GetExtderSystem()->GetNozzleType(0); - - if (opt_nozzle_diameters != nullptr) { - for (auto i = 0; i < used_extruders.size(); i++) { - auto extruder = used_extruders[i]; - preset_nozzle_diameters = float(opt_nozzle_diameters->get_at(extruder)); - if (preset_nozzle_diameters != obj_->GetExtderSystem()->GetNozzleDiameter(0)) { is_same_nozzle_diameters = false; } - } - } - - } catch (...) {} - - nozzle_diameter = preset_nozzle_diameters; - - return is_same_nozzle_diameters; -} - bool SyncAmsInfoDialog::is_same_nozzle_type(std::string &filament_type, NozzleType &tag_nozzle_type) { bool is_same_nozzle_type = true; diff --git a/src/slic3r/GUI/SyncAmsInfoDialog.hpp b/src/slic3r/GUI/SyncAmsInfoDialog.hpp index 061e0e777f..6cacff0af1 100644 --- a/src/slic3r/GUI/SyncAmsInfoDialog.hpp +++ b/src/slic3r/GUI/SyncAmsInfoDialog.hpp @@ -203,7 +203,6 @@ public: void update_timelapse_enable_status(); bool is_same_printer_model(); bool is_blocking_printing(MachineObject *obj_); - bool is_same_nozzle_diameters(NozzleType &tag_nozzle_type, float &nozzle_diameter); bool is_same_nozzle_type(std::string &filament_type, NozzleType &tag_nozzle_type); bool is_timeout(); int update_print_required_data(Slic3r::DynamicPrintConfig config, Slic3r::Model model, Slic3r::PlateDataPtrs plate_data_list, std::string file_name, std::string file_path);