0020885: EDF 607 SMESH: Measure tools

Additional improvement of "Mesh Information" dialog box (show information on multiple selected mesh nodes / elements)
This commit is contained in:
vsr 2010-12-13 09:45:53 +00:00
parent 10363c830c
commit 826ee93fae
3 changed files with 488 additions and 332 deletions

View File

@ -62,6 +62,7 @@
const int SPACING = 6; const int SPACING = 6;
const int MARGIN = 9; const int MARGIN = 9;
const int MAXITEMS = 10;
/*! /*!
\class SMESHGUI_MeshInfo \class SMESHGUI_MeshInfo
@ -465,8 +466,29 @@ void SMESHGUI_MeshInfo::setFieldsVisible( int start, int end, bool on )
\param parent parent widget \param parent parent widget
*/ */
SMESHGUI_ElemInfo::SMESHGUI_ElemInfo( QWidget* parent ) SMESHGUI_ElemInfo::SMESHGUI_ElemInfo( QWidget* parent )
: QWidget( parent ), myActor( 0 ), myID( 0 ), myIsElement( -1 ) : QWidget( parent ), myActor( 0 ), myIsElement( -1 )
{ {
myFrame = new QWidget( this );
myExtra = new QWidget( this );
myCurrent = new QLabel( "10/43 items shown", myExtra );
myCurrent->setAlignment( Qt::AlignRight | Qt::AlignVCenter );
myPrev = new QPushButton( tr( "<<" ), myExtra );
myNext = new QPushButton( tr( ">>" ), myExtra );
QHBoxLayout* hbl = new QHBoxLayout( myExtra );
hbl->setContentsMargins( 0, SPACING, 0, 0 );
hbl->setSpacing( SPACING );
hbl->addStretch();
hbl->addWidget( myCurrent );
hbl->addWidget( myPrev );
hbl->addWidget( myNext );
QVBoxLayout* vbl = new QVBoxLayout( this );
vbl->setMargin( 0 );
vbl->setSpacing( 0 );
vbl->addWidget( myFrame );
vbl->addWidget( myExtra );
connect( myPrev, SIGNAL( clicked() ), this, SLOT( showPrevious() ) );
connect( myNext, SIGNAL( clicked() ), this, SLOT( showNext() ) );
clear();
} }
/*! /*!
@ -484,7 +506,6 @@ void SMESHGUI_ElemInfo::setSource( SMESH_Actor* actor )
{ {
if ( myActor != actor ) { if ( myActor != actor ) {
myActor = actor; myActor = actor;
myID = 0;
myIsElement = -1; myIsElement = -1;
clear(); clear();
} }
@ -492,19 +513,87 @@ void SMESHGUI_ElemInfo::setSource( SMESH_Actor* actor )
/*! /*!
\brief Show mesh element information \brief Show mesh element information
\param long id mesh node / element ID \param id mesh node / element ID
\param isElem show mesh element information if \c true or mesh node information if \c false \param isElem show mesh element information if \c true or mesh node information if \c false
*/ */
void SMESHGUI_ElemInfo::showInfo( long id, bool isElem ) void SMESHGUI_ElemInfo::showInfo( long id, bool isElem )
{ {
myID = id; QSet<long> ids;
myIsElement = isElem; ids << id;
showInfo( ids, isElem );
}
/*!
\brief Show mesh element information
\param ids mesh nodes / elements identifiers
\param isElem show mesh element information if \c true or mesh node information if \c false
*/
void SMESHGUI_ElemInfo::showInfo( QSet<long> ids, bool isElem )
{
QList<long> newIds = ids.toList();
qSort( newIds );
if ( myIDs == newIds && myIsElement == isElem ) return;
myIDs = newIds;
myIsElement = isElem;
myIndex = 0;
updateControls();
information( myIDs.mid( myIndex*MAXITEMS, MAXITEMS ) );
} }
/*! /*!
\fn void SMESHGUI_ElemInfo::clear()
\brief Clear mesh element information widget \brief Clear mesh element information widget
*/ */
void SMESHGUI_ElemInfo::clear()
{
myIDs.clear();
myIndex = 0;
clearInternal();
updateControls();
}
/*!
\brief Get central area widget
\return central widget
*/
QWidget* SMESHGUI_ElemInfo::frame() const
{
return myFrame;
}
/*!
\brief Get actor
\return actor being used
*/
SMESH_Actor* SMESHGUI_ElemInfo::actor() const
{
return myActor;
}
/*!
\brief Get current info mode.
\return \c true if mesh element information is shown or \c false if node information is shown
*/
bool SMESHGUI_ElemInfo::isElements() const
{
return myIsElement;
}
/*!
\fn void SMESHGUI_ElemInfo::information( const QList<long>& ids )
\brief Show information on the specified nodes / elements
This function is to be redefined in sub-classes.
\param ids nodes / elements identifiers information is to be shown on
*/
/*!
\brief Internal clean-up (reset widget)
*/
void SMESHGUI_ElemInfo::clearInternal()
{
}
/*! /*!
\brief Get node connectivity \brief Get node connectivity
@ -560,6 +649,39 @@ SMESHGUI_ElemInfo::XYZ SMESHGUI_ElemInfo::gravityCenter( const SMDS_MeshElement*
return xyz; return xyz;
} }
/*!
\brief This slot is called from "Show Previous" button click.
Shows information on the previous group of the items.
*/
void SMESHGUI_ElemInfo::showPrevious()
{
myIndex = qMax( 0, myIndex-1 );
updateControls();
information( myIDs.mid( myIndex*MAXITEMS, MAXITEMS ) );
}
/*!
\brief This slot is called from "Show Next" button click.
Shows information on the next group of the items.
*/
void SMESHGUI_ElemInfo::showNext()
{
myIndex = qMin( myIndex+1, myIDs.count() / MAXITEMS );
updateControls();
information( myIDs.mid( myIndex*MAXITEMS, MAXITEMS ) );
}
/*!
\brief Update widgets state
*/
void SMESHGUI_ElemInfo::updateControls()
{
myExtra->setVisible( myIDs.count() > MAXITEMS );
myCurrent->setText( tr( "X_FROM_Y_ITEMS_SHOWN" ).arg( myIndex*MAXITEMS+1 ).arg(qMin(myIndex*MAXITEMS+MAXITEMS, myIDs.count())).arg( myIDs.count() ) );
myPrev->setEnabled( myIndex > 0 );
myNext->setEnabled( (myIndex+1)*MAXITEMS < myIDs.count() );
}
/*! /*!
\class SMESHGUI_SimpleElemInfo \class SMESHGUI_SimpleElemInfo
\brief Represents mesh element information in the simple text area. \brief Represents mesh element information in the simple text area.
@ -572,32 +694,28 @@ SMESHGUI_ElemInfo::XYZ SMESHGUI_ElemInfo::gravityCenter( const SMDS_MeshElement*
SMESHGUI_SimpleElemInfo::SMESHGUI_SimpleElemInfo( QWidget* parent ) SMESHGUI_SimpleElemInfo::SMESHGUI_SimpleElemInfo( QWidget* parent )
: SMESHGUI_ElemInfo( parent ) : SMESHGUI_ElemInfo( parent )
{ {
myInfo = new QTextBrowser( this ); myInfo = new QTextBrowser( frame() );
QVBoxLayout* l = new QVBoxLayout( this ); QVBoxLayout* l = new QVBoxLayout( frame() );
l->setMargin( 0 ); l->setMargin( 0 );
l->addWidget( myInfo ); l->addWidget( myInfo );
} }
/*! /*!
\brief Show mesh element information \brief Show mesh element information
\param long id mesh node / element ID \param ids mesh nodes / elements identifiers
\param isElem show mesh element information if \c true or mesh node information if \c false
*/ */
void SMESHGUI_SimpleElemInfo::showInfo( long id, bool isElem ) void SMESHGUI_SimpleElemInfo::information( const QList<long>& ids )
{ {
if ( myID == id && myIsElement == isElem ) return; clearInternal();
SMESHGUI_ElemInfo::showInfo( id, isElem ); if ( actor() ) {
clear();
if ( myActor ) {
int precision = SMESHGUI::resourceMgr()->integerValue( "SMESH", "length_precision", 6 ); int precision = SMESHGUI::resourceMgr()->integerValue( "SMESH", "length_precision", 6 );
if ( !isElem ) { foreach ( long id, ids ) {
if ( !isElements() ) {
// //
// show node info // show node info
// //
const SMDS_MeshElement* e = myActor->GetObject()->GetMesh()->FindNode( id ); const SMDS_MeshElement* e = actor()->GetObject()->GetMesh()->FindNode( id );
if ( !e ) return; if ( !e ) return;
const SMDS_MeshNode* node = static_cast<const SMDS_MeshNode*>( e ); const SMDS_MeshNode* node = static_cast<const SMDS_MeshNode*>( e );
@ -637,7 +755,7 @@ void SMESHGUI_SimpleElemInfo::showInfo( long id, bool isElem )
// //
// show element info // show element info
// //
const SMDS_MeshElement* e = myActor->GetObject()->GetMesh()->FindElement( id ); const SMDS_MeshElement* e = actor()->GetObject()->GetMesh()->FindElement( id );
if ( !e ) return; if ( !e ) return;
// element ID && type // element ID && type
@ -733,7 +851,12 @@ void SMESHGUI_SimpleElemInfo::showInfo( long id, bool isElem )
else { else {
myInfo->append( QString( "<b>%1</b>" ).arg( tr( "FREE_NODE" ) ).arg( id ) ); myInfo->append( QString( "<b>%1</b>" ).arg( tr( "FREE_NODE" ) ).arg( id ) );
} }
}
}
// separator // separator
if ( ids.count() > 1 ) {
myInfo->append( "" );
myInfo->append( "------" );
myInfo->append( "" ); myInfo->append( "" );
} }
} }
@ -741,9 +864,9 @@ void SMESHGUI_SimpleElemInfo::showInfo( long id, bool isElem )
} }
/*! /*!
\brief Clear mesh element information widget \brief Internal clean-up (reset widget)
*/ */
void SMESHGUI_SimpleElemInfo::clear() void SMESHGUI_SimpleElemInfo::clearInternal()
{ {
myInfo->clear(); myInfo->clear();
} }
@ -791,37 +914,33 @@ QWidget* SMESHGUI_TreeElemInfo::ItemDelegate::createEditor( QWidget* parent, con
SMESHGUI_TreeElemInfo::SMESHGUI_TreeElemInfo( QWidget* parent ) SMESHGUI_TreeElemInfo::SMESHGUI_TreeElemInfo( QWidget* parent )
: SMESHGUI_ElemInfo( parent ) : SMESHGUI_ElemInfo( parent )
{ {
myInfo = new QTreeWidget( this ); myInfo = new QTreeWidget( frame() );
myInfo->setColumnCount( 2 ); myInfo->setColumnCount( 2 );
myInfo->setHeaderLabels( QStringList() << tr( "PROPERTY" ) << tr( "VALUE" ) ); myInfo->setHeaderLabels( QStringList() << tr( "PROPERTY" ) << tr( "VALUE" ) );
myInfo->header()->setStretchLastSection( true ); myInfo->header()->setStretchLastSection( true );
myInfo->header()->setResizeMode( 0, QHeaderView::ResizeToContents ); myInfo->header()->setResizeMode( 0, QHeaderView::ResizeToContents );
myInfo->setItemDelegate( new ItemDelegate( myInfo ) ); myInfo->setItemDelegate( new ItemDelegate( myInfo ) );
QVBoxLayout* l = new QVBoxLayout( this ); QVBoxLayout* l = new QVBoxLayout( frame() );
l->setMargin( 0 ); l->setMargin( 0 );
l->addWidget( myInfo ); l->addWidget( myInfo );
} }
/*! /*!
\brief Show mesh element information \brief Show mesh element information
\param long id mesh node / element ID \param ids mesh nodes / elements identifiers
\param isElem show mesh element information if \c true or mesh node information if \c false
*/ */
void SMESHGUI_TreeElemInfo::showInfo( long id, bool isElem ) void SMESHGUI_TreeElemInfo::information( const QList<long>& ids )
{ {
if ( myID == id && myIsElement == isElem ) return; clearInternal();
SMESHGUI_ElemInfo::showInfo( id, isElem ); if ( actor() ) {
clear();
if ( myActor ) {
int precision = SMESHGUI::resourceMgr()->integerValue( "SMESH", "length_precision", 6 ); int precision = SMESHGUI::resourceMgr()->integerValue( "SMESH", "length_precision", 6 );
if ( !isElem ) { foreach ( long id, ids ) {
if ( !isElements() ) {
// //
// show node info // show node info
// //
const SMDS_MeshElement* e = myActor->GetObject()->GetMesh()->FindNode( id ); const SMDS_MeshElement* e = actor()->GetObject()->GetMesh()->FindNode( id );
if ( !e ) return; if ( !e ) return;
const SMDS_MeshNode* node = static_cast<const SMDS_MeshNode*>( e ); const SMDS_MeshNode* node = static_cast<const SMDS_MeshNode*>( e );
@ -882,7 +1001,7 @@ void SMESHGUI_TreeElemInfo::showInfo( long id, bool isElem )
// //
// show element info // show element info
// //
const SMDS_MeshElement* e = myActor->GetObject()->GetMesh()->FindElement( id ); const SMDS_MeshElement* e = actor()->GetObject()->GetMesh()->FindElement( id );
if ( !e ) return; if ( !e ) return;
// element ID && type // element ID && type
@ -1020,11 +1139,12 @@ void SMESHGUI_TreeElemInfo::showInfo( long id, bool isElem )
} }
} }
} }
}
/*! /*!
\brief Clear mesh element information widget \brief Internal clean-up (reset widget)
*/ */
void SMESHGUI_TreeElemInfo::clear() void SMESHGUI_TreeElemInfo::clearInternal()
{ {
myInfo->clear(); myInfo->clear();
myInfo->repaint(); myInfo->repaint();
@ -1092,7 +1212,7 @@ SMESHGUI_MeshInfoDlg::SMESHGUI_MeshInfoDlg( QWidget* parent, int page )
myMode->addButton( new QRadioButton( tr( "ELEM_MODE" ), w ), ElemMode ); myMode->addButton( new QRadioButton( tr( "ELEM_MODE" ), w ), ElemMode );
myMode->button( NodeMode )->setChecked( true ); myMode->button( NodeMode )->setChecked( true );
myID = new QLineEdit( w ); myID = new QLineEdit( w );
myID->setValidator( new SMESHGUI_IdValidator( this, 1 ) ); myID->setValidator( new SMESHGUI_IdValidator( this ) );
int mode = SMESHGUI::resourceMgr()->integerValue( "SMESH", "mesh_elem_info", 1 ); int mode = SMESHGUI::resourceMgr()->integerValue( "SMESH", "mesh_elem_info", 1 );
mode = qMin( 1, qMax( 0, mode ) ); mode = qMin( 1, qMax( 0, mode ) );
@ -1173,10 +1293,14 @@ void SMESHGUI_MeshInfoDlg::showInfo( const Handle(SALOME_InteractiveObject)& IO
SMESH::GetNameOfSelectedElements( selector, IO, ID ) : SMESH::GetNameOfSelectedElements( selector, IO, ID ) :
SMESH::GetNameOfSelectedNodes( selector, IO, ID ); SMESH::GetNameOfSelectedNodes( selector, IO, ID );
} }
if ( nb == 1 ) {
myID->setText( ID.trimmed() );
myElemInfo->setSource( myActor ) ; myElemInfo->setSource( myActor ) ;
myElemInfo->showInfo( ID.toLong(), myMode->checkedId() == ElemMode ); if ( nb > 0 ) {
myID->setText( ID.trimmed() );
QSet<long> ids;
QStringList idTxt = ID.split( " ", QString::SkipEmptyParts );
foreach ( ID, idTxt )
ids << ID.trimmed().toLong();
myElemInfo->showInfo( ids, myMode->checkedId() == ElemMode );
} }
else { else {
myID->clear(); myID->clear();
@ -1247,15 +1371,15 @@ void SMESHGUI_MeshInfoDlg::updateSelection()
} }
} }
int oldID = myID->text().toLong(); QString oldID = myID->text().trimmed();
SMESH_Actor* oldActor = myActor; SMESH_Actor* oldActor = myActor;
myID->clear(); myID->clear();
connect( selMgr, SIGNAL( currentSelectionChanged() ), this, SLOT( updateInfo() ) ); connect( selMgr, SIGNAL( currentSelectionChanged() ), this, SLOT( updateInfo() ) );
updateInfo(); updateInfo();
if ( oldActor == myActor && myActor && oldID ) { if ( oldActor == myActor && myActor && !oldID.isEmpty() ) {
myID->setText( QString::number( oldID ) ); myID->setText( oldID );
idChanged(); idChanged();
} }
} }
@ -1328,10 +1452,15 @@ void SMESHGUI_MeshInfoDlg::idChanged()
if ( myActor && selector ) { if ( myActor && selector ) {
Handle(SALOME_InteractiveObject) IO = myActor->getIO(); Handle(SALOME_InteractiveObject) IO = myActor->getIO();
TColStd_MapOfInteger ID; TColStd_MapOfInteger ID;
ID.Add( myID->text().toLong() ); QSet<long> ids;
QStringList idTxt = myID->text().split( " ", QString::SkipEmptyParts );
foreach ( QString id, idTxt ) {
ID.Add( id.trimmed().toLong() );
ids << id.trimmed().toLong();
}
selector->AddOrRemoveIndex( IO, ID, false ); selector->AddOrRemoveIndex( IO, ID, false );
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow() ) if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow() )
aViewWindow->highlight( IO, true, true ); aViewWindow->highlight( IO, true, true );
myElemInfo->showInfo( myID->text().toLong(), myMode->checkedId() == ElemMode ); myElemInfo->showInfo( ids, myMode->checkedId() == ElemMode );
} }
} }

