From bef139898a9d5f2245a7b0ae7b399c4cedcdc6a0 Mon Sep 17 00:00:00 2001 From: "zhimin.zeng" Date: Sat, 22 Mar 2025 18:04:27 +0800 Subject: [PATCH] FIX: crash when delete filament with setting support filament jira: STUDIO-11063 Change-Id: I72ede85e540178b576239615d67017c082ded113 --- src/slic3r/GUI/GUI_ObjectList.cpp | 30 +++++++++++++++++++++--------- src/slic3r/GUI/Plater.cpp | 10 ++++++---- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 3ff0aace6..4fc525eb9 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -724,19 +724,35 @@ void ObjectList::update_filament_values_for_items_when_delete_filament(const siz m_objects_model->SetExtruder(extruder, item); static const char *keys[] = {"support_filament", "support_interface_filament"}; - for (auto key : keys) - if (object->config.has(key) && object->config.opt_int(key) == filament_id + 1) { - if (replace_id == -1) + for (auto key : keys) { + if (object->config.has(key)) { + if(object->config.opt_int(key) == filament_id + 1) object->config.erase(key); - else - object->config.set_key_value(key, new ConfigOptionInt(replace_filament_id)); + else { + int new_value = object->config.opt_int(key) > filament_id ? object->config.opt_int(key) - 1 : object->config.opt_int(key); + object->config.set_key_value(key, new ConfigOptionInt(new_value)); + } } + } //if (object->volumes.size() > 1) { for (size_t id = 0; id < object->volumes.size(); id++) { item = m_objects_model->GetItemByVolumeId(i, id); if (!item) continue; + + for (auto key : keys) { + if (object->volumes[id]->config.has(key)) { + if (object->volumes[id]->config.opt_int(key) == filament_id + 1) + object->volumes[id]->config.erase(key); + else { + int new_value = object->volumes[id]->config.opt_int(key) > filament_id ? object->volumes[id]->config.opt_int(key) - 1 : + object->volumes[id]->config.opt_int(key); + object->config.set_key_value(key, new ConfigOptionInt(new_value)); + } + } + } + if (!object->volumes[id]->config.has("extruder")) { continue; } @@ -749,10 +765,6 @@ void ObjectList::update_filament_values_for_items_when_delete_filament(const siz } m_objects_model->SetExtruder(extruder, item); - - for (auto key : keys) - if (object->volumes[id]->config.has(key) && object->volumes[id]->config.opt_int(key) == filament_id + 1) - object->volumes[id]->config.erase(key); } //} diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index f675a363f..f5171582b 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -14948,11 +14948,13 @@ void Plater::on_filaments_delete(size_t num_filaments, size_t filament_id, int r // update global support filament static const char *keys[] = {"support_filament", "support_interface_filament"}; for (auto key : keys) - if (p->config->has(key) && p->config->opt_int(key) == filament_id + 1) { - if (replace_filament_id == -1) + if (p->config->has(key)) { + if(p->config->opt_int(key) == filament_id + 1) (*(p->config)).erase(key); - else - (*(p->config)).set_key_value(key, new ConfigOptionInt(replace_filament_id + 1)); + else { + int new_value = p->config->opt_int(key) > filament_id ? p->config->opt_int(key) - 1 : p->config->opt_int(key); + (*(p->config)).set_key_value(key, new ConfigOptionInt(new_value)); + } } // update object/volume/support(object and volume) filament id