Salome HOME
52566]: TC7.5.0: Empty group of Balls at Diameter Equal to filter
[modules/smesh.git] / src / SMDS / SMDS_VtkFace.cxx
index 80644c7e2ab6b2f9869d7755b043da4876fb52fc..c0bf69cc766d0cde482af656c7624f613cd507ba 100644 (file)
@@ -1,9 +1,9 @@
-// Copyright (C) 2010-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2010-2014  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
@@ -64,6 +64,9 @@ void SMDS_VtkFace::init(const std::vector<vtkIdType>& nodeIds, SMDS_Mesh* mesh)
     case 9:
       aType = VTK_BIQUADRATIC_QUAD;
       break;
+    case 7:
+      aType = VTK_BIQUADRATIC_TRIANGLE;
+      break;
     default:
       aType = VTK_POLYGON;
       break;
@@ -116,6 +119,7 @@ int SMDS_VtkFace::NbEdges() const
   {
     case VTK_TRIANGLE:
     case VTK_QUADRATIC_TRIANGLE:
+    case VTK_BIQUADRATIC_TRIANGLE:
       nbEdges = 3;
       break;
     case VTK_QUAD:
@@ -157,6 +161,22 @@ SMDS_VtkFace::GetNode(const int ind) const
   return SMDS_Mesh::_meshList[myMeshId]->FindNodeVtk( pts[ 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_VtkFace::GetNodeIndex( const SMDS_MeshNode* node ) const
+{
+  vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
+  vtkIdType npts, *pts;
+  grid->GetCellPoints( this->myVtkID, npts, pts );
+  for ( vtkIdType i = 0; i < npts; ++i )
+    if ( pts[i] == node->getVtkId() )
+      return i;
+  return -1;
+}
+
 bool SMDS_VtkFace::IsQuadratic() const
 {
   vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
@@ -167,6 +187,7 @@ bool SMDS_VtkFace::IsQuadratic() const
     case VTK_QUADRATIC_TRIANGLE:
     case VTK_QUADRATIC_QUAD:
     case VTK_BIQUADRATIC_QUAD:
+    case VTK_BIQUADRATIC_TRIANGLE:
       return true;
       break;
     default:
@@ -189,6 +210,7 @@ bool SMDS_VtkFace::IsMediumNode(const SMDS_MeshNode* node) const
   switch (aVtkType)
   {
     case VTK_QUADRATIC_TRIANGLE:
+    case VTK_BIQUADRATIC_TRIANGLE:
       rankFirstMedium = 3; // medium nodes are of rank 3,4,5
       break;
     case VTK_QUADRATIC_QUAD:
@@ -245,13 +267,13 @@ SMDSAbs_GeometryType SMDS_VtkFace::GetGeomType() const
   switch ( aVtkType ) {
   case VTK_TRIANGLE:
   case VTK_QUADRATIC_TRIANGLE:
-    return SMDSGeom_TRIANGLE;
+  case VTK_BIQUADRATIC_TRIANGLE: return SMDSGeom_TRIANGLE;
+
   case VTK_QUAD:
   case VTK_QUADRATIC_QUAD:
-  case VTK_BIQUADRATIC_QUAD:
-    return SMDSGeom_QUADRANGLE;
-  case VTK_POLYGON:
-    return SMDSGeom_POLYGON;
+  case VTK_BIQUADRATIC_QUAD: return SMDSGeom_QUADRANGLE;
+
+  case VTK_POLYGON: return SMDSGeom_POLYGON;
   default:;
   }
   return SMDSGeom_NONE;
@@ -277,14 +299,14 @@ SMDS_ElemIteratorPtr SMDS_VtkFace::elementsIterator(SMDSAbs_ElementType type) co
   }
 }
 
-SMDS_ElemIteratorPtr SMDS_VtkFace::nodesIteratorToUNV() const
+SMDS_NodeIteratorPtr SMDS_VtkFace::nodesIteratorToUNV() const
 {
-  return SMDS_ElemIteratorPtr(new SMDS_VtkCellIteratorToUNV(SMDS_Mesh::_meshList[myMeshId], myVtkID, GetEntityType()));
+  return SMDS_NodeIteratorPtr(new SMDS_VtkCellIteratorToUNV(SMDS_Mesh::_meshList[myMeshId], myVtkID, GetEntityType()));
 }
 
-SMDS_ElemIteratorPtr SMDS_VtkFace::interlacedNodesElemIterator() const
+SMDS_NodeIteratorPtr SMDS_VtkFace::interlacedNodesIterator() const
 {
-  return SMDS_ElemIteratorPtr(new SMDS_VtkCellIteratorToUNV(SMDS_Mesh::_meshList[myMeshId], myVtkID, GetEntityType()));
+  return nodesIteratorToUNV();
 }
 
 //! change only the first node, used for temporary triangles in quadrangle to triangle adaptor