Salome HOME
Add ConvertFromQuadratic()
[modules/smesh.git] / src / SMESH / SMESH_MeshEditor.cxx
index 8ac7037872db5a9e24d5c66280878e145488b7ff..ec4331f59c2c9bec481f10f23ceee2d1384c3341 100644 (file)
@@ -6023,6 +6023,62 @@ void SMESH_MeshEditor::ConvertToQuadratic(const bool theForce3d)
   delete aHelper;
 }
 
+//=======================================================================
+//function : ConvertFromQuadratic
+//purpose  :
+//=======================================================================
+bool  SMESH_MeshEditor::ConvertFromQuadratic()
+{
+  SMESHDS_Mesh* meshDS = GetMeshDS();
+  SMDS_ElemIteratorPtr aElemItr = meshDS->elementsIterator();
+  while(aElemItr->more())
+  {
+    const SMDS_MeshElement* elem = aElemItr->next();
+    if(elem)
+    {
+      if(!elem->IsQuadratic())
+        continue;
+      
+      int id = elem->GetID();
+
+      int nbNodes = elem->NbNodes();
+      vector<const SMDS_MeshNode *> aNds (nbNodes);
+
+      for(int i = 0; i < nbNodes; i++)
+      {
+       const SMDS_MeshNode* n = elem->GetNode(i);
+       if( elem->IsMediumNode( n ) )
+         meshDS->SMDS_Mesh::RemoveFreeElement( n );    
+       else 
+         aNds[i] = n;
+      }
+
+      SMDSAbs_ElementType aType = elem->GetType();      
+      RemoveElemFromGroups (elem, meshDS);
+      meshDS->SMDS_Mesh::RemoveFreeElement(elem);
+
+      SMDS_MeshElement * NewElem = 0;
+      switch(aType)
+      {
+        case SMDSAbs_Edge:
+         NewElem = meshDS->AddEdgeWithID( ,id );
+         break;
+       case SMDSAbs_Face:
+         if( nbNds==3 )NewElem = meshDS->AddFaceWithID( ,id );
+         if( nbNds==4 )NewElem = meshDS->AddFaceWithID( ,id );
+         break;
+       case SMDSAbs_Volume:
+         break;
+       default:
+         break;
+      }
+
+      AddToSameGroups(NewElem, elem, meshDS);
+    }
+  }
+  return true;
+}
+
 //=======================================================================
 //function : SewSideElements
 //purpose  :