Salome HOME
Fix compilation pb on gcc 6 (add missing std includes)
[modules/smesh.git] / src / SMDS / SMDS_VolumeTool.hxx
index ff067eb3a94bed4913814c1444725d92d282c883..d0a1f31211f1c8fbe261d8bb8bc4cac0add52efa 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016  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
@@ -20,7 +20,7 @@
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
-//  SMESH SMDS : implementaion of Salome mesh data structure
+//  SMESH SMDS : implementation of Salome mesh data structure
 // File      : SMDS_VolumeTool.hxx
 // Module    : SMESH
 // Created   : Tue Jul 13 11:27:17 2004
 
 class SMDS_MeshElement;
 class SMDS_MeshNode;
-class SMDS_VtkVolume;
 class SMDS_MeshVolume;
 
 #include <vector>
 #include <set>
+#include <map>
 
 // =========================================================================
 //
@@ -57,15 +57,17 @@ class SMDS_EXPORT SMDS_VolumeTool
 
   SMDS_VolumeTool ();
   ~SMDS_VolumeTool ();
-  SMDS_VolumeTool (const SMDS_MeshElement* theVolume,
-                   const bool              ignoreCentralNodes=true);
+  SMDS_VolumeToolconst SMDS_MeshElement* theVolume,
+                   const bool              ignoreCentralNodes = true);
 
-  bool Set (const SMDS_MeshElement* theVolume,
-            const bool              ignoreCentralNodes=true);
+  bool Set( const SMDS_MeshElement*                  theVolume,
+            const bool                               ignoreCentralNodes = true,
+            const std::vector<const SMDS_MeshNode*>* nodes = 0);
   // Set volume.
   // Return false if theVolume is not of type SMDSAbs_Volume.
   // ignoreCentralNodes makes skip nodes at face centers when returning
-  // nodes of faces of SMDSEntity_TriQuad_Hexa
+  // nodes of faces of SMDSEntity_TriQuad_Hexa.
+  // alternative nodes can be provided
 
   const SMDS_MeshVolume* Element() const;
   // return element
@@ -73,6 +75,8 @@ class SMDS_EXPORT SMDS_VolumeTool
   int ID() const;
   // return element ID
 
+  bool IsPoly() const { return myPolyedre; }
+
   // -----------------------
   // general info
   // -----------------------
@@ -88,10 +92,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() const { return (const SMDS_MeshNode**) &myVolumeNodes[0]; }
   // Return array of volume nodes
 
-  int NbNodes() { return myVolumeNbNodes; }
+  int NbNodes() const { return myVolumeNodes.size(); }
   // Return array of volume nodes
 
   double GetSize() const;
@@ -177,7 +181,11 @@ class SMDS_EXPORT SMDS_VolumeTool
   // SetExternalNormal() is taken into account.
 
   bool IsFreeFace(  int faceIndex, const SMDS_MeshElement** otherVol=0 ) const;
-  // Check that all volumes built on the face nodes lays on one side
+  // Fast check that only one volume is built on nodes of a given face
+  // otherVol returns another volume sharing the given facet
+
+  bool IsFreeFaceAdv(  int faceIndex, const SMDS_MeshElement** otherVol=0 ) const;
+  // Thorough check that all volumes built on the face nodes lays on one side
   // otherVol returns another volume sharing the given facet
 
   bool GetFaceNormal (int faceIndex, double & X, double & Y, double & Z) const;
@@ -195,7 +203,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
 
@@ -232,31 +241,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;
+  const SMDS_MeshVolume*  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