Salome HOME
IPAL52781: Orientation of a wall face created by revolution is wrong
[modules/smesh.git] / src / SMDS / SMDS_VolumeTool.hxx
index bde071fde8cd07a9f40f0d2bb3c37b29825e22b4..7e88f7c1a309c48061daf61a8ee4092da20c374e 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -6,7 +6,7 @@
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -38,6 +38,7 @@ class SMDS_MeshVolume;
 
 #include <vector>
 #include <set>
+#include <map>
 
 // =========================================================================
 //
@@ -90,10 +91,10 @@ class SMDS_EXPORT SMDS_VolumeTool
   // top and bottom faces are reversed.
   // Result of IsForward() and methods returning nodes change
 
-  const SMDS_MeshNode** GetNodes() { return myVolumeNodes; }
+  const SMDS_MeshNode** GetNodes() { return &myVolumeNodes[0]; }
   // Return array of volume nodes
 
-  int NbNodes() { return myVolumeNbNodes; }
+  int NbNodes() { return myVolumeNodes.size(); }
   // Return array of volume nodes
 
   double GetSize() const;
@@ -201,7 +202,8 @@ class SMDS_EXPORT SMDS_VolumeTool
   int GetCenterNodeIndex( int faceIndex ) const;
   // Return index of the node located at face center of a quadratic element like HEX27
 
-  int GetFaceIndex( const std::set<const SMDS_MeshNode*>& theFaceNodes ) const;
+  int GetFaceIndex( const std::set<const SMDS_MeshNode*>& theFaceNodes,
+                    const int                             theFaceIndexHint=-1) const;
   // Return index of a face formed by theFaceNodes.
   // Return -1 if a face not found
 
@@ -238,31 +240,45 @@ class SMDS_EXPORT SMDS_VolumeTool
   static int NbCornerNodes(VolumeType type);
   // Useful to know nb of corner nodes of a quadratic volume
 
-private:
+  static int GetOppFaceIndexOfHex( int faceIndex );
+  // Return index of the opposite face of the hexahedron
+
+ private:
 
   bool setFace( int faceIndex ) const;
 
+  bool projectNodesToNormal( int faceIndex, double& minProj, double& maxProj ) const;
+
   const SMDS_MeshElement* myVolume;
   const SMDS_VtkVolume*   myPolyedre;
   bool                    myIgnoreCentralNodes;
 
   bool                    myVolForward;
   int                     myNbFaces;
-  int                     myVolumeNbNodes;
-  const SMDS_MeshNode**   myVolumeNodes;
-  std::vector< int >      myPolyIndices;
-
-  mutable bool                    myExternalFaces;
-
-  mutable const int*              myAllFacesNodeIndices_F;
-  mutable const int*              myAllFacesNodeIndices_RE;
-  mutable const int*              myAllFacesNbNodes;
-  mutable int                     myMaxFaceNbNodes;
-
-  mutable int                     myCurFace;
-  mutable int                     myFaceNbNodes;
-  mutable int*                    myFaceNodeIndices;
-  mutable const SMDS_MeshNode**   myFaceNodes;
+  std::vector<const SMDS_MeshNode*> myVolumeNodes;
+  std::vector< int >      myPolyIndices; // of a myCurFace
+  std::vector< int >      myPolyQuantities;
+  std::vector< int >      myPolyFacetOri; // -1-in, +1-out, 0-undef
+
+  typedef std::pair<int,int> Link;
+  std::map<Link, int>     myFwdLinks; // used in IsFaceExternal() to find out myPolyFacetOri
+
+  mutable bool            myExternalFaces;
+
+  mutable const int*      myAllFacesNodeIndices_F;
+  mutable const int*      myAllFacesNodeIndices_RE;
+  mutable const int*      myAllFacesNbNodes;
+  mutable int             myMaxFaceNbNodes;
+
+  struct SaveFacet;
+  struct Facet
+  {
+    int                   myIndex;
+    int                   myNbNodes;
+    int*                  myNodeIndices;
+    std::vector<const SMDS_MeshNode*> myNodes;
+  };
+  mutable Facet           myCurFace;
 
 };
 #endif