From c656333fb4f2415a0b88821a721072f28b30a53a Mon Sep 17 00:00:00 2001 From: eap Date: Mon, 15 Jan 2018 17:20:17 +0300 Subject: [PATCH 1/1] IPAL54364: Add Gravity Center measurement --- idl/SMESH_Measurements.idl | 8 +++- src/SMESH_I/SMESH_Measurements_i.cxx | 55 ++++++++++++++++++++++++---- src/SMESH_I/SMESH_Measurements_i.hxx | 9 ++++- src/SMESH_SWIG/smeshBuilder.py | 12 ++++++ 4 files changed, 73 insertions(+), 11 deletions(-) diff --git a/idl/SMESH_Measurements.idl b/idl/SMESH_Measurements.idl index cb6d68acf..d3a9c77f4 100644 --- a/idl/SMESH_Measurements.idl +++ b/idl/SMESH_Measurements.idl @@ -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 diff --git a/src/SMESH_I/SMESH_Measurements_i.cxx b/src/SMESH_I/SMESH_Measurements_i.cxx index d5ddc864c..ca0103c01 100644 --- a/src/SMESH_I/SMESH_Measurements_i.cxx +++ b/src/SMESH_I/SMESH_Measurements_i.cxx @@ -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; @@ -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; +} diff --git a/src/SMESH_I/SMESH_Measurements_i.hxx b/src/SMESH_I/SMESH_Measurements_i.hxx index 1b2fcc7b0..bb696eb92 100644 --- a/src/SMESH_I/SMESH_Measurements_i.hxx +++ b/src/SMESH_I/SMESH_Measurements_i.hxx @@ -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); }; } diff --git a/src/SMESH_SWIG/smeshBuilder.py b/src/SMESH_SWIG/smeshBuilder.py index 6a1a4e1df..270d5946b 100644 --- a/src/SMESH_SWIG/smeshBuilder.py +++ b/src/SMESH_SWIG/smeshBuilder.py @@ -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 -- 2.30.2