-// 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
//
// 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
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;
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] );
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));
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 )
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
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;
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;