1 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
20 // File : SMESH_Block.hxx
21 // Created : Tue Nov 30 12:42:18 2004
22 // Author : Edward AGAPOV (eap)
25 #ifndef SMESH_Block_HeaderFile
26 #define SMESH_Block_HeaderFile
28 #include <Geom2d_Curve.hxx>
29 #include <Geom_Curve.hxx>
30 #include <Geom_Surface.hxx>
32 #include <TopTools_IndexedMapOfOrientedShape.hxx>
33 #include <TopoDS_Edge.hxx>
34 #include <TopoDS_Shell.hxx>
35 #include <TopoDS_Vertex.hxx>
37 #include <gp_Trsf.hxx>
40 #include <math_FunctionSetWithDerivatives.hxx>
41 #include <math_Matrix.hxx>
42 #include <math_Vector.hxx>
47 class SMDS_MeshVolume;
50 // =========================================================
51 // class calculating coordinates of 3D points by normalized
52 // parameters inside the block and vice versa
53 // =========================================================
55 class SMESH_Block: public math_FunctionSetWithDerivatives
58 enum TShapeID { // ids of the block sub-shapes
61 ID_V000 = 1, ID_V100, ID_V010, ID_V110, ID_V001, ID_V101, ID_V011, ID_V111,
63 ID_Ex00, ID_Ex10, ID_Ex01, ID_Ex11,
64 ID_E0y0, ID_E1y0, ID_E0y1, ID_E1y1,
65 ID_E00z, ID_E10z, ID_E01z, ID_E11z,
67 ID_Fxy0, ID_Fxy1, ID_Fx0z, ID_Fx1z, ID_F0yz, ID_F1yz,
71 static inline bool IsVertexID( int theShapeID )
72 { return ( theShapeID >= ID_V000 && theShapeID <= ID_V111 ); }
74 static inline bool IsEdgeID( int theShapeID )
75 { return ( theShapeID >= ID_Ex00 && theShapeID <= ID_E11z ); }
77 static inline bool IsFaceID( int theShapeID )
78 { return ( theShapeID >= ID_Fxy0 && theShapeID <= ID_F1yz ); }
81 SMESH_Block (): myNbIterations(0), mySumDist(0.) {}
83 bool LoadBlockShapes(const TopoDS_Shell& theShell,
84 const TopoDS_Vertex& theVertex000,
85 const TopoDS_Vertex& theVertex001,
86 // TopTools_IndexedMapOfShape& theShapeIDMap
87 TopTools_IndexedMapOfOrientedShape& theShapeIDMap );
88 // add sub-shapes of theBlock to theShapeIDMap so that they get
89 // IDs acoording to enum TShapeID
91 bool LoadMeshBlock(const SMDS_MeshVolume* theVolume,
92 const int theNode000Index,
93 const int theNode001Index,
94 vector<const SMDS_MeshNode*>& theOrderedNodes);
95 // prepare to work with theVolume and
96 // return nodes in the order of TShapeID enum
98 static int GetShapeIDByParams ( const gp_XYZ& theParams );
99 // define an id of the block sub-shape by point parameters
101 bool VertexPoint( const int theVertexID, gp_XYZ& thePoint ) const {
102 if ( !IsVertexID( theVertexID )) return false;
103 thePoint = myPnt[ theVertexID - ID_V000 ]; return true;
105 // return vertex coordinates
107 bool EdgePoint( const int theEdgeID, const gp_XYZ& theParams, gp_XYZ& thePoint ) const {
108 if ( !IsEdgeID( theEdgeID )) return false;
109 thePoint = myEdge[ theEdgeID - ID_Ex00 ].Point( theParams ); return true;
111 // return coordinates of a point on edge
113 bool FacePoint( const int theFaceID, const gp_XYZ& theParams, gp_XYZ& thePoint ) const {
114 if ( !IsFaceID ( theFaceID )) return false;
115 thePoint = myFace[ theFaceID - ID_Fxy0 ].Point( theParams ); return true;
117 // return coordinates of a point on face
119 bool ShellPoint( const gp_XYZ& theParams, gp_XYZ& thePoint ) const;
120 // return coordinates of a point in shell
122 bool ComputeParameters (const gp_Pnt& thePoint,
124 const int theShapeID = ID_Shell);
125 // compute point parameters in the block
127 static void GetFaceEdgesIDs (const int faceID, vector< int >& edgeVec );
128 // return edges IDs of a face in the order u0, u1, 0v, 1v
130 static void GetEdgeVertexIDs (const int edgeID, vector< int >& vertexVec );
131 // return vertex IDs of an edge
133 static int GetCoordIndOnEdge (const int theEdgeID)
134 { return (theEdgeID < ID_E0y0) ? 1 : (theEdgeID < ID_E00z) ? 2 : 3; }
135 // return an index of a coordinate which varies along the edge
137 static double* GetShapeCoef (const int theShapeID);
138 // for theShapeID( TShapeID ), returns 3 coefficients used
139 // to compute an addition of an on-theShape point to coordinates
140 // of an in-shell point. If an in-shell point has parameters (Px,Py,Pz),
141 // then the addition of a point P is computed as P*kx*ky*kz and ki is
142 // defined by the returned coef like this:
143 // ki = (coef[i] == 0) ? 1 : (coef[i] < 0) ? 1 - Pi : Pi
145 static bool IsForwardEdge (const TopoDS_Edge & theEdge,
146 //TopTools_IndexedMapOfShape& theShapeIDMap
147 TopTools_IndexedMapOfOrientedShape& theShapeIDMap) {
148 int v1ID = theShapeIDMap.FindIndex( TopExp::FirstVertex( theEdge ).Oriented( TopAbs_FORWARD ));
149 int v2ID = theShapeIDMap.FindIndex( TopExp::LastVertex( theEdge ).Oriented( TopAbs_FORWARD ));
150 return ( v1ID < v2ID );
152 // Return true if an in-block parameter increases along theEdge curve
154 static void Swap(double& a, double& b) { double tmp = a; a = b; b = tmp; }
156 // methods of math_FunctionSetWithDerivatives
157 Standard_Integer NbVariables() const;
158 Standard_Integer NbEquations() const;
159 Standard_Boolean Value(const math_Vector& X,math_Vector& F) ;
160 Standard_Boolean Derivatives(const math_Vector& X,math_Matrix& D) ;
161 Standard_Boolean Values(const math_Vector& X,math_Vector& F,math_Matrix& D) ;
162 Standard_Integer GetStateNumber ();
164 static ostream& DumpShapeID (const int theBlockShapeID, ostream& stream);
165 // DEBUG: dump an id of a block sub-shape
173 Handle(Geom_Curve) myC3d;
175 double GetU( const gp_XYZ& theParams ) const;
176 gp_XYZ Point( const gp_XYZ& theParams ) const;
182 // 4 edges in the order u0, u1, 0v, 1v
184 double myFirst [ 4 ];
186 Handle(Geom2d_Curve) myC2d [ 4 ];
187 // 4 corner points in the order 00, 10, 11, 01
188 gp_XY myCorner [ 4 ];
190 Handle(Geom_Surface) myS;
192 gp_XY GetUV( const gp_XYZ& theParams ) const;
193 gp_XYZ Point( const gp_XYZ& theParams ) const;
194 int GetUInd() const { return myCoordInd[ 0 ]; }
195 int GetVInd() const { return myCoordInd[ 2 ]; }
196 void GetCoefs( int i, const gp_XYZ& theParams, double& eCoef, double& vCoef ) const;
201 TopoDS_Shell myShell;
202 // geometry in the order as in TShapeID:
210 // for param computation
217 gp_XYZ myPoint; // the given point
218 gp_XYZ myParam; // the best parameters guess
219 double myValues[ 4 ]; // values computed at myParam
221 typedef pair<gp_XYZ,gp_XYZ> TxyzPair;
222 TxyzPair my3x3x3GridNodes[ 27 ];