From 8232a716e64fcfbd12fc7ebdaeeef4bfde261f66 Mon Sep 17 00:00:00 2001 From: "zhimin.zeng" Date: Sun, 14 Jul 2024 22:14:52 +0800 Subject: [PATCH] FIX: fix bug when delete filament update filament of HeightRange jira: none Change-Id: I62cb21a65ecdfc36e8bc7d0915a85ecba578e49f --- src/libslic3r/Model.cpp | 2 +- src/libslic3r/TriangleSelector.cpp | 4 ++-- src/slic3r/GUI/GUI_ObjectList.cpp | 33 ++++++++++++++++++++++++++++++ src/slic3r/GUI/Plater.cpp | 2 +- 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 59b92df97..03e84c236 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -3090,7 +3090,7 @@ void ModelVolume::update_extruder_count_when_delete_filament(size_t extruder_cou std::vector used_extruders = get_extruders(); for (int extruder_id : used_extruders) { if (extruder_id == filament_id) { - mmu_segmentation_facets.set_enforcer_block_type_limit(*this, (EnforcerBlockerType)(extruder_count + 1), (EnforcerBlockerType) filament_id); + mmu_segmentation_facets.set_enforcer_block_type_limit(*this, (EnforcerBlockerType)(extruder_count + 1), (EnforcerBlockerType)(filament_id + 1)); break; } } diff --git a/src/libslic3r/TriangleSelector.cpp b/src/libslic3r/TriangleSelector.cpp index 361efa983..8f07598fe 100644 --- a/src/libslic3r/TriangleSelector.cpp +++ b/src/libslic3r/TriangleSelector.cpp @@ -1558,7 +1558,7 @@ void TriangleSelector::get_facets_split_by_tjoints(const Vec3i &vertices, const this->get_facets_split_by_tjoints( { vertices(0), midpoints(0), midpoints(2) }, { this->neighbor_child(neighbors(0), vertices(1), vertices(0), Partition::Second), - -1, + -1, this->neighbor_child(neighbors(2), vertices(0), vertices(2), Partition::First) }, out_triangles); this->get_facets_split_by_tjoints( @@ -1764,7 +1764,7 @@ void TriangleSelector::deserialize(const std::pair max_ebt) + if (state > max_ebt || state == to_delete_filament) state = EnforcerBlockerType::NONE; if (to_delete_filament != EnforcerBlockerType::NONE && state != EnforcerBlockerType::NONE) { diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 1364e6711..7fdec57e6 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -744,6 +744,39 @@ void ObjectList::update_filament_values_for_items_when_delete_filament(const siz object->volumes[id]->config.erase(key); } } + + item = m_objects_model->GetItemById(i); + ObjectDataViewModelNode *object_node = static_cast(item.GetID()); + if (object_node->GetChildCount() == 0) + continue; + + // update height_range + for (size_t i = 0; i < object_node->GetChildCount(); i++) { + ObjectDataViewModelNode * layer_root_node = object_node->GetNthChild(i); + if (layer_root_node->GetType() != ItemType::itLayerRoot) + continue; + for (size_t j = 0; j < layer_root_node->GetChildCount(); j++) { + ObjectDataViewModelNode * layer_node = layer_root_node->GetNthChild(j); + auto layer_item = wxDataViewItem((void *) layer_root_node->GetNthChild(j)); + if (!layer_item) + continue; + auto l_iter = object->layer_config_ranges.find(layer_node->GetLayerRange()); + if (l_iter != object->layer_config_ranges.end()) { + auto& layer_range_item = *(l_iter); + if (layer_range_item.second.has("extruder") && layer_range_item.second.option("extruder")->getInt() == filament_id + 1) { + int new_extruder = 0; + extruder = wxString::Format("%d", new_extruder); + layer_range_item.second.set("extruder", new_extruder); + } else { + int layer_filament_id = layer_range_item.second.option("extruder")->getInt(); + int new_extruder = layer_filament_id > filament_id ? layer_filament_id - 1 : layer_filament_id; + extruder = wxString::Format("%d", new_extruder); + layer_range_item.second.set("extruder", new_extruder); + } + m_objects_model->SetExtruder(extruder, layer_item); + } + } + } } // BBS diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 7a2544ac6..23e153de2 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1895,7 +1895,7 @@ void Sidebar::delete_filament(size_t filament_id) { if (filament_id > filament_count) return; - if (wxGetApp().preset_bundle->is_the_only_edited_filament(filament_id) || (filament_id == 1)) { + if (wxGetApp().preset_bundle->is_the_only_edited_filament(filament_id) || (filament_id == 0)) { wxGetApp().get_tab(Preset::TYPE_FILAMENT)->select_preset(wxGetApp().preset_bundle->filament_presets[0], false, "", true); }