Salome HOME
Merge with OCC-V2_1_0_deb
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_StandardMeshInfosDlg.cxx
diff --git a/src/SMESHGUI/SMESHGUI_StandardMeshInfosDlg.cxx b/src/SMESHGUI/SMESHGUI_StandardMeshInfosDlg.cxx
new file mode 100644 (file)
index 0000000..37dfbdf
--- /dev/null
@@ -0,0 +1,448 @@
+//  SMESH SMESHGUI : GUI for SMESH component
+//
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+//
+//
+//
+//  File   : SMESHGUI_StandardMeshInfosDlg.cxx
+//  Author : Michael ZORIN
+//  Module : SMESH
+//  $Header$
+
+// QT Includes
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qtextbrowser.h>
+#include <qmap.h>
+#include <qpushbutton.h>
+
+#include "QAD_Application.h"
+#include "QAD_Desktop.h"
+#include "QAD_WaitCursor.h"
+
+#include "SMESHGUI_StandardMeshInfosDlg.h"
+#include "SMESHGUI_Utils.h"
+#include "SMESHGUI_MeshUtils.h"
+#include "SMESHGUI.h"
+
+#include "SMESH.hxx"
+
+// IDL Headers
+#include "SALOMEconfig.h"
+#include CORBA_SERVER_HEADER(SMESH_Mesh)
+#include CORBA_SERVER_HEADER(SMESH_Group)
+#include CORBA_SERVER_HEADER(GEOM_Gen)
+
+#include "utilities.h"
+
+using namespace std;
+
+
+//=================================================================================
+/*!
+ *  SMESHGUI_StandardMeshInfosDlg::SMESHGUI_StandardMeshInfosDlg
+ * 
+ *  Constructor
+ */
+//=================================================================================
+SMESHGUI_StandardMeshInfosDlg::SMESHGUI_StandardMeshInfosDlg( QWidget* parent,  const char* name, bool modal, WFlags fl )
+     : QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose )
+{
+  if ( !name )
+      setName( "SMESHGUI_StandardMeshInfosDlg" );
+  setCaption( tr( "SMESH_STANDARD_MESHINFO_TITLE"  ) );
+  setSizeGripEnabled( TRUE );
+
+  myStartSelection = true;
+  myIsActiveWindow = true;
+
+  // dialog layout
+  QGridLayout* aDlgLayout = new QGridLayout( this ); 
+  aDlgLayout->setSpacing( 6 );
+  aDlgLayout->setMargin( 11 );
+  
+  // mesh group box
+  myMeshGroup = new QGroupBox( this, "myMeshGroup" );
+  myMeshGroup->setTitle( tr( "SMESH_MESH" ) );
+  myMeshGroup->setColumnLayout(0, Qt::Vertical );
+  myMeshGroup->layout()->setSpacing( 0 );
+  myMeshGroup->layout()->setMargin( 0 );
+  QGridLayout* myMeshGroupLayout = new QGridLayout( myMeshGroup->layout() );
+  myMeshGroupLayout->setAlignment( Qt::AlignTop );
+  myMeshGroupLayout->setSpacing( 6 );
+  myMeshGroupLayout->setMargin( 11 );
+  
+  // select button, label and line edit with mesh name
+  myNameLab = new QLabel( myMeshGroup, "myNameLab" );
+  myNameLab->setText( tr( "SMESH_NAME"  ) );
+  myMeshGroupLayout->addWidget( myNameLab, 0, 0 );
+
+  QPixmap image0( QAD_Desktop::getResourceManager()->loadPixmap( "SMESH",tr( "ICON_SELECT" ) ) );
+  mySelectBtn = new QPushButton( myMeshGroup, "mySelectBtn" );
+  mySelectBtn->setPixmap( image0 );
+  mySelectBtn->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+  myMeshGroupLayout->addWidget( mySelectBtn, 0, 1 );
+  
+  myMeshLine = new QLineEdit( myMeshGroup, "myMeshLine" );
+  myMeshGroupLayout->addWidget( myMeshLine, 0, 2 );
+  
+  aDlgLayout->addWidget( myMeshGroup, 0, 0 );
+
+  // information group box
+  myInfoGroup  = new QGroupBox( this, "myInfoGroup" );
+  myInfoGroup->setTitle( tr( "SMESH_INFORMATION" ) );
+  myInfoGroup->setColumnLayout(0, Qt::Vertical );
+  myInfoGroup->layout()->setSpacing( 0 );
+  myInfoGroup->layout()->setMargin( 0 );
+  QGridLayout* myInfoGroupLayout = new QGridLayout( myInfoGroup->layout() );
+  myInfoGroupLayout->setAlignment( Qt::AlignTop );
+  myInfoGroupLayout->setSpacing( 6 );
+  myInfoGroupLayout->setMargin( 11 );
+  
+  // information text browser
+  myInfo = new QTextBrowser(myInfoGroup, "myInfo");
+  myInfoGroupLayout->addWidget( myInfo, 0, 0 );
+
+  aDlgLayout->addWidget( myInfoGroup, 1, 0 );
+
+  // buttons group
+  myButtonsGroup = new QGroupBox( this, "myButtonsGroup" );
+  myButtonsGroup->setColumnLayout(0, Qt::Vertical );
+  myButtonsGroup->layout()->setSpacing( 0 );  myButtonsGroup->layout()->setMargin( 0 );
+  QHBoxLayout* myButtonsGroupLayout = new QHBoxLayout( myButtonsGroup->layout() );
+  myButtonsGroupLayout->setAlignment( Qt::AlignTop );
+  myButtonsGroupLayout->setSpacing( 6 ); myButtonsGroupLayout->setMargin( 11 );
+  
+  // buttons --> OK button
+  myOkBtn = new QPushButton( tr( "SMESH_BUT_OK"  ), myButtonsGroup, "myOkBtn" );
+  myOkBtn->setAutoDefault( TRUE ); myOkBtn->setDefault( TRUE );
+  myButtonsGroupLayout->addStretch();
+  myButtonsGroupLayout->addWidget( myOkBtn );
+  myButtonsGroupLayout->addStretch();
+  
+  aDlgLayout->addWidget( myButtonsGroup, 2, 0 );
+  
+  mySelection = SALOME_Selection::Selection( SMESHGUI::GetSMESHGUI()->GetActiveStudy()->getSelection() );
+  SMESHGUI::GetSMESHGUI()->SetActiveDialogBox( this ) ;
+
+  // connect signals
+  connect( myOkBtn,                  SIGNAL( clicked() ),                      this, SLOT( close() ) );
+  connect( mySelectBtn,              SIGNAL( clicked() ),                      this, SLOT( onStartSelection() ) );
+  connect( SMESHGUI::GetSMESHGUI(),  SIGNAL( SignalCloseAllDialogs() ),        this, SLOT( close() ) ) ;
+  connect( SMESHGUI::GetSMESHGUI(),  SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ) ;
+  connect( mySelection,              SIGNAL( currentSelectionChanged() ),      this, SLOT( onSelectionChanged() ) );
+
+  // resize and move dialog, then show
+  this->setMinimumSize(270, 428);
+  int x, y;
+  SMESHGUI::GetSMESHGUI()->DefineDlgPosition( this, x, y );
+  this->move( x, y );
+  this->show();
+  
+  // init dialog with current selection
+  myMeshFilter = new SMESH_TypeFilter( MESH );
+  mySelection->AddFilter( myMeshFilter );
+  onSelectionChanged();
+}
+
+//=================================================================================
+/*!
+ *  SMESHGUI_StandardMeshInfosDlg::~SMESHGUI_StandardMeshInfosDlg
+ * 
+ *  Destructor
+ */
+//=================================================================================
+SMESHGUI_StandardMeshInfosDlg::~SMESHGUI_StandardMeshInfosDlg()
+{
+}
+
+//=================================================================================
+/*!
+ *  SMESHGUI_StandardMeshInfosDlg::DumpMeshInfos
+ */
+//=================================================================================
+void SMESHGUI_StandardMeshInfosDlg::DumpMeshInfos()
+{
+  QAD_WaitCursor wc;
+  int nbSel = mySelection->IObjectCount();
+  myInfo->clear();
+  if ( nbSel == 1 ) {
+    myStartSelection = false;
+    myMeshLine->setText( "" );
+    SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO( mySelection->firstIObject() );
+    
+    if ( !aMesh->_is_nil() ) {
+      QString aName, anInfo;
+      SMESH::GetNameOfSelectedIObjects(mySelection, aName);
+      myMeshLine->setText( aName );
+      int aNbNodes =   (int)aMesh->NbNodes();
+      int aNbEdges =   (int)aMesh->NbEdges();
+      int aNbFaces =   (int)aMesh->NbFaces();
+      int aNbVolumes = (int)aMesh->NbVolumes();
+      
+      int aDimension = 0;
+      double aNbDimElements = 0;
+      if (aNbVolumes > 0) {
+       aNbDimElements = aNbVolumes;
+       aDimension = 3;
+      }
+      else if(aNbFaces > 0 ) {
+       aNbDimElements = aNbFaces;
+       aDimension = 2;
+      }
+      else if(aNbEdges > 0 ) {
+       aNbDimElements = aNbEdges;
+       aDimension = 1;
+      }
+      else if(aNbNodes > 0 ) {
+       aNbDimElements = aNbNodes;
+       aDimension = 0;
+      }
+      
+      // information about the mesh
+      anInfo.append(QString("Nb of element of dimension %1:<b> %2</b><br>").arg(aDimension).arg(aNbDimElements));
+      anInfo.append(QString("Nb of nodes: <b>%1</b><br><br>").arg(aNbNodes));
+
+      // information about the groups of the mesh
+      SALOMEDS::Study_var aStudy = SMESH::GetActiveStudyDocument();
+      SALOMEDS::SObject_var aMeshSO = aStudy->FindObjectIOR( aStudy->ConvertObjectToIOR(aMesh) ); 
+      SALOMEDS::SObject_var anObj;
+      
+      bool hasGroup = false;
+
+      // info about groups on nodes
+      aMeshSO->FindSubObject(Tag_NodeGroups , anObj);
+      if ( !anObj->_is_nil() )
+       {
+         SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator(anObj);
+         if (it->More())
+           {
+             anInfo.append(QString("Groups:<br><br>"));
+             hasGroup = true;
+           }
+         for(; it->More(); it->Next()){
+           SALOMEDS::SObject_var subObj = it->Value();
+           SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( subObj->GetObject() );
+           if ( !aGroup->_is_nil() )
+             {
+               anInfo.append(QString("-   <b>%1</b><br>").arg(aGroup->GetName()));
+               anInfo.append(QString("%1<br>").arg("on nodes"));
+               anInfo.append(QString("%1<br>").arg(aGroup->Size()));
+               // check if the group based on geometry
+               SMESH::SMESH_GroupOnGeom_var aGroupOnGeom = SMESH::SMESH_GroupOnGeom::_narrow(aGroup);
+               if ( !aGroupOnGeom->_is_nil() )
+                 {
+                   GEOM::GEOM_Object_var aGroupMainShape = aGroupOnGeom->GetShape();
+                   QString aShapeName = "<unknown>";
+                   SALOMEDS::SObject_var aGeomObj, aRef;
+                   if ( subObj->FindSubObject( 1, aGeomObj ) &&  aGeomObj->ReferencedObject( aRef ))
+                     aShapeName = aRef->GetName();
+                   anInfo.append(QString("based on <i>%1</i> geometry object<br><br>").arg(aShapeName));
+                 }
+               else
+                 anInfo.append(QString("<br>"));
+             }
+         }
+       }  
+      
+      // info about groups on edges
+      anObj = SALOMEDS::SObject::_nil();
+      aMeshSO->FindSubObject(Tag_EdgeGroups , anObj);
+      if ( !anObj->_is_nil() )
+       {
+         SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator(anObj);
+         if (!hasGroup && it->More())
+           {
+             anInfo.append(QString("Groups:<br><br>"));
+             hasGroup = true;
+           }
+         for(; it->More(); it->Next()){
+           SALOMEDS::SObject_var subObj = it->Value();
+           SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( subObj->GetObject() );
+           if ( !aGroup->_is_nil() )
+             {
+               anInfo.append(QString("-   <b>%1</b><br>").arg(aGroup->GetName()));
+               anInfo.append(QString("%1<br>").arg("on edges"));
+               anInfo.append(QString("%1<br>").arg(aGroup->Size()));
+               // check if the group based on geometry
+               SMESH::SMESH_GroupOnGeom_var aGroupOnGeom = SMESH::SMESH_GroupOnGeom::_narrow(aGroup);
+               if ( !aGroupOnGeom->_is_nil() )
+                 {
+                   GEOM::GEOM_Object_var aGroupMainShape = aGroupOnGeom->GetShape();
+                   QString aShapeName = "<unknown>";
+                   SALOMEDS::SObject_var aGeomObj, aRef;
+                   if ( subObj->FindSubObject( 1, aGeomObj ) &&  aGeomObj->ReferencedObject( aRef ))
+                     aShapeName = aRef->GetName();
+                   anInfo.append(QString("based on <i>%1</i> geometry object<br><br>").arg(aShapeName));
+                 }
+               else
+                 anInfo.append(QString("<br>"));
+             }
+         }
+       }
+      
+      // info about groups on faces
+      anObj = SALOMEDS::SObject::_nil();
+      aMeshSO->FindSubObject(Tag_FaceGroups , anObj);
+      if ( !anObj->_is_nil() )
+       {
+         SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator(anObj);
+         if (!hasGroup && it->More())
+           {
+             anInfo.append(QString("Groups:<br><br>"));
+             hasGroup = true;
+           }
+         for(; it->More(); it->Next()){
+           SALOMEDS::SObject_var subObj = it->Value();
+           SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( subObj->GetObject() );
+           if ( !aGroup->_is_nil() )
+             {
+               anInfo.append(QString("-   <b>%1</b><br>").arg(aGroup->GetName()));
+               anInfo.append(QString("%1<br>").arg("on faces"));
+               anInfo.append(QString("%1<br>").arg(aGroup->Size()));
+               // check if the group based on geometry
+               SMESH::SMESH_GroupOnGeom_var aGroupOnGeom = SMESH::SMESH_GroupOnGeom::_narrow(aGroup);
+               if ( !aGroupOnGeom->_is_nil() )
+                 {
+                   GEOM::GEOM_Object_var aGroupMainShape = aGroupOnGeom->GetShape();
+                   QString aShapeName = "<unknown>";
+                   SALOMEDS::SObject_var aGeomObj, aRef;
+                   if ( subObj->FindSubObject( 1, aGeomObj ) &&  aGeomObj->ReferencedObject( aRef ))
+                     aShapeName = aRef->GetName();
+                   anInfo.append(QString("based on <i>%1</i> geometry object<br><br>").arg(aShapeName));
+                 }
+               else
+                 anInfo.append(QString("<br>"));
+             }
+         }
+       }
+      
+      // info about groups on volumes
+      anObj = SALOMEDS::SObject::_nil();
+      aMeshSO->FindSubObject(Tag_VolumeGroups , anObj);
+      if ( !anObj->_is_nil() )
+       {
+         SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator(anObj);
+         if (!hasGroup && it->More())
+           anInfo.append(QString("Groups:<br>"));
+         for(; it->More(); it->Next()){
+           SALOMEDS::SObject_var subObj = it->Value();
+           SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( subObj->GetObject() );
+           if ( !aGroup->_is_nil() )
+             {
+               anInfo.append(QString("-   <b>%1</b><br>").arg(aGroup->GetName()));
+               anInfo.append(QString("%1<br>").arg("on volumes"));
+               anInfo.append(QString("%1<br>").arg(aGroup->Size()));
+               // check if the group based on geometry
+               SMESH::SMESH_GroupOnGeom_var aGroupOnGeom = SMESH::SMESH_GroupOnGeom::_narrow(aGroup);
+               if ( !aGroupOnGeom->_is_nil() )
+                 {
+                   GEOM::GEOM_Object_var aGroupMainShape = aGroupOnGeom->GetShape();
+                   QString aShapeName = "<unknown>";
+                   SALOMEDS::SObject_var aGeomObj, aRef;
+                   if ( subObj->FindSubObject( 1, aGeomObj ) &&  aGeomObj->ReferencedObject( aRef ))
+                     aShapeName = aRef->GetName();
+                   anInfo.append(QString("based on <i>%1</i> geometry object<br><br>").arg(aShapeName));
+                 }
+               else
+                 anInfo.append(QString("<br>"));
+             }
+         }
+       }
+      
+      myInfo->setText(anInfo);
+      return;
+    }
+  }
+  
+  return;
+}
+
+//=================================================================================
+// function : SelectionIntoArgument()
+// purpose  : Called when selection has changed
+//=================================================================================
+void SMESHGUI_StandardMeshInfosDlg::onSelectionChanged()
+{
+  if ( myStartSelection )
+    DumpMeshInfos();
+}
+
+
+//=================================================================================
+// function : closeEvent()
+// purpose  :
+//=================================================================================
+void SMESHGUI_StandardMeshInfosDlg::closeEvent( QCloseEvent* e )
+{
+  mySelection->ClearFilters();
+  SMESHGUI::GetSMESHGUI()->ResetState();
+  QDialog::closeEvent( e );
+}
+
+
+//=================================================================================
+// function : windowActivationChange()
+// purpose  : called when window is activated/deactivated
+//=================================================================================
+void SMESHGUI_StandardMeshInfosDlg::windowActivationChange( bool oldActive )
+{
+  QDialog::windowActivationChange( oldActive );
+  if ( isActiveWindow() && myIsActiveWindow != isActiveWindow() )
+    ActivateThisDialog() ;
+  myIsActiveWindow = isActiveWindow();
+}
+
+
+//=================================================================================
+// function : DeactivateActiveDialog()
+// purpose  :
+//=================================================================================
+void SMESHGUI_StandardMeshInfosDlg::DeactivateActiveDialog()
+{
+  disconnect( mySelection, 0, this, 0 );
+}
+
+
+//=================================================================================
+// function : ActivateThisDialog()
+// purpose  :
+//=================================================================================
+void SMESHGUI_StandardMeshInfosDlg::ActivateThisDialog()
+{
+  /* Emit a signal to deactivate any active dialog */
+  SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog() ;
+  connect( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( onSelectionChanged() ) );
+}
+
+//=================================================================================
+// function : onStartSelection()
+// purpose  : starts selection
+//=================================================================================
+void SMESHGUI_StandardMeshInfosDlg::onStartSelection()
+{
+  myStartSelection = true;
+  mySelection->AddFilter( myMeshFilter ) ;
+  myMeshLine->setText( tr( "Select a mesh" ) );
+  onSelectionChanged();
+  myStartSelection = true;
+}