Salome HOME
Merge from V5_1_main 14/05/2010
[modules/smesh.git] / src / StdMeshers / StdMeshers_QuadToTriaAdaptor.cxx
index d0441576d082a21a7ac7935a4dda2c45726ae1be..1ca7e5b1283995c4f9f1002312b5f00df910c0f8 100644 (file)
@@ -1,7 +1,4 @@
-//  Copyright (C) 2007-2008  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
+//  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  SMESH SMESH : implementaion of SMESH idl descriptions
 // File      : StdMeshers_QuadToTriaAdaptor.cxx
 // Module    : SMESH
 #include <gp_Lin.hxx>
 #include <gp_Pln.hxx>
 
+#include <numeric>
+
 using namespace std;
 
 enum EQuadNature { NOT_QUAD, QUAD, DEGEN_QUAD };
 
+  // sdt-like iterator used to get coordinates of nodes of mesh element
+typedef SMDS_StdIterator< SMESH_MeshEditor::TNodeXYZ, SMDS_ElemIteratorPtr > TXyzIterator;
+
 //================================================================================
 /*!
  * \brief Destructor
@@ -84,7 +87,7 @@ static gp_Pnt FindBestPoint(const gp_Pnt& P1, const gp_Pnt& P2,
   if( a < (b+c)/2 )
     return PC;
   else {
-    // find shift along V in order to a became equal to (b+c)/2
+    // find shift along V in order a to became equal to (b+c)/2
     double shift = sqrt( a*a + (b*b-c*c)*(b*b-c*c)/16/a/a - (b*b+c*c)/2 );
     gp_Dir aDir(V);
     gp_Pnt Pbest = PC.XYZ() + aDir.XYZ() * shift;
@@ -378,11 +381,9 @@ int StdMeshers_QuadToTriaAdaptor::Preparation(const SMDS_MeshElement*       face
     if ( volumes[0] )
     {
       // get volume gc
-      gp_XYZ volGC(0,0,0);
       SMDS_ElemIteratorPtr nodeIt = volumes[0]->nodesIterator();
-      while ( nodeIt->more() )
-        volGC += SMESH_MeshEditor::TNodeXYZ( nodeIt->next() );
-      volGC /= volumes[0]->NbNodes();
+      gp_XYZ volGC(0,0,0);
+      volGC = accumulate( TXyzIterator(nodeIt), TXyzIterator(), volGC ) / volumes[0]->NbNodes();
 
       if ( VNorm * gp_Vec( PC, volGC ) < 0 )
         swap( volumes[0], volumes[1] );
@@ -496,6 +497,7 @@ bool StdMeshers_QuadToTriaAdaptor::Compute(SMESH_Mesh& aMesh, const TopoDS_Shape
           triaList.push_back( new SMDS_FaceOfNodes( NewNode, FNodes[i], FNodes[i+1] ));
 
         // create pyramid
+        if ( isRev ) swap( FNodes[1], FNodes[3]);
         SMDS_MeshVolume* aPyram =
           helper.AddVolume( FNodes[0], FNodes[1], FNodes[2], FNodes[3], NewNode );
         myPyram2Trias.insert(make_pair(aPyram, & triaList));
@@ -649,7 +651,8 @@ bool StdMeshers_QuadToTriaAdaptor::Compute(SMESH_Mesh& aMesh)
       const SMDS_MeshElement* F = *itF;
       if(F==face) continue;
       Handle(TColgp_HSequenceOfPnt) aContour = new TColgp_HSequenceOfPnt;
-      for ( i = 0; i < 4; ++i )
+      int nbN = F->NbNodes() / ( F->IsQuadratic() ? 2 : 1 );
+      for ( i = 0; i < nbN; ++i )
         aContour->Append( SMESH_MeshEditor::TNodeXYZ( F->GetNode(i) ));
       gp_Pnt intP;
       for ( int isRev = 0; isRev < 2; ++isRev )
@@ -714,10 +717,6 @@ bool StdMeshers_QuadToTriaAdaptor::Compute2ndPart(SMESH_Mesh& aMesh)
   if(myPyram2Trias.empty())
     return true;
 
-  // sdt-like iterator used to get coordinates of nodes of mesh element
-  typedef SMDS_StdIterator< SMESH_MeshEditor::TNodeXYZ, SMDS_ElemIteratorPtr > TXyzIterator;
-  TXyzIterator xyzEnd;
-
   int k = 0;
 
   // for each pyramid store list of merged pyramids with their faces
@@ -732,7 +731,7 @@ bool StdMeshers_QuadToTriaAdaptor::Compute2ndPart(SMESH_Mesh& aMesh)
     TPyram2Merged::iterator pMergesI = MergesInfo.find( PrmI );
 
     TXyzIterator xyzIt( PrmI->nodesIterator() );
-    vector<gp_Pnt> PsI( xyzIt, xyzEnd );
+    vector<gp_Pnt> PsI( xyzIt, TXyzIterator() );
 
     // compare PrmI with all the rest pyramids
     bool NeedMove = false;
@@ -748,7 +747,7 @@ bool StdMeshers_QuadToTriaAdaptor::Compute2ndPart(SMESH_Mesh& aMesh)
         continue; // already merged
 
       xyzIt = TXyzIterator( PrmJ->nodesIterator() );
-      vector<gp_Pnt> PsJ( xyzIt, xyzEnd );
+      vector<gp_Pnt> PsJ( xyzIt, TXyzIterator() );
 
       bool hasInt = false;
       gp_Pnt Pint;