Version: 9.16.0
SMESH_ProxyMesh.hxx
Go to the documentation of this file.
1// Copyright (C) 2007-2026 CEA, EDF, OPEN CASCADE
2//
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.
7//
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.
12//
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
16//
17// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18//
19
20// File : SMESH_ProxyMesh.hxx
21// Created : Thu Dec 2 10:05:35 2010
22// Author : Edward AGAPOV (eap)
23
24#ifndef __SMESH_ProxyMesh_HXX__
25#define __SMESH_ProxyMesh_HXX__
26
27#include "SMESH_SMESH.hxx"
28
30#include "SMESHDS_SubMesh.hxx"
31#include "SMESH_TypeDefs.hxx"
32
33#include <TopoDS_Shape.hxx>
34#include <NCollection_DataMap.hxx>
35#include <smIdType.hxx>
36
37#include <map>
38#include <vector>
39#include <boost/shared_ptr.hpp>
40
41class SMDS_MeshNode;
43class SMESHDS_Mesh;
44class SMESH_Mesh;
45
51{
52public:
53
54 typedef boost::shared_ptr<SMESH_ProxyMesh> Ptr;
55
56 typedef std::map<const SMDS_MeshNode*, const SMDS_MeshNode*, TIDCompare > TN2NMap;
57
58 //--------------------------------------------------------------------------------
63 {
64 public:
65
66 const TN2NMap* GetNodeNodeMap() const { return _n2n; }
67 const SMDS_MeshNode* GetProxyNode( const SMDS_MeshNode* n ) const;
68 const UVPtStructVec& GetUVPtStructVec() const { return _uvPtStructVec; }
69 virtual void AddElement(const SMDS_MeshElement * e);
70 virtual smIdType NbElements() const;
71 virtual smIdType NbNodes() const;
72 virtual SMDS_ElemIteratorPtr GetElements() const;
73 virtual SMDS_NodeIteratorPtr GetNodes() const;
74 virtual void Clear();
75 virtual bool Contains(const SMDS_MeshElement * ME) const;
76
77 template< class ITERATOR >
78 void ChangeElements( ITERATOR it, ITERATOR end )
79 {
80 // change SubMesh contents without deleting tmp elements
81 // for which the caller is responsible
82 _elements.assign( it, end );
83 }
84 SubMesh(const SMDS_Mesh* mesh, int index=0);
85 virtual ~SubMesh() { Clear(); }
86
87 protected:
88 std::vector<const SMDS_MeshElement *> _elements;
90 UVPtStructVec _uvPtStructVec; // for SubMesh of EDGE
91 friend class SMESH_ProxyMesh;
92
93 protected: // methods of SMDS_ElementHolder; remove elements before mesh compacting or clearing
94 virtual SMDS_ElemIteratorPtr getElements() { Clear(); return GetElements(); }
95 virtual void tmpClear() {}
96 virtual void add( const SMDS_MeshElement* /*element*/ ) {}
97 virtual void compact() {}
98 virtual void clear() { Clear(); }
99 };
100 //--------------------------------------------------------------------------------
101 // Public interface
102
104 SMESH_ProxyMesh(std::vector<SMESH_ProxyMesh::Ptr>& components);
105 SMESH_ProxyMesh(const SMESH_Mesh& mesh);
106 virtual ~SMESH_ProxyMesh();
107
108 // Returns a sub-mesh of a shape; it can be a proxy sub-mesh
109 const SMESHDS_SubMesh* GetSubMesh(const TopoDS_Shape& shape) const;
110
111 // Return a sub-mesh by a shape ID; it can be a proxy sub-mesh
112 const SMESHDS_SubMesh* GetSubMesh(const int shapeID) const;
113
114 // Return a proxy sub-mesh of a shape; it can be NULL
115 const SubMesh* GetProxySubMesh(const TopoDS_Shape& shape) const;
116
117 // Return a proxy node of a node; the input node is returned if no proxy exists
118 const SMDS_MeshNode* GetProxyNode( const SMDS_MeshNode* node ) const;
119
120 // Return number of proxy sub-meshes
121 int NbProxySubMeshes() const;
122
123 // Return iterator on all faces of the mesh taking into account substitutions.
124 // To be used in case of mesh without shape
126
127 // Return iterator on all faces on the face taking into account substitutions
128 SMDS_ElemIteratorPtr GetFaces(const TopoDS_Shape& face) const;
129
130 // Return total nb of faces taking into account substitutions
131 smIdType NbFaces() const;
132
133 bool IsTemporary(const SMDS_MeshElement* elem ) const;
134
135 // Return iterator on inverse elements of a node that may be a proxy one
137 SMDSAbs_ElementType type) const;
138
139 // Check if a FACE has prisms on its both sides
140 static bool HasPrismsOnTwoSides( SMESHDS_SubMesh* faceSM );
141
142 SMESH_Mesh* GetMesh() const { return const_cast<SMESH_Mesh*>( _mesh ); }
143
144 SMESHDS_Mesh* GetMeshDS() const;
145
146 //--------------------------------------------------------------------------------
147 // Interface for descendants
148 protected:
149
150 void setMesh(const SMESH_Mesh& mesh);
151
152 int shapeIndex(const TopoDS_Shape& shape) const;
153
154 virtual SubMesh* newSubmesh(int index=0) const;
155
156 // Return a proxy sub-mesh; zero index is for the case of mesh w/o shape
157 SubMesh* findProxySubMesh(int shapeIndex=0) const;
158
159 // Return a proxy sub-mesh; it is created if not yet exists
160 SubMesh* getProxySubMesh(int shapeIndex);
161
162 // Return a proxy sub-mesh; it is created if not yet exists
163 SubMesh* getProxySubMesh(const TopoDS_Shape& shape=TopoDS_Shape());
164
165 // move proxy sub-mesh from other proxy mesh to this, returns true if sub-mesh found
166 bool takeProxySubMesh( const TopoDS_Shape& shape, SMESH_ProxyMesh* proxyMesh );
167
168 // move tmp elements residing the _mesh from other proxy mesh to this
169 void takeTmpElemsInMesh( SMESH_ProxyMesh* proxyMesh );
170
171 // removes tmp element from the _mesh
172 void removeTmpElement( const SMDS_MeshElement* elem );
173
174 // stores tmp element residing the _mesh
175 void storeTmpElement( const SMDS_MeshElement* elem );
176
177 // store node-node correspondence
178 void setNode2Node(const SMDS_MeshNode* srcNode,
179 const SMDS_MeshNode* proxyNode,
180 const SubMesh* subMesh);
181
182 // types of elements needed to implement NbFaces() and GetFaces();
183 // if _allowedTypes is empty, only elements from _subMeshes are returned,
184 // else elements of _mesh filtered using allowedTypes are additionally returned
185 std::vector< SMDSAbs_EntityType> _allowedTypes;
186
187 private:
188
190
191 // proxy sub-meshes; index in vector == shapeIndex(shape)
192 std::vector< SubMesh* > _subMeshes;
193
194 // tmp elements residing the _mesh, to be deleted at destruction
195 std::set< const SMDS_MeshElement* > _elemsInMesh;
196
197 // inverse elements of proxy nodes
198 typedef NCollection_DataMap< const SMDS_MeshNode*,
199 std::vector< const SMDS_MeshElement* >,
202
203 // Complex submesh used to iterate over elements in other sub-meshes
205};
206
207#endif
SMDSAbs_ElementType
Type (node, edge, face or volume) of elements.
Definition: SMDSAbs_ElementType.hxx:34
boost::shared_ptr< SMDS_Iterator< const SMDS_MeshElement * > > SMDS_ElemIteratorPtr
Definition: SMDS_ElemIterator.hxx:43
boost::shared_ptr< SMDS_Iterator< const SMDS_MeshNode * > > SMDS_NodeIteratorPtr
Definition: SMDS_ElemIterator.hxx:46
#define SMESH_EXPORT
Definition: SMESH_SMESH.hxx:37
std::vector< UVPtStruct > UVPtStructVec
Definition: SMESH_TypeDefs.hxx:294
IMAP::const_iterator end(const IMAP &m)
Definition: StdMeshers_Projection_2D.cxx:106
Base class for elements.
Definition: SMDS_MeshElement.hxx:56
Definition: SMDS_MeshNode.hxx:36
Definition: SMDS_Mesh.hxx:53
Definition: SMESHDS_Mesh.hxx:98
Definition: SMESHDS_SubMesh.hxx:48
Definition: SMESH_Mesh.hxx:80
Proxy sub-mesh.
Definition: SMESH_ProxyMesh.hxx:63
virtual void add(const SMDS_MeshElement *)
the descendant squeeze its element storage after re-adding elements
Definition: SMESH_ProxyMesh.hxx:96
std::vector< const SMDS_MeshElement * > _elements
Definition: SMESH_ProxyMesh.hxx:88
virtual void compact()
allow the descendant treat its elements before mesh clearing
Definition: SMESH_ProxyMesh.hxx:97
TN2NMap * _n2n
Definition: SMESH_ProxyMesh.hxx:89
UVPtStructVec _uvPtStructVec
Definition: SMESH_ProxyMesh.hxx:90
virtual void tmpClear()
the descendant object re-add its elements after the mesh compacting
Definition: SMESH_ProxyMesh.hxx:95
const UVPtStructVec & GetUVPtStructVec() const
Definition: SMESH_ProxyMesh.hxx:68
const TN2NMap * GetNodeNodeMap() const
Definition: SMESH_ProxyMesh.hxx:66
virtual void clear()
Definition: SMESH_ProxyMesh.hxx:98
void ChangeElements(ITERATOR it, ITERATOR end)
Definition: SMESH_ProxyMesh.hxx:78
virtual SMDS_ElemIteratorPtr getElements()
< the descendant object return its elements just before the mesh compacting
Definition: SMESH_ProxyMesh.hxx:94
virtual ~SubMesh()
Definition: SMESH_ProxyMesh.hxx:85
Container of xD mesh elements substituting other ones in the input mesh of an (x+1)D algorithm.
Definition: SMESH_ProxyMesh.hxx:51
int NbProxySubMeshes() const
Returns number of proxy sub-meshes.
Definition: SMESH_ProxyMesh.cxx:242
SMDS_ElemIteratorPtr GetInverseElementIterator(const SMDS_MeshNode *node, SMDSAbs_ElementType type) const
Return iterator on inverse elements of a node that may be a proxy one.
Definition: SMESH_ProxyMesh.cxx:603
std::vector< SMDSAbs_EntityType > _allowedTypes
Definition: SMESH_ProxyMesh.hxx:185
const SMESH_Mesh * _mesh
Definition: SMESH_ProxyMesh.hxx:189
SMESH_Mesh * GetMesh() const
Definition: SMESH_ProxyMesh.hxx:142
std::set< const SMDS_MeshElement * > _elemsInMesh
Definition: SMESH_ProxyMesh.hxx:195
static bool HasPrismsOnTwoSides(SMESHDS_SubMesh *faceSM)
Check if a FACE has prisms on its both sides.
Definition: SMESH_ProxyMesh.cxx:651
SMDS_ElemIteratorPtr GetFaces() const
Returns iterator on all faces of the mesh taking into account substitutions To be used in case of mes...
Definition: SMESH_ProxyMesh.cxx:375
std::vector< SubMesh * > _subMeshes
Definition: SMESH_ProxyMesh.hxx:192
TNodeElemVecMap _inverseElements
Definition: SMESH_ProxyMesh.hxx:201
SubMesh * findProxySubMesh(int shapeIndex=0) const
Returns a proxy sub-mesh.
Definition: SMESH_ProxyMesh.cxx:473
SMESHDS_Mesh * GetMeshDS() const
Returns mesh DS.
Definition: SMESH_ProxyMesh.cxx:484
smIdType NbFaces() const
Return total nb of faces taking into account substitutions.
Definition: SMESH_ProxyMesh.cxx:405
int shapeIndex(const TopoDS_Shape &shape) const
Returns index of a shape.
Definition: SMESH_ProxyMesh.cxx:150
void setMesh(const SMESH_Mesh &mesh)
Set mesh.
Definition: SMESH_ProxyMesh.cxx:137
void setNode2Node(const SMDS_MeshNode *srcNode, const SMDS_MeshNode *proxyNode, const SubMesh *subMesh)
Set node-node correspondence.
Definition: SMESH_ProxyMesh.cxx:575
bool IsTemporary(const SMDS_MeshElement *elem) const
Return true if the element is a temporary one.
Definition: SMESH_ProxyMesh.cxx:591
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.
Definition: SMESH_ProxyMesh.cxx:216
NCollection_DataMap< const SMDS_MeshNode *, std::vector< const SMDS_MeshElement * >, SMESH_Hasher > TNodeElemVecMap
Definition: SMESH_ProxyMesh.hxx:200
SubMesh * _subContainer
Definition: SMESH_ProxyMesh.hxx:204
void storeTmpElement(const SMDS_MeshElement *elem)
Stores tmp element residing the _mesh.
Definition: SMESH_ProxyMesh.cxx:564
virtual ~SMESH_ProxyMesh()
Destructor deletes proxy submeshes and tmp elements.
Definition: SMESH_ProxyMesh.cxx:117
boost::shared_ptr< SMESH_ProxyMesh > Ptr
Definition: SMESH_ProxyMesh.hxx:54
SMESH_ProxyMesh()
Constructor; mesh must be set by a descendant class.
Definition: SMESH_ProxyMesh.cxx:44
bool takeProxySubMesh(const TopoDS_Shape &shape, SMESH_ProxyMesh *proxyMesh)
Move proxy sub-mesh from other proxy mesh to this, returns true if sub-mesh found.
Definition: SMESH_ProxyMesh.cxx:495
void takeTmpElemsInMesh(SMESH_ProxyMesh *proxyMesh)
Move tmp elements residing the _mesh from other proxy mesh to this.
Definition: SMESH_ProxyMesh.cxx:519
SubMesh * getProxySubMesh(int shapeIndex)
Returns a proxy sub-mesh; it is created if not yet exists.
Definition: SMESH_ProxyMesh.cxx:447
const SubMesh * GetProxySubMesh(const TopoDS_Shape &shape) const
Returns the proxy sub-mesh of a shape; it can be NULL.
Definition: SMESH_ProxyMesh.cxx:204
void removeTmpElement(const SMDS_MeshElement *elem)
Removes tmp elements from the _mesh.
Definition: SMESH_ProxyMesh.cxx:535
virtual SubMesh * newSubmesh(int index=0) const
Create a SubMesh.
Definition: SMESH_ProxyMesh.cxx:163
const SMESHDS_SubMesh * GetSubMesh(const TopoDS_Shape &shape) const
Returns the submesh of a shape; it can be a proxy sub-mesh.
Definition: SMESH_ProxyMesh.cxx:174
std::map< const SMDS_MeshNode *, const SMDS_MeshNode *, TIDCompare > TN2NMap
Definition: SMESH_ProxyMesh.hxx:56
Definition: SMESH_TypeDefs.hxx:246