X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_ProxyMesh.hxx;h=c630a729769e998d432cc56d1ee23ffb21ca400d;hp=faf67734f17e79ac4a29bef20508df608289d810;hb=refs%2Ftags%2FV9_7_0a1;hpb=bd4e115a78b52e3fbc016e5e30bb0e19b2a9e7d6 diff --git a/src/SMESH/SMESH_ProxyMesh.hxx b/src/SMESH/SMESH_ProxyMesh.hxx index faf67734f..c630a7297 100644 --- a/src/SMESH/SMESH_ProxyMesh.hxx +++ b/src/SMESH/SMESH_ProxyMesh.hxx @@ -1,9 +1,9 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -26,21 +26,26 @@ #include "SMESH_SMESH.hxx" -#include "SMDS_MeshElement.hxx" +#include "SMDS_ElementHolder.hxx" #include "SMESHDS_SubMesh.hxx" +#include "SMESH_TypeDefs.hxx" #include +#include +#include #include #include #include class SMDS_MeshNode; +class SMDS_MeshElement; class SMESHDS_Mesh; class SMESH_Mesh; /*! - * \brief Container of mesh faces substituting other faces in the input mesh of 3D algorithm + * \brief Container of xD mesh elements substituting other ones in the + * input mesh of an (x+1)D algorithm */ class SMESH_EXPORT SMESH_ProxyMesh { @@ -54,102 +59,125 @@ public: /*! * \brief Proxy sub-mesh */ - class SubMesh : public SMESHDS_SubMesh + class SMESH_EXPORT SubMesh : public SMESHDS_SubMesh { public: - const TN2NMap* GetNodeNodeMap() const { return _n2n; } + const TN2NMap* GetNodeNodeMap() const { return _n2n; } const SMDS_MeshNode* GetProxyNode( const SMDS_MeshNode* n ) const; - virtual void AddElement(const SMDS_MeshElement * e); - virtual int NbElements() const; + const UVPtStructVec& GetUVPtStructVec() const { return _uvPtStructVec; } + virtual void AddElement(const SMDS_MeshElement * e); + virtual smIdType NbElements() const; + virtual smIdType NbNodes() const; virtual SMDS_ElemIteratorPtr GetElements() const; - virtual void Clear(); - virtual bool Contains(const SMDS_MeshElement * ME) const; + virtual SMDS_NodeIteratorPtr GetNodes() const; + virtual void Clear(); + virtual bool Contains(const SMDS_MeshElement * ME) const; template< class ITERATOR > - void ChangeElements( ITERATOR it, ITERATOR end ) + void ChangeElements( ITERATOR it, ITERATOR end ) { - // change SubMesh contents without deleting tmp faces + // change SubMesh contents without deleting tmp elements // for which the caller is responsible - _elements.clear(); - while ( it != end ) _elements.push_back( *it++ ); + _elements.assign( it, end ); } - SubMesh(int index=0):SMESHDS_SubMesh(0,index),_n2n(0) {} - ~SubMesh() { Clear(); } + SubMesh(const SMDS_Mesh* mesh, int index=0); + virtual ~SubMesh() { Clear(); } - private: + protected: std::vector _elements; TN2NMap* _n2n; + UVPtStructVec _uvPtStructVec; // for SubMesh of EDGE friend class SMESH_ProxyMesh; + + protected: // methods of SMDS_ElementHolder; remove elements before mesh compacting or clearing + virtual SMDS_ElemIteratorPtr getElements() { Clear(); return GetElements(); } + virtual void tmpClear() {} + virtual void add( const SMDS_MeshElement* /*element*/ ) {} + virtual void compact() {} + virtual void clear() { Clear(); } }; //-------------------------------------------------------------------------------- // Public interface SMESH_ProxyMesh(); SMESH_ProxyMesh(std::vector& components); - SMESH_ProxyMesh(const SMESH_Mesh& mesh) { _mesh = &mesh; } + SMESH_ProxyMesh(const SMESH_Mesh& mesh); virtual ~SMESH_ProxyMesh(); - // Returns the submesh of a face; it can be a proxy sub-mesh - const SMESHDS_SubMesh* GetSubMesh(const TopoDS_Shape& face) const; + // Returns a sub-mesh of a shape; it can be a proxy sub-mesh + const SMESHDS_SubMesh* GetSubMesh(const TopoDS_Shape& shape) const; + + // Return a sub-mesh by a shape ID; it can be a proxy sub-mesh + const SMESHDS_SubMesh* GetSubMesh(const int shapeID) const; + + // Return a proxy sub-mesh of a shape; it can be NULL + const SubMesh* GetProxySubMesh(const TopoDS_Shape& shape) const; - // Returns the proxy sub-mesh of a face; it can be NULL - const SubMesh* GetProxySubMesh(const TopoDS_Shape& face) const; + // Return a proxy node of a node; the input node is returned if no proxy exists + const SMDS_MeshNode* GetProxyNode( const SMDS_MeshNode* node ) const; - // Returns the proxy node of a node; the input node is returned if no proxy exists - const SMDS_MeshNode* GetProxyNode( const SMDS_MeshNode* node ) const; + // Return number of proxy sub-meshes + int NbProxySubMeshes() const; - // Returns iterator on all faces of the mesh taking into account substitutions + // Return iterator on all faces of the mesh taking into account substitutions. // To be used in case of mesh without shape - SMDS_ElemIteratorPtr GetFaces() const; + SMDS_ElemIteratorPtr GetFaces() const; - // Returns iterator on all faces on the face taking into account substitutions - SMDS_ElemIteratorPtr GetFaces(const TopoDS_Shape& face) const; + // Return iterator on all faces on the face taking into account substitutions + SMDS_ElemIteratorPtr GetFaces(const TopoDS_Shape& face) const; // Return total nb of faces taking into account substitutions - int NbFaces() const; + smIdType NbFaces() const; - bool IsTemporary(const SMDS_MeshElement* elem ) const; + bool IsTemporary(const SMDS_MeshElement* elem ) const; + // Return iterator on inverse elements of a node that may be a proxy one + SMDS_ElemIteratorPtr GetInverseElementIterator(const SMDS_MeshNode* node, + SMDSAbs_ElementType type) const; + // Check if a FACE has prisms on its both sides + static bool HasPrismsOnTwoSides( SMESHDS_SubMesh* faceSM ); - const SMESH_Mesh* GetMesh() const { return _mesh; } + SMESH_Mesh* GetMesh() const { return const_cast( _mesh ); } - SMESHDS_Mesh* GetMeshDS() const; + SMESHDS_Mesh* GetMeshDS() const; //-------------------------------------------------------------------------------- // Interface for descendants protected: - void setMesh(const SMESH_Mesh& mesh) { _mesh = &mesh; } + void setMesh(const SMESH_Mesh& mesh); - int shapeIndex(const TopoDS_Shape& shape) const; + int shapeIndex(const TopoDS_Shape& shape) const; - // returns a proxy sub-mesh; zero index is for the case of mesh w/o shape + virtual SubMesh* newSubmesh(int index=0) const; + + // Return a proxy sub-mesh; zero index is for the case of mesh w/o shape SubMesh* findProxySubMesh(int shapeIndex=0) const; - // returns a proxy sub-mesh; it is created if not yet exists + // Return a proxy sub-mesh; it is created if not yet exists SubMesh* getProxySubMesh(int shapeIndex); - // returns a proxy sub-mesh; it is created if not yet exists + // Return a proxy sub-mesh; it is created if not yet exists SubMesh* getProxySubMesh(const TopoDS_Shape& shape=TopoDS_Shape()); // move proxy sub-mesh from other proxy mesh to this, returns true if sub-mesh found - bool takeProxySubMesh( const TopoDS_Shape& shape, SMESH_ProxyMesh* proxyMesh ); + bool takeProxySubMesh( const TopoDS_Shape& shape, SMESH_ProxyMesh* proxyMesh ); // move tmp elements residing the _mesh from other proxy mesh to this - void takeTmpElemsInMesh( SMESH_ProxyMesh* proxyMesh ); + void takeTmpElemsInMesh( SMESH_ProxyMesh* proxyMesh ); - // removes tmp faces from the _mesh - void removeTmpElement( const SMDS_MeshElement* face ); + // removes tmp element from the _mesh + void removeTmpElement( const SMDS_MeshElement* elem ); // stores tmp element residing the _mesh - void storeTmpElement( const SMDS_MeshElement* face ); + void storeTmpElement( const SMDS_MeshElement* elem ); // store node-node correspondence - void setNode2Node(const SMDS_MeshNode* srcNode, - const SMDS_MeshNode* proxyNode, - const SubMesh* subMesh); + void setNode2Node(const SMDS_MeshNode* srcNode, + const SMDS_MeshNode* proxyNode, + const SubMesh* subMesh); // types of elements needed to implement NbFaces() and GetFaces(); // if _allowedTypes is empty, only elements from _subMeshes are returned, @@ -166,8 +194,14 @@ public: // tmp elements residing the _mesh, to be deleted at destruction std::set< const SMDS_MeshElement* > _elemsInMesh; + // inverse elements of proxy nodes + typedef NCollection_DataMap< const SMDS_MeshNode*, + std::vector< const SMDS_MeshElement* >, + SMESH_Hasher > TNodeElemVecMap; + TNodeElemVecMap _inverseElements; + // Complex submesh used to iterate over elements in other sub-meshes - mutable SubMesh _subContainer; + mutable SubMesh* _subContainer; }; #endif