X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMDS%2FSMDS_VtkVolume.cxx;h=7615b8442e70dfa1a562a7a2126b06542c97360a;hb=ef3921b2afe32874a6a266ceea8a12a30cc6f17c;hp=7e66a83c8bda851a290415226c788c4c5093c18e;hpb=c2c0a21343037194c319d5aa6674e89a22e9c7a5;p=modules%2Fsmesh.git diff --git a/src/SMDS/SMDS_VtkVolume.cxx b/src/SMDS/SMDS_VtkVolume.cxx index 7e66a83c8..7615b8442 100644 --- a/src/SMDS/SMDS_VtkVolume.cxx +++ b/src/SMDS/SMDS_VtkVolume.cxx @@ -1,9 +1,9 @@ -// Copyright (C) 2010-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2010-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // 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 @@ -95,7 +95,7 @@ void SMDS_VtkVolume::initPoly(const std::vector& nodeIds, SMDS_UnstructuredGrid* grid = mesh->getGrid(); //double center[3]; //this->gravityCenter(grid, &nodeIds[0], nodeIds.size(), ¢er[0]); - vector ptIds; + std::vector ptIds; vtkIdType nbFaces = nbNodesPerFace.size(); int k = 0; for (int i = 0; i < nbFaces; i++) @@ -165,7 +165,7 @@ bool SMDS_VtkVolume::vtkOrder(const SMDS_MeshNode* nodes[], const int nbNodes) const std::vector& interlace = SMDS_MeshCell::toVtkOrder( VTKCellType( aVtkType )); if ( !interlace.empty() ) { - ASSERT( interlace.size() == nbNodes ); + ASSERT( (int)interlace.size() == nbNodes ); std::vector initNodes( nodes, nodes+nbNodes ); for ( size_t i = 0; i < interlace.size(); ++i ) nodes[i] = initNodes[ interlace[i] ]; @@ -365,8 +365,7 @@ const SMDS_MeshNode* SMDS_VtkVolume::GetFaceNode(const int face_ind, const int n */ std::vector SMDS_VtkVolume::GetQuantities() const { - vector quantities; - quantities.clear(); + std::vector quantities; SMDS_Mesh *mesh = SMDS_Mesh::_meshList[myMeshId]; vtkUnstructuredGrid* grid = mesh->getGrid(); vtkIdType aVtkType = grid->GetCellType(this->myVtkID); @@ -428,11 +427,62 @@ const SMDS_MeshNode* SMDS_VtkVolume::GetNode(const int ind) const { vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid(); vtkIdType aVtkType = grid->GetCellType(this->myVtkID); + if ( aVtkType == VTK_POLYHEDRON) + { + vtkIdType nFaces = 0; + vtkIdType* ptIds = 0; + grid->GetFaceStream(this->myVtkID, nFaces, ptIds); + int id = 0, nbPoints = 0; + for (int i = 0; i < nFaces; i++) + { + int nodesInFace = ptIds[id]; + if ( ind < nbPoints + nodesInFace ) + return SMDS_Mesh::_meshList[myMeshId]->FindNodeVtk( ptIds[ ind + i ]); + nbPoints += nodesInFace; + id += (nodesInFace + 1); + } + return 0; + } vtkIdType npts, *pts; grid->GetCellPoints( this->myVtkID, npts, pts ); const std::vector& interlace = SMDS_MeshCell::fromVtkOrder( VTKCellType( aVtkType )); return SMDS_Mesh::_meshList[myMeshId]->FindNodeVtk( pts[ interlace.empty() ? ind : interlace[ind]] ); } +/*! + * \brief Check if a node belongs to the element + * \param node - the node to check + * \retval int - node index within the element, -1 if not found + */ +int SMDS_VtkVolume::GetNodeIndex( const SMDS_MeshNode* node ) const +{ + vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid(); + const vtkIdType aVtkType = grid->GetCellType(this->myVtkID); + if ( aVtkType == VTK_POLYHEDRON) + { + vtkIdType nFaces = 0; + vtkIdType* ptIds = 0; + grid->GetFaceStream(this->myVtkID, 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; + } + vtkIdType npts, *pts; + grid->GetCellPoints( this->myVtkID, npts, pts ); + for ( vtkIdType i = 0; i < npts; ++i ) + if ( pts[i] == node->getVtkId() ) + { + const std::vector& interlace = SMDS_MeshCell::toVtkOrder( VTKCellType( aVtkType )); + return interlace.empty() ? i : interlace[i]; + } + return -1; +} bool SMDS_VtkVolume::IsQuadratic() const { @@ -507,7 +557,6 @@ bool SMDS_VtkVolume::IsMediumNode(const SMDS_MeshNode* node) const int SMDS_VtkVolume::NbCornerNodes() const { vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid(); - int nbN = grid->GetCell(myVtkID)->GetNumberOfPoints(); vtkIdType aVtkType = grid->GetCellType(myVtkID); switch (aVtkType) { @@ -518,7 +567,7 @@ int SMDS_VtkVolume::NbCornerNodes() const case VTK_TRIQUADRATIC_HEXAHEDRON: return 8; default:; } - return nbN; + return NbNodes(); } SMDSAbs_EntityType SMDS_VtkVolume::GetEntityType() const @@ -670,6 +719,6 @@ int SMDS_VtkVolume::NbUniqueNodes() const */ SMDS_ElemIteratorPtr SMDS_VtkVolume::uniqueNodesIterator() const { - MESSAGE("uniqueNodesIterator"); + //MESSAGE("uniqueNodesIterator"); return SMDS_ElemIteratorPtr(new SMDS_VtkCellIterator(SMDS_Mesh::_meshList[myMeshId], myVtkID, GetEntityType())); }