Salome HOME
IPAL54364: Add Gravity Center measurement
authoreap <eap@opencascade.com>
Mon, 15 Jan 2018 14:20:17 +0000 (17:20 +0300)
committereap <eap@opencascade.com>
Mon, 15 Jan 2018 14:20:17 +0000 (17:20 +0300)
idl/SMESH_Measurements.idl
src/SMESH_I/SMESH_Measurements_i.cxx
src/SMESH_I/SMESH_Measurements_i.hxx
src/SMESH_SWIG/smeshBuilder.py

index cb6d68a..d3a9c77 100644 (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
index d5ddc86..ca0103c 100644 (file)
 
 #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;
+}
index 1b2fcc7..bb696eb 100644 (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);
   };
 }
 
index 6a1a4e1..270d594 100644 (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