]> SALOME platform Git repositories - modules/smesh.git/commitdiff
Salome HOME
Optimize SMDS_MeshElement::GetNodeIndex()
authoreap <eap@opencascade.com>
Mon, 29 Jul 2013 11:49:21 +0000 (11:49 +0000)
committereap <eap@opencascade.com>
Mon, 29 Jul 2013 11:49:21 +0000 (11:49 +0000)
+  virtual int GetNodeIndex( const SMDS_MeshNode* node ) const;

src/SMDS/SMDS_VtkFace.cxx
src/SMDS/SMDS_VtkFace.hxx
src/SMDS/SMDS_VtkVolume.cxx
src/SMDS/SMDS_VtkVolume.hxx

index 56787bda0c232b07520ca874f95269b23a248763..3d5e82fee2ebf71788e16dc1d2d088ec9cc140ec 100644 (file)
@@ -161,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();
index 5fc10324db3b5b79c2bb0860747cab46eb26967b..f62b86c0067619ae06d817bd6140d8f7d3151426 100644 (file)
@@ -47,6 +47,7 @@ public:
   virtual SMDSAbs_EntityType   GetEntityType() const;
   virtual SMDSAbs_GeometryType GetGeomType() const;
   virtual const SMDS_MeshNode* GetNode(const int ind) const;
+  virtual int GetNodeIndex( const SMDS_MeshNode* node ) const;
 
   virtual bool IsQuadratic() const;
   virtual bool IsPoly() const;
index 3db0ba03ba7ce9549c07a631b98cd4a8bf6b293a..22f5de67ed250c3a277dd5828ff649fafc806598 100644 (file)
@@ -448,6 +448,42 @@ const SMDS_MeshNode* SMDS_VtkVolume::GetNode(const int ind) const
   const std::vector<int>& 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, nbPoints = 0;
+    for (int iF = 0; iF < nFaces; iF++)
+    {
+      int nodesInFace = ptIds[id];
+      for ( vtkIdType i = 0; i < nodesInFace; ++i )
+        if ( ptIds[id+i] == node->getVtkId() )
+          return id+i-iF;
+      nbPoints += nodesInFace;
+      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<int>& interlace = SMDS_MeshCell::toVtkOrder( VTKCellType( aVtkType ));
+      return interlace.empty() ? i : interlace[i];
+    }
+  return -1;
+}
 
 bool SMDS_VtkVolume::IsQuadratic() const
 {
index 63c41ecb717c82c4bb48eb69e430cb70db53479f..827f17fd75c552c85352fed5a5d1205285e67d64 100644 (file)
@@ -56,6 +56,7 @@ public:
   virtual SMDSAbs_EntityType   GetEntityType() const;
   virtual SMDSAbs_GeometryType GetGeomType() const;
   virtual const SMDS_MeshNode* GetNode(const int ind) const;
+  virtual int GetNodeIndex( const SMDS_MeshNode* node ) const;
   virtual bool IsQuadratic() const;
   virtual bool IsPoly() const;
   virtual bool IsMediumNode(const SMDS_MeshNode* node) const;