X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_Measurements_i.cxx;h=2fcac5a7f9122551b4efb276f0f3c77fd0daf3a0;hb=4f62bd06834539d8d81339ead532cbceef3646d8;hp=b3e832b4543deea9a7594b0a604b37c514b2c5a7;hpb=d422f17c1dcf6bbe2f9479653e5d1089155e4fc2;p=modules%2Fsmesh.git diff --git a/src/SMESH_I/SMESH_Measurements_i.cxx b/src/SMESH_I/SMESH_Measurements_i.cxx index b3e832b45..2fcac5a7f 100644 --- a/src/SMESH_I/SMESH_Measurements_i.cxx +++ b/src/SMESH_I/SMESH_Measurements_i.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -28,16 +28,15 @@ #include "SMESH_Measurements_i.hxx" -#include "SMESH_Gen_i.hxx" -#include "SMESH_Filter_i.hxx" -#include "SMESH_PythonDump.hxx" - +#include "SMDS_ElemIterator.hxx" #include "SMDS_Mesh.hxx" -#include "SMDS_MeshNode.hxx" #include "SMDS_MeshElement.hxx" -#include "SMDS_ElemIterator.hxx" - +#include "SMDS_MeshNode.hxx" #include "SMESHDS_Mesh.hxx" +#include "SMESH_Filter_i.hxx" +#include "SMESH_Gen_i.hxx" +#include "SMESH_MeshAlgos.hxx" +#include "SMESH_PythonDump.hxx" using namespace SMESH; @@ -256,16 +255,13 @@ static void enlargeBoundingBox(const SMESH::SMESH_IDSource_ptr theObject, enlargeBoundingBox( aMesh->FindNode( aElementsId[i] ), theMeasure); else { - const SMDS_MeshElement* elem = aMesh->FindElement( aElementsId[i] ); - if (!elem) - continue; - SMDS_ElemIteratorPtr aNodeIter = elem->nodesIterator(); - while( aNodeIter->more() ) - enlargeBoundingBox( dynamic_cast( aNodeIter->next() ), theMeasure); + if ( const SMDS_MeshElement* elem = aMesh->FindElement( aElementsId[i] )) + for (SMDS_NodeIteratorPtr aNodeIter = elem->nodeIterator(); aNodeIter->more(); ) + enlargeBoundingBox( aNodeIter->next(), theMeasure); } } } - + //======================================================================= // name : BoundingBox // Purpose : compute common bounding box of entities @@ -308,3 +304,45 @@ double Measurements_i::Volume(SMESH::SMESH_IDSource_ptr theSource) { return getNumericalValue( theSource, SMESH::Controls::NumericalFunctorPtr(new SMESH::Controls::Volume()) ); } + +//======================================================================= +//function : GravityCenter +//purpose : return gravity center of the source: average coordinates of all nodes +//======================================================================= + +SMESH::PointStruct Measurements_i::GravityCenter(SMESH::SMESH_IDSource_ptr theSource) +{ + SMESH::PointStruct grCenter = { 0.,0.,0. }; + const SMESHDS_Mesh* mesh = getMesh( theSource ); + if ( !mesh ) + return grCenter; + + // unmark all nodes; visited nodes will be marked + SMESH_MeshAlgos::MarkElems( mesh->nodesIterator(), /*isMarked=*/false ); + + gp_XYZ sumCoord( 0,0,0 ); + int nodeCount = 0; + + SMDS_ElemIteratorPtr eIt = SMESH_Mesh_i::GetElements( theSource, SMESH::ALL ); + while ( eIt->more() ) + { + const SMDS_MeshElement* elem = eIt->next(); + for ( SMDS_NodeIteratorPtr nIt = elem->nodeIterator(); nIt->more(); ) + { + const SMDS_MeshNode* n = nIt->next(); + if ( !n->isMarked() ) + { + sumCoord += SMESH_NodeXYZ( n ); + ++nodeCount; + n->setIsMarked( true ); + } + } + } + sumCoord /= nodeCount; + + grCenter.x = sumCoord.X(); + grCenter.y = sumCoord.Y(); + grCenter.z = sumCoord.Z(); + + return grCenter; +}