2016-09-22 5 views
2

Я изменил сетку, и некоторые ребра были добавлены.Индекс края OpenMesh после повторного открытия модифицированной сетки

Затем я сохранил модифицированную сетку в файле .obj. Когда я открываю этот .obj-файл с помощью функции чтения OpenMesh, индексы ребер отличаются от индексов ребер при сохранении сетки, потому что файл .obj имеет только информацию о вершинах и гранях.

Мне нужно сохранить дополнительный файл информации о границах в порядке индекса края при сохранении измененной сетки. Но согласно тому, что я упомянул выше, порядок отличается, поэтому информация о краях неверна после повторного открытия модифицированной сетки.

У меня есть решение. Я сохраняю измененную сетку (старую сетку), затем читаю сохраненный файл как новую сетку. Проверьте каждый край новой сетки в порядке индекса и найдите тот же край в старой сетке. Затем я могу вывести информацию о краях в порядке индекса края новой сетки.

Есть ли простое решение без повторного открытия? Например, функция OpenMesh, которая пересчитывает граничные индексы?

Благодаря

ответ

1

Из того, что вы говорите, я полагаю, что вы, вероятно, с использованием (или, по крайней мере, следует использовать) пользовательский краевую собственность, где вы храните вашу дополнительную информацию. В идеале, как так:

auto edge_pm = OpenMesh::makePropertyManagerFromExistingOrNew< 
     OpenMesh::EPropHandleT<std::string> >(mesh, "edge_info"); 
// Set some random edge info. 
edge_pm[mesh.edge_handle(23)] = "foo"; 

Вы можете использовать родной .om формат OpenMesh, который позволяет хранить пользовательские свойства. Взгляните на модульные тесты в /src/Unittests/unittests_read_write_OM.cc, в частности на номер WriteTriangleVertexBoolProperty, который реализует пример, в котором сетка с настраиваемым свойством сохраняется в файле .om, а затем снова считывается из этого файла. Для примера выше, это будет выглядеть примерно так:

// Flag property so it gets serialized. 
mesh.property(edge_pm.getRawProperty()).set_persistent(true); 
bool ok = OpenMesh::IO::write_mesh(mesh, "bar.om"); 

При загрузке сетки из файла, не забудьте сначала создать свойство:

Mesh new_mesh; 
auto new_edge_pm = OpenMesh::makePropertyManagerFromExistingOrNew< 
     OpenMesh::EPropHandleT<std::string> >(new_mesh, "edge_info"); 
bool ok = OpenMesh::IO::read_mesh(new_mesh, "bar.om"); 

Затем ваша собственность должна быть восстановлена:

std::cout << new_edge_pm[new_mesh.edge_handle(23)] << std::endl; 
// Should print "foo"