IPAL54364: Add Gravity Center measurement

This commit is contained in:
eap 2018-01-15 17:20:17 +03:00
parent 7a713be33b
commit c656333fb4
4 changed files with 74 additions and 12 deletions

View File

@ -31,7 +31,6 @@
module SMESH
{
/*
* Measure component
*/
@ -70,7 +69,12 @@ module SMESH
* sum of volume of 3D elements of the source
*/
double Volume(in SMESH_IDSource source);
/*!
* gravity center of the source
*/
PointStruct GravityCenter(in SMESH_IDSource source);
};
};
};
#endif

View File

@ -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_Mesh.hxx"
#include "SMDS_MeshNode.hxx"
#include "SMDS_MeshElement.hxx"
#include "SMDS_ElemIterator.hxx"
#include "SMDS_Mesh.hxx"
#include "SMDS_MeshElement.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;
@ -308,3 +307,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;
}

View File

@ -67,12 +67,17 @@ namespace SMESH
/*!
* sum of area of 2D elements of the source
*/
double Area(SMESH::SMESH_IDSource_ptr);
double Area(SMESH::SMESH_IDSource_ptr theSource);
/*!
* sum of volume of 3D elements of the source
*/
double Volume(SMESH::SMESH_IDSource_ptr);
double Volume(SMESH::SMESH_IDSource_ptr theSource);
/*!
* gravity center of the source
*/
SMESH::PointStruct GravityCenter(SMESH::SMESH_IDSource_ptr theSource);
};
}

View File

@ -1155,6 +1155,18 @@ class smeshBuilder(object, SMESH._objref_SMESH_Gen):
aMeasurements.UnRegister()
return value
## Get gravity center of all nodes of the mesh object.
# @param obj mesh, submesh or group
# @return three components of the gravity center: x,y,z
# @ingroup l1_measurements
def GetGravityCenter(self, obj):
if isinstance(obj, Mesh): obj = obj.mesh
if isinstance(obj, Mesh_Algorithm): obj = obj.GetSubMesh()
aMeasurements = self.CreateMeasurements()
pointStruct = aMeasurements.GravityCenter(obj)
aMeasurements.UnRegister()
return pointStruct.x, pointStruct.y, pointStruct.z
pass # end of class smeshBuilder
import omniORB