--- /dev/null
+using namespace std;
+// File : SMESHGUI_MeshInfosDlg.cxx
+// Created : Sat Jun 08 15:31:16 2002
+// Author : Nicolas BARBEROU
+
+// Project : SALOME
+// Module : SMESH
+// Copyright : EADS CCR 2002
+// $Header$
+
+#include "SMESHGUI_MeshInfosDlg.h"
+
+#include "SMESHGUI.h"
+#include "QAD_Application.h"
+#include "QAD_Desktop.h"
+#include "utilities.h"
+
+// QT Includes
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qvariant.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qmap.h>
+
+/*
+ * Constructs a SMESHGUI_MeshInfosDlg which is a child of 'parent', with the
+ * name 'name' and widget flags set to 'f'
+ *
+ * The dialog will by default be modeless, unless you set 'modal' to
+ * TRUE to construct a modal dialog.
+ */
+SMESHGUI_MeshInfosDlg::SMESHGUI_MeshInfosDlg( QWidget* parent, const char* name, SALOME_Selection* Sel, bool modal, WFlags fl )
+ : QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu )
+{
+ if ( !name )
+ setName( "SMESHGUI_MeshInfosDlg" );
+ setCaption( tr( "SMESH_MESHINFO_TITLE" ) );
+ setSizeGripEnabled( TRUE );
+
+ SMESHGUI_MeshInfosDlgLayout = new QVBoxLayout( this );
+ SMESHGUI_MeshInfosDlgLayout->setSpacing( 6 );
+ SMESHGUI_MeshInfosDlgLayout->setMargin( 11 );
+
+ /****************************************************************/
+ GroupBox1 = new QGroupBox( this, "GroupBox1" );
+ GroupBox1->setTitle( tr( "SMESH_MESHINFO_NB1D" ) );
+ GroupBox1->setColumnLayout(0, Qt::Vertical );
+ GroupBox1->layout()->setSpacing( 0 );
+ GroupBox1->layout()->setMargin( 0 );
+ QGridLayout* GroupBox1Layout = new QGridLayout( GroupBox1->layout() );
+ GroupBox1Layout->setAlignment( Qt::AlignTop );
+ GroupBox1Layout->setSpacing( 6 );
+ GroupBox1Layout->setMargin( 11 );
+
+ TextLabel11 = new QLabel( GroupBox1, "TextLabel11" );
+ TextLabel11->setMinimumWidth( 100 );
+ TextLabel11->setText( tr( "SMESH_MESHINFO_NODES" ) );
+ GroupBox1Layout->addWidget( TextLabel11, 0, 0 );
+
+ TextLabel12 = new QLabel( GroupBox1, "TextLabel12" );
+ TextLabel12->setMinimumWidth( 100 );
+ TextLabel12->setText( tr( "SMESH_MESHINFO_EDGES" ) );
+ GroupBox1Layout->addWidget( TextLabel12, 1, 0 );
+
+ TextLabel13 = new QLabel( GroupBox1, "TextLabel13" );
+ TextLabel13->setMinimumWidth( 100 );
+ GroupBox1Layout->addWidget( TextLabel13, 0, 1 );
+
+ TextLabel14 = new QLabel( GroupBox1, "TextLabel14" );
+ TextLabel14->setMinimumWidth( 100 );
+ GroupBox1Layout->addWidget( TextLabel14, 1, 1 );
+ SMESHGUI_MeshInfosDlgLayout->addWidget( GroupBox1 );
+
+ /****************************************************************/
+ GroupBox2 = new QGroupBox( this, "GroupBox2" );
+ GroupBox2->setTitle( tr( "SMESH_MESHINFO_NB2D" ) );
+ GroupBox2->setColumnLayout(0, Qt::Vertical );
+ GroupBox2->layout()->setSpacing( 0 );
+ GroupBox2->layout()->setMargin( 0 );
+ QGridLayout* GroupBox2Layout = new QGridLayout( GroupBox2->layout() );
+ GroupBox2Layout->setAlignment( Qt::AlignTop );
+ GroupBox2Layout->setSpacing( 6 );
+ GroupBox2Layout->setMargin( 11 );
+
+ TextLabel21 = new QLabel( GroupBox2, "TextLabel21" );
+ TextLabel21->setMinimumWidth( 100 );
+ TextLabel21->setText( tr( "SMESH_MESHINFO_TRIANGLES" ) );
+ GroupBox2Layout->addWidget( TextLabel21, 0, 0 );
+
+ TextLabel22 = new QLabel( GroupBox2, "TextLabel22" );
+ TextLabel22->setMinimumWidth( 100 );
+ TextLabel22->setText( tr( "SMESH_MESHINFO_QUADRANGLES" ) );
+ GroupBox2Layout->addWidget( TextLabel22, 1, 0 );
+
+ TextLabel23 = new QLabel( GroupBox2, "TextLabel23" );
+ TextLabel23->setMinimumWidth( 100 );
+ GroupBox2Layout->addWidget( TextLabel23, 0, 1 );
+
+ TextLabel24 = new QLabel( GroupBox2, "TextLabel24" );
+ TextLabel24->setMinimumWidth( 100 );
+ GroupBox2Layout->addWidget( TextLabel24, 1, 1 );
+ SMESHGUI_MeshInfosDlgLayout->addWidget( GroupBox2 );
+
+ /****************************************************************/
+ GroupBox3 = new QGroupBox( this, "GroupBox3" );
+ GroupBox3->setTitle( tr( "SMESH_MESHINFO_NB3D" ) );
+ GroupBox3->setColumnLayout(0, Qt::Vertical );
+ GroupBox3->layout()->setSpacing( 0 );
+ GroupBox3->layout()->setMargin( 0 );
+ QGridLayout* GroupBox3Layout = new QGridLayout( GroupBox3->layout() );
+ GroupBox3Layout->setAlignment( Qt::AlignTop );
+ GroupBox3Layout->setSpacing( 6 );
+ GroupBox3Layout->setMargin( 11 );
+
+ TextLabel31 = new QLabel( GroupBox3, "TextLabel31" );
+ TextLabel31->setMinimumWidth( 100 );
+ TextLabel31->setText( tr( "SMESH_MESHINFO_TETRAS" ) );
+ GroupBox3Layout->addWidget( TextLabel31, 0, 0 );
+
+ TextLabel32 = new QLabel( GroupBox3, "TextLabel32" );
+ TextLabel32->setMinimumWidth( 100 );
+ TextLabel32->setText( tr( "SMESH_MESHINFO_HEXAS" ) );
+ GroupBox3Layout->addWidget( TextLabel32, 1, 0 );
+
+ TextLabel33 = new QLabel( GroupBox3, "TextLabel33" );
+ TextLabel33->setMinimumWidth( 100 );
+ GroupBox3Layout->addWidget( TextLabel33, 0, 1 );
+
+ TextLabel34 = new QLabel( GroupBox3, "TextLabel34" );
+ TextLabel34->setMinimumWidth( 100 );
+ GroupBox3Layout->addWidget( TextLabel34, 1, 1 );
+ SMESHGUI_MeshInfosDlgLayout->addWidget( GroupBox3 );
+
+ /****************************************************************/
+ QGroupBox* GroupButtons = new QGroupBox( this, "GroupButtons" );
+ GroupButtons->setColumnLayout(0, Qt::Vertical );
+ GroupButtons->layout()->setSpacing( 0 );
+ GroupButtons->layout()->setMargin( 0 );
+ QGridLayout* GroupButtonsLayout = new QGridLayout( GroupButtons->layout() );
+ GroupButtonsLayout->setAlignment( Qt::AlignTop );
+ GroupButtonsLayout->setSpacing( 6 );
+ GroupButtonsLayout->setMargin( 11 );
+
+ GroupButtonsLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 0 );
+ buttonOk = new QPushButton( GroupButtons, "buttonOk" );
+ buttonOk->setText( tr( "SMESH_BUT_OK" ) );
+ buttonOk->setAutoDefault( TRUE );
+ buttonOk->setDefault( TRUE );
+ GroupButtonsLayout->addWidget( buttonOk, 0, 1 );
+ GroupButtonsLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 2 );
+ SMESHGUI_MeshInfosDlgLayout->addWidget( GroupButtons );
+ /****************************************************************/
+
+ Init( Sel ) ;
+}
+
+/*
+ * Destroys the object and frees any allocated resources
+ */
+SMESHGUI_MeshInfosDlg::~SMESHGUI_MeshInfosDlg()
+{
+ // no need to delete child widgets, Qt does it all for us
+}
+
+//=================================================================================
+// function : Init()
+// purpose :
+//=================================================================================
+void SMESHGUI_MeshInfosDlg::Init( SALOME_Selection* Sel )
+{
+ mySelection = Sel ;
+
+ mySMESHGUI = SMESHGUI::GetSMESHGUI() ;
+ myStudy = mySMESHGUI->GetActiveStudy()->getStudyDocument();
+
+ Engines::Component_var comp = QAD_Application::getDesktop()->getEngine("FactoryServer", "SMESH");
+ myCompMesh = SMESH::SMESH_Gen::_narrow(comp);
+
+ int nbSel = mySelection->IObjectCount();
+
+ TextLabel13->setText( "0" );
+ TextLabel14->setText( "0" );
+ TextLabel23->setText( "0" );
+ TextLabel24->setText( "0" );
+ TextLabel33->setText( "0" );
+ TextLabel34->setText( "0" );
+
+ //gets the selected mesh
+ if ( nbSel == 1 ) {
+ Handle(SALOME_InteractiveObject) IObject = mySelection->firstIObject();
+ Standard_Boolean res;
+ myMesh = mySMESHGUI->ConvertIOinMesh( IObject, res );
+ if ( res )
+ DumpMeshInfos();
+ }
+
+ mySMESHGUI->SetActiveDialogBox( (QDialog*)this ) ;
+
+ /* signals and slots connections */
+ connect( buttonOk, SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) );
+ connect( mySMESHGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ) ;
+ connect( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
+ /* to close dialog if study change */
+ connect( mySMESHGUI, SIGNAL ( SignalCloseAllDialogs() ), this, SLOT( ClickOnOk() ) ) ;
+
+ /* Move widget on the botton right corner of main widget */
+ int x, y ;
+ mySMESHGUI->DefineDlgPosition( this, x, y ) ;
+ this->move( x, y ) ;
+ this->show() ; /* Displays Dialog */
+
+ return ;
+}
+
+//=================================================================================
+// function : genEdgeKey
+// purpose : edge counting helper;
+// packs two long integers into one 8-byte value (treated as double by the caller);
+// the order of arguments is insignificant
+//=================================================================================
+void genEdgeKey(long a, long b, void* key)
+{
+ long* lKey = (long*)key;
+ *lKey = (a < b) ? a : b;
+ *(++lKey) = (a < b) ? b : a;
+}
+
+//=================================================================================
+// function : DumpMeshInfos()
+// purpose :
+//=================================================================================
+void SMESHGUI_MeshInfosDlg::DumpMeshInfos()
+{
+ int nbOfNodes = myMesh->NbNodes();
+ int nbOfEdges = myMesh->NbEdges();
+ int nbOfTriangles = myMesh->NbTriangles();
+ int nbOfQuadrangles = myMesh->NbQuadrangles();
+ int nbOfTetras = myMesh->NbTetras();
+ int nbOfHexas = myMesh->NbHexas();
+
+ /*
+ int nbOfNodes = 0 ;
+ int nbOfEdges = 0 ;
+ int nbOfTriangles = 0 ;
+ int nbOfQuadrangles = 0 ;
+ int nbOfTetras = 0 ;
+ int nbOfHexas = 0 ;
+ int nbCells = 0 ;
+ int CellType = 0 ;
+ QMap<double, char> aMapOfEdges;
+
+ Standard_Boolean result;
+ SMESH_Actor* MeshActor = mySMESHGUI->FindActor(myMesh, result, true);
+
+ if ( result ) {
+ vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( MeshActor->DataSource );
+ vtkPoints *Pts = ugrid->GetPoints();
+ nbOfNodes = Pts->GetNumberOfPoints();
+ int nbCells = ugrid->GetNumberOfCells();
+
+ for ( int i = 0; i < nbCells; i++ ) {
+ vtkCell* cellPtr = ugrid->GetCell(i);
+ CellType = cellPtr->GetCellType();
+ switch (CellType)
+ {
+ case 3: //Edges
+ {
+ nbOfEdges++;
+ break;
+ }
+ case 5: //Triangles
+ {
+ nbOfTriangles++;
+
+ for (int edgeNum = 0; edgeNum < 3; edgeNum++) {
+ vtkCell* edgePtr = cellPtr->GetEdge(edgeNum);
+ double anEdgeKey;
+ genEdgeKey(edgePtr->GetPointId(0), edgePtr->GetPointId(1), &anEdgeKey);
+ if (!aMapOfEdges.contains(anEdgeKey)) {
+ nbOfEdges++;
+ aMapOfEdges.insert(anEdgeKey, 0);
+ }
+ }
+ break;
+ }
+ case 9: //Quadrangles
+ {
+ nbOfQuadrangles++;
+
+ for (int edgeNum = 0; edgeNum < 4; edgeNum++) {
+ vtkCell* edgePtr = cellPtr->GetEdge(edgeNum);
+ double anEdgeKey;
+ genEdgeKey(edgePtr->GetPointId(0), edgePtr->GetPointId(1), &anEdgeKey);
+ if (!aMapOfEdges.contains(anEdgeKey)) {
+ nbOfEdges++;
+ aMapOfEdges.insert(anEdgeKey, 0);
+ }
+ }
+ break;
+ }
+ case 10: //Tetraedras
+ {
+ nbOfTetras++;
+
+ for (int edgeNum = 0; edgeNum < 6; edgeNum++) {
+ vtkCell* edgePtr = cellPtr->GetEdge(edgeNum);
+ double anEdgeKey;
+ genEdgeKey(edgePtr->GetPointId(0), edgePtr->GetPointId(1), &anEdgeKey);
+ if (!aMapOfEdges.contains(anEdgeKey)) {
+ nbOfEdges++;
+ aMapOfEdges.insert(anEdgeKey, 0);
+ }
+ }
+ break;
+ }
+ case 12: //Hexahedras
+ {
+ nbOfHexas++;
+
+ for (int edgeNum = 0; edgeNum < 12; edgeNum++) {
+ vtkCell* edgePtr = cellPtr->GetEdge(edgeNum);
+ double anEdgeKey;
+ genEdgeKey(edgePtr->GetPointId(0), edgePtr->GetPointId(1), &anEdgeKey);
+ if (!aMapOfEdges.contains(anEdgeKey)) {
+ nbOfEdges++;
+ aMapOfEdges.insert(anEdgeKey, 0);
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ */
+ TextLabel13->setText( tr( "%1" ).arg(nbOfNodes) );
+ TextLabel14->setText( tr( "%1" ).arg(nbOfEdges) );
+ TextLabel23->setText( tr( "%1" ).arg(nbOfTriangles) );
+ TextLabel24->setText( tr( "%1" ).arg(nbOfQuadrangles) );
+ TextLabel33->setText( tr( "%1" ).arg(nbOfTetras) );
+ TextLabel34->setText( tr( "%1" ).arg(nbOfHexas) );
+}
+
+//=================================================================================
+// function : ClickOnOk()
+// purpose :
+//=================================================================================
+void SMESHGUI_MeshInfosDlg::ClickOnOk()
+{
+ disconnect( mySelection, 0, this, 0 );
+ mySMESHGUI->ResetState() ;
+ reject() ;
+ return ;
+}
+
+//=================================================================================
+// function : SelectionIntoArgument()
+// purpose : Called when selection has changed
+//=================================================================================
+void SMESHGUI_MeshInfosDlg::SelectionIntoArgument()
+{
+ TextLabel13->setText( "0" );
+ TextLabel14->setText( "0" );
+ TextLabel23->setText( "0" );
+ TextLabel24->setText( "0" );
+ TextLabel33->setText( "0" );
+ TextLabel34->setText( "0" );
+
+ int nbSel = mySelection->IObjectCount();
+ if ( nbSel == 1 ) {
+ Handle(SALOME_InteractiveObject) IObject = mySelection->firstIObject();
+ Standard_Boolean res;
+ myMesh = mySMESHGUI->ConvertIOinMesh( IObject, res );
+ if ( res )
+ DumpMeshInfos();
+ }
+ return ;
+}
+
+
+//=================================================================================
+// function : closeEvent()
+// purpose :
+//=================================================================================
+void SMESHGUI_MeshInfosDlg::closeEvent( QCloseEvent* e )
+{
+ disconnect( mySelection, 0, this, 0 );
+ mySMESHGUI->ResetState() ;
+ reject() ;
+ return ;
+}
+
+
+//=================================================================================
+// function : enterEvent()
+// purpose : when mouse enter onto the QWidget
+//=================================================================================
+void SMESHGUI_MeshInfosDlg::enterEvent( QEvent * )
+{
+ ActivateThisDialog() ;
+}
+
+
+//=================================================================================
+// function : DeactivateActiveDialog()
+// purpose :
+//=================================================================================
+void SMESHGUI_MeshInfosDlg::DeactivateActiveDialog()
+{
+ disconnect( mySelection, 0, this, 0 );
+
+ return ;
+}
+
+
+//=================================================================================
+// function : ActivateThisDialog()
+// purpose :
+//=================================================================================
+void SMESHGUI_MeshInfosDlg::ActivateThisDialog()
+{
+ /* Emit a signal to deactivate any active dialog */
+ mySMESHGUI->EmitSignalDeactivateDialog() ;
+
+ return ;
+}
+