Утверждение block_size == b не удалось при чтении файла OpenMesh

При чтении файла OpenMesh через

OpenMesh::EPropHandleT<bool> prop_feature_edge;
mesh.add_property(prop_feature_edge, "feature");
OpenMesh::IO::read_mesh(mesh, "testmesh.om");

Я получаю ошибку

Assertion failed: block_size == b, file E:\JB\workspace\OpenMesh-Windows-Gitlab-master\c9e6b25f\src\OpenMesh\Core\IO\reader\OMReader.cc, line 564

Я искал это в источнике, но не понял, что там проверяет утверждение. Проблема, вероятно, связана с тем, как различные свойства сетки хранятся / загружаются, но сообщение об ошибке не очень помогает увидеть, что пошло не так.

Обратите внимание, что путь к файлу в утверждении исходит из бинарных файлов openmesh, а не из моего проекта. Утверждение определено в этом источнике.

Файл был написан с использованием

OpenMesh::EPropHandleT<bool> prop_feature_edge;
mesh.add_property(prop_feature_edge, "feature");
mesh.property(prop_feature_edge).set_persistent(true);
OpenMesh::IO::write_mesh(mesh, "testmesh.om");

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

Соответствующее Stacktrace:

    myProgram.exe!OpenMesh::IO::_OMReader_::restore_binary_custom_data(class std::basic_istream<char,struct std::char_traits<char> > &,class OpenMesh::BaseProperty *,unsigned __int64,bool)    Unknown
myProgram.exe!OpenMesh::IO::_OMReader_::read_binary_edge_chunk(class std::basic_istream<char,struct std::char_traits<char> > &,class OpenMesh::IO::BaseImporter &,class OpenMesh::IO::Options &,bool)   Unknown
myProgram.exe!OpenMesh::IO::_OMReader_::read_binary(class std::basic_istream<char,struct std::char_traits<char> > &,class OpenMesh::IO::BaseImporter &,class OpenMesh::IO::Options &)   Unknown
myProgram.exe!OpenMesh::IO::_OMReader_::read(class std::basic_istream<char,struct std::char_traits<char> > &,class OpenMesh::IO::BaseImporter &,class OpenMesh::IO::Options &)  Unknown
myProgram.exe!OpenMesh::IO::_OMReader_::read(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class OpenMesh::IO::BaseImporter &,class OpenMesh::IO::Options &)  Unknown
myProgram.exe!OpenMesh::IO::_IOManager_::read(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class OpenMesh::IO::BaseImporter &,class OpenMesh::IO::Options &) Unknown
myProgram.exe!OpenMesh::IO::read_mesh<OpenMesh::TriMesh_ArrayKernelT<OpenMesh::DefaultTraits> >(OpenMesh::TriMesh_ArrayKernelT<OpenMesh::DefaultTraits> & _mesh, const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & _filename, OpenMesh::IO::Options & _opt, bool _clear) Line 141    C++
myProgram.exe!main(int argc, char * * argv) Line 479    C++
[External Code]

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

Сравнивая свойства настроенных сеток, они кажутся одинаковыми:

properties before writing
3 vprops:
v:points
<vprop>
v:colors
1 hprops:
<hprop>
2 eprops:
<eprop>
feature, persistent
2 fprops:
<fprop>
f:status
0 mprops:
#bytes written: 169006

properties before reading
3 vprops:
v:points
<vprop>
v:colors
1 hprops:
<hprop>
2 eprops:
<eprop>
feature, persistent
2 fprops:
<fprop>
f:status
0 mprops:

1

Решение

Я нашел решение проблемы.

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

Это работало нормально и collect_garbage() правильно удалили грани, но соответствующие ребра не были удалены. Это привело к тому, что количество ребер было разным до записи и после загрузки, пока feature свойство, вероятно, имело тот же размер, что и раньше, и не совпадало с количеством загруженных ребер.

Решение состоит в том, чтобы добавить

mesh.request_edge_status()

в дополнение к mesh.request_face_status(), В зависимости от операций на сетке, это, вероятно, хорошая идея использовать mesh.request_vertex_status() также.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]