1 // Copyright (C) 2007-2010 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.
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_MeshElement.hxx"
30 #include "SMESHDS_SubMesh.hxx"
32 #include <TopoDS_Shape.hxx>
36 #include <boost/shared_ptr.hpp>
43 * \brief Container of mesh faces substituting other faces in the input mesh of 3D algorithm
45 class SMESH_EXPORT SMESH_ProxyMesh
49 typedef boost::shared_ptr<SMESH_ProxyMesh> Ptr;
51 typedef std::map<const SMDS_MeshNode*, const SMDS_MeshNode*, TIDCompare > TN2NMap;
53 //--------------------------------------------------------------------------------
55 * \brief Proxy sub-mesh
57 class SubMesh : public SMESHDS_SubMesh
61 const TN2NMap* GetNodeNodeMap() const { return _n2n; }
62 const SMDS_MeshNode* GetProxyNode( const SMDS_MeshNode* n ) const;
63 virtual void AddElement(const SMDS_MeshElement * e);
64 virtual int NbElements() const;
65 virtual SMDS_ElemIteratorPtr GetElements() const;
67 virtual bool Contains(const SMDS_MeshElement * ME) const;
69 template< class ITERATOR >
70 void ChangeElements( ITERATOR it, ITERATOR end )
72 // change SubMesh contents without deleting tmp faces
73 // for which the caller is responsible
75 while ( it != end ) _elements.push_back( *it++ );
77 SubMesh(int index=0):SMESHDS_SubMesh(0,index),_n2n(0) {}
78 ~SubMesh() { Clear(); }
81 std::vector<const SMDS_MeshElement *> _elements;
83 friend class SMESH_ProxyMesh;
85 //--------------------------------------------------------------------------------
89 SMESH_ProxyMesh(std::vector<SMESH_ProxyMesh::Ptr>& components);
90 SMESH_ProxyMesh(const SMESH_Mesh& mesh) { _mesh = &mesh; }
91 virtual ~SMESH_ProxyMesh();
93 // Returns the submesh of a face; it can be a proxy sub-mesh
94 const SMESHDS_SubMesh* GetSubMesh(const TopoDS_Shape& face) const;
96 // Returns the proxy sub-mesh of a face; it can be NULL
97 const SubMesh* GetProxySubMesh(const TopoDS_Shape& face) const;
99 // Returns the proxy node of a node; the input node is returned if no proxy exists
100 const SMDS_MeshNode* GetProxyNode( const SMDS_MeshNode* node ) const;
102 // Returns iterator on all faces of the mesh taking into account substitutions
103 // To be used in case of mesh without shape
104 SMDS_ElemIteratorPtr GetFaces() const;
106 // Returns iterator on all faces on the face taking into account substitutions
107 SMDS_ElemIteratorPtr GetFaces(const TopoDS_Shape& face) const;
109 // Return total nb of faces taking into account substitutions
112 bool IsTemporary(const SMDS_MeshElement* elem ) const;
116 const SMESH_Mesh* GetMesh() const { return _mesh; }
118 SMESHDS_Mesh* GetMeshDS() const;
120 //--------------------------------------------------------------------------------
121 // Interface for descendants
124 void setMesh(const SMESH_Mesh& mesh) { _mesh = &mesh; }
126 int shapeIndex(const TopoDS_Shape& shape) const;
128 // returns a proxy sub-mesh; zero index is for the case of mesh w/o shape
129 SubMesh* findProxySubMesh(int shapeIndex=0) const;
131 // returns a proxy sub-mesh; it is created if not yet exists
132 SubMesh* getProxySubMesh(int shapeIndex);
134 // returns a proxy sub-mesh; it is created if not yet exists
135 SubMesh* getProxySubMesh(const TopoDS_Shape& shape=TopoDS_Shape());
137 // move proxy sub-mesh from other proxy mesh to this, returns true if sub-mesh found
138 bool takeProxySubMesh( const TopoDS_Shape& shape, SMESH_ProxyMesh* proxyMesh );
140 // move tmp elements residing the _mesh from other proxy mesh to this
141 void takeTmpElemsInMesh( SMESH_ProxyMesh* proxyMesh );
143 // removes tmp faces from the _mesh
144 void removeTmpElement( const SMDS_MeshElement* face );
146 // stores tmp element residing the _mesh
147 void storeTmpElement( const SMDS_MeshElement* face );
149 // store node-node correspondence
150 void setNode2Node(const SMDS_MeshNode* srcNode,
151 const SMDS_MeshNode* proxyNode,
152 const SubMesh* subMesh);
154 // types of elements needed to implement NbFaces() and GetFaces();
155 // if _allowedTypes is empty, only elements from _subMeshes are returned,
156 // else elements of _mesh filtered using allowedTypes are additionally returned
157 std::vector< SMDSAbs_EntityType> _allowedTypes;
161 const SMESH_Mesh* _mesh;
163 // proxy sub-meshes; index in vector == shapeIndex(shape)
164 std::vector< SubMesh* > _subMeshes;
166 // tmp elements residing the _mesh, to be deleted at destruction
167 std::set< const SMDS_MeshElement* > _elemsInMesh;
169 // Complex submesh used to iterate over elements in other sub-meshes
170 mutable SubMesh _subContainer;