1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
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.
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.
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
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // SMESH SMESH : implementaion of SMESH idl descriptions
23 // File : SMESH_Mesh.hxx
24 // Author : Paul RASCLE, EDF
27 #ifndef _SMESH_MESH_HXX_
28 #define _SMESH_MESH_HXX_
30 #include "SMESH_SMESH.hxx"
32 #include "SMESH_Hypothesis.hxx"
34 #include "SMESHDS_Mesh.hxx"
35 #include "SMESHDS_Command.hxx"
36 #include "SMDSAbs_ElementType.hxx"
38 #include "Utils_SALOME_Exception.hxx"
40 #include <TopoDS_Shape.hxx>
41 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
47 class SMESHDS_Document;
49 class TopTools_ListOfShape;
51 class SMESH_HypoFilter;
54 typedef std::list<int> TListOfInt;
55 typedef std::list<TListOfInt> TListOfListOfInt;
57 class SMESH_EXPORT SMESH_Mesh
60 SMESH_Mesh(int theLocalId,
63 bool theIsEmbeddedMode,
64 SMESHDS_Document* theDocument);
66 virtual ~SMESH_Mesh();
69 * \brief Set geometry to be meshed
71 void ShapeToMesh(const TopoDS_Shape & aShape);
73 * \brief Return geometry to be meshed. (It may be a PseudoShape()!)
75 TopoDS_Shape GetShapeToMesh() const;
77 * \brief Return true if there is a geometry to be meshed, not PseudoShape()
79 bool HasShapeToMesh() const { return _isShapeToMesh; }
81 * \brief Return diagonal size of bounding box of shape to mesh.
83 double GetShapeDiagonalSize() const;
85 * \brief Return diagonal size of bounding box of a shape.
87 static double GetShapeDiagonalSize(const TopoDS_Shape & aShape);
89 * \brief Return a solid which is returned by GetShapeToMesh() if
90 * a real geometry to be meshed was not set
92 static const TopoDS_Solid& PseudoShape();
95 * \brief Remove all nodes and elements
100 * \brief Remove all nodes and elements of indicated shape
102 void ClearSubMesh(const int theShapeId);
104 int UNVToMesh(const char* theFileName);
106 * consult DriverMED_R_SMESHDS_Mesh::ReadStatus for returned value
108 int MEDToMesh(const char* theFileName, const char* theMeshName);
110 int STLToMesh(const char* theFileName);
112 SMESH_Hypothesis::Hypothesis_Status
113 AddHypothesis(const TopoDS_Shape & aSubShape, int anHypId)
114 throw(SALOME_Exception);
116 SMESH_Hypothesis::Hypothesis_Status
117 RemoveHypothesis(const TopoDS_Shape & aSubShape, int anHypId)
118 throw(SALOME_Exception);
120 const std::list <const SMESHDS_Hypothesis * >&
121 GetHypothesisList(const TopoDS_Shape & aSubShape) const
122 throw(SALOME_Exception);
124 const SMESH_Hypothesis * GetHypothesis(const TopoDS_Shape & aSubShape,
125 const SMESH_HypoFilter& aFilter,
126 const bool andAncestors,
127 TopoDS_Shape* assignedTo=0) const;
129 int GetHypotheses(const TopoDS_Shape & aSubShape,
130 const SMESH_HypoFilter& aFilter,
131 std::list <const SMESHDS_Hypothesis * >& aHypList,
132 const bool andAncestors) const;
134 const std::list<SMESHDS_Command*> & GetLog() throw(SALOME_Exception);
136 void ClearLog() throw(SALOME_Exception);
138 int GetId() { return _id; }
140 SMESHDS_Mesh * GetMeshDS() { return _myMeshDS; }
142 SMESH_Gen *GetGen() { return _gen; }
144 SMESH_subMesh *GetSubMesh(const TopoDS_Shape & aSubShape)
145 throw(SALOME_Exception);
147 SMESH_subMesh *GetSubMeshContaining(const TopoDS_Shape & aSubShape) const
148 throw(SALOME_Exception);
150 SMESH_subMesh *GetSubMeshContaining(const int aShapeID) const
151 throw(SALOME_Exception);
153 * \brief Return submeshes of groups containing the given subshape
155 std::list<SMESH_subMesh*> GetGroupSubMeshesContaining(const TopoDS_Shape & shape) const
156 throw(SALOME_Exception);
158 * \brief Say all submeshes that theChangedHyp has been modified
160 void NotifySubMeshesHypothesisModification(const SMESH_Hypothesis* theChangedHyp);
162 const std::list < SMESH_subMesh * >&
163 GetSubMeshUsingHypothesis(SMESHDS_Hypothesis * anHyp) throw(SALOME_Exception);
165 * \brief Return True if anHyp is used to mesh aSubShape
167 bool IsUsedHypothesis(SMESHDS_Hypothesis * anHyp,
168 const SMESH_subMesh * aSubMesh);
170 * \brief check if a hypothesis alowing notconform mesh is present
172 bool IsNotConformAllowed() const;
174 bool IsMainShape(const TopoDS_Shape& theShape) const;
176 * \brief Return list of ancestors of theSubShape in the order
177 * that lower dimention shapes come first
179 const TopTools_ListOfShape& GetAncestors(const TopoDS_Shape& theSubShape) const;
181 void SetAutoColor(bool theAutoColor) throw(SALOME_Exception);
183 bool GetAutoColor() throw(SALOME_Exception);
186 * \brief Return data map of descendant to ancestor shapes
188 typedef TopTools_IndexedDataMapOfShapeListOfShape TAncestorMap;
189 const TAncestorMap& GetAncestorMap() const { return _mapAncestors; }
191 * \brief Check group names for duplications.
192 * Consider maximum group name length stored in MED file
194 bool HasDuplicatedGroupNamesMED();
196 void ExportMED(const char *file,
197 const char* theMeshName = NULL,
198 bool theAutoGroups = true,
200 throw(SALOME_Exception);
202 void ExportDAT(const char *file) throw(SALOME_Exception);
203 void ExportUNV(const char *file) throw(SALOME_Exception);
204 void ExportSTL(const char *file, const bool isascii) throw(SALOME_Exception);
206 int NbNodes() throw(SALOME_Exception);
208 int Nb0DElements() throw(SALOME_Exception);
210 int NbEdges(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
212 int NbFaces(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
214 int NbTriangles(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
216 int NbQuadrangles(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
218 int NbPolygons() throw(SALOME_Exception);
220 int NbVolumes(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
222 int NbTetras(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
224 int NbHexas(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
226 int NbPyramids(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
228 int NbPrisms(SMDSAbs_ElementOrder order = ORDER_ANY) throw(SALOME_Exception);
230 int NbPolyhedrons() throw(SALOME_Exception);
232 int NbSubMesh() throw(SALOME_Exception);
234 int NbGroup() const { return _mapGroup.size(); }
236 SMESH_Group* AddGroup (const SMDSAbs_ElementType theType,
239 const TopoDS_Shape& theShape=TopoDS_Shape());
241 typedef boost::shared_ptr< SMDS_Iterator<SMESH_Group*> > GroupIteratorPtr;
242 GroupIteratorPtr GetGroups() const;
244 std::list<int> GetGroupIds() const;
246 SMESH_Group* GetGroup (const int theGroupID);
248 void RemoveGroup (const int theGroupID);
250 SMESH_Group* ConvertToStandalone ( int theGroupID );
252 SMDSAbs_ElementType GetElementType( const int id, const bool iselem );
254 void ClearMeshOrder();
255 void SetMeshOrder(const TListOfListOfInt& theOrder );
256 const TListOfListOfInt& GetMeshOrder() const;
259 * \brief sort submeshes according to stored mesh order
260 * \param theListToSort in out list to be sorted
261 * \return FALSE if nothing sorted
263 bool SortByMeshOrder(std::list<SMESH_subMesh*>& theListToSort) const;
267 ostream& Dump(ostream & save);
271 void fillAncestorsMap(const TopoDS_Shape& theShape);
272 std::list<SMESH_subMesh*> getAncestorsSubMeshes
273 (const TopoDS_Shape& theSubShape) const;
276 int _id; // id given by creator (unique within the creator instance)
278 int _idDoc; // id given by SMESHDS_Document
279 int _groupId; // id generator for group objects
280 int _nbSubShapes; // initial nb of subshapes in the shape to mesh
281 bool _isShapeToMesh;// set to true when a shape is given (only once)
282 std::list <SMESH_subMesh*> _subMeshesUsingHypothesisList;
283 SMESHDS_Document * _myDocument;
284 SMESHDS_Mesh * _myMeshDS;
285 std::map <int, SMESH_subMesh*> _mapSubMesh;
286 std::map <int, SMESH_Group*> _mapGroup;
291 double _shapeDiagonal; //!< diagonal size of bounding box of shape to mesh
293 TopTools_IndexedDataMapOfShapeListOfShape _mapAncestors;
295 TListOfListOfInt _mySubMeshOrder;
299 SMESH_Mesh(const SMESH_Mesh&) {};