X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMDS%2FSMDS_VolumeTool.cxx;fp=src%2FSMDS%2FSMDS_VolumeTool.cxx;h=3094a761f0cff2aa5f60af6c802450b42ec4b6a0;hp=7ee1f81f206e0ebc18ee290fdab2c2241885fd0b;hb=79b1ac2b6df9117f16f11d444b1f165d477a1813;hpb=984c4ffdd7df62aeaedc544cd0b8e64ff8f53f1a diff --git a/src/SMDS/SMDS_VolumeTool.cxx b/src/SMDS/SMDS_VolumeTool.cxx index 7ee1f81f2..3094a761f 100644 --- a/src/SMDS/SMDS_VolumeTool.cxx +++ b/src/SMDS/SMDS_VolumeTool.cxx @@ -31,6 +31,7 @@ #include "SMDS_MeshElement.hxx" #include "SMDS_MeshNode.hxx" #include "SMDS_PolyhedralVolumeOfNodes.hxx" +#include "SMDS_Mesh.hxx" #include "utilities.h" @@ -1111,8 +1112,8 @@ bool SMDS_VolumeTool::IsLinked (const int theNode1Index, return IsLinked(myVolumeNodes[theNode1Index], myVolumeNodes[theNode2Index]); } - int minInd = theNode1Index < theNode2Index ? theNode1Index : theNode2Index; - int maxInd = theNode1Index < theNode2Index ? theNode2Index : theNode1Index; + int minInd = min( theNode1Index, theNode2Index ); + int maxInd = max( theNode1Index, theNode2Index ); if ( minInd < 0 || maxInd > myVolumeNbNodes - 1 || maxInd == minInd ) return false; @@ -1217,6 +1218,65 @@ int SMDS_VolumeTool::GetNodeIndex(const SMDS_MeshNode* theNode) const return -1; } +//================================================================================ +/*! + * \brief Fill vector with boundary faces existing in the mesh + * \param faces - vector of found nodes + * \retval int - nb of found faces + */ +//================================================================================ + +int SMDS_VolumeTool::GetAllExistingFaces(vector & faces) +{ + faces.clear(); + faces.reserve( NbFaces() ); + for ( int iF = 0; iF < NbFaces(); ++iF ) { + const SMDS_MeshFace* face = 0; + const SMDS_MeshNode** nodes = GetFaceNodes( iF ); + switch ( NbFaceNodes( iF )) { + case 3: + face = SMDS_Mesh::FindFace( nodes[0], nodes[1], nodes[2] ); break; + case 4: + face = SMDS_Mesh::FindFace( nodes[0], nodes[1], nodes[2], nodes[3] ); break; + case 6: + face = SMDS_Mesh::FindFace( nodes[0], nodes[1], nodes[2], + nodes[3], nodes[4], nodes[5]); break; + case 8: + face = SMDS_Mesh::FindFace( nodes[0], nodes[1], nodes[2], nodes[3], + nodes[4], nodes[5], nodes[6], nodes[7]); break; + } + if ( face ) + faces.push_back( face ); + } + return faces.size(); +} + + +//================================================================================ +/*! + * \brief Fill vector with boundary edges existing in the mesh + * \param edges - vector of found edges + * \retval int - nb of found faces + */ +//================================================================================ + +int SMDS_VolumeTool::GetAllExistingEdges(vector & edges) const +{ + edges.clear(); + edges.reserve( myVolumeNbNodes * 2 ); + for ( int i = 0; i < myVolumeNbNodes; ++i ) { + for ( int j = i + 1; j < myVolumeNbNodes; ++j ) { + if ( IsLinked( i, j )) { + const SMDS_MeshElement* edge = + SMDS_Mesh::FindEdge( myVolumeNodes[i], myVolumeNodes[j] ); + if ( edge ) + edges.push_back( edge ); + } + } + } + return edges.size(); +} + //======================================================================= //function : IsFreeFace //purpose : check that only one volume is build on the face nodes @@ -1276,7 +1336,7 @@ bool SMDS_VolumeTool::IsFreeFace( int faceIndex ) continue; // opposite side } // remove a volume from volNbShared map - volNbShared.erase( vNbIt ); + volNbShared.erase( vNbIt-- ); } // here volNbShared contains only volumes laying on the @@ -1518,6 +1578,31 @@ int SMDS_VolumeTool::NbFaces( VolumeType type ) } } +//================================================================================ +/*! + * \brief Useful to know nb of corner nodes of a quadratic volume + * \param type - volume type + * \retval int - nb of corner nodes + */ +//================================================================================ + +int SMDS_VolumeTool::NbCornerNodes(VolumeType type) +{ + switch ( type ) { + case TETRA : + case QUAD_TETRA: return 4; + case PYRAM : + case QUAD_PYRAM: return 5; + case PENTA : + case QUAD_PENTA: return 6; + case HEXA : + case QUAD_HEXA : return 8; + default: return 0; + } + return 0; +} + // + //======================================================================= //function : GetFaceNodesIndices //purpose : Return the array of face nodes indices @@ -1566,3 +1651,22 @@ int SMDS_VolumeTool::NbFaceNodes(VolumeType type, return 0; } +//======================================================================= +//function : Get +//purpose : return element +//======================================================================= + +const SMDS_MeshVolume* SMDS_VolumeTool::Get() const +{ + return static_cast( myVolume ); +} + +//======================================================================= +//function : ID +//purpose : return element ID +//======================================================================= + +int SMDS_VolumeTool::ID() const +{ + return myVolume ? myVolume->GetID() : 0; +}