Salome HOME
26339eb0957ef7b9a995822425ea49bd467462b1
[modules/smesh.git] / src / SMESH / SMESH_Mesh.hxx
1 //  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 //  SMESH SMESH : implementaion of SMESH idl descriptions
23 //  File   : SMESH_Mesh.hxx
24 //  Author : Paul RASCLE, EDF
25 //  Module : SMESH
26 //
27 #ifndef _SMESH_MESH_HXX_
28 #define _SMESH_MESH_HXX_
29
30 #include "SMESH_SMESH.hxx"
31
32 #include "SMESH_Hypothesis.hxx"
33
34 #include "SMESHDS_Mesh.hxx"
35 #include "SMESHDS_Command.hxx"
36 #include "SMDSAbs_ElementType.hxx"
37
38 #include "Utils_SALOME_Exception.hxx"
39
40 #include <TopoDS_Shape.hxx>
41 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
42
43 #include <list>
44 #include <map>
45
46 class SMESH_Gen;
47 class SMESHDS_Document;
48 class SMESH_Group;
49 class TopTools_ListOfShape;
50 class SMESH_subMesh;
51 class SMESH_HypoFilter;
52 class TopoDS_Solid;
53
54 class SMESH_EXPORT SMESH_Mesh
55 {
56 public:
57   SMESH_Mesh(int               theLocalId, 
58              int               theStudyId, 
59              SMESH_Gen*        theGen,
60              bool              theIsEmbeddedMode,
61              SMESHDS_Document* theDocument);
62   
63   virtual ~SMESH_Mesh();
64   
65   /*!
66    * \brief Set geometry to be meshed
67    */
68   void ShapeToMesh(const TopoDS_Shape & aShape);
69   /*!
70    * \brief Return geometry to be meshed. (It may be a PseudoShape()!)
71    */
72   TopoDS_Shape GetShapeToMesh() const;
73   /*!
74    * \brief Return true if there is a geometry to be meshed, not PseudoShape()
75    */
76   bool HasShapeToMesh() const { return _isShapeToMesh; }
77   /*!
78    * \brief Return diagonal size of bounding box of shape to mesh.
79    */
80   double GetShapeDiagonalSize() const;
81   /*!
82    * \brief Return diagonal size of bounding box of a shape.
83    */
84   static double GetShapeDiagonalSize(const TopoDS_Shape & aShape);
85   /*!
86    * \brief Return a solid which is returned by GetShapeToMesh() if
87    *        a real geometry to be meshed was not set
88    */
89   static const TopoDS_Solid& PseudoShape();
90
91   /*!
92    * \brief Remove all nodes and elements
93    */
94   void Clear();
95
96   /*!
97    * \brief Remove all nodes and elements of indicated shape
98    */
99   void ClearSubMesh(const int theShapeId);
100
101   int UNVToMesh(const char* theFileName);
102   /*!
103    * consult DriverMED_R_SMESHDS_Mesh::ReadStatus for returned value
104    */
105   int MEDToMesh(const char* theFileName, const char* theMeshName);
106   
107   int STLToMesh(const char* theFileName);
108
109   SMESH_Hypothesis::Hypothesis_Status
110   AddHypothesis(const TopoDS_Shape & aSubShape, int anHypId)
111     throw(SALOME_Exception);
112   
113   SMESH_Hypothesis::Hypothesis_Status
114   RemoveHypothesis(const TopoDS_Shape & aSubShape, int anHypId)
115     throw(SALOME_Exception);
116   
117   const std::list <const SMESHDS_Hypothesis * >&
118   GetHypothesisList(const TopoDS_Shape & aSubShape) const
119     throw(SALOME_Exception);
120
121   const SMESH_Hypothesis * GetHypothesis(const TopoDS_Shape &    aSubShape,
122                                          const SMESH_HypoFilter& aFilter,
123                                          const bool              andAncestors,
124                                          TopoDS_Shape*           assignedTo=0) const;
125   
126   int GetHypotheses(const TopoDS_Shape &                     aSubShape,
127                     const SMESH_HypoFilter&                  aFilter,
128                     std::list <const SMESHDS_Hypothesis * >& aHypList,
129                     const bool                               andAncestors) const;
130
131   const std::list<SMESHDS_Command*> & GetLog() throw(SALOME_Exception);
132   
133   void ClearLog() throw(SALOME_Exception);
134   
135   int GetId()                { return _id; }
136   
137   SMESHDS_Mesh * GetMeshDS() { return _myMeshDS; }
138   
139   SMESH_Gen *GetGen()        { return _gen; }
140   
141   SMESH_subMesh *GetSubMesh(const TopoDS_Shape & aSubShape)
142     throw(SALOME_Exception);
143   
144   SMESH_subMesh *GetSubMeshContaining(const TopoDS_Shape & aSubShape) const
145     throw(SALOME_Exception);
146   
147   SMESH_subMesh *GetSubMeshContaining(const int aShapeID) const
148     throw(SALOME_Exception);
149   /*!
150    * \brief Return submeshes of groups containing the given subshape
151    */
152   std::list<SMESH_subMesh*> GetGroupSubMeshesContaining(const TopoDS_Shape & shape) const
153     throw(SALOME_Exception);
154   /*!
155    * \brief Say all submeshes that theChangedHyp has been modified
156    */
157   void NotifySubMeshesHypothesisModification(const SMESH_Hypothesis* theChangedHyp);
158
159   const std::list < SMESH_subMesh * >&
160   GetSubMeshUsingHypothesis(SMESHDS_Hypothesis * anHyp) throw(SALOME_Exception);
161   /*!
162    * \brief Return True if anHyp is used to mesh aSubShape
163    */
164   bool IsUsedHypothesis(SMESHDS_Hypothesis *  anHyp,
165                         const SMESH_subMesh * aSubMesh);
166   /*!
167    * \brief check if a hypothesis alowing notconform mesh is present
168    */
169   bool IsNotConformAllowed() const;
170   
171   bool IsMainShape(const TopoDS_Shape& theShape) const;
172   /*!
173    * \brief Return list of ancestors of theSubShape in the order
174    *        that lower dimention shapes come first
175    */
176   const TopTools_ListOfShape& GetAncestors(const TopoDS_Shape& theSubShape) const;
177
178   void SetAutoColor(bool theAutoColor) throw(SALOME_Exception);
179
180   bool GetAutoColor() throw(SALOME_Exception);
181
182   /*!
183    * \brief Return data map of descendant to ancestor shapes
184    */
185   typedef TopTools_IndexedDataMapOfShapeListOfShape TAncestorMap;
186   const TAncestorMap& GetAncestorMap() const { return _mapAncestors; }
187   /*!
188    * \brief Check group names for duplications.
189    *  Consider maximum group name length stored in MED file
190    */
191   bool HasDuplicatedGroupNamesMED();
192
193   void ExportMED(const char *file, 
194                  const char* theMeshName = NULL, 
195                  bool theAutoGroups = true, 
196                  int theVersion = 0) 
197     throw(SALOME_Exception);
198
199   void ExportDAT(const char *file) throw(SALOME_Exception);
200   void ExportUNV(const char *file) throw(SALOME_Exception);
201   void ExportSTL(const char *file, const bool isascii) throw(SALOME_Exception);
202   
203   int NbNodes() throw(SALOME_Exception);
204   
205   int Nb0DElements() throw(SALOME_Exception);
206   
207   int NbEdges(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
208   
209   int NbFaces(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
210   
211   int NbTriangles(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
212   
213   int NbQuadrangles(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
214
215   int NbPolygons() throw(SALOME_Exception);
216   
217   int NbVolumes(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
218   
219   int NbTetras(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
220   
221   int NbHexas(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
222   
223   int NbPyramids(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
224
225   int NbPrisms(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
226   
227   int NbPolyhedrons() throw(SALOME_Exception);
228   
229   int NbSubMesh() throw(SALOME_Exception);
230   
231   int NbGroup() const { return _mapGroup.size(); }
232   
233   SMESH_Group* AddGroup (const SMDSAbs_ElementType theType,
234                          const char*               theName,
235                          int&                      theId,
236                          const TopoDS_Shape&       theShape=TopoDS_Shape());
237   
238   typedef boost::shared_ptr< SMDS_Iterator<SMESH_Group*> > GroupIteratorPtr;
239   GroupIteratorPtr GetGroups() const;
240   
241   std::list<int> GetGroupIds() const;
242   
243   SMESH_Group* GetGroup (const int theGroupID);
244
245   void RemoveGroup (const int theGroupID);
246
247   SMESH_Group* ConvertToStandalone ( int theGroupID );
248
249   SMDSAbs_ElementType GetElementType( const int id, const bool iselem );
250
251   //
252   
253   ostream& Dump(ostream & save);
254   
255 private:
256   
257 protected:
258   int                        _id;           // id given by creator (unique within the creator instance)
259   int                        _studyId;
260   int                        _idDoc;        // id given by SMESHDS_Document
261   int                        _groupId;      // id generator for group objects
262   int                        _nbSubShapes;  // initial nb of subshapes in the shape to mesh
263   bool                       _isShapeToMesh;// set to true when a shape is given (only once)
264   std::list <SMESH_subMesh*> _subMeshesUsingHypothesisList;
265   SMESHDS_Document *         _myDocument;
266   SMESHDS_Mesh *             _myMeshDS;
267   std::map <int, SMESH_subMesh*> _mapSubMesh;
268   std::map <int, SMESH_Group*>   _mapGroup;
269   SMESH_Gen *                _gen;
270
271   bool                       _isAutoColor;
272
273   double                     _shapeDiagonal; //!< diagonal size of bounding box of shape to mesh
274   
275   TopTools_IndexedDataMapOfShapeListOfShape _mapAncestors;
276
277 protected:
278   SMESH_Mesh() {};
279   SMESH_Mesh(const SMESH_Mesh&) {};
280 };
281
282 #endif