1

在 OpenMesh 中,一旦将命名属性添加到元素中,它将是永久的,因为该属性在属性管理器的范围内仍然存在,如此处所述。我的问题是,如何按名称删除此类属性?

到目前为止,我尝试由物业经理删除,甚至这个失败:

auto face_props = OpenMesh::FProp<FaceProp>(mesh, "face_props");
mesh.remove_property(face_props);

有错误

error: no matching function for call to ‘OpenMesh::TriMesh_ArrayKernelT<>::remove_property(OpenMesh::PropertyManager<OpenMesh::FPropHandleT<FaceProp>, int>&)’

是否有remove_property我可以编写remove_property("face_props")(或类似的)删除属性的函数?

编辑:以下给出了相同的错误:

mesh.remove_property( OpenMesh::getProperty<OpenMesh::FaceHandle, FaceProp>(mesh, "face_props") );

我怀疑它mesh.remove_property()需要一个属性句柄对象,但getProperty()返回一个属性管理器。我不知道如何解决这个问题。

Edit2:我想另一个问题是:如何从物业经理那里获得物业的物业句柄?

Edit3:查看源代码,它似乎PropertyManager有一个成员函数deleteProperty(),但 a) 是私有的,b) 如果未设置,它只会删除属性retain,我假设将为命名属性设置。

4

1 回答 1

1

显然,可以定义一个较低级别的属性句柄,然后使用get_property_handle它将句柄作为参考并就地更新它。这有效:

    OpenMesh::FPropHandleT< FaceProp > fprop;
    mesh.get_property_handle(fprop, "face_props");
    mesh.remove_property( fprop );

我希望这有更好的记录。或者我在 C++ 方面做得更好。

于 2020-11-18T18:04:51.767 回答