Salome HOME
Fix PAL8562: rpath (rpath-link) option needs parameter - directory to search shared...
[modules/smesh.git] / src / SMESH / SMESH_Block.hxx
index d937aeddd84700aa82f03db33dc619057b4f31bc..155104866ea5c0a09bde4a6c075d3e26b02ba10a 100644 (file)
@@ -44,6 +44,9 @@
 #include <ostream>
 #include <vector>
 
+class SMDS_MeshVolume;
+class SMDS_MeshNode;
+
 // =========================================================
 // class calculating coordinates of 3D points by normalized
 // parameters inside the block and vice versa
@@ -65,6 +68,16 @@ class SMESH_Block: public math_FunctionSetWithDerivatives
 
     ID_Shell
     };
+
+
+ public: // methods about ids of the block sub-shapes
+
+  static int NbVertices()  { return  8; }
+  static int NbEdges()     { return 12; }
+  static int NbFaces()     { return  6; }
+  static int NbSubShapes() { return ID_Shell; }
+  // to avoid magic numbers when allocating memory for subshapes
+
   static inline bool IsVertexID( int theShapeID )
   { return ( theShapeID >= ID_V000 && theShapeID <= ID_V111 ); }
 
@@ -74,25 +87,69 @@ class SMESH_Block: public math_FunctionSetWithDerivatives
   static inline bool IsFaceID( int theShapeID )
   { return ( theShapeID >= ID_Fxy0 && theShapeID <= ID_F1yz ); }
 
+  static int ShapeIndex( int theShapeID )
+  {
+    if ( IsVertexID( theShapeID )) return theShapeID - ID_V000;
+    if ( IsEdgeID( theShapeID ))   return theShapeID - ID_Ex00;
+    if ( IsFaceID( theShapeID ))   return theShapeID - ID_Fxy0;
+    return 0;
+  }
+  // return index [0-...] for each type of sub-shapes,
+  // for example :
+  // ShapeIndex( ID_Ex00 ) == 0
+  // ShapeIndex( ID_Ex10 ) == 1
+
+  static void GetFaceEdgesIDs (const int faceID, vector< int >& edgeVec );
+  // return edges IDs of a face in the order u0, u1, 0v, 1v
+
+  static void GetEdgeVertexIDs (const int edgeID, vector< int >& vertexVec );
+  // return vertex IDs of an edge
+
+  static int GetCoordIndOnEdge (const int theEdgeID)
+  { return (theEdgeID < ID_E0y0) ? 1 : (theEdgeID < ID_E00z) ? 2 : 3; }
+  // return an index of a coordinate which varies along the edge
+
+  static double* GetShapeCoef (const int theShapeID);
+  // for theShapeID( TShapeID ), returns 3 coefficients used
+  // to compute an addition of an on-theShape point to coordinates
+  // of an in-shell point. If an in-shell point has parameters (Px,Py,Pz),
+  // then the addition of a point P is computed as P*kx*ky*kz and ki is
+  // defined by the returned coef like this:
+  // ki = (coef[i] == 0) ? 1 : (coef[i] < 0) ? 1 - Pi : Pi
+
+  static int GetShapeIDByParams ( const gp_XYZ& theParams );
+  // define an id of the block sub-shape by point parameters
+
+  static ostream& DumpShapeID (const int theBlockShapeID, ostream& stream);
+  // DEBUG: dump an id of a block sub-shape
+
+
+ public: // initialization
 
   SMESH_Block (): myNbIterations(0), mySumDist(0.) {}
 
   bool LoadBlockShapes(const TopoDS_Shell&         theShell,
                        const TopoDS_Vertex&        theVertex000,
                        const TopoDS_Vertex&        theVertex001,
-//                       TopTools_IndexedMapOfShape& theShapeIDMap
                        TopTools_IndexedMapOfOrientedShape& theShapeIDMap );
   // add sub-shapes of theBlock to theShapeIDMap so that they get
   // IDs acoording to enum TShapeID
 
-  static int GetShapeIDByParams ( const gp_XYZ& theParams );
-  // define an id of the block sub-shape by point parameters
+  bool LoadMeshBlock(const SMDS_MeshVolume*        theVolume,
+                     const int                     theNode000Index,
+                     const int                     theNode001Index,
+                     vector<const SMDS_MeshNode*>& theOrderedNodes);
+  // prepare to work with theVolume and
+  // return nodes in the order of TShapeID enum
+
+
+ public: // define coordinates by parameters
 
   bool VertexPoint( const int theVertexID, gp_XYZ& thePoint ) const {
     if ( !IsVertexID( theVertexID ))           return false;
     thePoint = myPnt[ theVertexID - ID_V000 ]; return true;
   }
