Salome HOME
Merging with WPdev
[modules/smesh.git] / src / StdMeshers / StdMeshers_Penta_3D.hxx
1 //  SMESH StdMeshers : implementaion of SMESH idl descriptions
2 //
3 //  Copyright (C) 2003  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 //
23 //
24 //  File   : StdMeshers_Penta_3D.hxx
25 //  Module : SMESH
26
27 #ifndef StdMeshers_Penta_3D_HeaderFile
28 #define StdMeshers_Penta_3D_HeaderFile
29
30 #include "SMESH_StdMeshers.hxx"
31
32 #include <map>
33
34 ////////////////////////////////////////////////////////////////////////
35 //
36 //  class StdMeshers_SMESHBlock
37 //
38 ////////////////////////////////////////////////////////////////////////
39 #include <gp_Pnt.hxx>
40 #include <gp_XYZ.hxx>
41 #include <TopoDS_Vertex.hxx>
42 #include <TopoDS_Shell.hxx>
43 #include <TopTools_IndexedMapOfOrientedShape.hxx>
44 #include <TColStd_MapOfInteger.hxx>
45
46 #include "SMESH_Block.hxx"
47
48 #include "SMESH_MesherHelper.hxx"
49
50 typedef std::map< double, std::vector<const SMDS_MeshNode*> > StdMeshers_IJNodeMap;
51
52 class STDMESHERS_EXPORT StdMeshers_SMESHBlock {
53  
54 public:
55   //
56   StdMeshers_SMESHBlock();
57   
58   void Load (const TopoDS_Shell& theShell);
59   
60   void Load (const TopoDS_Shell& theShell,
61              const TopoDS_Vertex& theV000,
62              const TopoDS_Vertex& theV001);
63   
64   void ComputeParameters(const gp_Pnt& thePnt, 
65                          gp_XYZ& theXYZ);
66   
67   void ComputeParameters(const gp_Pnt& thePnt,
68                          const TopoDS_Shape& theShape,
69                          gp_XYZ& theXYZ);
70   
71   void ComputeParameters(const double& theU,
72                          const TopoDS_Shape& theShape,
73                          gp_XYZ& theXYZ);
74   
75   void Point(const gp_XYZ& theParams, 
76              gp_Pnt& thePnt);
77   
78   void Point(const gp_XYZ& theParams,
79              const TopoDS_Shape& theShape, 
80              gp_Pnt& thePnt);
81   
82   int ShapeID(const TopoDS_Shape& theShape); 
83   
84   const TopoDS_Shape& Shape(const int theID);
85
86   SMESH_Block & Block() { return myTBlock; }
87
88   bool IsForwadEdge(const int theEdgeID);
89
90   int  ErrorStatus() const;
91
92
93 protected:
94   TopoDS_Shell                       myShell;
95   TopTools_IndexedMapOfOrientedShape myShapeIDMap;
96   SMESH_Block                        myTBlock;
97   TopoDS_Shape                       myEmptyShape;
98   vector<int>                        myIsEdgeForward;
99   //
100   int myErrorStatus;
101 };
102
103 ////////////////////////////////////////////////////////////////////////
104 //
105 //  class StdMeshers_TNode
106 //
107 ////////////////////////////////////////////////////////////////////////
108 #include "SMDS_MeshNode.hxx"
109
110 class STDMESHERS_EXPORT StdMeshers_TNode {
111
112 public:
113   
114   StdMeshers_TNode(){
115     myNode=NULL;
116     myXYZ.SetCoord(99., 99., 99.);
117     myShapeSupportID=-1;
118     myBaseNodeID=-1;
119   }
120   
121   void SetNode(const SMDS_MeshNode* theNode) {
122     myNode=(SMDS_MeshNode*) theNode;
123   }
124   
125   const SMDS_MeshNode* Node()const {
126     return myNode;
127   }
128
129   void SetShapeSupportID (const int theID) {
130     myShapeSupportID=theID;
131   }
132   
133   int ShapeSupportID()const {
134     return myShapeSupportID;
135   }
136   
137   void SetNormCoord (const gp_XYZ& theXYZ) {
138     myXYZ=theXYZ;
139   }
140
141   const gp_XYZ& NormCoord ()const{
142     return myXYZ;
143   }
144   
145   void SetBaseNodeID (const int theID) {
146     myBaseNodeID=theID;
147   }
148   
149   int BaseNodeID ()const{
150     return myBaseNodeID;
151   }
152
153 private:
154   SMDS_MeshNode* myNode;
155   int  myShapeSupportID;
156   gp_XYZ         myXYZ;
157   int            myBaseNodeID;
158 };
159
160 ////////////////////////////////////////////////////////////////////////
161 //
162 //  class StdMeshers_Penta_3D
163 //
164 ////////////////////////////////////////////////////////////////////////
165 #include "SMESH_Mesh.hxx"
166 #include <TopoDS_Shape.hxx>
167 //
168 class STDMESHERS_EXPORT StdMeshers_Penta_3D {
169 //
170   public: // methods
171     StdMeshers_Penta_3D();
172     
173     ~StdMeshers_Penta_3D();
174     
175     bool Compute(SMESH_Mesh& , const TopoDS_Shape& );
176     
177     int ErrorStatus() const {
178       return myErrorStatus;
179     }
180    
181     void SetTolerance(const double theTol3D) {
182       myTol3D=theTol3D;
183     }
184     
185     double Tolerance() const {
186       return myTol3D;
187     }
188
189     bool LoadIJNodes(StdMeshers_IJNodeMap & theIJNodes,
190                      const TopoDS_Face&     theFace,
191                      const TopoDS_Edge&     theBaseEdge,
192                      SMESHDS_Mesh*          theMesh);
193     // Load nodes bound to theFace into column (vectors) and rows
194     // of theIJNodes.
195     // The value of theIJNodes map is a vector of ordered nodes so
196     // that the 0-the one lies on theBaseEdge.
197     // The key of theIJNodes map is a normalized parameter of each
198     // 0-the node on theBaseEdge.
199
200
201   protected: // methods
202     
203     void CheckData();
204     
205     void MakeBlock();
206
207     void MakeNodes();
208
209     double SetHorizEdgeXYZ(const gp_XYZ&                  aBNXYZ,
210                            const int                      aFaceID,
211                            vector<const SMDS_MeshNode*>*& aCol1,
212                            vector<const SMDS_MeshNode*>*& aCol2);
213
214     void ShapeSupportID(const bool theIsUpperLayer,
215                         const SMESH_Block::TShapeID theBNSSID,
216                         SMESH_Block::TShapeID& theSSID);
217
218     void FindNodeOnShape(const TopoDS_Shape& aS,
219                          const gp_XYZ& aParams,
220                          const int z,
221                          StdMeshers_TNode& aTN);
222
223     void CreateNode(const bool theIsUpperLayer,
224                     const gp_XYZ& aParams,
225                     StdMeshers_TNode& aTN);
226
227     void ClearMeshOnFxy1();
228
229     void MakeMeshOnFxy1();
230
231     void MakeConnectingMap();
232
233     int GetIndexOnLayer(const int aID);
234
235     void MakeVolumeMesh();
236   
237     void SetMesh(SMESH_Mesh& theMesh) {
238       myMesh=(void *)&theMesh;
239     }
240     
241     SMESH_Mesh* GetMesh()const {
242       return (SMESH_Mesh*)myMesh;
243     }
244     
245   protected: // fields
246     TopoDS_Shape              myShape;
247     StdMeshers_SMESHBlock     myBlock;
248     void *                    myMesh;
249     int                       myErrorStatus;
250     //
251     vector <StdMeshers_TNode> myTNodes;
252     int                       myISize;
253     int                       myJSize;
254     double                    myTol3D;        // Tolerance value     
255     std::map < int, int >     myConnectingMap;
256     //
257     vector<StdMeshers_IJNodeMap> myWallNodesMaps; // nodes on a face
258     vector<gp_XYZ>            myShapeXYZ; // point on each sub-shape
259
260     bool myCreateQuadratic;
261     SMESH_MesherHelper* myTool; // toll for working with quadratic elements
262 };
263
264 #endif