FIX:make sort_volumes right

Jira: STUDIO-5645
Change-Id: If324c9115bfaaf0c1b7b4be7c7ee96ba6b8ac890
This commit is contained in:
zhou.xu 2023-12-19 16:15:51 +08:00 committed by lane.wei
parent d87d9f9270
commit 5b1db7f45e
2 changed files with 30 additions and 19 deletions

View File

@ -3766,6 +3766,9 @@ wxDataViewItemArray ObjectList::add_volumes_to_object_in_list(size_t obj_idx, st
} }
int volume_idx{-1}; 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) { for (const ModelVolume *volume : object->volumes) {
++volume_idx; ++volume_idx;
if (object->is_cut() && volume->is_cut_connector()) 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()), get_warning_icon_name(volume->mesh().stats()),
volume->config.has("extruder") ? volume->config.extruder() : 0, volume->config.has("extruder") ? volume->config.extruder() : 0,
false); false);
ui_and_3d_volume_map[ui_volume_idx] = volume_idx;
ui_volume_idx++;
add_settings_item(vol_item, &volume->config.get()); add_settings_item(vol_item, &volume->config.get());
if (add_to_selection && add_to_selection(volume)) if (add_to_selection && add_to_selection(volume))
@ -4495,10 +4500,12 @@ void ObjectList::update_selections()
assert(obj_idx >= 0 && vol_idx >= 0); assert(obj_idx >= 0 && vol_idx >= 0);
if (object(obj_idx)->volumes[vol_idx]->is_cut_connector()) if (object(obj_idx)->volumes[vol_idx]->is_cut_connector())
sels.Add(m_objects_model->GetInfoItemByType(m_objects_model->GetItemById(obj_idx), InfoItemType::CutConnectors)); 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)); sels.Add(m_objects_model->GetItemByVolumeId(obj_idx, vol_idx));
} }
} }
}
m_selection_mode = smVolume; } m_selection_mode = smVolume; }
} }
else if (selection.is_single_full_instance() || selection.is_multiple_full_instance()) else if (selection.is_single_full_instance() || selection.is_multiple_full_instance())
@ -4600,7 +4607,8 @@ void ObjectList::update_selections_on_canvas()
const int obj_idx = m_objects_model->GetObjectIdByItem(item); const int obj_idx = m_objects_model->GetObjectIdByItem(item);
if (type == itVolume) { 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<unsigned int> idxs = selection.get_volume_idxs_from_volume(obj_idx, std::max(instance_idx, 0), vol_idx); std::vector<unsigned int> 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()); 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; return items;
object->sort_volumes(true); object->sort_volumes(true);
update_info_items(obj_idx, nullptr, true);
wxDataViewItem object_item = m_objects_model->GetItemById(obj_idx); items = add_volumes_to_object_in_list(obj_idx, std::move(add_to_selection));
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);
}
changed_object(obj_idx); changed_object(obj_idx);
return items; return items;

View File

@ -332,13 +332,30 @@ class ObjectDataViewModel :public wxDataViewModel
wxDataViewCtrl* m_ctrl { nullptr }; wxDataViewCtrl* m_ctrl { nullptr };
std::vector<std::pair<ObjectDataViewModelNode*, wxString>> assembly_name_list; std::vector<std::pair<ObjectDataViewModelNode*, wxString>> assembly_name_list;
std::vector<std::pair<ObjectDataViewModelNode*, wxString>> search_found_list; std::vector<std::pair<ObjectDataViewModelNode*, wxString>> search_found_list;
std::map<int, int> m_ui_and_3d_volume_map;
public: public:
ObjectDataViewModel(); ObjectDataViewModel();
~ObjectDataViewModel(); ~ObjectDataViewModel();
void Init(); void Init();
std::map<int, int> &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 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 AddObject(ModelObject* model_object, std::string warning_bitmap, bool has_lock = false, bool refresh = true);
wxDataViewItem AddVolumeChild( const wxDataViewItem &parent_item, wxDataViewItem AddVolumeChild( const wxDataViewItem &parent_item,