-  // return vertex coordinates
+  // return vertex coordinates, parameters are defined by theVertexID
 
   bool EdgePoint( const int theEdgeID, const gp_XYZ& theParams, gp_XYZ& thePoint ) const {
     if ( !IsEdgeID( theEdgeID ))                                 return false;
@@ -109,28 +166,32 @@ class SMESH_Block: public math_FunctionSetWithDerivatives
   bool ShellPoint( const gp_XYZ& theParams, gp_XYZ& thePoint ) const;
   // return coordinates of a point in shell
 
+  static bool ShellPoint(const gp_XYZ&         theParams,
+                         const vector<gp_XYZ>& thePointOnShape,
+                         gp_XYZ&               thePoint );
+  // computes coordinates of a point in shell by points on sub-shapes;
+  // thePointOnShape[ subShapeID ] must be a point on a subShape;
+  // thePointOnShape.size() == ID_Shell, thePointOnShape[0] not used
+
+
+ public: // define parameters by coordinates
+
   bool ComputeParameters (const gp_Pnt& thePoint,
                           gp_XYZ&       theParams,
                           const int     theShapeID = ID_Shell);
-  // compute point parameters in the block
+  // compute point parameters in the block.
+  // Note: for edges, it is better to use EdgeParameters()
 
-  static void GetFaceEdgesIDs (const int faceID, vector< int >& edgeVec );
-  // return edges IDs of a face in the order u0, u1, 0v, 1v
+  bool VertexParameters(const int theVertexID, gp_XYZ& theParams);
+  // return parameters of a vertex given by TShapeID
 
-  static int GetCoordIndOnEdge (const int theEdgeID)
-  { return (theEdgeID < ID_E0y0) ? 1 : (theEdgeID < ID_E00z) ? 2 : 3; }
-  // return an index of a coordinate which varies along the edge
+  bool EdgeParameters(const int theEdgeID, const double theU, gp_XYZ& theParams);
+  // return parameters of a point given by theU on edge
 
-  static double* GetShapeCoef (const int theShapeID);
-  // for theShapeID( TShapeID ), returns 3 coefficients used
-  // to compute an addition of an on-theShape point to coordinates
-  // of an in-shell point. If an in-shell point has parameters (Px,Py,Pz),
-  // then the addition of a point P is computed as P*kx*ky*kz and ki is
-  // defined by the returned coef like this:
-  // ki = (coef[i] == 0) ? 1 : (coef[i] < 0) ? 1 - Pi : Pi
 
-  static bool IsForwardEdge (const TopoDS_Edge &         theEdge, 
-                             //TopTools_IndexedMapOfShape& theShapeIDMap
+ public: // services
+
+  static bool IsForwardEdge (const TopoDS_Edge &                 theEdge,
                              TopTools_IndexedMapOfOrientedShape& theShapeIDMap) {
     int v1ID = theShapeIDMap.FindIndex( TopExp::FirstVertex( theEdge ).Oriented( TopAbs_FORWARD ));
     int v2ID = theShapeIDMap.FindIndex( TopExp::LastVertex( theEdge ).Oriented( TopAbs_FORWARD ));
@@ -140,7 +201,10 @@ class SMESH_Block: public math_FunctionSetWithDerivatives
 
   static void Swap(double& a, double& b) { double tmp = a; a = b; b = tmp; }
 
-  // methods of math_FunctionSetWithDerivatives
+
+ public:
+  // methods of math_FunctionSetWithDerivatives used internally
+  // to define parameters by coordinates
   Standard_Integer NbVariables() const;
   Standard_Integer NbEquations() const;
   Standard_Boolean Value(const math_Vector& X,math_Vector& F) ;
@@ -148,9 +212,6 @@ class SMESH_Block: public math_FunctionSetWithDerivatives
   Standard_Boolean Values(const math_Vector& X,math_Vector& F,math_Matrix& D) ;
   Standard_Integer GetStateNumber ();
 
-  static ostream& DumpShapeID (const int theBlockShapeID, ostream& stream);
-  // DEBUG: dump an id of a block sub-shape
-
  private:
 
   struct TEdge {
@@ -161,6 +222,8 @@ class SMESH_Block: public math_FunctionSetWithDerivatives
     gp_Trsf            myTrsf;
     double GetU( const gp_XYZ& theParams ) const;
     gp_XYZ Point( const gp_XYZ& theParams ) const;
+    // if mesh volume
+    gp_XYZ             myNodes[2];
   };
 
   struct TFace {
@@ -178,10 +241,13 @@ class SMESH_Block: public math_FunctionSetWithDerivatives
     gp_XYZ Point( const gp_XYZ& theParams ) const;
     int GetUInd() const { return myCoordInd[ 0 ]; }
     int GetVInd() const { return myCoordInd[ 2 ]; }
+    void GetCoefs( int i, const gp_XYZ& theParams, double& eCoef, double& vCoef ) const;
+    // if mesh volume
+    gp_XYZ               myNodes[4];
   };
 
   TopoDS_Shell myShell;
-  // geometry:
+  // geometry in the order as in TShapeID:
   // 8 vertices
   gp_XYZ myPnt[ 8 ];
   // 12 edges