diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 6a68e4e33..ef7e7b190 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -3836,6 +3836,14 @@ std::pair PresetBundle::load_vendor_configs_ return std::make_pair(std::move(substitutions), presets_loaded); } +void PresetBundle::on_extruders_count_changed(int extruders_count) +{ + printers.get_edited_preset().set_num_extruders(extruders_count); + update_multi_material_filament_presets(); + reset_default_nozzle_volume_type(); + extruder_ams_counts.resize(extruders_count); +} + void PresetBundle::update_multi_material_filament_presets(size_t to_delete_filament_id) { if (printers.get_edited_preset().printer_technology() != ptFFF) diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp index 7ed7f4e26..1b3630550 100644 --- a/src/libslic3r/PresetBundle.hpp +++ b/src/libslic3r/PresetBundle.hpp @@ -227,6 +227,8 @@ public: // update size and content of filament_presets. void update_multi_material_filament_presets(size_t to_delete_filament_id = size_t(-1)); + void on_extruders_count_changed(int extruder_count); + // Update the is_compatible flag of all print and filament presets depending on whether they are marked // as compatible with the currently selected printer (and print in case of filament presets). // Also updates the is_visible flag of each preset. diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index a47b1080f..387b39e40 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1235,12 +1235,14 @@ void Sidebar::priv::update_sync_status(const MachineObject *obj) } std::vector> extruder_ams_counts = wxGetApp().preset_bundle->extruder_ams_counts; - for (size_t i = 0; i < extruder_ams_counts.size(); ++i) { - for (auto iter = extruder_ams_counts[i].begin(); iter != extruder_ams_counts[i].end(); ++iter){ - if (iter->first == 4) - extruder_infos[i].ams_4 = iter->second; - if (iter->first == 1) - extruder_infos[i].ams_1 = iter->second; + if (extruder_ams_counts.size() >= extruder_nums) { + for (size_t i = 0; i < extruder_nums; ++i) { + for (auto iter = extruder_ams_counts[i].begin(); iter != extruder_ams_counts[i].end(); ++iter) { + if (iter->first == 4) + extruder_infos[i].ams_4 = iter->second; + if (iter->first == 1) + extruder_infos[i].ams_1 = iter->second; + } } } diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index f17713093..7c46b2c2b 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3859,9 +3859,7 @@ void TabPrinter::extruders_count_changed(size_t extruders_count) bool is_count_changed = false; if (m_extruders_count != extruders_count) { m_extruders_count = extruders_count; - m_preset_bundle->printers.get_edited_preset().set_num_extruders(extruders_count); - m_preset_bundle->update_multi_material_filament_presets(); - m_preset_bundle->reset_default_nozzle_volume_type(); + m_preset_bundle->on_extruders_count_changed(extruders_count); is_count_changed = true; wxGetApp().plater()->get_partplate_list().on_extruder_count_changed((int)m_extruders_count);