diff --git a/doc/salome/examples/Makefile.am b/doc/salome/examples/Makefile.am
index 94c233a75..1846b16a2 100644
--- a/doc/salome/examples/Makefile.am
+++ b/doc/salome/examples/Makefile.am
@@ -110,6 +110,7 @@ GOOD_TESTS = \
grouping_elements_ex08.py \
measurements_ex01.py \
measurements_ex02.py \
+ measurements_ex03.py \
modifying_meshes_ex01.py \
modifying_meshes_ex02.py \
modifying_meshes_ex03.py \
diff --git a/doc/salome/examples/measurements_ex03.py b/doc/salome/examples/measurements_ex03.py
new file mode 100644
index 000000000..ef15e7e25
--- /dev/null
+++ b/doc/salome/examples/measurements_ex03.py
@@ -0,0 +1,34 @@
+# Basic Properties
+
+
+import salome
+salome.salome_init()
+import GEOM
+from salome.geom import geomBuilder
+geompy = geomBuilder.New(salome.myStudy)
+
+import SMESH, SALOMEDS
+from salome.smesh import smeshBuilder
+smesh = smeshBuilder.New(salome.myStudy)
+import salome_notebook
+
+from SMESH_mechanic import mesh as mesh1
+
+mesh1.Compute()
+
+# compute length for mesh1
+length = mesh1.GetLength()
+
+# compute area for mesh1
+area = mesh1.GetArea()
+
+# compute volume for mesh1
+volume = mesh1.GetVolume()
+
+# print basic properties
+print
+print "Basic Properties for mesh:"
+print "* length =", length
+print "* area =", area
+print "* volume =", volume
+print
diff --git a/doc/salome/gui/SMESH/images/basic_props.png b/doc/salome/gui/SMESH/images/basic_props.png
new file mode 100644
index 000000000..bba200d09
Binary files /dev/null and b/doc/salome/gui/SMESH/images/basic_props.png differ
diff --git a/doc/salome/gui/SMESH/images/bnd_box.png b/doc/salome/gui/SMESH/images/bnd_box.png
index 6761a76ff..d079eaaa4 100644
Binary files a/doc/salome/gui/SMESH/images/bnd_box.png and b/doc/salome/gui/SMESH/images/bnd_box.png differ
diff --git a/doc/salome/gui/SMESH/images/min_distance.png b/doc/salome/gui/SMESH/images/min_distance.png
index 765522e88..486dab376 100644
Binary files a/doc/salome/gui/SMESH/images/min_distance.png and b/doc/salome/gui/SMESH/images/min_distance.png differ
diff --git a/doc/salome/gui/SMESH/input/measurements.doc b/doc/salome/gui/SMESH/input/measurements.doc
index 6514cf287..0787b7c20 100644
--- a/doc/salome/gui/SMESH/input/measurements.doc
+++ b/doc/salome/gui/SMESH/input/measurements.doc
@@ -64,6 +64,32 @@ viewer.
\image html bnd_box_preview.png
+\section basic_properties_anchor Basic Properties
+
+This operation allows calculation of length, area or volume for the the selected
+object:
+- Length is calculated as a sum of length of all 1D elements;
+- Area id a sum of area of all 2D elements
+- Volume is a sum of volume of all 3D elements.
+
+To start one of Basic Properties calculations, select Length, Area
+or Volume item from Measurements - Basic Properties menu.
+
+\image html basic_props.png
+
+In the dialog box select the required type of calculation (length, area or volume), select
+the the object (mesh, sub-mesh or group) and press \em Compute button.
+
+The result of calculation will be shown in the bottom area of the
+dialog box.
+
+\note
+- If mesh consists of 3D elements only, its "length" and "area" will be 0.
+- As calculation result is a sum of length, area and volume of all mesh elements,
+ duplications are not taken into account; i.e. all duplicated elements
+ (elements built on the same set of nodes) will be included into the result.
+- Similarly, intersection of elements is not taken into account.
+
See Also a sample TUI Script of a
\ref tui_measurements_page "Measurement operations".
diff --git a/doc/salome/gui/SMESH/input/tui_measurements.doc b/doc/salome/gui/SMESH/input/tui_measurements.doc
index 4d25c7358..950cc2aba 100644
--- a/doc/salome/gui/SMESH/input/tui_measurements.doc
+++ b/doc/salome/gui/SMESH/input/tui_measurements.doc
@@ -8,4 +8,7 @@
\section tui_bounding_box Bounding Box
\tui_script{measurements_ex02.py}
+\section tui_bounding_box Basic Properties
+\tui_script{measurements_ex03.py}
+
*/
diff --git a/idl/SMESH_Measurements.idl b/idl/SMESH_Measurements.idl
index becc67547..43e5bf2bc 100644
--- a/idl/SMESH_Measurements.idl
+++ b/idl/SMESH_Measurements.idl
@@ -55,6 +55,21 @@ module SMESH
* common bounding box of entities
*/
Measure BoundingBox(in ListOfIDSources sources);
+
+ /*!
+ * sum of length of 1D elements of the source
+ */
+ double Length(in SMESH_IDSource source);
+
+ /*!
+ * sum of area of 2D elements of the source
+ */
+ double Area(in SMESH_IDSource source);
+
+ /*!
+ * sum of volume of 3D elements of the source
+ */
+ double Volume(in SMESH_IDSource source);
};
};
diff --git a/resources/Makefile.am b/resources/Makefile.am
index 7a057d202..786c3cd48 100644
--- a/resources/Makefile.am
+++ b/resources/Makefile.am
@@ -208,7 +208,11 @@ dist_salomeres_DATA = \
mesh_min_dist.png \
reorient_faces_point.png \
reorient_faces_face.png \
- mesh_ball.png
+ mesh_ball.png \
+ mesh_measure_basic_props.png \
+ mesh_measure_length.png \
+ mesh_measure_area.png \
+ mesh_measure_volume.png
# VSR: little trick to avoid putting if SMESHCatalog.xml to the distribution archive
nodist_salomeres_SCRIPTS = SMESHCatalog.xml SalomeApp.xml
diff --git a/resources/mesh_measure_area.png b/resources/mesh_measure_area.png
new file mode 100644
index 000000000..72d292be9
Binary files /dev/null and b/resources/mesh_measure_area.png differ
diff --git a/resources/mesh_measure_basic_props.png b/resources/mesh_measure_basic_props.png
new file mode 100644
index 000000000..4d7ed1378
Binary files /dev/null and b/resources/mesh_measure_basic_props.png differ
diff --git a/resources/mesh_measure_length.png b/resources/mesh_measure_length.png
new file mode 100644
index 000000000..996f7c311
Binary files /dev/null and b/resources/mesh_measure_length.png differ
diff --git a/resources/mesh_measure_volume.png b/resources/mesh_measure_volume.png
new file mode 100644
index 000000000..7e4ae014d
Binary files /dev/null and b/resources/mesh_measure_volume.png differ
diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx
index 5d3cac68f..11eb2b89e 100644
--- a/src/SMESHGUI/SMESHGUI.cxx
+++ b/src/SMESHGUI/SMESHGUI.cxx
@@ -3541,8 +3541,20 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
}
case 501:
case 502:
+ case 503:
+ case 504:
+ case 505:
{
- int page = theCommandID == 501 ? SMESHGUI_MeasureDlg::MinDistance : SMESHGUI_MeasureDlg::BoundingBox;
+ int page = SMESHGUI_MeasureDlg::MinDistance;
+ if ( theCommandID == 502 )
+ page = SMESHGUI_MeasureDlg::BoundingBox;
+ else if ( theCommandID == 503 )
+ page = SMESHGUI_MeasureDlg::Length;
+ else if ( theCommandID == 504 )
+ page = SMESHGUI_MeasureDlg::Area;
+ else if ( theCommandID == 505 )
+ page = SMESHGUI_MeasureDlg::Volume;
+
EmitSignalDeactivateDialog();
SMESHGUI_MeasureDlg* dlg = new SMESHGUI_MeasureDlg( SMESHGUI::desktop(), page );
dlg->show();
@@ -3844,6 +3856,9 @@ void SMESHGUI::initialize( CAM_Application* app )
createSMESHAction( 501, "MEASURE_MIN_DIST", "ICON_MEASURE_MIN_DIST" );
createSMESHAction( 502, "MEASURE_BND_BOX", "ICON_MEASURE_BND_BOX" );
+ createSMESHAction( 503, "MEASURE_LENGTH", "ICON_MEASURE_LENGTH" );
+ createSMESHAction( 504, "MEASURE_AREA", "ICON_MEASURE_AREA" );
+ createSMESHAction( 505, "MEASURE_VOLUME", "ICON_MEASURE_VOLUME" );
createSMESHAction( 300, "HIDE" );
createSMESHAction( 301, "SHOW" );
@@ -3872,7 +3887,8 @@ void SMESHGUI::initialize( CAM_Application* app )
addId = createMenu( tr( "MEN_ADD" ), modifyId, 402 ),
removeId = createMenu( tr( "MEN_REMOVE" ), modifyId, 403 ),
renumId = createMenu( tr( "MEN_RENUM" ), modifyId, 404 ),
- transfId = createMenu( tr( "MEN_TRANSF" ), modifyId, 405 );
+ transfId = createMenu( tr( "MEN_TRANSF" ), modifyId, 405 ),
+ basicPropId = createMenu( tr( "MEN_BASIC_PROPERTIES" ), measureId, -1, 10 );
//createMenu( 111, importId, -1 );
createMenu( 112, importId, -1 );
@@ -4020,6 +4036,9 @@ void SMESHGUI::initialize( CAM_Application* app )
createMenu( 501, measureId, -1 );
createMenu( 502, measureId, -1 );
+ createMenu( 503, basicPropId, -1 );
+ createMenu( 504, basicPropId, -1 );
+ createMenu( 505, basicPropId, -1 );
createMenu( 214, viewId, -1 );
// ----- create toolbars --------------
diff --git a/src/SMESHGUI/SMESHGUI_Measurements.cxx b/src/SMESHGUI/SMESHGUI_Measurements.cxx
index a5580dd65..8cbf40364 100644
--- a/src/SMESHGUI/SMESHGUI_Measurements.cxx
+++ b/src/SMESHGUI/SMESHGUI_Measurements.cxx
@@ -1085,6 +1085,219 @@ void SMESHGUI_BoundingBox::clear()
erasePreview();
}
+/*!
+ \class SMESHGUI_BasicProperties
+ \brief basic properties measurement widget.
+
+ Widget to calculate length, area or volume for the selected object(s).
+*/
+
+/*!
+ \brief Constructor.
+ \param parent parent widget
+*/
+SMESHGUI_BasicProperties::SMESHGUI_BasicProperties( QWidget* parent )
+: QWidget( parent )
+{
+ // Property (length, area or volume)
+ QGroupBox* aPropertyGrp = new QGroupBox( tr( "PROPERTY" ), this );
+
+ QRadioButton* aLength = new QRadioButton( tr( "LENGTH" ), aPropertyGrp );
+ QRadioButton* anArea = new QRadioButton( tr( "AREA" ), aPropertyGrp );
+ QRadioButton* aVolume = new QRadioButton( tr( "VOLUME" ), aPropertyGrp );
+
+ myMode = new QButtonGroup( this );
+ myMode->addButton( aLength, Length );
+ myMode->addButton( anArea, Area );
+ myMode->addButton( aVolume, Volume );
+
+ QHBoxLayout* aPropertyLayout = new QHBoxLayout;
+ aPropertyLayout->addWidget( aLength );
+ aPropertyLayout->addWidget( anArea );
+ aPropertyLayout->addWidget( aVolume );
+
+ aPropertyGrp->setLayout( aPropertyLayout );
+
+ // Source object
+ QGroupBox* aSourceGrp = new QGroupBox( tr( "SOURCE_MESH_SUBMESH_GROUP" ), this );
+
+ mySource = new QLineEdit( aSourceGrp );
+ mySource->setReadOnly( true );
+
+ QHBoxLayout* aSourceLayout = new QHBoxLayout;
+ aSourceLayout->addWidget( mySource );
+
+ aSourceGrp->setLayout( aSourceLayout );
+
+ // Compute button
+ QPushButton* aCompute = new QPushButton( tr( "COMPUTE" ), this );
+
+ // Result of computation (length, area or volume)
+ myResultGrp = new QGroupBox( this );
+
+ myResult = new QLineEdit;
+ myResult->setReadOnly( true );
+
+ QHBoxLayout* aResultLayout = new QHBoxLayout;
+ aResultLayout->addWidget( myResult );
+
+ myResultGrp->setLayout( aResultLayout );
+
+ // Layout
+ QGridLayout* aMainLayout = new QGridLayout( this );
+ aMainLayout->setMargin( MARGIN );
+ aMainLayout->setSpacing( SPACING );
+
+ aMainLayout->addWidget( aPropertyGrp, 0, 0, 1, 2 );
+ aMainLayout->addWidget( aSourceGrp, 1, 0, 1, 2 );
+ aMainLayout->addWidget( aCompute, 2, 0 );
+ aMainLayout->addWidget( myResultGrp, 3, 0, 1, 2 );
+ aMainLayout->setColumnStretch( 1, 5 );
+ aMainLayout->setRowStretch( 4, 5 );
+
+ // Initial state
+ setMode( Length );
+
+ // Connections
+ connect( myMode, SIGNAL( buttonClicked( int ) ), this, SLOT( modeChanged( int ) ) );
+ connect( aCompute, SIGNAL( clicked() ), this, SLOT( compute() ) );
+
+ // Selection filter
+ QList filters;
+ filters.append( new SMESH_TypeFilter( SMESH::MESHorSUBMESH ) );
+ filters.append( new SMESH_TypeFilter( SMESH::GROUP ) );
+ myFilter = new SMESH_LogicalFilter( filters, SMESH_LogicalFilter::LO_OR );
+}
+
+/*!
+ \brief Destructor
+*/
+SMESHGUI_BasicProperties::~SMESHGUI_BasicProperties()
+{
+}
+
+/*!
+ \brief Sets the measurement mode.
+ \param theMode the mode to set (length, area or volume meausurement)
+*/
+void SMESHGUI_BasicProperties::setMode( const Mode theMode )
+{
+ QRadioButton* aButton = qobject_cast( myMode->button( theMode ) );
+ if ( aButton ) {
+ aButton->setChecked( true );
+ modeChanged( theMode );
+ }
+}
+
+/*!
+ \brief Setup the selection mode.
+*/
+void SMESHGUI_BasicProperties::updateSelection()
+{
+ LightApp_SelectionMgr* selMgr = SMESHGUI::selectionMgr();
+
+ disconnect( selMgr, 0, this, 0 );
+ selMgr->clearFilters();
+
+ SMESH::SetPointRepresentation( false );
+ if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow() ) {
+ aViewWindow->SetSelectionMode( ActorSelection );
+ }
+ selMgr->installFilter( myFilter );
+
+ connect( selMgr, SIGNAL( currentSelectionChanged() ), this, SLOT( selectionChanged() ) );
+}
+
+/*!
+ \brief Deactivate widget
+*/
+void SMESHGUI_BasicProperties::deactivate()
+{
+ disconnect( SMESHGUI::selectionMgr(), 0, this, 0 );
+}
+
+/*!
+ \brief Called when selection is changed
+*/
+void SMESHGUI_BasicProperties::selectionChanged()
+{
+ SUIT_OverrideCursor wc;
+
+ SALOME_ListIO selected;
+ SMESHGUI::selectionMgr()->selectedObjects( selected );
+
+ if ( selected.Extent() == 1 ) {
+ Handle(SALOME_InteractiveObject) IO = selected.First();
+ SMESH::SMESH_IDSource_var obj = SMESH::IObjectToInterface( IO );
+ if ( !CORBA::is_nil( obj ) ) {
+ mySrc = obj;
+
+ QString aName;
+ SMESH::GetNameOfSelectedIObjects( SMESHGUI::selectionMgr(), aName );
+ mySource->setText( aName );
+ }
+ }
+
+ clear();
+}
+
+/*!
+ \brief Called when the measurement mode selection is changed.
+ \param theMode the selected mode
+*/
+void SMESHGUI_BasicProperties::modeChanged( int theMode )
+{
+ clear();
+
+ if ( theMode == Length ) {
+ myResultGrp->setTitle( tr("LENGTH") );
+ } else if ( theMode == Area ) {
+ myResultGrp->setTitle( tr("AREA") );
+ } else if ( theMode == Volume ) {
+ myResultGrp->setTitle( tr("VOLUME") );
+ }
+}
+
+/*!
+ \brief Calculate length, area or volume for the selected object(s)
+*/
+void SMESHGUI_BasicProperties::compute()
+{
+ SUIT_OverrideCursor wc;
+
+ SMESH::SMESH_IDSource_var source;
+
+ if ( !CORBA::is_nil( mySrc ) ) {
+ // compute
+ int precision = SMESHGUI::resourceMgr()->integerValue( "SMESH", "length_precision", 6 );
+ SMESH::Measurements_var measure = SMESHGUI::GetSMESHGen()->CreateMeasurements();
+
+ double result = 0;
+
+ if ( myMode->checkedId() == Length ) {
+ result = measure->Length( mySrc.in() );
+ } else if ( myMode->checkedId() == Area ) {
+ result = measure->Area( mySrc.in() );
+ } else if ( myMode->checkedId() == Volume ) {
+ result = measure->Volume( mySrc.in() );
+ }
+
+ measure->UnRegister();
+
+ myResult->setText( QString::number( result, precision > 0 ? 'f' : 'g', qAbs( precision ) ) );
+ } else {
+ clear();
+ }
+}
+
+/*!
+ \brief Reset the widget to the initial state (nullify the result field)
+*/
+void SMESHGUI_BasicProperties::clear()
+{
+ myResult->clear();
+}
+
/*!
\class SMESHGUI_MeshInfoDlg
\brief Centralized dialog box for the measurements
@@ -1110,12 +1323,17 @@ SMESHGUI_MeasureDlg::SMESHGUI_MeasureDlg( QWidget* parent, int page )
// min distance
myMinDist = new SMESHGUI_MinDistance( myTabWidget );
- myTabWidget->addTab( myMinDist, resMgr->loadPixmap( "SMESH", tr( "ICON_MEASURE_MIN_DIST" ) ), tr( "MIN_DIST" ) );
+ int aMinDistInd = myTabWidget->addTab( myMinDist, resMgr->loadPixmap( "SMESH", tr( "ICON_MEASURE_MIN_DIST" ) ), tr( "MIN_DIST" ) );
// bounding box
myBndBox = new SMESHGUI_BoundingBox( myTabWidget );
- myTabWidget->addTab( myBndBox, resMgr->loadPixmap( "SMESH", tr( "ICON_MEASURE_BND_BOX" ) ), tr( "BND_BOX" ) );
+ int aBndBoxInd = myTabWidget->addTab( myBndBox, resMgr->loadPixmap( "SMESH", tr( "ICON_MEASURE_BND_BOX" ) ), tr( "BND_BOX" ) );
+
+ // basic properties
+
+ myBasicProps = new SMESHGUI_BasicProperties( myTabWidget );
+ int aBasicPropInd = myTabWidget->addTab( myBasicProps, resMgr->loadPixmap( "SMESH", tr( "ICON_MEASURE_BASIC_PROPS" ) ), tr( "BASIC_PROPERTIES" ) );
// buttons
QPushButton* okBtn = new QPushButton( tr( "SMESH_BUT_OK" ), this );
@@ -1139,7 +1357,19 @@ SMESHGUI_MeasureDlg::SMESHGUI_MeasureDlg( QWidget* parent, int page )
l->addStretch();
l->addLayout( btnLayout );
- myTabWidget->setCurrentIndex( qMax( (int)MinDistance, qMin( (int)BoundingBox, page ) ) );
+ int anInd = -1;
+ if ( page == MinDistance ) {
+ anInd = aMinDistInd;
+ } else if ( page == BoundingBox ) {
+ anInd = aBndBoxInd;
+ } else if ( page == Length || page == Area || page == Volume ) {
+ myBasicProps->setMode( (SMESHGUI_BasicProperties::Mode)(page - Length) );
+ anInd = aBasicPropInd;
+ }
+
+ if ( anInd >= 0 ) {
+ myTabWidget->setCurrentIndex( anInd );
+ }
connect( okBtn, SIGNAL( clicked() ), this, SLOT( reject() ) );
connect( helpBtn, SIGNAL( clicked() ), this, SLOT( help() ) );
@@ -1200,7 +1430,10 @@ void SMESHGUI_MeasureDlg::updateSelection()
myMinDist->updateSelection();
else if ( myTabWidget->currentIndex() == BoundingBox )
myBndBox->updateSelection();
-
+ else {
+ myBndBox->erasePreview();
+ myBasicProps->updateSelection();
+ }
}
/*!
@@ -1208,9 +1441,16 @@ void SMESHGUI_MeasureDlg::updateSelection()
*/
void SMESHGUI_MeasureDlg::help()
{
- SMESH::ShowHelpFile( myTabWidget->currentIndex() == MinDistance ?
- "measurements_page.html#min_distance_anchor" :
- "measurements_page.html#bounding_box_anchor" );
+ QString aHelpFile;
+ if ( myTabWidget->currentIndex() == MinDistance ) {
+ aHelpFile = "measurements_page.html#min_distance_anchor";
+ } else if ( myTabWidget->currentIndex() == BoundingBox ) {
+ aHelpFile = "measurements_page.html#bounding_box_anchor";
+ } else {
+ aHelpFile = "measurements_page.html#basic_properties_anchor";
+ }
+
+ SMESH::ShowHelpFile( aHelpFile );
}
/*!
@@ -1229,6 +1469,7 @@ void SMESHGUI_MeasureDlg::activate()
*/
void SMESHGUI_MeasureDlg::deactivate()
{
+ myBasicProps->deactivate();
myMinDist->deactivate();
myBndBox->deactivate();
myTabWidget->setEnabled( false );
diff --git a/src/SMESHGUI/SMESHGUI_Measurements.h b/src/SMESHGUI/SMESHGUI_Measurements.h
index f4cd672fb..65e3539cd 100644
--- a/src/SMESHGUI/SMESHGUI_Measurements.h
+++ b/src/SMESHGUI/SMESHGUI_Measurements.h
@@ -32,6 +32,7 @@
class QButtonGroup;
class QLineEdit;
class QTabWidget;
+class QGroupBox;
class SUIT_SelectionFilter;
class SALOME_Actor;
class SMESH_Actor;
@@ -101,9 +102,9 @@ public:
void updateSelection();
void deactivate();
+ void erasePreview();
private:
- void erasePreview();
void displayPreview();
void createPreview( double, double, double, double, double, double );
@@ -135,6 +136,37 @@ private:
SALOME_Actor* myPreview;
};
+class SMESHGUI_EXPORT SMESHGUI_BasicProperties : public QWidget
+{
+ Q_OBJECT;
+
+public:
+ //! Property type
+ enum Mode { Length, Area, Volume };
+
+ SMESHGUI_BasicProperties( QWidget* = 0 );
+ ~SMESHGUI_BasicProperties();
+
+ void setMode( const Mode );
+
+ void updateSelection();
+ void deactivate();
+
+private slots:
+ void selectionChanged();
+ void modeChanged( int);
+ void compute();
+ void clear();
+
+private:
+ QButtonGroup* myMode;
+ QLineEdit* mySource;
+ QGroupBox* myResultGrp;
+ QLineEdit* myResult;
+ SMESH::SMESH_IDSource_var mySrc;
+ SUIT_SelectionFilter* myFilter;
+};
+
class SMESHGUI_EXPORT SMESHGUI_MeasureDlg : public QDialog
{
Q_OBJECT;
@@ -145,7 +177,10 @@ public:
//! Measurement type
enum {
MinDistance, //!< minimum distance
- BoundingBox //!< bounding box
+ BoundingBox, //!< bounding box
+ Length, //!< length
+ Area, //!< area
+ Volume //!< volume
};
SMESHGUI_MeasureDlg( QWidget* = 0, int = MinDistance );
@@ -167,6 +202,7 @@ private:
QTabWidget* myTabWidget;
SMESHGUI_MinDistance* myMinDist;
SMESHGUI_BoundingBox* myBndBox;
+ SMESHGUI_BasicProperties* myBasicProps;
};
#endif // SMESHGUI_MEASUREMENTS_H
diff --git a/src/SMESHGUI/SMESH_images.ts b/src/SMESHGUI/SMESH_images.ts
index a8fa7fd73..c985f167e 100644
--- a/src/SMESHGUI/SMESH_images.ts
+++ b/src/SMESHGUI/SMESH_images.ts
@@ -559,6 +559,22 @@
split_into_tetra.png
+
+
+ mesh_measure_length.png
+
+
+
+ mesh_measure_area.png
+
+
+
+ mesh_measure_volume.png
+
+
+
+ mesh_measure_basic_props.png
+
mesh_min_dist.png
diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts
index ba6d7aedf..e989562ed 100644
--- a/src/SMESHGUI/SMESH_msg_en.ts
+++ b/src/SMESHGUI/SMESH_msg_en.ts
@@ -712,6 +712,46 @@
Bounding box
+
+
+ Basic Properties
+
+
+
+ Length
+
+
+
+ Calculate sum of length of all 1D elements of the selected object(s)
+
+
+
+ Length
+
+
+
+ Area
+
+
+
+ Calculate sum of area of all 2D elements of the selected object(s)
+
+
+
+ Area
+
+
+
+ Volume
+
+
+
+ Calculate sum of volume of all 3D elements of the selected object(s)
+
+
+
+ Volume
+
Move Node
@@ -7308,6 +7348,33 @@ as they are of improper type:
Distance
+
+ SMESHGUI_BasicProperties
+
+
+ Property
+
+
+
+ Length
+
+
+
+ Area
+
+
+
+ Volume
+
+
+
+ Source (mesh, sub-mesh or group)
+
+
+
+ Compute
+
+
SMESHGUI_CopyMeshDlg
@@ -7337,6 +7404,10 @@ as they are of improper type:
Bounding Box
+
+
+ Basic Properties
+
SMESHGUI_BoundingBox
diff --git a/src/SMESHGUI/SMESH_msg_fr.ts b/src/SMESHGUI/SMESH_msg_fr.ts
index bc0d57a4d..6f409879b 100755
--- a/src/SMESHGUI/SMESH_msg_fr.ts
+++ b/src/SMESHGUI/SMESH_msg_fr.ts
@@ -748,6 +748,46 @@
Boîte englobante
+
+
+ Basic Properties
+
+
+
+ Length
+
+
+
+ Calculate sum of length of all 1D elements of the selected object(s)
+
+
+
+ Length
+
+
+
+ Area
+
+
+
+ Calculate sum of area of all 2D elements of the selected object(s)
+
+
+
+ Area
+
+
+
+ Volume
+
+
+
+ Calculate sum of volume of all 3D elements of the selected object(s)
+
+
+
+ Volume
+
Déplacer un nœud
@@ -7294,6 +7334,33 @@ en raison de leurs types incompatibles:
Distance
+
+ SMESHGUI_BasicProperties
+
+
+ Property
+
+
+
+ Length
+
+
+
+ Area
+
+
+
+ Volume
+
+
+
+ Source (mesh, sub-mesh or group)
+
+
+
+ Compute
+
+
SMESHGUI_CopyMeshDlg
@@ -7323,6 +7390,10 @@ en raison de leurs types incompatibles:
Boîte englobante
+
+
+ Basic Properties
+
SMESHGUI_BoundingBox
diff --git a/src/SMESH_I/SMESH_Measurements_i.cxx b/src/SMESH_I/SMESH_Measurements_i.cxx
index 9a9d439aa..9bb687fc3 100644
--- a/src/SMESH_I/SMESH_Measurements_i.cxx
+++ b/src/SMESH_I/SMESH_Measurements_i.cxx
@@ -25,6 +25,7 @@
#include "SMESH_Measurements_i.hxx"
#include "SMESH_Gen_i.hxx"
+#include "SMESH_Filter_i.hxx"
#include "SMESH_PythonDump.hxx"
#include "SMDS_Mesh.hxx"
@@ -131,6 +132,24 @@ static bool isNodeType (SMESH::array_of_ElementType_var theTypes)
return theTypes->length() > 0 && theTypes[0] == SMESH::NODE;
}
+static double getNumericalValue(SMESH::SMESH_IDSource_ptr theSource, SMESH::Controls::NumericalFunctorPtr theFunctor)
+{
+ double value = 0;
+
+ if ( !CORBA::is_nil( theSource ) ) {
+ const SMESHDS_Mesh* aMesh = getMesh( theSource );
+ if ( aMesh ) {
+ theFunctor->SetMesh( aMesh );
+
+ SMESH::long_array_var anElementsId = theSource->GetIDs();
+ for (int i = 0; i < anElementsId->length(); i++) {
+ value += theFunctor->GetValue( anElementsId[i] );
+ }
+ }
+ }
+ return value;
+}
+
//=======================================================================
// name : MinDistance
// Purpose : minimal distance between two given entities
@@ -257,3 +276,30 @@ SMESH::Measure Measurements_i::BoundingBox (const SMESH::ListOfIDSources& theSou
return aMeasure;
}
+
+//=======================================================================
+// name : Length
+// Purpose : sum of length of 1D elements of the source
+//=======================================================================
+double Measurements_i::Length(SMESH::SMESH_IDSource_ptr theSource)
+{
+ return getNumericalValue( theSource, SMESH::Controls::NumericalFunctorPtr(new SMESH::Controls::Length()) );
+}
+
+//=======================================================================
+// name : Area
+// Purpose : sum of area of 2D elements of the source
+//=======================================================================
+double Measurements_i::Area(SMESH::SMESH_IDSource_ptr theSource)
+{
+ return getNumericalValue( theSource, SMESH::Controls::NumericalFunctorPtr(new SMESH::Controls::Area()) );
+}
+
+//=======================================================================
+// name : Volume
+// Purpose : sum of volume of 3D elements of the source
+//=======================================================================
+double Measurements_i::Volume(SMESH::SMESH_IDSource_ptr theSource)
+{
+ return getNumericalValue( theSource, SMESH::Controls::NumericalFunctorPtr(new SMESH::Controls::Volume()) );
+}
diff --git a/src/SMESH_I/SMESH_Measurements_i.hxx b/src/SMESH_I/SMESH_Measurements_i.hxx
index 0f1bbadac..f7135ae44 100644
--- a/src/SMESH_I/SMESH_Measurements_i.hxx
+++ b/src/SMESH_I/SMESH_Measurements_i.hxx
@@ -57,6 +57,22 @@ namespace SMESH
* common bounding box of entities
*/
SMESH::Measure BoundingBox(const SMESH::ListOfIDSources& theSources);
+
+
+ /*!
+ * sum of length of 1D elements of the source
+ */
+ double Length(SMESH::SMESH_IDSource_ptr theSource);
+
+ /*!
+ * sum of area of 2D elements of the source
+ */
+ double Area(SMESH::SMESH_IDSource_ptr);
+
+ /*!
+ * sum of volume of 3D elements of the source
+ */
+ double Volume(SMESH::SMESH_IDSource_ptr);
};
}
diff --git a/src/SMESH_SWIG/smeshBuilder.py b/src/SMESH_SWIG/smeshBuilder.py
index d0471ca0f..b0f55e498 100644
--- a/src/SMESH_SWIG/smeshBuilder.py
+++ b/src/SMESH_SWIG/smeshBuilder.py
@@ -4398,25 +4398,46 @@ class Mesh:
return val
## Get length of 1D element.
- # @param elemId mesh element ID
+ # @param elemId mesh element ID (if not defined - sum of length of all 1D elements will be calculated)
# @return element's length value
# @ingroup l1_measurements
- def GetLength(self, elemId):
- return self._valueFromFunctor(SMESH.FT_Length, elemId)
+ def GetLength(self, elemId=None):
+ length = 0
+ if elemId == None:
+ aMeasurements = self.smeshpyD.CreateMeasurements()
+ length = aMeasurements.Length(self.GetMesh())
+ aMeasurements.UnRegister()
+ else:
+ length = self._valueFromFunctor(SMESH.FT_Length, elemId)
+ return length
## Get area of 2D element.
- # @param elemId mesh element ID
+ # @param elemId mesh element ID (if not defined - sum of area of all 2D elements will be calculated)
# @return element's area value
# @ingroup l1_measurements
- def GetArea(self, elemId):
- return self._valueFromFunctor(SMESH.FT_Area, elemId)
+ def GetArea(self, elemId=None):
+ area = 0
+ if elemId == None:
+ aMeasurements = self.smeshpyD.CreateMeasurements()
+ area = aMeasurements.Area(self.GetMesh())
+ aMeasurements.UnRegister()
+ else:
+ area = self._valueFromFunctor(SMESH.FT_Area, elemId)
+ return area
## Get volume of 3D element.
- # @param elemId mesh element ID
+ # @param elemId mesh element ID (if not defined - sum of volume of all 3D elements will be calculated)
# @return element's volume value
# @ingroup l1_measurements
- def GetVolume(self, elemId):
- return self._valueFromFunctor(SMESH.FT_Volume3D, elemId)
+ def GetVolume(self, elemId=None):
+ volume = 0
+ if elemId == None:
+ aMeasurements = self.smeshpyD.CreateMeasurements()
+ volume = aMeasurements.Volume(self.GetMesh())
+ aMeasurements.UnRegister()
+ else:
+ volume = self._valueFromFunctor(SMESH.FT_Volume3D, elemId)
+ return volume
## Get maximum element length.
# @param elemId mesh element ID