Индекс края OpenMesh после повторного открытия измененной сетки

Я модифицировал сетку и добавил несколько ребер.

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

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

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

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

Спасибо


person Uksin    schedule 22.09.2016    source источник


Ответы (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";

Вы можете использовать собственный формат OpenMesh .om, который позволяет хранить пользовательские свойства. Взгляните на модульные тесты в /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"
person hc_    schedule 22.09.2016