Как сохранить пользовательские свойства вершин с помощью openmesh в Python? - PullRequest
0 голосов
/ 18 мая 2018

Я работаю с openmesh, установленным в Python 3.6 через pip.Мне нужно добавить пользовательские свойства к вершинам сетки, чтобы хранить некоторые данные в каждой вершине.Мой код выглядит следующим образом:

import openmesh as OM
import numpy as np
mesh = OM.TriMesh()

#Some vertices
vh0 = mesh.add_vertex(np.array([0,0,0]));
vh1 = mesh.add_vertex(np.array([1,0,0]));
vh2 = mesh.add_vertex(np.array([1,1,0]));
vh3 = mesh.add_vertex(np.array([0,1,0]));

#Some data
data = np.arange(mesh.n_vertices)

#Add custom property
for vh in mesh.vertices():
    mesh.set_vertex_property('prop1', vh, data[vh.idx()])

#Check properties have been added correctly
print(mesh.vertex_property('prop1'))

OM.write_mesh('mesh.om',mesh)

print возвращает [0, 1, 2, 3].Все идет нормально.Но когда я снова читаю сетку, пользовательское свойство исчезло:

mesh1 = OM.TriMesh()

mesh1 = OM.read_trimesh('mesh.om')

print(mesh1.vertex_property('prop1'))

возвращает [None, None, None, None]

У меня есть два предположения:
1 - свойство не было сохранено впервое место
2 - читатель не знает, что существует пользовательское свойство, когда он читает файл mesh.om

Кто-нибудь знает, как правильно сохранить и прочитать сетку с пользовательскими свойствами вершин с помощью openmesh в Python?Или это вообще возможно (кто-нибудь делал это раньше?)?
Это что-то не так с моим кодом?

Спасибо за вашу помощь,

Чарльз.

1 Ответ

0 голосов
/ 09 июля 2018

Модуль записи OM в настоящее время не поддерживает пользовательские свойства.Если вы работаете с числовыми свойствами, возможно, проще всего преобразовать данные в массив NumPy и сохранить их отдельно.

Скажем, ваша сетка и свойства настроены так:

import openmesh as om
import numpy as np

# create example mesh
mesh1 = om.TriMesh()
v00 = mesh1.add_vertex([0,0,0])
v01 = mesh1.add_vertex([0,1,0])
v10 = mesh1.add_vertex([1,0,0])
v11 = mesh1.add_vertex([1,1,0])
mesh1.add_face(v00, v01, v11)
mesh1.add_face(v00, v11, v01)

# set property data
mesh1.set_vertex_property('color', v00, [1,0,0])
mesh1.set_vertex_property('color', v01, [0,1,0])
mesh1.set_vertex_property('color', v10, [0,0,1])
mesh1.set_vertex_property('color', v11, [1,1,1])

Вы можете извлечь данные свойства в виде массива с использованием одного из методов *_property_array и сохранить его вместе с сеткой с помощью функции save NumPy.

om.write_mesh('mesh.om', mesh1)
color_array1 = mesh1.vertex_property_array('color')
np.save('color.npy', color_array1)

Загрузка выполняется аналогично:

mesh2 = om.read_trimesh('mesh.om')
color_array2 = np.load('color.npy')
mesh2.set_vertex_property_array('color', color_array2)

# verify property data is equal
for vh1, vh2 in zip(mesh1.vertices(), mesh2.vertices()):
    color1 = mesh1.vertex_property('color', vh1)
    color2 = mesh2.vertex_property('color', vh2)
    assert np.allclose(color1, color2)
...