From 414c3507f2c6e1edab2692b3dcec3ac5faa92c3e Mon Sep 17 00:00:00 2001 From: Max Lyon Date: Tue, 2 Mar 2021 01:22:56 +0100 Subject: [PATCH] only add properties with property creator when they not already exist --- src/OpenMesh/Core/IO/reader/OMReader.cc | 23 +++++++++++++++----- src/OpenMesh/Core/Utils/PropertyCreator.hh | 25 +++++++++++++--------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/OpenMesh/Core/IO/reader/OMReader.cc b/src/OpenMesh/Core/IO/reader/OMReader.cc index 19800f69..33a9e0e1 100644 --- a/src/OpenMesh/Core/IO/reader/OMReader.cc +++ b/src/OpenMesh/Core/IO/reader/OMReader.cc @@ -829,32 +829,45 @@ size_t _OMReader_::restore_binary_custom_data(std::istream& _is, BaseProperty* _ //--------------------------------helper void _OMReader_:: add_generic_property(OMFormat::Chunk::PropertyName& _property_type, BaseImporter& _bi) const { + // We want to support the old way of restoring properties, ie. + // the user has manually created the corresponding property. + // In that case the property does not need be registered. + // However, the _bi.kerne()->_get_prop(property_name_) checks below + // May return a property with the correct name but the wrong type. + // For now we will have to live with that. + + PropertyCreationManager& manager = PropertyCreationManager::instance(); switch (chunk_header_.entity_) { case OMFormat::Chunk::Entity_Vertex: { - manager.create_property(*_bi.kernel(), _property_type, property_name_); + if (_bi.kernel()->_get_vprop(property_name_) == nullptr) + manager.create_property(*_bi.kernel(), _property_type, property_name_); break; } case OMFormat::Chunk::Entity_Face: { - manager.create_property(*_bi.kernel(), _property_type, property_name_); + if (_bi.kernel()->_get_fprop(property_name_) == nullptr) + manager.create_property(*_bi.kernel(), _property_type, property_name_); break; } case OMFormat::Chunk::Entity_Edge: { - manager.create_property(*_bi.kernel(), _property_type, property_name_); + if (_bi.kernel()->_get_eprop(property_name_) == nullptr) + manager.create_property(*_bi.kernel(), _property_type, property_name_); break; } case OMFormat::Chunk::Entity_Halfedge: { - manager.create_property(*_bi.kernel(), _property_type, property_name_); + if (_bi.kernel()->_get_hprop(property_name_) == nullptr) + manager.create_property(*_bi.kernel(), _property_type, property_name_); break; } case OMFormat::Chunk::Entity_Mesh: { - manager.create_property(*_bi.kernel(), _property_type, property_name_); + if (_bi.kernel()->_get_mprop(property_name_) == nullptr) + manager.create_property(*_bi.kernel(), _property_type, property_name_); break; } case OMFormat::Chunk::Entity_Sentinel: diff --git a/src/OpenMesh/Core/Utils/PropertyCreator.hh b/src/OpenMesh/Core/Utils/PropertyCreator.hh index 3d176259..c686efb4 100644 --- a/src/OpenMesh/Core/Utils/PropertyCreator.hh +++ b/src/OpenMesh/Core/Utils/PropertyCreator.hh @@ -116,16 +116,21 @@ class PropertyCreatorImpl : public PropertyCreator { public: std::string type_id_string() override { return get_type_name(); } - void create_vertex_property (BaseKernel& _mesh, const std::string& _property_name) override { VPropHandleT prop; - _mesh.add_property(prop, _property_name); } - void create_halfedge_property(BaseKernel& _mesh, const std::string& _property_name) override { HPropHandleT prop; - _mesh.add_property(prop, _property_name); } - void create_edge_property (BaseKernel& _mesh, const std::string& _property_name) override { EPropHandleT prop; - _mesh.add_property(prop, _property_name); } - void create_face_property (BaseKernel& _mesh, const std::string& _property_name) override { FPropHandleT prop; - _mesh.add_property(prop, _property_name); } - void create_mesh_property (BaseKernel& _mesh, const std::string& _property_name) override { MPropHandleT prop; - _mesh.add_property(prop, _property_name); } + + template + void create_prop(BaseKernel& _mesh, const std::string& _property_name) + { + using PHandle = typename PropHandle::template type; + PHandle prop; + if (!_mesh.get_property_handle(prop, _property_name)) + _mesh.add_property(prop, _property_name); + } + + void create_vertex_property (BaseKernel& _mesh, const std::string& _property_name) override { create_prop(_mesh, _property_name); } + void create_halfedge_property(BaseKernel& _mesh, const std::string& _property_name) override { create_prop(_mesh, _property_name);} + void create_edge_property (BaseKernel& _mesh, const std::string& _property_name) override { create_prop(_mesh, _property_name);} + void create_face_property (BaseKernel& _mesh, const std::string& _property_name) override { create_prop(_mesh, _property_name);} + void create_mesh_property (BaseKernel& _mesh, const std::string& _property_name) override { create_prop(_mesh, _property_name);} ~PropertyCreatorImpl() override {} protected: