在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()
返回一个属性管理器。我不知道如何解决这个问题。
编辑2:我想另一个问题是:如何从物业经理那里获得物业的属性句柄?
Edit3:查看源代码,似乎PropertyManager
有一个成员函数deleteProperty()
但 a) 是私有的,b) 它仅在未设置retain
时才删除属性,我认为这将为命名属性设置。
显然,可以定义一个较低级别的属性句柄,然后使用get_property_handle
将句柄作为引用并就地更新它。这有效:
OpenMesh::FPropHandleT< FaceProp > fprop;
mesh.get_property_handle(fprop, "face_props");
mesh.remove_property( fprop );
我希望这能得到更好的记录。或者说我在C++上更好。