Salome HOME
Merge of fix from V7_main
[modules/smesh.git] / src / SMDS / SMDS_Mesh.cxx
index fe6f186e496b9b33a9f76da95648fa5b9a0a5598..da6ecd8a30806db6660e9c689a800b0f95157053 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -53,6 +53,7 @@
 #include <map>
 #include <iostream>
 #include <fstream>
+#include <iterator>
 using namespace std;
 
 #ifndef WIN32
@@ -160,10 +161,10 @@ SMDS_Mesh::SMDS_Mesh()
   myGrid->Initialize();
   myGrid->Allocate();
   vtkPoints* points = vtkPoints::New();
-  // rnv: to fix bug "21125: EDF 1233 SMESH: Degrardation of precision in a test case for quadratic conversion"
-  // using double type for storing coordinates of nodes instead float.
+  // bug "21125: EDF 1233 SMESH: Degrardation of precision in a test case for quadratic conversion"
+  // Use double type for storing coordinates of nodes instead of float.
   points->SetDataType(VTK_DOUBLE);
-  points->SetNumberOfPoints(SMDS_Mesh::chunkSize);
+  points->SetNumberOfPoints(0 /*SMDS_Mesh::chunkSize*/);
   myGrid->SetPoints( points );
   points->Delete();
   myGrid->BuildLinks();
@@ -1597,6 +1598,9 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceFromVtkIdsWithID(const std::vector<vtkIdType>&
     case VTK_BIQUADRATIC_QUAD:
       myInfo.myNbBiQuadQuadrangles++;
       break;
+    case VTK_BIQUADRATIC_TRIANGLE:
+      myInfo.myNbBiQuadTriangles++;
+      break;
     case VTK_POLYGON:
       myInfo.myNbPolygons++;
       break;
@@ -1638,6 +1642,17 @@ bool SMDS_Mesh::registerElement(int ID, SMDS_MeshElement* element)
   return true;
 }
 
+//=======================================================================
+//function : MoveNode
+//purpose  : 
+//=======================================================================
+
+void SMDS_Mesh::MoveNode(const SMDS_MeshNode *n, double x, double y, double z)
+{
+  SMDS_MeshNode * node=const_cast<SMDS_MeshNode*>(n);
+  node->setXYZ(x,y,z);
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 /// Return the node whose SMDS ID is 'ID'.
 ///////////////////////////////////////////////////////////////////////////////
@@ -2446,7 +2461,7 @@ const SMDS_MeshElement* SMDS_Mesh::FindElement (const vector<const SMDS_MeshNode
             e = 0;
         }
         if ( e )
-          return static_cast<const SMDS_MeshFace *> (e);
+          return e;
       }
     }
   }
@@ -2656,6 +2671,13 @@ SMDS_Mesh::~SMDS_Mesh()
         myNodeIDFactory->ReleaseID(node->GetID(), node->getVtkId());
       }
   }
+  myGrid->Delete();
+
+  delete myNodePool;
+  delete myVolumePool;
+  delete myFacePool;
+  delete myEdgePool;
+  delete myBallPool;
 }
 
 //================================================================================
@@ -2688,50 +2710,56 @@ void SMDS_Mesh::Clear()
     myElementIDFactory->Clear();
     }
 
-  SMDS_ElemIteratorPtr itv = elementsIterator();
-  while (itv->more())
-    {
-      SMDS_MeshElement* elem = (SMDS_MeshElement*)(itv->next());
-      SMDSAbs_ElementType aType = elem->GetType();
-      switch (aType)
-      {
-        case SMDSAbs_0DElement:
-          delete elem;
-          break;
-        case SMDSAbs_Edge:
-           myEdgePool->destroy(static_cast<SMDS_VtkEdge*>(elem));
-          break;
-        case SMDSAbs_Face:
-          myFacePool->destroy(static_cast<SMDS_VtkFace*>(elem));
-          break;
-        case SMDSAbs_Volume:
-          myVolumePool->destroy(static_cast<SMDS_VtkVolume*>(elem));
-          break;
-        case SMDSAbs_Ball:
-          myBallPool->destroy(static_cast<SMDS_BallElement*>(elem));
-          break;
-        default:
-          break;
-      }
-    }
-  myCells.clear();
-  myCellIdVtkToSmds.clear();
-  //myCellIdSmdsToVtk.clear();
+  // SMDS_ElemIteratorPtr itv = elementsIterator();
+  // while (itv->more())
+  //   {
+  //     SMDS_MeshElement* elem = (SMDS_MeshElement*)(itv->next());
+  //     SMDSAbs_ElementType aType = elem->GetType();
+  //     switch (aType)
+  //     {
+  //       case SMDSAbs_0DElement:
+  //         delete elem;
+  //         break;
+  //       case SMDSAbs_Edge:
+  //          myEdgePool->destroy(static_cast<SMDS_VtkEdge*>(elem));
+  //         break;
+  //       case SMDSAbs_Face:
+  //         myFacePool->destroy(static_cast<SMDS_VtkFace*>(elem));
+  //         break;
+  //       case SMDSAbs_Volume:
+  //         myVolumePool->destroy(static_cast<SMDS_VtkVolume*>(elem));
+  //         break;
+  //       case SMDSAbs_Ball:
+  //         myBallPool->destroy(static_cast<SMDS_BallElement*>(elem));
+  //         break;
+  //       default:
+  //         break;
+  //     }
+  //   }
+  myVolumePool->clear();
+  myFacePool->clear();
+  myEdgePool->clear();
+  myBallPool->clear();
+
+  clearVector( myCells );
+  clearVector( myCellIdVtkToSmds );
 
   SMDS_NodeIteratorPtr itn = nodesIterator();
   while (itn->more())
     {
       SMDS_MeshNode *node = (SMDS_MeshNode*)(itn->next());
       node->SetPosition(SMDS_SpacePosition::originSpacePosition());
-      myNodePool->destroy(node);
+      //myNodePool->destroy(node);
     }
