42#ifndef PROPERTYMANAGER_HH_
43#define PROPERTYMANAGER_HH_
46#include <OpenMesh/Core/Utils/HandleToPropHandle.hh>
47#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>
75template<
typename PROPTYPE,
typename MeshT =
int>
79 using Value =
typename PROPTYPE::Value;
80 using value_type =
typename PROPTYPE::value_type;
81 using Handle =
typename PROPTYPE::Handle;
83 using Reference =
typename PROPTYPE::reference;
84 using ConstReference =
typename PROPTYPE::const_reference;
90 template <
typename PropertyManager2,
typename PropHandleT>
94 template <
typename PropertyManager2>
103 std::swap(*to, *from);
105 static ConstReference access_property_const(
PolyConnectivity& mesh,
const PROPTYPE& prop_handle,
const Handle&) {
106 return mesh.property(prop_handle);
108 static Reference access_property(
PolyConnectivity& mesh,
const PROPTYPE& prop_handle,
const Handle&) {
109 return mesh.property(prop_handle);
114 template <
typename PropertyManager2,
typename PropHandleT>
117 pm.
set_range(pm.mesh_.template all_elements<Handle>(), initial_value);
120 from.
copy_to(from.mesh_.template all_elements<Handle>(), to, to.mesh_.template all_elements<Handle>());
123 std::swap(lhs.mesh().
property(lhs.prop_).data_vector(), rhs.mesh().property(rhs.prop_).data_vector());
125 lhs.mesh().
property(lhs.prop_).resize(lhs.mesh().template n_elements<Handle>());
126 rhs.mesh().property(rhs.prop_).resize(rhs.mesh().template n_elements<Handle>());
128 static ConstReference access_property_const(
PolyConnectivity& mesh,
const PROPTYPE& prop_handle,
const Handle& handle) {
129 return mesh.property(prop_handle, handle);
131 static Reference access_property(
PolyConnectivity& mesh,
const PROPTYPE& prop_handle,
const Handle& handle) {
132 return mesh.property(prop_handle, handle);
159 OM_DEPRECATED(
"Use the constructor without parameter 'existing' instead. Check for existance with hasProperty")
162 if (!PropertyManager::mesh().get_property_handle(prop_, propname)) {
163 std::ostringstream oss;
164 oss <<
"Requested property handle \"" << propname <<
"\" does not exist.";
165 throw std::runtime_error(oss.str());
168 PropertyManager::mesh().add_property(prop_, propname);
181 if (!PropertyManager::mesh().get_property_handle(prop_, propname)) {
182 PropertyManager::mesh().add_property(prop_, propname);
198 PropertyManager::mesh().add_property(prop_, propname);
199 Storage::initialize(*
this, initial_value);
211 PropertyManager::mesh().add_property(prop_, name_);
223 PropertyManager::mesh().add_property(prop_, name_);
224 Storage::initialize(*
this, initial_value);
244 retain_(rhs.retain_),
253 PropertyManager::mesh().add_property(prop_, name_);
254 Storage::copy(rhs, *
this);
267 Storage::copy(*
this, result);
273 if (&mesh_ == &rhs.mesh_ && prop_ == rhs.prop_)
276 Storage::copy(rhs, *
this);
284 void swap(PropertyManager &rhs) {
286 Storage::swap(rhs, *
this);
289 static bool propertyExists(
const PolyConnectivity &mesh,
const char *propname) {
291 return mesh.get_property_handle(dummy, propname);
294 bool isValid()
const {
return prop_.is_valid(); }
295 operator bool()
const {
return isValid(); }
297 const PROPTYPE &getRawProperty()
const {
return prop_; }
299 const std::string &getName()
const {
return name_; }
314 template <
typename MeshType >
315 const MeshType&
getMesh()
const {
return dynamic_cast<const MeshType&
>(mesh_); }
325 OM_DEPRECATED(
"retain no longer has any effect. Instead, named properties are always retained, while unnamed ones are not.")
326 void retain(
bool = true) {}
335 retain_(rhs.retain_),
339 rhs.prop_.invalidate();
347 if ((&mesh_ != &rhs.mesh_) || (prop_ != rhs.prop_))
352 Storage::copy(rhs, *
this);
357 Storage::swap(rhs, *
this);
361 rhs.prop_.invalidate();
374 static PropertyManager createIfNotExists(PolyConnectivity &mesh,
const char *propname) {
387 template<
typename PROP_VALUE,
typename ITERATOR_TYPE>
388 static PropertyManager createIfNotExists(PolyConnectivity &mesh,
const char *propname,
389 const ITERATOR_TYPE &begin,
const ITERATOR_TYPE &end,
390 const PROP_VALUE &init_value) {
391 const bool exists = propertyExists(mesh, propname);
394 pm.set_range(begin, end, init_value);
395 return std::move(pm);
407 template<
typename PROP_VALUE,
typename ITERATOR_RANGE>
408 static PropertyManager createIfNotExists(PolyConnectivity &mesh,
const char *propname,
409 const ITERATOR_RANGE &range,
const PROP_VALUE &init_value) {
410 return createIfNotExists(
411 mesh, propname, range.begin(), range.end(), init_value);
428 return mesh().mproperty(prop_)[0];
444 return mesh().mproperty(prop_)[0];
454 inline typename PROPTYPE::reference
operator[] (Handle handle) {
455 return mesh().property(prop_, handle);
465 inline typename PROPTYPE::const_reference
operator[] (
const Handle& handle)
const {
466 return mesh().property(prop_, handle);
476 inline typename PROPTYPE::reference
operator() (
const Handle& handle = Handle()) {
478 return Storage::access_property(mesh(), prop_, handle);
488 inline typename PROPTYPE::const_reference
operator() (
const Handle& handle = Handle())
const {
490 return Storage::access_property_const(mesh(), prop_, handle);
517 template<
typename HandleTypeIterator,
typename PROP_VALUE>
518 void set_range(HandleTypeIterator begin, HandleTypeIterator end,
519 const PROP_VALUE &value) {
520 for (; begin != end; ++begin)
521 (*
this)[*begin] = value;
524#if (defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
525 template<
typename HandleTypeIteratorRange,
typename PROP_VALUE>
526 void set_range(
const HandleTypeIteratorRange &range,
527 const PROP_VALUE &value) {
528 set_range(range.begin(), range.end(), value);
546 template<
typename HandleTypeIterator,
typename PropertyManager2,
547 typename HandleTypeIterator2>
548 void copy_to(HandleTypeIterator begin, HandleTypeIterator end,
549 PropertyManager2 &dst_propmanager,
550 HandleTypeIterator2 dst_begin, HandleTypeIterator2 dst_end)
const {
552 for (; begin != end && dst_begin != dst_end; ++begin, ++dst_begin) {
553 dst_propmanager[*dst_begin] = (*this)[*begin];
557 template<
typename RangeType,
typename PropertyManager2,
559 void copy_to(
const RangeType &range,
560 PropertyManager2 &dst_propmanager,
561 const RangeType2 &dst_range)
const {
562 copy_to(range.begin(), range.end(), dst_propmanager,
563 dst_range.begin(), dst_range.end());
581 template<
typename RangeType,
typename RangeType2>
582 static void copy(
const char *prop_name,
587 DstPM dst(DstPM::createIfNotExists(dst_mesh, prop_name));
590 SrcPM src(src_mesh, prop_name,
true);
592 src.copy_to(src_range, dst, dst_range);
603 mesh().property(getRawProperty()).set_persistent(_persistence);
607 void deleteProperty() {
608 if (!retain_ && prop_.is_valid())
609 mesh().remove_property(prop_);
612 PolyConnectivity& mesh()
const
614 return const_cast<PolyConnectivity&
>(mesh_);
618 const PolyConnectivity& mesh_;
624template <
typename PropertyT>
628 using Value =
typename PropertyT::Value;
629 using value_type =
typename PropertyT::value_type;
630 using Handle =
typename PropertyT::Handle;
635 prop_(property_handle)
638 inline const typename PropertyT::const_reference operator() (
const Handle& handle)
640 return mesh_.
property(prop_, handle);
643 inline const typename PropertyT::const_reference operator[] (
const Handle& handle)
645 return mesh_.
property(prop_, handle);
680template<
typename ElementT,
typename T>
682OM_DEPRECATED(
"Named temporary properties are deprecated. Either create a temporary without name or a non-temporary with name")
711template<
typename ElementT,
typename T>
739template<
typename ElementT,
typename T>
743 return mesh.get_property_handle(ph, propname);
773template<
typename ElementT,
typename T>
776 if (!hasProperty<ElementT, T>(mesh, propname))
778 std::ostringstream oss;
779 oss <<
"Requested property handle \"" << propname <<
"\" does not exist.";
780 throw std::runtime_error(oss.str());
814template<
typename ElementT,
typename T>
829template<
typename PROPTYPE>
848template<
typename PROPTYPE,
typename MeshT =
int>
863template<
typename PROPTYPE,
typename MeshT =
int>
881template<
typename PROPTYPE,
882 typename ITERATOR_TYPE,
typename PROP_VALUE>
886 const ITERATOR_TYPE &begin, const ITERATOR_TYPE &end,
887 const PROP_VALUE &init_value) {
889 mesh, propname, begin, end, init_value);
903template<
typename PROPTYPE,
904 typename ITERATOR_RANGE,
typename PROP_VALUE>
908 const ITERATOR_RANGE &range,
909 const PROP_VALUE &init_value) {
910 return makePropertyManagerFromExistingOrNew<PROPTYPE>(
911 mesh, propname, range.begin(), range.end(), init_value);
918template<
typename MeshT>
927template<
typename MeshT>
934template <
typename HandleT,
typename T>
void remove_property(VPropHandleT< T > &_ph)
PropertyT< T > & property(VPropHandleT< T > _ph)
bool get_property_handle(VPropHandleT< T > &_ph, const std::string &_name) const
Connectivity Class for polygonal meshes.
static void copy(const char *prop_name, PolyConnectivity &src_mesh, const RangeType &src_range, PolyConnectivity &dst_mesh, const RangeType2 &dst_range)
void set_range(HandleTypeIterator begin, HandleTypeIterator end, const PROP_VALUE &value)
PropertyManager(const Value &initial_value, PolyConnectivity &mesh, const char *propname)
ConstPropertyViewer< OpenMesh::VPropHandleT< typename MeshT::Point > > getPointsProperty(const MeshT &mesh)
PropertyManager(PolyConnectivity &mesh, const char *propname, bool existing)
PropertyManager< typename HandleToPropHandle< ElementT, T >::type > makeTemporaryProperty(PolyConnectivity &mesh)
PROPTYPE::reference operator[](Handle handle)
bool hasProperty(const PolyConnectivity &mesh, const char *propname)
void copy_to(HandleTypeIterator begin, HandleTypeIterator end, PropertyManager2 &dst_propmanager, HandleTypeIterator2 dst_begin, HandleTypeIterator2 dst_end) const
PROPTYPE::reference & operator*()
PropertyManager< OpenMesh::VPropHandleT< typename MeshT::Point > > getPointsProperty(MeshT &mesh)
void set_persistent(bool _persistence=true)
PropertyManager(const PolyConnectivity &mesh)
PropertyManager(const Value &initial_value, const PolyConnectivity &mesh)
PropertyManager< typename HandleToPropHandle< ElementT, T >::type > getProperty(PolyConnectivity &mesh, const char *propname)
PropertyManager(PolyConnectivity &mesh, PROPTYPE property_handle)
PROPTYPE::reference operator()(const Handle &handle=Handle())
PropertyManager< typename HandleToPropHandle< ElementT, T >::type > getOrMakeProperty(PolyConnectivity &mesh, const char *propname)
PROPTYPE::const_reference & operator*() const
PropertyManager(PolyConnectivity &mesh, const char *propname)
Default property class for any type T.
#define OM_DEPRECATED(msg)
define OM_SUPPRESS_DEPRECATED to suppress deprecated code warnings
bool getMesh(int _identifier, PolyMesh *&_mesh)
Get the Poly Mesh which has the given identifier.