Salome HOME
0021893: EDF 2133 SMESH : Improvement of 3D extrusion algorithm
[modules/smesh.git] / src / SMDS / SMDS_VtkFace.cxx
index 79a087709d43857ffb2a97618b225385f24eb62d..80644c7e2ab6b2f9869d7755b043da4876fb52fc 100644 (file)
@@ -1,3 +1,22 @@
+// Copyright (C) 2010-2012  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.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
 #include "SMDS_VtkFace.hxx"
 #include "SMDS_MeshNode.hxx"
 #include "SMDS_Mesh.hxx"
@@ -13,7 +32,7 @@ SMDS_VtkFace::SMDS_VtkFace()
 {
 }
 
-SMDS_VtkFace::SMDS_VtkFace(std::vector<vtkIdType> nodeIds, SMDS_Mesh* mesh)
+SMDS_VtkFace::SMDS_VtkFace(const std::vector<vtkIdType>& nodeIds, SMDS_Mesh* mesh)
 {
   init(nodeIds, mesh);
 }
@@ -22,10 +41,10 @@ SMDS_VtkFace::~SMDS_VtkFace()
 {
 }
 
-void SMDS_VtkFace::init(std::vector<vtkIdType> nodeIds, SMDS_Mesh* mesh)
+void SMDS_VtkFace::init(const std::vector<vtkIdType>& nodeIds, SMDS_Mesh* mesh)
 {
+  SMDS_MeshFace::init();
   vtkUnstructuredGrid* grid = mesh->getGrid();
-  myIdInShape = -1;
   myMeshId = mesh->getMeshId();
   vtkIdType aType = VTK_TRIANGLE;
   switch (nodeIds.size())
@@ -42,21 +61,24 @@ void SMDS_VtkFace::init(std::vector<vtkIdType> nodeIds, SMDS_Mesh* mesh)
     case 8:
       aType = VTK_QUADRATIC_QUAD;
       break;
+    case 9:
+      aType = VTK_BIQUADRATIC_QUAD;
+      break;
     default:
       aType = VTK_POLYGON;
       break;
   }
-  myVtkID = grid->InsertNextLinkedCell(aType, nodeIds.size(), &nodeIds[0]);
+  myVtkID = grid->InsertNextLinkedCell(aType, nodeIds.size(), (vtkIdType*) &nodeIds[0]);
   mesh->setMyModified();
   //MESSAGE("SMDS_VtkFace::init myVtkID " << myVtkID);
 }
 
-void SMDS_VtkFace::initPoly(std::vector<vtkIdType> nodeIds, SMDS_Mesh* mesh)
+void SMDS_VtkFace::initPoly(const std::vector<vtkIdType>& nodeIds, SMDS_Mesh* mesh)
 {
+  SMDS_MeshFace::init();
   vtkUnstructuredGrid* grid = mesh->getGrid();
-  myIdInShape = -1;
   myMeshId = mesh->getMeshId();
-  myVtkID = grid->InsertNextLinkedCell(VTK_POLYGON, nodeIds.size(), &nodeIds[0]);
+  myVtkID = grid->InsertNextLinkedCell(VTK_POLYGON, nodeIds.size(), (vtkIdType*) &nodeIds[0]);
   mesh->setMyModified();
 }
 
@@ -98,6 +120,7 @@ int SMDS_VtkFace::NbEdges() const
       break;
     case VTK_QUAD:
     case VTK_QUADRATIC_QUAD:
+    case VTK_BIQUADRATIC_QUAD:
       nbEdges = 4;
       break;
     case VTK_POLYGON:
@@ -128,7 +151,10 @@ int SMDS_VtkFace::NbNodes() const
 const SMDS_MeshNode*
 SMDS_VtkFace::GetNode(const int ind) const
 {
-  return SMDS_MeshElement::GetNode(ind); // --- a optimiser !
+  vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
+  vtkIdType npts, *pts;
+  grid->GetCellPoints( this->myVtkID, npts, pts );
+  return SMDS_Mesh::_meshList[myMeshId]->FindNodeVtk( pts[ ind ]);
 }
 
 bool SMDS_VtkFace::IsQuadratic() const
