X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHUtils%2FSMESH_TypeDefs.hxx;h=2e920132d4aecac0e10e544f6e3340ae1f1f101a;hb=HEAD;hp=9fec2e5bd7079b6199259052ce53b59584b4215c;hpb=63a442b2c3cbc5e2155d83e86dfdb77d6961fab3;p=modules%2Fsmesh.git diff --git a/src/SMESHUtils/SMESH_TypeDefs.hxx b/src/SMESHUtils/SMESH_TypeDefs.hxx index 9fec2e5bd..9ae5a4ce2 100644 --- a/src/SMESHUtils/SMESH_TypeDefs.hxx +++ b/src/SMESHUtils/SMESH_TypeDefs.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -27,23 +27,32 @@ #ifndef __SMESH_TypeDefs_HXX__ #define __SMESH_TypeDefs_HXX__ +#include + #include "SMESH_Utils.hxx" +#include "SMDS_SetIterator.hxx" #include "SMDS_MeshNode.hxx" +#include + #include #include +#include #include #include #include #include +#include + typedef std::map, TIDCompare > TElemOfElemListMap; typedef std::map, TIDCompare > TElemOfNodeListMap; -typedef std::map TNodeNodeMap; +typedef std::map TNodeNodeMap; //!< Set of elements sorted by ID, to be used to assure predictability of edition typedef std::set< const SMDS_MeshElement*, TIDCompare > TIDSortedElemSet; @@ -72,6 +81,7 @@ namespace SMESHUtils TVECTOR v2( vec ); vec.swap( v2 ); } + /*! * \brief Auto pointer */ @@ -79,11 +89,15 @@ namespace SMESHUtils struct Deleter { TOBJ* _obj; - Deleter( TOBJ* obj ): _obj( obj ) {} + explicit Deleter( TOBJ* obj = (TOBJ*)NULL ): _obj( obj ) {} ~Deleter() { delete _obj; _obj = 0; } + TOBJ& operator*() const { return *_obj; } + TOBJ* operator->() const { return _obj; } + operator bool() const { return _obj; } private: Deleter( const Deleter& ); }; + /*! * \brief Auto pointer to array */ @@ -93,9 +107,40 @@ namespace SMESHUtils TOBJ* _obj; ArrayDeleter( TOBJ* obj ): _obj( obj ) {} ~ArrayDeleter() { delete [] _obj; _obj = 0; } + operator TOBJ*() { return _obj; } + TOBJ* get() { return _obj; } private: ArrayDeleter( const ArrayDeleter& ); }; + + /*! + * \return SMDS_ElemIteratorPtr on an std container of SMDS_MeshElement's + */ + template < class ELEM_SET > + SMDS_ElemIteratorPtr elemSetIterator( const ELEM_SET& elements ) + { + typedef SMDS_SetIterator + < SMDS_pElement, typename ELEM_SET::const_iterator> TSetIterator; + return boost::make_shared< TSetIterator >( elements.begin(), elements.end() ); + } + + /*! + * \brief Increment enum value + */ + template < typename ENUM > + void Increment( ENUM& v, int delta=1 ) + { + v = ENUM( int(v)+delta ); + } + + /*! + * \brief Return incremented enum value + */ + template < typename ENUM > + ENUM Add( ENUM v, int delta ) + { + return ENUM( int(v)+delta ); + } } //======================================================================= @@ -112,7 +157,41 @@ struct SMESH_TLink: public NLink { if ( first->GetID() < second->GetID() ) std::swap( first, second ); } const SMDS_MeshNode* node1() const { return first; } const SMDS_MeshNode* node2() const { return second; } + + // methods for usage of SMESH_TLink as a hasher in NCollection maps + //static int HashCode(const SMESH_TLink& link, int aLimit) + //{ + // return smIdHasher::HashCode( link.node1()->GetID() + link.node2()->GetID(), aLimit ); + //} + //static Standard_Boolean IsEqual(const SMESH_TLink& l1, const SMESH_TLink& l2) + //{ + // return ( l1.node1() == l2.node1() && l1.node2() == l2.node2() ); + //} }; +// a hasher in NCollection maps +struct SMESH_TLinkHasher +{ +#if OCC_VERSION_LARGE < 0x07080000 + static int HashCode(const SMESH_TLink& link, int aLimit) + { + return smIdHasher::HashCode( link.node1()->GetID() + link.node2()->GetID(), aLimit ); + } + static Standard_Boolean IsEqual(const SMESH_TLink& l1, const SMESH_TLink& l2) + { + return ( l1.node1() == l2.node1() && l1.node2() == l2.node2() ); + } +#else + size_t operator()(const SMESH_TLink& link) const + { + return smIdHasher()( link.node1()->GetID() + link.node2()->GetID() ); + } + bool operator()(const SMESH_TLink& l1, const SMESH_TLink& l2) const + { + return ( l1.node1() == l2.node1() && l1.node2() == l2.node2() ); + } +#endif +}; +typedef SMESH_TLink SMESH_Link; //======================================================================= /*! @@ -129,24 +208,62 @@ struct SMESH_OrientedLink: public SMESH_TLink //------------------------------------------ /*! - * \brief SMDS_MeshNode -> gp_XYZ convertor + * \brief SMDS_MeshNode -> gp_XYZ converter */ //------------------------------------------ struct SMESH_TNodeXYZ : public gp_XYZ { const SMDS_MeshNode* _node; - double _xyz[3]; - SMESH_TNodeXYZ( const SMDS_MeshElement* e=0):gp_XYZ(0,0,0),_node(0) { + SMESH_TNodeXYZ( const SMDS_MeshElement* e=0):gp_XYZ(0,0,0),_node(0) + { + Set(e); + } + bool Set( const SMDS_MeshElement* e=0 ) + { if (e) { assert( e->GetType() == SMDSAbs_Node ); _node = static_cast(e); - _node->GetXYZ(_xyz); // - thread safe getting coords - SetCoord( _xyz[0], _xyz[1], _xyz[2] ); + _node->GetXYZ( ChangeData() ); // - thread safe getting coords + return true; } + return false; } + void SetXYZ( const gp_XYZ& p ) { SetCoord( p.X(), p.Y(), p.Z() ); } + const SMDS_MeshNode* Node() const { return _node; } double Distance(const SMDS_MeshNode* n) const { return (SMESH_TNodeXYZ( n )-*this).Modulus(); } double SquareDistance(const SMDS_MeshNode* n) const { return (SMESH_TNodeXYZ( n )-*this).SquareModulus(); } - bool operator==(const SMESH_TNodeXYZ& other) const { return _node == other._node; } + bool operator==(const SMESH_TNodeXYZ& other) const { return _node == other._node; } + bool operator!=(const SMESH_TNodeXYZ& other) const { return _node != other._node; } + bool operator!() const { return !_node; } + const SMDS_MeshNode* operator->() const { return _node; } +}; +typedef SMESH_TNodeXYZ SMESH_NodeXYZ; + +// -------------------------------------------------------------------------------- +// SMESH_Hasher provide methods needed to put mesh data to NCollection maps + +struct SMESH_Hasher +{ +#if OCC_VERSION_LARGE < 0x07080000 + static Standard_Integer HashCode(const SMDS_MeshElement* e, const Standard_Integer upper) + { + return smIdHasher::HashCode( e->GetID(), upper ); + } + static Standard_Boolean IsEqual( const SMDS_MeshElement* e1, const SMDS_MeshElement* e2 ) + { + return ( e1 == e2 ); + } +#else + size_t operator()(const SMDS_MeshElement* e) const + { + return smIdHasher()( e->GetID() ); + } + + bool operator()(const SMDS_MeshElement* e1, const SMDS_MeshElement* e2) const + { + return ( e1 == e2 ); + } +#endif }; //-------------------------------------------------- @@ -162,9 +279,10 @@ typedef struct uvPtStruct double x, y; // 2d parameter, normalized [0,1] const SMDS_MeshNode * node; - uvPtStruct(): node(NULL) {} + uvPtStruct(const SMDS_MeshNode* n = 0): node(n) {} inline gp_XY UV() const { return gp_XY( u, v ); } + inline void SetUV( const gp_XY& uv ) { u = uv.X(); v = uv.Y(); } struct NodeAccessor // accessor to iterate on nodes in UVPtStructVec { @@ -177,20 +295,13 @@ typedef std::vector< UVPtStruct > UVPtStructVec; // -------------------------------------------------------------------------------- // class SMESH_SequenceOfElemPtr -#include - -class SMDS_MeshElement; - -typedef const SMDS_MeshElement* SMDS_MeshElementPtr; - -DEFINE_SEQUENCE (SMESH_SequenceOfElemPtr, SMESH_BaseCollectionElemPtr, SMDS_MeshElementPtr) +typedef std::vector< const SMDS_MeshElement* > SMESH_SequenceOfElemPtr; // -------------------------------------------------------------------------------- // class SMESH_SequenceOfNode -typedef const SMDS_MeshNode* SMDS_MeshNodePtr; -DEFINE_SEQUENCE(SMESH_SequenceOfNode, - SMESH_BaseCollectionNodePtr, SMDS_MeshNodePtr) +typedef const SMDS_MeshNode* SMDS_MeshNodePtr; +typedef NCollection_Sequence< SMDS_MeshNodePtr > SMESH_SequenceOfNode; #endif