Salome HOME
Merge remote-tracking branch 'origin/fbt/fix_french_translation'
[modules/smesh.git] / src / SMESH / SMESH_ProxyMesh.hxx
1 // Copyright (C) 2007-2016  CEA/DEN, EDF R&D, 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
29 #include "SMESHDS_SubMesh.hxx"
30 #include "SMESH_TypeDefs.hxx"
31
32 #include <TopoDS_Shape.hxx>
33
34 #include <map>
35 #include <vector>
36 #include <boost/shared_ptr.hpp>
37
38 class SMDS_MeshNode;
39 class SMDS_MeshElement;
40 class SMESHDS_Mesh;
41 class SMESH_Mesh;
42
43 /*!
44  * \brief Container of xD mesh elements substituting other ones in the
45  *        input mesh of an (x+1)D algorithm
46  */
47 class SMESH_EXPORT SMESH_ProxyMesh
48 {
49 public:
50
51   typedef boost::shared_ptr<SMESH_ProxyMesh> Ptr;
52
53   typedef std::map<const SMDS_MeshNode*, const SMDS_MeshNode*, TIDCompare > TN2NMap;
54
55   //--------------------------------------------------------------------------------
56   /*!
57    * \brief Proxy sub-mesh
58    */
59   class SMESH_EXPORT SubMesh : public SMESHDS_SubMesh
60   {
61   public:
62
63     const TN2NMap*       GetNodeNodeMap() const { return _n2n; }
64     const SMDS_MeshNode* GetProxyNode( const SMDS_MeshNode* n ) const;
65     const UVPtStructVec& GetUVPtStructVec() const { return _uvPtStructVec; }
66     virtual void         AddElement(const SMDS_MeshElement * e);
67     virtual int          NbElements() const;
68     virtual int          NbNodes() const;
69     virtual SMDS_ElemIteratorPtr GetElements(bool reverse=false) const;
70     virtual SMDS_NodeIteratorPtr GetNodes(bool reverse=false) const;
71     virtual void         Clear();
72     virtual bool         Contains(const SMDS_MeshElement * ME) const;
73
74     template< class ITERATOR >
75     void ChangeElements( ITERATOR it, ITERATOR end )
76     {
77       // change SubMesh contents without deleting tmp elements
78       // for which the caller is responsible
79       _elements.assign( it, end );
80     }
81     SubMesh(int index=0):SMESHDS_SubMesh(0,index),_n2n(0) {}
82     virtual ~SubMesh() { Clear(); }
83
84   protected:
85     std::vector<const SMDS_MeshElement *> _elements;
86     TN2NMap*                              _n2n;
87     UVPtStructVec                         _uvPtStructVec; // for SubMesh of EDGE
88     friend class SMESH_ProxyMesh;
89   };
90   //--------------------------------------------------------------------------------
91   // Public interface
92
93   SMESH_ProxyMesh();
94   SMESH_ProxyMesh(std::vector<SMESH_ProxyMesh::Ptr>& components);
95   SMESH_ProxyMesh(const SMESH_Mesh& mesh) { _mesh = &mesh; }
96   virtual ~SMESH_ProxyMesh();
97
98   // Returns the submesh of a shape; it can be a proxy sub-mesh
99   const SMESHDS_SubMesh* GetSubMesh(const TopoDS_Shape& shape) const;
100
101   // Returns the proxy sub-mesh of a shape; it can be NULL
102   const SubMesh*         GetProxySubMesh(const TopoDS_Shape& shape) const;
103
104   // Returns the proxy node of a node; the input node is returned if no proxy exists
105   const SMDS_MeshNode*   GetProxyNode( const SMDS_MeshNode* node ) const;
106
107   // Returns number of proxy sub-meshes
108   int                    NbProxySubMeshes() const;
109
110   // Returns iterator on all faces of the mesh taking into account substitutions.
111   // To be used in case of mesh without shape
112   SMDS_ElemIteratorPtr   GetFaces() const;
113
114   // Returns iterator on all faces on the face taking into account substitutions
115   SMDS_ElemIteratorPtr   GetFaces(const TopoDS_Shape& face) const;
116
117   // Return total nb of faces taking into account substitutions
118   int                    NbFaces() const;
119
120   bool                   IsTemporary(const SMDS_MeshElement* elem ) const;
121
122
123
124   SMESH_Mesh*            GetMesh() const { return const_cast<SMESH_Mesh*>( _mesh ); }
125
126   SMESHDS_Mesh*          GetMeshDS() const;
127
128   //--------------------------------------------------------------------------------
129   // Interface for descendants
130  protected:
131
132   void     setMesh(const SMESH_Mesh& mesh) { _mesh = &mesh; }
133
134   int      shapeIndex(const TopoDS_Shape& shape) const;
135
136   virtual SubMesh* newSubmesh(int index=0) const { return new SubMesh(index); }
137
138   // returns a proxy sub-mesh; zero index is for the case of mesh w/o shape
139   SubMesh* findProxySubMesh(int shapeIndex=0) const;
140
141   // returns a proxy sub-mesh; it is created if not yet exists
142   SubMesh* getProxySubMesh(int shapeIndex);
143
144   // returns a proxy sub-mesh; it is created if not yet exists
145   SubMesh* getProxySubMesh(const TopoDS_Shape& shape=TopoDS_Shape());
146
147   // move proxy sub-mesh from other proxy mesh to this, returns true if sub-mesh found
148   bool     takeProxySubMesh( const TopoDS_Shape& shape, SMESH_ProxyMesh* proxyMesh );
149
150   // move tmp elements residing the _mesh from other proxy mesh to this
151   void     takeTmpElemsInMesh( SMESH_ProxyMesh* proxyMesh );
152
153   // removes tmp element from the _mesh
154   void     removeTmpElement( const SMDS_MeshElement* elem );
155
156   // stores tmp element residing the _mesh
157   void     storeTmpElement( const SMDS_MeshElement* elem );
158
159   // store node-node correspondence
160   void     setNode2Node(const SMDS_MeshNode* srcNode,
161                         const SMDS_MeshNode* proxyNode,
162                         const SubMesh*       subMesh);
163
164   // types of elements needed to implement NbFaces() and GetFaces();
165   // if _allowedTypes is empty, only elements from _subMeshes are returned,
166   // else elements of _mesh filtered using allowedTypes are additionally returned
167   std::vector< SMDSAbs_EntityType> _allowedTypes;
168
169  private:
170
171   const SMESH_Mesh*       _mesh;
172
173   // proxy sub-meshes; index in vector == shapeIndex(shape)
174   std::vector< SubMesh* > _subMeshes;
175
176   // tmp elements residing the _mesh, to be deleted at destruction
177   std::set< const SMDS_MeshElement* > _elemsInMesh;
178
179   // Complex submesh used to iterate over elements in other sub-meshes
180   mutable SubMesh _subContainer;
181 };
182
183 #endif