mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-12 17:50:34 +05:00
IPAL54364: Add Gravity Center measurement
This commit is contained in:
parent
7a713be33b
commit
c656333fb4
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user