diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 7076735c5..448637ebc 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -3766,6 +3766,9 @@ wxDataViewItemArray ObjectList::add_volumes_to_object_in_list(size_t obj_idx, st } int volume_idx{-1}; + auto& ui_and_3d_volume_map = m_objects_model->get_ui_and_3d_volume_map(); + ui_and_3d_volume_map.clear(); + int ui_volume_idx = 0; for (const ModelVolume *volume : object->volumes) { ++volume_idx; if (object->is_cut() && volume->is_cut_connector()) @@ -3778,6 +3781,8 @@ wxDataViewItemArray ObjectList::add_volumes_to_object_in_list(size_t obj_idx, st get_warning_icon_name(volume->mesh().stats()), volume->config.has("extruder") ? volume->config.extruder() : 0, false); + ui_and_3d_volume_map[ui_volume_idx] = volume_idx; + ui_volume_idx++; add_settings_item(vol_item, &volume->config.get()); if (add_to_selection && add_to_selection(volume)) @@ -4495,8 +4500,10 @@ void ObjectList::update_selections() assert(obj_idx >= 0 && vol_idx >= 0); if (object(obj_idx)->volumes[vol_idx]->is_cut_connector()) sels.Add(m_objects_model->GetInfoItemByType(m_objects_model->GetItemById(obj_idx), InfoItemType::CutConnectors)); - else + else { + vol_idx = m_objects_model->get_real_volume_index_in_ui(vol_idx); sels.Add(m_objects_model->GetItemByVolumeId(obj_idx, vol_idx)); + } } } m_selection_mode = smVolume; } @@ -4600,7 +4607,8 @@ void ObjectList::update_selections_on_canvas() const int obj_idx = m_objects_model->GetObjectIdByItem(item); if (type == itVolume) { - const int vol_idx = m_objects_model->GetVolumeIdByItem(item); + int vol_idx = m_objects_model->GetVolumeIdByItem(item); + vol_idx = m_objects_model->get_real_volume_index_in_3d(vol_idx); std::vector idxs = selection.get_volume_idxs_from_volume(obj_idx, std::max(instance_idx, 0), vol_idx); volume_idxs.insert(volume_idxs.end(), idxs.begin(), idxs.end()); } @@ -5814,22 +5822,8 @@ wxDataViewItemArray ObjectList::reorder_volumes_and_get_selection(int obj_idx, s return items; object->sort_volumes(true); - - wxDataViewItem object_item = m_objects_model->GetItemById(obj_idx); - m_objects_model->DeleteVolumeChildren(object_item); - - for (const ModelVolume* volume : object->volumes) { - wxDataViewItem vol_item = m_objects_model->AddVolumeChild(object_item, from_u8(volume->name), - volume->type(), - get_warning_icon_name(volume->mesh().stats()), - volume->config.has("extruder") ? volume->config.extruder() : 0, - false); - // add settings to the part, if it has those - add_settings_item(vol_item, &volume->config.get()); - - if (add_to_selection && add_to_selection(volume)) - items.Add(vol_item); - } + update_info_items(obj_idx, nullptr, true); + items = add_volumes_to_object_in_list(obj_idx, std::move(add_to_selection)); changed_object(obj_idx); return items; diff --git a/src/slic3r/GUI/ObjectDataViewModel.hpp b/src/slic3r/GUI/ObjectDataViewModel.hpp index 624b432df..6e8965894 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.hpp +++ b/src/slic3r/GUI/ObjectDataViewModel.hpp @@ -332,13 +332,30 @@ class ObjectDataViewModel :public wxDataViewModel wxDataViewCtrl* m_ctrl { nullptr }; std::vector> assembly_name_list; std::vector> search_found_list; + std::map m_ui_and_3d_volume_map; public: ObjectDataViewModel(); ~ObjectDataViewModel(); void Init(); - + std::map &get_ui_and_3d_volume_map() { return m_ui_and_3d_volume_map; } + int get_real_volume_index_in_3d(int ui_value) + { + if (m_ui_and_3d_volume_map.find(ui_value) != m_ui_and_3d_volume_map.end()) { + return m_ui_and_3d_volume_map[ui_value]; + } + return ui_value; + } + int get_real_volume_index_in_ui(int _3d_value) + { + for (auto item: m_ui_and_3d_volume_map) { + if (item.second == _3d_value) { + return item.first; + } + } + return _3d_value; + } wxDataViewItem AddPlate(PartPlate* part_plate, wxString name = wxEmptyString, bool refresh = true); wxDataViewItem AddObject(ModelObject* model_object, std::string warning_bitmap, bool has_lock = false, bool refresh = true); wxDataViewItem AddVolumeChild( const wxDataViewItem &parent_item,