-// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2020 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
// 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
// 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>
// =========================================================================
//
SMDS_VolumeTool ();
~SMDS_VolumeTool ();
- SMDS_VolumeTool (const SMDS_MeshElement* theVolume,
- const bool ignoreCentralNodes=true);
+ SMDS_VolumeTool( const 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
// 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;
static int GetOppFaceIndexOfHex( int faceIndex );
// Return index of the opposite face of the hexahedron
-private:
+ private:
bool setFace( int faceIndex ) const;
+ bool projectNodesToNormal( int faceIndex,
+ double& minProj,
+ double& maxProj,
+ double* normal = 0) 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