smesh/src/SMESHGUI/SMESHGUI_StandardMeshInfosDlg.cxx

470 lines
18 KiB
C++
Raw Normal View History

2004-12-17 16:07:35 +05:00
// 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
2004-12-17 16:07:35 +05:00
//
//
//
// File : SMESHGUI_StandardMeshInfosDlg.cxx
// Author : Michael ZORIN
// Module : SMESH
// $Header$
#include "SMESHGUI_StandardMeshInfosDlg.h"
#include "SMESHGUI.h"
#include "SMESHGUI_Utils.h"
#include "SMESHGUI_MeshUtils.h"
#include "SMESH.hxx"
#include "SMESH_TypeFilter.hxx"
#include "SALOMEDSClient_Study.hxx"
#include "SALOMEDSClient_SObject.hxx"
2005-06-08 16:45:19 +06:00
#include "SUIT_Desktop.h"
#include "SUIT_Session.h"
#include "SUIT_OverrideCursor.h"
#include "SUIT_MessageBox.h"
#include "LightApp_Application.h"
#include "LightApp_SelectionMgr.h"
#include "SALOME_ListIO.hxx"
#include "utilities.h"
2004-12-17 16:07:35 +05:00
// QT Includes
#include <qgroupbox.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qlineedit.h>
#include <qtextbrowser.h>
#include <qmap.h>
#include <qpushbutton.h>
// IDL Headers
#include "SALOMEconfig.h"
#include CORBA_SERVER_HEADER(SMESH_Mesh)
#include CORBA_SERVER_HEADER(SMESH_Group)
#include CORBA_SERVER_HEADER(GEOM_Gen)
using namespace std;
//=================================================================================
/*!
* SMESHGUI_StandardMeshInfosDlg::SMESHGUI_StandardMeshInfosDlg
*
2004-12-17 16:07:35 +05:00
* Constructor
*/
//=================================================================================
2005-06-08 16:45:19 +06:00
SMESHGUI_StandardMeshInfosDlg::SMESHGUI_StandardMeshInfosDlg( SMESHGUI* theModule, const char* name,
bool modal, WFlags fl)
2005-06-08 16:45:19 +06:00
: QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder |
WStyle_Title | WStyle_SysMenu | WDestructiveClose),
mySMESHGUI( theModule ),
mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
2004-12-17 16:07:35 +05:00
{
if (!name)
setName("SMESHGUI_StandardMeshInfosDlg");
setCaption(tr("SMESH_STANDARD_MESHINFO_TITLE" ));
setSizeGripEnabled(TRUE);
2004-12-17 16:07:35 +05:00
myStartSelection = true;
myIsActiveWindow = true;
// dialog layout
QGridLayout* aDlgLayout = new QGridLayout(this);
aDlgLayout->setSpacing(6);
aDlgLayout->setMargin(11);
2004-12-17 16:07:35 +05:00
// 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);
2004-12-17 16:07:35 +05:00
// 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(SUIT_Session::session()->resourceMgr()->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);
2004-12-17 16:07:35 +05:00
// 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);
2004-12-17 16:07:35 +05:00
// information text browser
myInfo = new QTextBrowser(myInfoGroup, "myInfo");
myInfoGroupLayout->addWidget(myInfo, 0, 0);
2004-12-17 16:07:35 +05:00
aDlgLayout->addWidget(myInfoGroup, 1, 0);
2004-12-17 16:07:35 +05:00
// 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 and Help buttons
myOkBtn = new QPushButton(tr("SMESH_BUT_OK" ), myButtonsGroup, "myOkBtn");
myOkBtn->setAutoDefault(TRUE); myOkBtn->setDefault(TRUE);
myHelpBtn = new QPushButton(tr("SMESH_BUT_HELP" ), myButtonsGroup, "myHelpBtn");
myHelpBtn->setAutoDefault(TRUE);
myButtonsGroupLayout->addWidget(myOkBtn);
2004-12-17 16:07:35 +05:00
myButtonsGroupLayout->addStretch();
myButtonsGroupLayout->addWidget(myHelpBtn);
aDlgLayout->addWidget(myButtonsGroup, 2, 0);
2005-06-08 16:45:19 +06:00
mySMESHGUI->SetActiveDialogBox(this);
2004-12-17 16:07:35 +05:00
// connect signals
2005-06-08 16:45:19 +06:00
connect( myOkBtn, SIGNAL(clicked()), this, SLOT(close()));
connect( myHelpBtn, SIGNAL(clicked()), this, SLOT(onHelp()));
2005-06-08 16:45:19 +06:00
connect( mySelectBtn, SIGNAL(clicked()), this, SLOT(onStartSelection()));
connect( mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(close()));
connect( mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
connect( mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(onSelectionChanged()));
2004-12-17 16:07:35 +05:00
// resize and move dialog, then show
this->setMinimumSize(270, 428);
this->show();
2004-12-17 16:07:35 +05:00
// init dialog with current selection
myMeshFilter = new SMESH_TypeFilter (MESH);
mySelectionMgr->installFilter(myMeshFilter);
2004-12-17 16:07:35 +05:00
onSelectionChanged();
myHelpFileName = "/files/viewing_mesh_info.htm#standard_infos";
2004-12-17 16:07:35 +05:00
}
//=================================================================================
/*!
* SMESHGUI_StandardMeshInfosDlg::~SMESHGUI_StandardMeshInfosDlg
*
2004-12-17 16:07:35 +05:00
* Destructor
*/
//=================================================================================
SMESHGUI_StandardMeshInfosDlg::~SMESHGUI_StandardMeshInfosDlg()
{
}
//=================================================================================
/*!
* SMESHGUI_StandardMeshInfosDlg::DumpMeshInfos
*/
//=================================================================================
void SMESHGUI_StandardMeshInfosDlg::DumpMeshInfos()
{
SUIT_OverrideCursor wc;
SALOME_ListIO aList;
mySelectionMgr->selectedObjects(aList);
int nbSel = aList.Extent();
2004-12-17 16:07:35 +05:00
myInfo->clear();
if (nbSel == 1) {
2004-12-17 16:07:35 +05:00
myStartSelection = false;
myMeshLine->setText("");
SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(aList.First());
if (!aMesh->_is_nil()) {
2004-12-17 16:07:35 +05:00
QString aName, anInfo;
SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aName);
myMeshLine->setText(aName);
2004-12-17 16:07:35 +05:00
int aNbNodes = (int)aMesh->NbNodes();
int aNbEdges = (int)aMesh->NbEdges();
int aNbFaces = (int)aMesh->NbFaces();
int aNbVolumes = (int)aMesh->NbVolumes();
2004-12-17 16:07:35 +05:00
int aDimension = 0;
double aNbDimElements = 0;
if (aNbVolumes > 0) {
aNbDimElements = aNbVolumes;
aDimension = 3;
}
else if(aNbFaces > 0) {
2004-12-17 16:07:35 +05:00
aNbDimElements = aNbFaces;
aDimension = 2;
}
else if(aNbEdges > 0) {
2004-12-17 16:07:35 +05:00
aNbDimElements = aNbEdges;
aDimension = 1;
}
else if(aNbNodes > 0) {
2004-12-17 16:07:35 +05:00
aNbDimElements = aNbNodes;
aDimension = 0;
}
2004-12-17 16:07:35 +05:00
// 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
_PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
_PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh);
_PTR(SObject) anObj;
2004-12-17 16:07:35 +05:00
bool hasGroup = false;
// info about groups on nodes
aMeshSO->FindSubObject(Tag_NodeGroups, anObj);
if (anObj) {
_PTR(ChildIterator) it = aStudy->NewChildIterator(anObj);
if (it->More()) {
anInfo.append(QString("Groups:<br><br>"));
hasGroup = true;
}
for (; it->More(); it->Next()) {
_PTR(SObject) subObj = it->Value();
CORBA::Object_var anObject = SMESH::SObjectToObject(subObj);
SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject);
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>";
_PTR(SObject) aGeomObj, aRef;
if (subObj->FindSubObject(1, aGeomObj) && aGeomObj->ReferencedObject(aRef))
aShapeName = aRef->GetName().c_str();
anInfo.append(QString("based on <i>%1</i> geometry object<br><br>").arg(aShapeName));
} else {
anInfo.append(QString("<br>"));
}
}
}
}
2004-12-17 16:07:35 +05:00
// info about groups on edges
anObj.reset();
aMeshSO->FindSubObject(Tag_EdgeGroups, anObj);
if (anObj) {
_PTR(ChildIterator) it = aStudy->NewChildIterator(anObj);
if (!hasGroup && it->More()) {
anInfo.append(QString("Groups:<br><br>"));
hasGroup = true;
}
for (; it->More(); it->Next()) {
_PTR(SObject) subObj = it->Value();
CORBA::Object_var anObject = SMESH::SObjectToObject(subObj);
SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject);
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>";
_PTR(SObject) aGeomObj, aRef;
if (subObj->FindSubObject(1, aGeomObj) && aGeomObj->ReferencedObject(aRef))
aShapeName = aRef->GetName().c_str();
anInfo.append(QString("based on <i>%1</i> geometry object<br><br>").arg(aShapeName));
} else {
anInfo.append(QString("<br>"));
}
}
2004-12-17 16:07:35 +05:00
}
}
2004-12-17 16:07:35 +05:00
// info about groups on faces
anObj.reset();
2004-12-17 16:07:35 +05:00
aMeshSO->FindSubObject(Tag_FaceGroups , anObj);
if (anObj) {
_PTR(ChildIterator) it = aStudy->NewChildIterator(anObj);
if (!hasGroup && it->More()) {
anInfo.append(QString("Groups:<br><br>"));
hasGroup = true;
}
for (; it->More(); it->Next()) {
_PTR(SObject) subObj = it->Value();
CORBA::Object_var anObject = SMESH::SObjectToObject(subObj);
SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject);
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>";
_PTR(SObject) aGeomObj, aRef;
if (subObj->FindSubObject(1, aGeomObj) && aGeomObj->ReferencedObject(aRef))
aShapeName = aRef->GetName().c_str();
anInfo.append(QString("based on <i>%1</i> geometry object<br><br>").arg(aShapeName));
} else {
anInfo.append(QString("<br>"));
}
}
2004-12-17 16:07:35 +05:00
}
}
2004-12-17 16:07:35 +05:00
// info about groups on volumes
anObj.reset();
aMeshSO->FindSubObject(Tag_VolumeGroups, anObj);
if (anObj) {
_PTR(ChildIterator) it = aStudy->NewChildIterator(anObj);
if (!hasGroup && it->More())
anInfo.append(QString("Groups:<br>"));
for (; it->More(); it->Next()) {
_PTR(SObject) subObj = it->Value();
CORBA::Object_var anObject = SMESH::SObjectToObject(subObj);
SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject);
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>";
_PTR(SObject) aGeomObj, aRef;
if (subObj->FindSubObject(1, aGeomObj) && aGeomObj->ReferencedObject(aRef))
aShapeName = aRef->GetName().c_str();
anInfo.append(QString("based on <i>%1</i> geometry object<br><br>").arg(aShapeName));
} else {
anInfo.append(QString("<br>"));
}
}
2004-12-17 16:07:35 +05:00
}
}
2004-12-17 16:07:35 +05:00
myInfo->setText(anInfo);
return;
}
}
}
//=================================================================================
// function : SelectionIntoArgument()
// purpose : Called when selection has changed
//=================================================================================
void SMESHGUI_StandardMeshInfosDlg::onSelectionChanged()
{
if (myStartSelection)
2004-12-17 16:07:35 +05:00
DumpMeshInfos();
}
//=================================================================================
// function : closeEvent()
// purpose :
//=================================================================================
void SMESHGUI_StandardMeshInfosDlg::closeEvent (QCloseEvent* e)
2004-12-17 16:07:35 +05:00
{
mySelectionMgr->clearFilters();
2005-06-08 16:45:19 +06:00
mySMESHGUI->ResetState();
QDialog::closeEvent(e);
2004-12-17 16:07:35 +05:00
}
//=================================================================================
// function : windowActivationChange()
// purpose : called when window is activated/deactivated
//=================================================================================
void SMESHGUI_StandardMeshInfosDlg::windowActivationChange (bool oldActive)
2004-12-17 16:07:35 +05:00
{
QDialog::windowActivationChange(oldActive);
if (isActiveWindow() && myIsActiveWindow != isActiveWindow())
ActivateThisDialog();
2004-12-17 16:07:35 +05:00
myIsActiveWindow = isActiveWindow();
}
//=================================================================================
// function : DeactivateActiveDialog()
// purpose :
//=================================================================================
void SMESHGUI_StandardMeshInfosDlg::DeactivateActiveDialog()
{
disconnect(mySelectionMgr, 0, this, 0);
2004-12-17 16:07:35 +05:00
}
//=================================================================================
// function : ActivateThisDialog()
// purpose :
//=================================================================================
void SMESHGUI_StandardMeshInfosDlg::ActivateThisDialog()
{
/* Emit a signal to deactivate any active dialog */
2005-06-08 16:45:19 +06:00
mySMESHGUI->EmitSignalDeactivateDialog();
connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(onSelectionChanged()));
2004-12-17 16:07:35 +05:00
}
//=================================================================================
// function : onStartSelection()
// purpose : starts selection
//=================================================================================
void SMESHGUI_StandardMeshInfosDlg::onStartSelection()
{
myStartSelection = true;
mySelectionMgr->installFilter(myMeshFilter);
myMeshLine->setText(tr("Select a mesh"));
2004-12-17 16:07:35 +05:00
onSelectionChanged();
myStartSelection = true;
}
//=================================================================================
// function : onHelp()
// purpose :
//=================================================================================
void SMESHGUI_StandardMeshInfosDlg::onHelp()
{
LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
if (app)
app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
else {
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(myHelpFileName),
QObject::tr("BUT_OK"));
}
}