-  myNodes.clear();
+  myNodePool->clear();
+  clearVector( myNodes );
 
   list<SMDS_Mesh*>::iterator itc=myChildren.begin();
   while(itc!=myChildren.end())
     (*itc)->Clear();
 
   myModified = false;
+  myModifTime++;
   xmin = 0; xmax = 0;
   ymin = 0; ymax = 0;
   zmin = 0; zmax = 0;
@@ -3343,6 +3371,7 @@ void SMDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elem)
       myNodes[elemId] = 0;
       myInfo.myNbNodes--;
       ((SMDS_MeshNode*) n)->SetPosition(SMDS_SpacePosition::originSpacePosition());
+      ((SMDS_MeshNode*) n)->SMDS_MeshElement::init( -1, -1, -1 ); // avoid reuse
       myNodePool->destroy(static_cast<SMDS_MeshNode*>(todest));
       myNodeIDFactory->ReleaseID(elemId, vtkId);
     }
@@ -3677,6 +3706,94 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
 }
 
 
+//=======================================================================
+//function : AddFace
+//purpose  :
+//=======================================================================
+SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1,
+                                  const SMDS_MeshNode * n2,
+                                  const SMDS_MeshNode * n3,
+                                  const SMDS_MeshNode * n12,
+                                  const SMDS_MeshNode * n23,
+                                  const SMDS_MeshNode * n31,
+                                  const SMDS_MeshNode * nCenter)
+{
+  return SMDS_Mesh::AddFaceWithID(n1,n2,n3,n12,n23,n31,nCenter,
+                                  myElementIDFactory->GetFreeID());
+}
+
+//=======================================================================
+//function : AddFaceWithID
+//purpose  :
+//=======================================================================
+SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int n1, int n2, int n3,
+                                        int n12,int n23,int n31, int nCenter, int ID)
+{
+  return SMDS_Mesh::AddFaceWithID
+    ((SMDS_MeshNode *)myNodeIDFactory->MeshElement(n1) ,
+     (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n2) ,
+     (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n3) ,
+     (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n12),
+     (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n23),
+     (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n31),
+     (SMDS_MeshNode *)myNodeIDFactory->MeshElement(nCenter),
+     ID);
+}
+
+//=======================================================================
+//function : AddFaceWithID
+//purpose  :
+//=======================================================================
+SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
+                                        const SMDS_MeshNode * n2,
+                                        const SMDS_MeshNode * n3,
+                                        const SMDS_MeshNode * n12,
+                                        const SMDS_MeshNode * n23,
+                                        const SMDS_MeshNode * n31,
+                                        const SMDS_MeshNode * nCenter,
+                                        int ID)
+{
+  if ( !n1 || !n2 || !n3 || !n12 || !n23 || !n31 || !nCenter) return 0;
+  if(hasConstructionEdges()) {
+    // creation quadratic edges - not implemented
+    return 0;
+  }
+  else
+  {
+    // --- retrieve nodes ID
+    vector<vtkIdType> nodeIds;
+    nodeIds.clear();
+    nodeIds.push_back(n1->getVtkId());
+    nodeIds.push_back(n2->getVtkId());
+    nodeIds.push_back(n3->getVtkId());
+    nodeIds.push_back(n12->getVtkId());
+    nodeIds.push_back(n23->getVtkId());
+    nodeIds.push_back(n31->getVtkId());
+    nodeIds.push_back(nCenter->getVtkId());
+
+    SMDS_MeshFace * face = 0;
+    SMDS_VtkFace *facevtk = myFacePool->getNew();
+    facevtk->init(nodeIds, this);
+    if (!this->registerElement(ID,facevtk))
+      {
+        this->myGrid->GetCellTypesArray()->SetValue(facevtk->getVtkId(), VTK_EMPTY_CELL);
+        myFacePool->destroy(facevtk);
+        return 0;
+      }
+    face = facevtk;
+    adjustmyCellsCapacity(ID);
+    myCells[ID] = face;
+    myInfo.myNbBiQuadTriangles++;
+
+//    if (!registerElement(ID, face)) {
+//      RemoveElement(face, false);
+//      face = NULL;
+//    }
+    return face;
+  }
+}
+
+
 //=======================================================================
 //function : AddFace
 //purpose  :