View File

@ -32,6 +32,7 @@
#include <QDialog> #include <QDialog>
#include <QList> #include <QList>
#include <QMap> #include <QMap>
#include <QSet>
#include <QVector> #include <QVector>
#include <SALOMEconfig.h> #include <SALOMEconfig.h>
@ -40,6 +41,7 @@
class QButtonGroup; class QButtonGroup;
class QLabel; class QLabel;
class QLineEdit; class QLineEdit;
class QPushButton;
class QTabWidget; class QTabWidget;
class QTextBrowser; class QTextBrowser;
class QTreeWidget; class QTreeWidget;
@ -121,8 +123,9 @@ public:
~SMESHGUI_ElemInfo(); ~SMESHGUI_ElemInfo();
void setSource( SMESH_Actor* ); void setSource( SMESH_Actor* );
virtual void showInfo( long, bool ); void showInfo( long, bool );
virtual void clear() = 0; void showInfo( QSet<long>, bool );
void clear();
protected: protected:
struct XYZ struct XYZ
@ -137,14 +140,32 @@ protected:
}; };
typedef QMap< int, QList<int> > Connectivity; typedef QMap< int, QList<int> > Connectivity;
QWidget* frame() const;
SMESH_Actor* actor() const;
bool isElements() const;
virtual void information( const QList<long>& ) = 0;
virtual void clearInternal();
Connectivity nodeConnectivity( const SMDS_MeshNode* ); Connectivity nodeConnectivity( const SMDS_MeshNode* );
QString formatConnectivity( Connectivity, int ); QString formatConnectivity( Connectivity, int );
XYZ gravityCenter( const SMDS_MeshElement* ); XYZ gravityCenter( const SMDS_MeshElement* );
protected: private slots:
void showPrevious();
void showNext();
void updateControls();
private:
SMESH_Actor* myActor; SMESH_Actor* myActor;
long myID; QList<long> myIDs;
int myIsElement; int myIsElement;
QWidget* myFrame;
QWidget* myExtra;
QLabel* myCurrent;
QPushButton* myPrev;
QPushButton* myNext;
int myIndex;
}; };
class SMESHGUI_EXPORT SMESHGUI_SimpleElemInfo : public SMESHGUI_ElemInfo class SMESHGUI_EXPORT SMESHGUI_SimpleElemInfo : public SMESHGUI_ElemInfo
@ -152,8 +173,9 @@ class SMESHGUI_EXPORT SMESHGUI_SimpleElemInfo : public SMESHGUI_ElemInfo
public: public:
SMESHGUI_SimpleElemInfo( QWidget* = 0 ); SMESHGUI_SimpleElemInfo( QWidget* = 0 );
void showInfo( long, bool ); protected:
void clear(); void information( const QList<long>& );
void clearInternal();
private: private:
QTextBrowser* myInfo; QTextBrowser* myInfo;
@ -166,8 +188,9 @@ class SMESHGUI_EXPORT SMESHGUI_TreeElemInfo : public SMESHGUI_ElemInfo
public: public:
SMESHGUI_TreeElemInfo( QWidget* = 0 ); SMESHGUI_TreeElemInfo( QWidget* = 0 );
void showInfo( long, bool ); protected:
void clear(); void information( const QList<long>& );
void clearInternal();
private: private:
QTreeWidgetItem* createItem( QTreeWidgetItem* = 0, int = 100 ); QTreeWidgetItem* createItem( QTreeWidgetItem* = 0, int = 100 );

View File

@ -5891,6 +5891,10 @@ It is impossible to read point coordinates from file</translation>
<source>VALUE</source> <source>VALUE</source>
<translation>Value</translation> <translation>Value</translation>
</message> </message>
<message>
<source>X_FROM_Y_ITEMS_SHOWN</source>
<translation>%1-%2 from %3 items shown</translation>
</message>
</context> </context>
<context> <context>
<name>SMESHGUI_MinDistance</name> <name>SMESHGUI_MinDistance</name>