1 // Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 // File : SMESH_ProxyMesh.hxx
21 // Created : Thu Dec 2 10:05:35 2010
22 // Author : Edward AGAPOV (eap)
24 #ifndef __SMESH_ProxyMesh_HXX__
25 #define __SMESH_ProxyMesh_HXX__
27 #include "SMESH_SMESH.hxx"
29 #include "SMDS_ElementHolder.hxx"
30 #include "SMESHDS_SubMesh.hxx"
31 #include "SMESH_TypeDefs.hxx"
33 #include <TopoDS_Shape.hxx>
34 #include <NCollection_DataMap.hxx>
38 #include <boost/shared_ptr.hpp>
41 class SMDS_MeshElement;
46 * \brief Container of xD mesh elements substituting other ones in the
47 * input mesh of an (x+1)D algorithm
49 class SMESH_EXPORT SMESH_ProxyMesh
53 typedef boost::shared_ptr<SMESH_ProxyMesh> Ptr;
55 typedef std::map<const SMDS_MeshNode*, const SMDS_MeshNode*, TIDCompare > TN2NMap;
57 //--------------------------------------------------------------------------------
59 * \brief Proxy sub-mesh
61 class SMESH_EXPORT SubMesh : public SMESHDS_SubMesh
65 const TN2NMap* GetNodeNodeMap() const { return _n2n; }
66 const SMDS_MeshNode* GetProxyNode( const SMDS_MeshNode* n ) const;
67 const UVPtStructVec& GetUVPtStructVec() const { return _uvPtStructVec; }
68 virtual void AddElement(const SMDS_MeshElement * e);
69 virtual int NbElements() const;
70 virtual int NbNodes() const;
71 virtual SMDS_ElemIteratorPtr GetElements() const;
72 virtual SMDS_NodeIteratorPtr GetNodes() const;
74 virtual bool Contains(const SMDS_MeshElement * ME) const;
76 template< class ITERATOR >
77 void ChangeElements( ITERATOR it, ITERATOR end )
79 // change SubMesh contents without deleting tmp elements
80 // for which the caller is responsible
81 _elements.assign( it, end );
83 SubMesh(const SMDS_Mesh* mesh, int index=0);
84 virtual ~SubMesh() { Clear(); }
87 std::vector<const SMDS_MeshElement *> _elements;
89 UVPtStructVec _uvPtStructVec; // for SubMesh of EDGE
90 friend class SMESH_ProxyMesh;
92 protected: // methods of SMDS_ElementHolder; remove elements before mesh compacting or clearing
93 virtual SMDS_ElemIteratorPtr getElements() { Clear(); return GetElements(); }
94 virtual void tmpClear() {}
95 virtual void add( const SMDS_MeshElement* /*element*/ ) {}
96 virtual void compact() {}
97 virtual void clear() { Clear(); }
99 //--------------------------------------------------------------------------------
103 SMESH_ProxyMesh(std::vector<SMESH_ProxyMesh::Ptr>& components);
104 SMESH_ProxyMesh(const SMESH_Mesh& mesh);
105 virtual ~SMESH_ProxyMesh();
107 // Returns a sub-mesh of a shape; it can be a proxy sub-mesh
108 const SMESHDS_SubMesh* GetSubMesh(const TopoDS_Shape& shape) const;
110 // Return a sub-mesh by a shape ID; it can be a proxy sub-mesh
111 const SMESHDS_SubMesh* GetSubMesh(const int shapeID) const;
113 // Return a proxy sub-mesh of a shape; it can be NULL
114 const SubMesh* GetProxySubMesh(const TopoDS_Shape& shape) const;
116 // Return a proxy node of a node; the input node is returned if no proxy exists
117 const SMDS_MeshNode* GetProxyNode( const SMDS_MeshNode* node ) const;
119 // Return number of proxy sub-meshes
120 int NbProxySubMeshes() const;
122 // Return iterator on all faces of the mesh taking into account substitutions.
123 // To be used in case of mesh without shape
124 SMDS_ElemIteratorPtr GetFaces() const;
126 // Return iterator on all faces on the face taking into account substitutions
127 SMDS_ElemIteratorPtr GetFaces(const TopoDS_Shape& face) const;
129 // Return total nb of faces taking into account substitutions
132 bool IsTemporary(const SMDS_MeshElement* elem ) const;
134 // Return iterator on inverse elements of a node that may be a proxy one
135 SMDS_ElemIteratorPtr GetInverseElementIterator(const SMDS_MeshNode* node,
136 SMDSAbs_ElementType type) const;
138 // Check if a FACE has prisms on its both sides
139 static bool HasPrismsOnTwoSides( SMESHDS_SubMesh* faceSM );
141 SMESH_Mesh* GetMesh() const { return const_cast<SMESH_Mesh*>( _mesh ); }
143 SMESHDS_Mesh* GetMeshDS() const;
145 //--------------------------------------------------------------------------------
146 // Interface for descendants
149 void setMesh(const SMESH_Mesh& mesh);
151 int shapeIndex(const TopoDS_Shape& shape) const;
153 virtual SubMesh* newSubmesh(int index=0) const;
155 // Return a proxy sub-mesh; zero index is for the case of mesh w/o shape
156 SubMesh* findProxySubMesh(int shapeIndex=0) const;
158 // Return a proxy sub-mesh; it is created if not yet exists
159 SubMesh* getProxySubMesh(int shapeIndex);
161 // Return a proxy sub-mesh; it is created if not yet exists
162 SubMesh* getProxySubMesh(const TopoDS_Shape& shape=TopoDS_Shape());
164 // move proxy sub-mesh from other proxy mesh to this, returns true if sub-mesh found
165 bool takeProxySubMesh( const TopoDS_Shape& shape, SMESH_ProxyMesh* proxyMesh );
167 // move tmp elements residing the _mesh from other proxy mesh to this
168 void takeTmpElemsInMesh( SMESH_ProxyMesh* proxyMesh );
170 // removes tmp element from the _mesh
171 void removeTmpElement( const SMDS_MeshElement* elem );
173 // stores tmp element residing the _mesh
174 void storeTmpElement( const SMDS_MeshElement* elem );
176 // store node-node correspondence
177 void setNode2Node(const SMDS_MeshNode* srcNode,
178 const SMDS_MeshNode* proxyNode,
179 const SubMesh* subMesh);
181 // types of elements needed to implement NbFaces() and GetFaces();
182 // if _allowedTypes is empty, only elements from _subMeshes are returned,
183 // else elements of _mesh filtered using allowedTypes are additionally returned
184 std::vector< SMDSAbs_EntityType> _allowedTypes;
188 const SMESH_Mesh* _mesh;
190 // proxy sub-meshes; index in vector == shapeIndex(shape)
191 std::vector< SubMesh* > _subMeshes;
193 // tmp elements residing the _mesh, to be deleted at destruction
194 std::set< const SMDS_MeshElement* > _elemsInMesh;
196 // inverse elements of proxy nodes
197 typedef NCollection_DataMap< const SMDS_MeshNode*,
198 std::vector< const SMDS_MeshElement* >,
199 SMESH_Hasher > TNodeElemVecMap;
200 TNodeElemVecMap _inverseElements;
202 // Complex submesh used to iterate over elements in other sub-meshes
203 mutable SubMesh* _subContainer;