Salome HOME
Use TXyzIterator in Preparation()
authoreap <eap@opencascade.com>
Tue, 30 Mar 2010 12:29:24 +0000 (12:29 +0000)
committereap <eap@opencascade.com>
Tue, 30 Mar 2010 12:29:24 +0000 (12:29 +0000)
src/StdMeshers/StdMeshers_QuadToTriaAdaptor.cxx

index 826906151dbde85bd983d120fdda2c37b9f8a9cd..117a2cbe43fe145db243991572aa22cebfef1c12 100644 (file)
 #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
@@ -378,11 +383,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 +499,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));
@@ -715,10 +719,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
@@ -733,7 +733,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;
@@ -749,7 +749,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;