// 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 #include #include #include #include #include #include #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: %2
").arg(aDimension).arg(aNbDimElements)); anInfo.append(QString("Nb of nodes: %1

").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:

")); 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("- %1
").arg(aGroup->GetName())); anInfo.append(QString("%1
").arg("on nodes")); anInfo.append(QString("%1
").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 = ""; SALOMEDS::SObject_var aGeomObj, aRef; if ( subObj->FindSubObject( 1, aGeomObj ) && aGeomObj->ReferencedObject( aRef )) aShapeName = aRef->GetName(); anInfo.append(QString("based on %1 geometry object

").arg(aShapeName)); } else anInfo.append(QString("
")); } } } // 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:

")); 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("- %1
").arg(aGroup->GetName())); anInfo.append(QString("%1
").arg("on edges")); anInfo.append(QString("%1
").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 = ""; SALOMEDS::SObject_var aGeomObj, aRef; if ( subObj->FindSubObject( 1, aGeomObj ) && aGeomObj->ReferencedObject( aRef )) aShapeName = aRef->GetName(); anInfo.append(QString("based on %1 geometry object

").arg(aShapeName)); } else anInfo.append(QString("
")); } } } // 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:

")); 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("- %1
").arg(aGroup->GetName())); anInfo.append(QString("%1
").arg("on faces")); anInfo.append(QString("%1
").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 = ""; SALOMEDS::SObject_var aGeomObj, aRef; if ( subObj->FindSubObject( 1, aGeomObj ) && aGeomObj->ReferencedObject( aRef )) aShapeName = aRef->GetName(); anInfo.append(QString("based on %1 geometry object

").arg(aShapeName)); } else anInfo.append(QString("
")); } } } // 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:
")); 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("- %1
").arg(aGroup->GetName())); anInfo.append(QString("%1
").arg("on volumes")); anInfo.append(QString("%1
").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 = ""; SALOMEDS::SObject_var aGeomObj, aRef; if ( subObj->FindSubObject( 1, aGeomObj ) && aGeomObj->ReferencedObject( aRef )) aShapeName = aRef->GetName(); anInfo.append(QString("based on %1 geometry object

").arg(aShapeName)); } else anInfo.append(QString("
")); } } } 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; }