X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMDS%2FSMDS_MeshVolume.cxx;fp=src%2FSMDS%2FSMDS_MeshVolume.cxx;h=a56c119b7b0c1e9f650c447689ddde04e3c5c084;hb=7f69bf0122b3be1c986dace03f53a78f50d021ad;hp=755285447cb721d880293adb649e1a32a9fcedea;hpb=17af9c65254903ebd2c5c92bb3ef58dc707bd70c;p=modules%2Fsmesh.git diff --git a/src/SMDS/SMDS_MeshVolume.cxx b/src/SMDS/SMDS_MeshVolume.cxx index 755285447..a56c119b7 100644 --- a/src/SMDS/SMDS_MeshVolume.cxx +++ b/src/SMDS/SMDS_MeshVolume.cxx @@ -25,244 +25,18 @@ // Author : Jean-Michel BOULCOURT // Module : SMESH // - #include "SMDS_MeshVolume.hxx" +//======================================================================= +//function : Print +//purpose : +//======================================================================= -#include "SMDS_Mesh.hxx" -#include "SMDS_VolumeTool.hxx" -#include "SMDS_VtkCellIterator.hxx" - -#include - -// init a polyherdon -void SMDS_MeshVolume::init( const std::vector& nodes, - const std::vector& nbNodesPerFace ) -{ - std::vector ptIds; - ptIds.reserve( nodes.size() + nbNodesPerFace.size() + 1 ); - - size_t nbFaces = nbNodesPerFace.size(); - for ( size_t iN = 0, iF = 0; iF < nbFaces; iF++ ) - { - int nf = nbNodesPerFace[iF]; - ptIds.push_back(nf); - for (int n = 0; n < nf; n++) - ptIds.push_back( nodes[ iN++ ]->GetVtkID() ); - } - - int vtkID = getGrid()->InsertNextLinkedCell(VTK_POLYHEDRON, nbFaces, &ptIds[0]); - setVtkID( vtkID ); -} - -void SMDS_MeshVolume::init( const std::vector& vtkNodeIds ) -{ - SMDSAbs_EntityType aType = SMDSEntity_Tetra; - switch ( vtkNodeIds.size()) // cases are in order of usage frequency - { - case 4: aType = SMDSEntity_Tetra; break; - case 5: aType = SMDSEntity_Pyramid; break; - case 8: aType = SMDSEntity_Hexa; break; - case 6: aType = SMDSEntity_Penta; break; - case 10: aType = SMDSEntity_Quad_Tetra; break; - case 20: aType = SMDSEntity_Quad_Hexa; break; - case 13: aType = SMDSEntity_Quad_Pyramid; break; - case 27: aType = SMDSEntity_TriQuad_Hexa; break; - case 15: aType = SMDSEntity_Quad_Penta; break; - case 18: aType = SMDSEntity_BiQuad_Penta; break; - case 12: aType = SMDSEntity_Hexagonal_Prism; break; - default: throw SALOME_Exception("wrong volume nodes"); - } - SMDS_MeshCell::init( aType, vtkNodeIds ); -} - -const SMDS_MeshNode* SMDS_MeshVolume::GetNode(const int ind) const -{ - if ( !IsPoly() ) - return SMDS_MeshCell::GetNode( ind ); - - vtkIdType nFaces = 0; - vtkIdType* ptIds = 0; - getGrid()->GetFaceStream( GetVtkID(), nFaces, ptIds ); - int id = 0, nbPoints = 0; - for (int i = 0; i < nFaces; i++) - { - int nodesInFace = ptIds[id]; - if ( ind < nbPoints + nodesInFace ) - return GetMesh()->FindNodeVtk( ptIds[ ind + i ]); - nbPoints += nodesInFace; - id += (nodesInFace + 1); - } - return 0; -} -int SMDS_MeshVolume::NbNodes() const -{ - if ( !IsPoly() ) - return SMDS_MeshCell::NbNodes(); - - vtkIdType nFaces = 0; - vtkIdType* ptIds = 0; - getGrid()->GetFaceStream( GetVtkID(), nFaces, ptIds ); - int id = 0, nbPoints = 0; - for (int i = 0; i < nFaces; i++) - { - int nodesInFace = ptIds[id]; - nbPoints += nodesInFace; - id += (nodesInFace + 1); - } - return nbPoints; -} - -int SMDS_MeshVolume::NbFaces() const -{ - if ( !IsPoly() ) - return SMDS_MeshCell::NbFaces(); - - vtkIdType nFaces = 0; - vtkIdType* ptIds = 0; - getGrid()->GetFaceStream( GetVtkID(), nFaces, ptIds ); - return nFaces; - -} -int SMDS_MeshVolume::NbEdges() const -{ - if ( !IsPoly() ) - return SMDS_MeshCell::NbEdges(); - - vtkIdType nFaces = 0; - vtkIdType* ptIds = 0; - getGrid()->GetFaceStream( GetVtkID(), nFaces, ptIds ); - int id = 0, nbEdges = 0; - for (int i = 0; i < nFaces; i++) - { - int edgesInFace = ptIds[id]; - id += (edgesInFace + 1); - nbEdges += edgesInFace; - } - nbEdges = nbEdges / 2; - return nbEdges; -} - -int SMDS_MeshVolume::GetNodeIndex( const SMDS_MeshNode* node ) const -{ - if ( !IsPoly() ) - return SMDS_MeshCell::GetNodeIndex( node ); - - vtkIdType nFaces = 0; - vtkIdType* ptIds = 0; - getGrid()->GetFaceStream( GetVtkID(), nFaces, ptIds ); - int id = 0; - for (int iF = 0; iF < nFaces; iF++) - { - int nodesInFace = ptIds[id]; - for ( vtkIdType i = 0; i < nodesInFace; ++i ) - if ( ptIds[id+i+1] == node->GetVtkID() ) - return id+i-iF; - id += (nodesInFace + 1); - } - return -1; -} -bool SMDS_MeshVolume::ChangeNodes(const SMDS_MeshNode* nodes[], const int nbNodes) -{ - return false; -} - -bool SMDS_MeshVolume::IsMediumNode(const SMDS_MeshNode* node) const -{ - if ( !IsPoly() ) - return SMDS_MeshCell::IsMediumNode( node ); - - return false; -} - -int SMDS_MeshVolume::NbCornerNodes() const -{ - if ( !IsPoly() ) - return SMDS_MeshCell::NbCornerNodes(); - - return NbNodes(); -} - -int SMDS_MeshVolume::NbFaceNodes (const int face_ind) const +SMDSAbs_ElementType SMDS_MeshVolume::GetType() const { - if ( !IsPoly() ) - return SMDS_VolumeTool( this ).NbFaceNodes( face_ind-1 ); - - vtkIdType nFaces = 0; - vtkIdType* ptIds = 0; - getGrid()->GetFaceStream( GetVtkID(), nFaces, ptIds ); - int id = 0, nbNodes = 0; - for (int i = 0; i < nFaces; i++) - { - int nodesInFace = ptIds[id]; - id += (nodesInFace + 1); - if (i == face_ind - 1) - { - nbNodes = nodesInFace; - break; - } - } - return nbNodes; + return SMDSAbs_Volume; } -const SMDS_MeshNode* SMDS_MeshVolume::GetFaceNode (const int face_ind, const int node_ind) const +vtkIdType SMDS_MeshVolume::GetVtkType() const { - if ( !IsPoly() ) - return SMDS_VolumeTool( this ).GetFaceNodes( face_ind-1 )[ node_ind - 1 ]; - - vtkIdType nFaces = 0; - vtkIdType* ptIds = 0; - getGrid()->GetFaceStream( GetVtkID(), nFaces, ptIds); - int id = 0; - for (int i = 0; i < nFaces; i++) - { - int nodesInFace = ptIds[id]; // nodeIds in ptIds[id+1 .. id+nodesInFace] - if (i == face_ind - 1) // first face is number 1 - { - if ((node_ind > 0) && (node_ind <= nodesInFace)) - return GetMesh()->FindNodeVtk(ptIds[id + node_ind]); // ptIds[id+1] : first node - } - id += (nodesInFace + 1); - } - return 0; -} - -std::vector SMDS_MeshVolume::GetQuantities() const -{ - std::vector quantities; - if ( IsPoly() ) - { - vtkIdType nFaces = 0; - vtkIdType* ptIds = 0; - getGrid()->GetFaceStream( GetVtkID(), nFaces, ptIds ); - int id = 0; - for (int i = 0; i < nFaces; i++) - { - int nodesInFace = ptIds[id]; // nodeIds in ptIds[id+1 .. id+nodesInFace] - quantities.push_back( nodesInFace ); - id += (nodesInFace + 1); - } - } - return quantities; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create an iterator which iterate on nodes owned by the element. -/////////////////////////////////////////////////////////////////////////////// -SMDS_ElemIteratorPtr SMDS_MeshVolume::nodesIterator() const -{ - if ( !IsPoly() ) - return SMDS_MeshCell::nodesIterator(); - - return boost::make_shared< SMDS_VtkCellIteratorPolyH<> >( GetMesh(), GetVtkID(), GetEntityType()); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create an iterator which iterate on nodes owned by the element. -/////////////////////////////////////////////////////////////////////////////// -SMDS_NodeIteratorPtr SMDS_MeshVolume::nodeIterator() const -{ - if ( !IsPoly() ) - return SMDS_MeshCell::nodeIterator(); - - return boost::make_shared< SMDS_VtkCellIteratorPolyH< SMDS_NodeIterator> >( GetMesh(), GetVtkID(), GetEntityType()); + return VTK_CONVEX_POINT_SET; // --- must be reimplemented in derived classes }