X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMDS%2FSMDS_VolumeTool.hxx;h=19aaeadf48ff36915193874b9841c2c2f39aa9c9;hp=bde071fde8cd07a9f40f0d2bb3c37b29825e22b4;hb=HEAD;hpb=5030955be884848b884ceb675e6dc35b0d36ede8 diff --git a/src/SMDS/SMDS_VolumeTool.hxx b/src/SMDS/SMDS_VolumeTool.hxx index bde071fde..56affdd48 100644 --- a/src/SMDS/SMDS_VolumeTool.hxx +++ b/src/SMDS/SMDS_VolumeTool.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2024 CEA, EDF, 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 @@ -31,13 +31,15 @@ #include "SMESH_SMDS.hxx" +#include + class SMDS_MeshElement; class SMDS_MeshNode; -class SMDS_VtkVolume; class SMDS_MeshVolume; #include #include +#include // ========================================================================= // @@ -57,20 +59,22 @@ class SMDS_EXPORT SMDS_VolumeTool 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* 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 - int ID() const; + smIdType ID() const; // return element ID bool IsPoly() const { return myPolyedre; } @@ -90,15 +94,18 @@ 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; } - // Return array of volume nodes + int NbNodes() const { return (int) myVolumeNodes.size(); } + // Return number of volume nodes double GetSize() const; // Return element volume + double GetScaledJacobian() const; + // Return the scaled jacobian + bool GetBaryCenter (double & X, double & Y, double & Z) const; bool IsOut(double X, double Y, double Z, double tol) const; @@ -181,6 +188,12 @@ class SMDS_EXPORT SMDS_VolumeTool bool IsFreeFace( int faceIndex, const SMDS_MeshElement** otherVol=0 ) const; // Fast check that only one volume is built on nodes of a given face // otherVol returns another volume sharing the given facet + // Function works for conforming mesh. + + bool IsFreeFaceCheckAllNodes( int faceIndex, const SMDS_MeshElement** otherVol=0 ) const; + // Check that only one volume is built on nodes of a given face + // otherVol returns another volume sharing the given facet + // Function to be used on mesh with non conforming elements. The face shared between bool IsFreeFaceAdv( int faceIndex, const SMDS_MeshElement** otherVol=0 ) const; // Thorough check that all volumes built on the face nodes lays on one side @@ -192,6 +205,10 @@ class SMDS_EXPORT SMDS_VolumeTool bool GetFaceBaryCenter (int faceIndex, double & X, double & Y, double & Z) const; // Return barycenter of a face + bool AllFacesSameOriented() const; + // Check that all the faces of a polyhedron have the same orientation + // no differentiation between inward and outward orientation is made. + double GetFaceArea( int faceIndex ) const; // Return face area @@ -201,7 +218,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& theFaceNodes ) const; + int GetFaceIndex( const std::set& theFaceNodes, + const int theFaceIndexHint=-1) const; // Return index of a face formed by theFaceNodes. // Return -1 if a face not found @@ -238,31 +256,48 @@ 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, + 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 myVolumeNodes; + std::vector< int > myPolyIndices; // of a myCurFace + std::vector myPolyQuantities; + std::vector< int > myPolyFacetOri; // -1-in, +1-out, 0-undef + + typedef std::pair Link; + std::map 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 myNodes; + }; + mutable Facet myCurFace; }; #endif