Salome HOME
PAL7358. Now Reorient() can work with edge, faces and volumes
authoreap <eap@opencascade.com>
Fri, 21 Jan 2005 12:16:32 +0000 (12:16 +0000)
committereap <eap@opencascade.com>
Fri, 21 Jan 2005 12:16:32 +0000 (12:16 +0000)
src/SMESH/SMESH_MeshEditor.cxx
src/SMESH/SMESH_MeshEditor.hxx

index d71d4efdc67ab8cad8fc43fb9b3bd1e7ee70caec..b884dcd533a7937fa902133b0c0abfe7072457db 100644 (file)
@@ -470,34 +470,40 @@ bool SMESH_MeshEditor::DeleteDiag (const SMDS_MeshNode * theNode1,
 
 //=======================================================================
 //function : Reorient
-//purpose  : Reverse the normal of theFace
-//           Return false if theFace is null
+//purpose  : Reverse theElement orientation
 //=======================================================================
 
-bool SMESH_MeshEditor::Reorient (const SMDS_MeshElement * theFace)
+bool SMESH_MeshEditor::Reorient (const SMDS_MeshElement * theElem)
 {
-  if (!theFace) return false;
-  const SMDS_FaceOfNodes* F = dynamic_cast<const SMDS_FaceOfNodes*>( theFace );
-  if (!F) return false;
-
-  const SMDS_MeshNode* aNodes [4], *tmpNode;
-  int i = 0;
-  SMDS_ElemIteratorPtr it = theFace->nodesIterator();
-  while ( it->more() )
-    aNodes[ i++ ] = static_cast<const SMDS_MeshNode*>( it->next() );
-
-  // exchange nodes with indeces 0 and 2
-  tmpNode = aNodes[ 0 ];
-  aNodes[ 0 ] = aNodes[ 2 ];
-  aNodes[ 2 ] = tmpNode;
-
-  //MESSAGE( theFace );
-
-  GetMeshDS()->ChangeElementNodes( theFace, aNodes, theFace->NbNodes() );
+  if (!theElem)
+    return false;
+  SMDS_ElemIteratorPtr it = theElem->nodesIterator();
+  if ( !it || !it->more() )
+    return false;
 
-  //MESSAGE( theFace );
+  switch ( theElem->GetType() ) {
+    
+  case SMDSAbs_Edge:
+  case SMDSAbs_Face:
+  {
+    int i = theElem->NbNodes();
+    vector<const SMDS_MeshNode*> aNodes( i );
+    while ( it->more() )
+      aNodes[ --i ]= static_cast<const SMDS_MeshNode*>( it->next() );
+    return GetMeshDS()->ChangeElementNodes( theElem, &aNodes[0], theElem->NbNodes() );
+  }
+  case SMDSAbs_Volume:
+  {
+    SMDS_VolumeTool vTool;
+    if ( !vTool.Set( theElem ))
+      return false;
+    vTool.Inverse();
+    return GetMeshDS()->ChangeElementNodes( theElem, vTool.GetNodes(), vTool.NbNodes() );
+  }
+  default:;
+  }
 
-  return true;
+  return false;
 }
 
 //=======================================================================
index fecb8b3bcff5e4374e52c3c817f9e31e11e6a049..677d9c033596a54021628fd99c3ebe8e4c13fa25 100644 (file)
@@ -70,9 +70,8 @@ class SMESH_MeshEditor {
   // with a quadrangle built on the same 4 nodes.
   // Return false if proper faces not found
 
-  bool Reorient (const SMDS_MeshElement * theFace);
-  // Reverse the normal of theFace
-  // Return false if theFace is null
+  bool Reorient (const SMDS_MeshElement * theElement);
+  // Reverse theElement orientation
 
 
   bool TriToQuad (std::set<const SMDS_MeshElement*> &  theElems,