@@ -140,6 +166,7 @@ bool SMDS_VtkFace::IsQuadratic() const
   {
     case VTK_QUADRATIC_TRIANGLE:
     case VTK_QUADRATIC_QUAD:
+    case VTK_BIQUADRATIC_QUAD:
       return true;
       break;
     default:
@@ -165,6 +192,7 @@ bool SMDS_VtkFace::IsMediumNode(const SMDS_MeshNode* node) const
       rankFirstMedium = 3; // medium nodes are of rank 3,4,5
       break;
     case VTK_QUADRATIC_QUAD:
+    case VTK_BIQUADRATIC_QUAD:
       rankFirstMedium = 4; // medium nodes are of rank 4,5,6,7
       break;
     default:
@@ -193,29 +221,40 @@ bool SMDS_VtkFace::IsMediumNode(const SMDS_MeshNode* node) const
   return false;
 }
 
+int SMDS_VtkFace::NbCornerNodes() const
+{
+  vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
+  int       nbPoints = grid->GetCell(myVtkID)->GetNumberOfPoints();
+  vtkIdType aVtkType = grid->GetCellType(myVtkID);
+  if ( aVtkType != VTK_POLYGON )
+    return nbPoints <= 4 ? nbPoints : nbPoints / 2;
+  return nbPoints;
+}
+
 SMDSAbs_EntityType SMDS_VtkFace::GetEntityType() const
 {
   vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
   vtkIdType aVtkType = grid->GetCellType(this->myVtkID);
-  SMDSAbs_EntityType aType = SMDSEntity_Polygon;
-  switch (aVtkType)
-  {
-    case VTK_TRIANGLE:
-      aType = SMDSEntity_Triangle;
-      break;
-    case VTK_QUAD:
-      aType = SMDSEntity_Quadrangle;
-      break;
-    case VTK_QUADRATIC_TRIANGLE:
-      aType = SMDSEntity_Quad_Triangle;
-      break;
-    case VTK_QUADRATIC_QUAD:
-      aType = SMDSEntity_Quad_Quadrangle;
-      break;
-    default:
-      aType = SMDSEntity_Polygon;
+  return SMDS_MeshCell::toSmdsType( VTKCellType( aVtkType ));
+}
+
+SMDSAbs_GeometryType SMDS_VtkFace::GetGeomType() const
+{
+  vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
+  vtkIdType aVtkType = grid->GetCellType(this->myVtkID);
+  switch ( aVtkType ) {
+  case VTK_TRIANGLE:
+  case VTK_QUADRATIC_TRIANGLE:
+    return SMDSGeom_TRIANGLE;
+  case VTK_QUAD:
+  case VTK_QUADRATIC_QUAD:
+  case VTK_BIQUADRATIC_QUAD:
+    return SMDSGeom_QUADRANGLE;
+  case VTK_POLYGON:
+    return SMDSGeom_POLYGON;
+  default:;
   }
-  return aType;
+  return SMDSGeom_NONE;
 }
 
 vtkIdType SMDS_VtkFace::GetVtkType() const
@@ -249,7 +288,7 @@ SMDS_ElemIteratorPtr SMDS_VtkFace::interlacedNodesElemIterator() const
 }
 
 //! change only the first node, used for temporary triangles in quadrangle to triangle adaptor
-void SMDS_VtkFace::ChangeApex(const SMDS_MeshNode* node)
+void SMDS_VtkFace::ChangeApex(SMDS_MeshNode* node)
 {
   vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
   vtkIdType npts = 0;
@@ -257,6 +296,6 @@ void SMDS_VtkFace::ChangeApex(const SMDS_MeshNode* node)
   grid->GetCellPoints(myVtkID, npts, pts);
   grid->RemoveReferenceToCell(pts[0], myVtkID);
   pts[0] = node->getVtkId();
-  grid->AddReferenceToCell(pts[0], myVtkID);
+  node->AddInverseElement(this),
   SMDS_Mesh::_meshList[myMeshId]->setMyModified();
 }