X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_EditMeshDlg.cxx;h=b95c34acfc948ce20b4249535f1bd4fc83b501fb;hb=d019e0815b9b6eb333b2d69bcff2e4b03e062233;hp=ee128b2cc4dcdeb0036e3355aaac35cb83373c19;hpb=25c935e78afdc192fe4c74d675afe2ed9ec42124;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_EditMeshDlg.cxx b/src/SMESHGUI/SMESHGUI_EditMeshDlg.cxx index ee128b2cc..b95c34acf 100644 --- a/src/SMESHGUI/SMESHGUI_EditMeshDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_EditMeshDlg.cxx @@ -1,49 +1,316 @@ +// Copyright (C) 2005 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.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include "SMESHGUI_EditMeshDlg.h" #include "SMESHGUI.h" #include "SMESHGUI_Utils.h" #include "SMESHGUI_VTKUtils.h" +#include "SMESHGUI_IdValidator.h" +#include "SMESHGUI_SpinBox.h" +#include "SMESH_Actor.h" #include "SMESH_TypeFilter.hxx" +#include "SMESH_LogicalFilter.hxx" +#include "SMESHGUI_MeshUtils.h" +#include "SMDS_Mesh.hxx" -#include "SUIT_Desktop.h" +#include "GEOMBase.h" + +#include "SUIT_ResourceMgr.h" #include "SUIT_Session.h" +#include "SUIT_MessageBox.h" + +#include "LightApp_Application.h" +#include "SVTK_ViewModel.h" +#include "SVTK_ViewWindow.h" +#include "SVTK_Selector.h" +#include "SVTK_Selection.h" #include "SALOME_ListIO.hxx" #include "utilities.h" +// OCCT Includes +#include +#include +#include + +//IDL Headers +#include CORBA_SERVER_HEADER(SMESH_Group) + +// VTK Includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + // QT Includes #include #include #include #include #include +#include +#include #include #include +#include #include #include +#include + +using namespace std; + +namespace SMESH { + class TIdPreview { // to display in the viewer IDs of the selected elements + SVTK_ViewWindow* myViewWindow; + + vtkUnstructuredGrid* myIdGrid; + SALOME_Actor* myIdActor; + + vtkUnstructuredGrid* myPointsNumDataSet; + vtkMaskPoints* myPtsMaskPoints; + vtkSelectVisiblePoints* myPtsSelectVisiblePoints; + vtkLabeledDataMapper* myPtsLabeledDataMapper; + vtkTextProperty* aPtsTextProp; + bool myIsPointsLabeled; + vtkActor2D* myPointLabels; + + vector myIDs; + + public: + TIdPreview(SVTK_ViewWindow* theViewWindow): + myViewWindow(theViewWindow) + { + myIdGrid = vtkUnstructuredGrid::New(); + + // Create and display actor + vtkDataSetMapper* aMapper = vtkDataSetMapper::New(); + aMapper->SetInput( myIdGrid ); + + myIdActor = SALOME_Actor::New(); + myIdActor->SetInfinitive(true); + myIdActor->VisibilityOff(); + myIdActor->PickableOff(); + + myIdActor->SetMapper( aMapper ); + aMapper->Delete(); + + myViewWindow->AddActor(myIdActor); + + //Definition of points numbering pipeline + myPointsNumDataSet = vtkUnstructuredGrid::New(); + + myPtsMaskPoints = vtkMaskPoints::New(); + myPtsMaskPoints->SetInput(myPointsNumDataSet); + myPtsMaskPoints->SetOnRatio(1); + + myPtsSelectVisiblePoints = vtkSelectVisiblePoints::New(); + myPtsSelectVisiblePoints->SetInput(myPtsMaskPoints->GetOutput()); + myPtsSelectVisiblePoints->SelectInvisibleOff(); + myPtsSelectVisiblePoints->SetTolerance(0.1); + + myPtsLabeledDataMapper = vtkLabeledDataMapper::New(); + myPtsLabeledDataMapper->SetInput(myPtsSelectVisiblePoints->GetOutput()); + myPtsLabeledDataMapper->SetLabelFormat("%g"); + myPtsLabeledDataMapper->SetLabelModeToLabelScalars(); + + vtkTextProperty* aPtsTextProp = vtkTextProperty::New(); + aPtsTextProp->SetFontFamilyToTimes(); + static int aPointsFontSize = 12; + aPtsTextProp->SetFontSize(aPointsFontSize); + aPtsTextProp->SetBold(1); + aPtsTextProp->SetItalic(0); + aPtsTextProp->SetShadow(0); + myPtsLabeledDataMapper->SetLabelTextProperty(aPtsTextProp); + aPtsTextProp->Delete(); + + myIsPointsLabeled = false; + + myPointLabels = vtkActor2D::New(); + myPointLabels->SetMapper(myPtsLabeledDataMapper); + myPointLabels->GetProperty()->SetColor(1,1,1); + myPointLabels->SetVisibility(myIsPointsLabeled); + + AddToRender(myViewWindow->getRenderer()); + } + + void SetPointsData ( SMDS_Mesh* theMesh, + TColStd_MapOfInteger & theNodesIdMap ) + { + vtkPoints* aPoints = vtkPoints::New(); + aPoints->SetNumberOfPoints(theNodesIdMap.Extent()); + myIDs.clear(); + + TColStd_MapIteratorOfMapOfInteger idIter( theNodesIdMap ); + for( int i = 0; idIter.More(); idIter.Next(), i++ ) { + const SMDS_MeshNode* aNode = theMesh->FindNode(idIter.Key()); + aPoints->SetPoint( i, aNode->X(), aNode->Y(), aNode->Z() ); + myIDs.push_back(idIter.Key()); + } + + myIdGrid->SetPoints(aPoints); + + aPoints->Delete(); + + myIdActor->GetMapper()->Update(); + } + + void SetElemsData( TColStd_MapOfInteger & theElemsIdMap, + list & aGrCentersXYZ ) + { + vtkPoints* aPoints = vtkPoints::New(); + aPoints->SetNumberOfPoints(theElemsIdMap.Extent()); + myIDs.clear(); + + TColStd_MapIteratorOfMapOfInteger idIter( theElemsIdMap ); + for( ; idIter.More(); idIter.Next() ) { + myIDs.push_back(idIter.Key()); + } + + gp_XYZ aXYZ; + list::iterator coordIt = aGrCentersXYZ.begin(); + for( int i = 0; coordIt != aGrCentersXYZ.end(); coordIt++, i++ ) { + aXYZ = *coordIt; + aPoints->SetPoint( i, aXYZ.X(), aXYZ.Y(), aXYZ.Z() ); + } + myIdGrid->SetPoints(aPoints); + aPoints->Delete(); + + myIdActor->GetMapper()->Update(); + } + + void AddToRender(vtkRenderer* theRenderer) + { + myIdActor->AddToRender(theRenderer); + + myPtsSelectVisiblePoints->SetRenderer(theRenderer); + theRenderer->AddActor2D(myPointLabels); + } + + void RemoveFromRender(vtkRenderer* theRenderer) + { + myIdActor->RemoveFromRender(theRenderer); + + myPtsSelectVisiblePoints->SetRenderer(theRenderer); + theRenderer->RemoveActor(myPointLabels); + } + + void SetPointsLabeled( bool theIsPointsLabeled, bool theIsActorVisible = true ) + { + myIsPointsLabeled = theIsPointsLabeled && myIdGrid->GetNumberOfPoints(); + + if ( myIsPointsLabeled ) { + myPointsNumDataSet->ShallowCopy(myIdGrid); + vtkDataSet *aDataSet = myPointsNumDataSet; + int aNbElem = myIDs.size(); + vtkIntArray *anArray = vtkIntArray::New(); + anArray->SetNumberOfValues( aNbElem ); + for ( int i = 0; i < aNbElem; i++ ) + anArray->SetValue( i, myIDs[i] ); + aDataSet->GetPointData()->SetScalars( anArray ); + anArray->Delete(); + myPtsMaskPoints->SetInput( aDataSet ); + myPointLabels->SetVisibility( theIsActorVisible ); + } + else { + myPointLabels->SetVisibility( false ); + } + } + + ~TIdPreview() + { + RemoveFromRender(myViewWindow->getRenderer()); + + myIdGrid->Delete(); + + myViewWindow->RemoveActor(myIdActor); + myIdActor->Delete(); + + //Deleting of points numbering pipeline + //--------------------------------------- + myPointsNumDataSet->Delete(); + + myPtsLabeledDataMapper->RemoveAllInputs(); + myPtsLabeledDataMapper->Delete(); + + myPtsSelectVisiblePoints->UnRegisterAllOutputs(); + myPtsSelectVisiblePoints->Delete(); + + myPtsMaskPoints->UnRegisterAllOutputs(); + myPtsMaskPoints->Delete(); + + myPointLabels->Delete(); + +// myTimeStamp->Delete(); + } + }; +} + +static const char * IconFirst[] = { +"18 10 2 1", +" g None", +". g #000000", +" . . ", +" .. .. .. ", +" .. ... ... ", +" .. .... .... ", +" .. ..... ..... ", +" .. ..... ..... ", +" .. .... .... ", +" .. ... ... ", +" .. .. .. ", +" . . "}; //================================================================================= // class : SMESHGUI_EditMeshDlg() // purpose : //================================================================================= -SMESHGUI_EditMeshDlg::SMESHGUI_EditMeshDlg (SMESHGUI* theModule, - const char* title, const char* icon, - int theAction) +SMESHGUI_EditMeshDlg::SMESHGUI_EditMeshDlg (SMESHGUI* theModule, + int theAction) : QDialog(SMESH::GetDesktop(theModule), "SMESHGUI_EditMeshDlg", false, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose), mySMESHGUI(theModule), mySelectionMgr(SMESH::GetSelectionMgr(theModule)), myAction(theAction) { - resize(303, 185); - setCaption(tr(title)); + setCaption(tr("SMESH_MERGE_NODES")); + + myIdPreview = new SMESH::TIdPreview(SMESH::GetViewWindow( mySMESHGUI )); - SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); - QPixmap image0 (aResMgr->loadPixmap("SMESH", tr(icon))); - QPixmap image1 (aResMgr->loadPixmap("SMESH", tr("ICON_SELECT"))); + SUIT_ResourceMgr* aResMgr = SMESH::GetResourceMgr( mySMESHGUI ); + QPixmap IconMergeNodes (aResMgr->loadPixmap("SMESH", tr("ICON_SMESH_MERGE_NODES"))); + QPixmap IconMergeElems (aResMgr->loadPixmap("SMESH", tr("ICON_DLG_MERGE_ELEMENTS"))); + QPixmap IconSelect (aResMgr->loadPixmap("SMESH", tr("ICON_SELECT"))); + QPixmap IconAdd (aResMgr->loadPixmap("SMESH", tr("ICON_APPEND"))); + QPixmap IconRemove (aResMgr->loadPixmap("SMESH", tr("ICON_REMOVE"))); setSizeGripEnabled(TRUE); DlgLayout = new QGridLayout (this); @@ -52,84 +319,169 @@ SMESHGUI_EditMeshDlg::SMESHGUI_EditMeshDlg (SMESHGUI* theModule, /***************************************************************/ GroupConstructors = new QButtonGroup (this, "GroupConstructors"); + GroupConstructors->setTitle(tr("SMESH_MERGE_NODES")); GroupConstructors->setExclusive(TRUE); GroupConstructors->setColumnLayout(0, Qt::Vertical); GroupConstructors->layout()->setSpacing(0); GroupConstructors->layout()->setMargin(0); - GroupConstructorsLayout = new QGridLayout (GroupConstructors->layout()); + GroupConstructorsLayout = new QGridLayout(GroupConstructors->layout()); GroupConstructorsLayout->setAlignment(Qt::AlignTop); GroupConstructorsLayout->setSpacing(6); GroupConstructorsLayout->setMargin(11); - Constructor1 = new QRadioButton (GroupConstructors, "Constructor1"); - Constructor1->setText(tr("")); - Constructor1->setPixmap(image0); - Constructor1->setChecked(TRUE); - Constructor1->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)1, - (QSizePolicy::SizeType)0, - Constructor1->sizePolicy().hasHeightForWidth())); - Constructor1->setMinimumSize(QSize(50, 0)); - GroupConstructorsLayout->addWidget(Constructor1, 0, 0); - QSpacerItem* spacer = new QSpacerItem (20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - GroupConstructorsLayout->addItem(spacer, 0, 1); + RadioButton = new QRadioButton(GroupConstructors, "RadioButton"); + RadioButton->setPixmap(IconMergeNodes); + if (myAction == 1) RadioButton->setPixmap(IconMergeElems); + RadioButton->setChecked(TRUE); + GroupConstructorsLayout->addWidget(RadioButton, 0, 0); DlgLayout->addWidget(GroupConstructors, 0, 0); /***************************************************************/ GroupButtons = new QGroupBox (this, "GroupButtons"); - GroupButtons->setGeometry(QRect(10, 10, 281, 48)); GroupButtons->setTitle(tr("" )); GroupButtons->setColumnLayout(0, Qt::Vertical); GroupButtons->layout()->setSpacing(0); GroupButtons->layout()->setMargin(0); - GroupButtonsLayout = new QGridLayout (GroupButtons->layout()); + GroupButtonsLayout = new QGridLayout(GroupButtons->layout()); GroupButtonsLayout->setAlignment(Qt::AlignTop); GroupButtonsLayout->setSpacing(6); GroupButtonsLayout->setMargin(11); - buttonCancel = new QPushButton (GroupButtons, "buttonCancel"); + buttonHelp = new QPushButton(GroupButtons, "buttonHelp"); + buttonHelp->setText(tr("SMESH_BUT_HELP" )); + buttonHelp->setAutoDefault(TRUE); + GroupButtonsLayout->addWidget(buttonHelp, 0, 4); + buttonCancel = new QPushButton(GroupButtons, "buttonCancel"); buttonCancel->setText(tr("SMESH_BUT_CLOSE" )); buttonCancel->setAutoDefault(TRUE); GroupButtonsLayout->addWidget(buttonCancel, 0, 3); - buttonApply = new QPushButton (GroupButtons, "buttonApply"); + buttonApply = new QPushButton(GroupButtons, "buttonApply"); buttonApply->setText(tr("SMESH_BUT_APPLY" )); buttonApply->setAutoDefault(TRUE); GroupButtonsLayout->addWidget(buttonApply, 0, 1); - QSpacerItem* spacer_9 = new QSpacerItem (20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - GroupButtonsLayout->addItem(spacer_9, 0, 2); - buttonOk = new QPushButton (GroupButtons, "buttonOk"); + QSpacerItem* spacer3 = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + GroupButtonsLayout->addItem(spacer3, 0, 2); + buttonOk = new QPushButton(GroupButtons, "buttonOk"); buttonOk->setText(tr("SMESH_BUT_OK" )); buttonOk->setAutoDefault(TRUE); buttonOk->setDefault(TRUE); GroupButtonsLayout->addWidget(buttonOk, 0, 0); - DlgLayout->addWidget(GroupButtons, 2, 0); + DlgLayout->addWidget(GroupButtons, 4, 0); /***************************************************************/ - GroupMesh = new QGroupBox (this, "GroupMesh"); - GroupMesh->setTitle(tr("SMESH_MESH" )); - GroupMesh->setMinimumSize(QSize(0, 0)); - GroupMesh->setFrameShape(QGroupBox::Box); - GroupMesh->setFrameShadow(QGroupBox::Sunken); + + // Controls for mesh defining + GroupMesh = new QGroupBox(this, "GroupMesh"); + GroupMesh->setTitle(tr("SMESH_SELECT_WHOLE_MESH")); GroupMesh->setColumnLayout(0, Qt::Vertical); GroupMesh->layout()->setSpacing(0); GroupMesh->layout()->setMargin(0); - GroupMeshLayout = new QGridLayout (GroupMesh->layout()); + GroupMeshLayout = new QGridLayout(GroupMesh->layout()); GroupMeshLayout->setAlignment(Qt::AlignTop); GroupMeshLayout->setSpacing(6); GroupMeshLayout->setMargin(11); - TextLabelMesh = new QLabel (GroupMesh, "TextLabelMesh"); - TextLabelMesh->setText(tr("SMESH_MESH")); - TextLabelMesh->setMinimumSize(QSize(50, 0)); - TextLabelMesh->setFrameShape(QLabel::NoFrame); - TextLabelMesh->setFrameShadow(QLabel::Plain); - GroupMeshLayout->addWidget(TextLabelMesh, 0, 0); - SelectButton = new QPushButton (GroupMesh, "SelectButton"); - SelectButton->setText(tr("")); - SelectButton->setPixmap(image1); - SelectButton->setToggleButton(FALSE); - GroupMeshLayout->addWidget(SelectButton, 0, 1); - LineEditMesh = new QLineEdit (GroupMesh, "LineEditMesh"); + + TextLabelName = new QLabel(GroupMesh, "TextLabelName"); + TextLabelName->setText(tr("SMESH_NAME")); + GroupMeshLayout->addWidget(TextLabelName, 0, 0); + + SelectMeshButton = new QPushButton(GroupMesh, "SelectMeshButton"); + SelectMeshButton->setPixmap(IconSelect); + GroupMeshLayout->addWidget(SelectMeshButton, 0, 1); + + LineEditMesh = new QLineEdit(GroupMesh, "LineEditMesh"); LineEditMesh->setReadOnly(true); GroupMeshLayout->addWidget(LineEditMesh, 0, 2); + DlgLayout->addWidget(GroupMesh, 1, 0); + /***************************************************************/ + + // Controls for coincident elements detecting + GroupCoincident = new QGroupBox(this, "GroupCoincident"); + GroupCoincident->setTitle(tr("COINCIDENT_NODES")); + GroupCoincident->setColumnLayout(0, Qt::Vertical); + GroupCoincident->layout()->setSpacing(0); + GroupCoincident->layout()->setMargin(0); + GroupCoincidentLayout = new QGridLayout(GroupCoincident->layout()); + GroupCoincidentLayout->setAlignment(Qt::AlignTop); + GroupCoincidentLayout->setSpacing(6); + GroupCoincidentLayout->setMargin(11); + + if (myAction == 0) { // case merge nodes + TextLabelTolerance = new QLabel(GroupCoincident, "TextLabelTolerance"); + TextLabelTolerance->setText(tr("SMESH_TOLERANCE")); + TextLabelTolerance->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred)); + GroupCoincidentLayout->addWidget(TextLabelTolerance, 0, 0); + + SpinBoxTolerance = new SMESHGUI_SpinBox(GroupCoincident, "SpinBoxTolerance"); + GroupCoincidentLayout->addWidget(SpinBoxTolerance, 0, 1); + } + + DetectButton = new QPushButton(GroupCoincident, "DetectButton"); + DetectButton->setText(tr("DETECT")); + DetectButton->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum)); + GroupCoincidentLayout->addWidget(DetectButton, 0, 2); + + ListCoincident = new QListBox(GroupCoincident, "ListCoincident"); + ListCoincident->setSelectionMode(QListBox::Extended); + if (myAction == 0) // case merge nodes + GroupCoincidentLayout->addMultiCellWidget(ListCoincident, 1, 3, 0, 1); + else // case merge elements + GroupCoincidentLayout->addMultiCellWidget(ListCoincident, 0, 3, 0, 1); + + QSpacerItem* spacer1 = new QSpacerItem(20, 21, QSizePolicy::Minimum, QSizePolicy::Expanding); + GroupCoincidentLayout->addItem(spacer1, 1, 2); + + AddGroupButton = new QPushButton(GroupCoincident, "AddGroupButton"); + AddGroupButton->setText(tr("SMESH_BUT_ADD")); + GroupCoincidentLayout->addWidget(AddGroupButton, 2, 2); + + RemoveGroupButton = new QPushButton(GroupCoincident, "RemoveGroupButton"); + RemoveGroupButton->setText(tr("SMESH_BUT_REMOVE")); + GroupCoincidentLayout->addWidget(RemoveGroupButton, 3, 2); + + SelectAllCB = new QCheckBox(GroupCoincident, "SelectAllCB"); + SelectAllCB->setText(tr("SELECT_ALL")); + GroupCoincidentLayout->addWidget(SelectAllCB, 4, 0); + + DlgLayout->addWidget(GroupCoincident, 2, 0); + + /***************************************************************/ + + // Controls for editing the selected group + GroupEdit = new QGroupBox(this, "GroupEdit"); + GroupEdit->setTitle(tr("EDIT_SELECTED_GROUP")); + GroupEdit->setColumnLayout(0, Qt::Vertical); + GroupEdit->layout()->setSpacing(0); + GroupEdit->layout()->setMargin(0); + GroupEditLayout = new QGridLayout(GroupEdit->layout()); + GroupEditLayout->setAlignment(Qt::AlignTop); + GroupEditLayout->setSpacing(6); + GroupEditLayout->setMargin(11); + + ListEdit = new QListBox(GroupEdit, "ListEdit"); + ListEdit->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred)); + ListEdit->setRowMode(QListBox::FixedNumber); + ListEdit->setMinimumHeight(ListEdit->sizeHint().height()); + ListEdit->setHScrollBarMode(QScrollView::AlwaysOn); + ListEdit->setVScrollBarMode(QScrollView::AlwaysOff); + ListEdit->setSelectionMode(QListBox::Extended); + GroupEditLayout->addMultiCellWidget(ListEdit, 0, 1, 0, 0); + + AddElemButton = new QPushButton(GroupEdit, "AddElemButton"); + AddElemButton->setPixmap(IconAdd); + GroupEditLayout->addWidget(AddElemButton, 0, 1); + + RemoveElemButton = new QPushButton(GroupEdit, "RemoveElemButton"); + RemoveElemButton->setPixmap(IconRemove); + GroupEditLayout->addWidget(RemoveElemButton, 0, 2); + + SetFirstButton = new QPushButton(GroupEdit, "SetFirstButton"); + SetFirstButton->setIconSet(QPixmap(IconFirst)); + SetFirstButton->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed)); + GroupEditLayout->addMultiCellWidget(SetFirstButton, 1, 1, 1, 2); + + DlgLayout->addWidget(GroupEdit, 3, 0); + Init(); // Initialisations } @@ -140,6 +492,7 @@ SMESHGUI_EditMeshDlg::SMESHGUI_EditMeshDlg (SMESHGUI* theModule, SMESHGUI_EditMeshDlg::~SMESHGUI_EditMeshDlg() { // no need to delete child widgets, Qt does it all for us + delete myIdPreview; } //================================================================================= @@ -148,60 +501,156 @@ SMESHGUI_EditMeshDlg::~SMESHGUI_EditMeshDlg() //================================================================================= void SMESHGUI_EditMeshDlg::Init() { - GroupMesh->show(); - mySMESHGUI->SetActiveDialogBox((QDialog*)this); + if (myAction == 0) { + SpinBoxTolerance->RangeStepAndValidator(0.0, COORD_MAX, 0.1, 3); + SpinBoxTolerance->SetValue(1e-05); + } + + RadioButton->setChecked(TRUE); + + myEditCurrentArgument = (QWidget*)LineEditMesh; - myMesh = SMESH::SMESH_Mesh::_nil(); + myActor = 0; + mySubMeshOrGroup = SMESH::SMESH_subMesh::_nil(); - myMeshFilter = new SMESH_TypeFilter (MESH); + mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector(); + + mySMESHGUI->SetActiveDialogBox((QDialog*)this); + myIsBusy = false; + + // Costruction of the logical filter + SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH); + SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (GROUP); + + QPtrList aListOfFilters; + if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter); + if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter); - // signals and slots connections - connect(buttonOk , SIGNAL(clicked()), this, SLOT(ClickOnOk())); + myMeshOrSubMeshOrGroupFilter = + new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); - connect(buttonApply , SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(buttonHelp, SIGNAL(clicked()), this, SLOT(ClickOnHelp())); - connect(SelectButton, SIGNAL(clicked()), this, SLOT(SelectionIntoArgument())); + connect(SelectMeshButton, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument())); + connect(DetectButton, SIGNAL (clicked()), this, SLOT(onDetect())); + connect(ListCoincident, SIGNAL (selectionChanged()), this, SLOT(onSelectGroup())); + connect(AddGroupButton, SIGNAL (clicked()), this, SLOT(onAddGroup())); + connect(RemoveGroupButton, SIGNAL (clicked()), this, SLOT(onRemoveGroup())); + connect(SelectAllCB, SIGNAL(toggled(bool)), this, SLOT(onSelectAll(bool))); + connect(ListEdit, SIGNAL (selectionChanged()), this, SLOT(onSelectElementFromGroup())); + connect(AddElemButton, SIGNAL (clicked()), this, SLOT(onAddElement())); + connect(RemoveElemButton, SIGNAL (clicked()), this, SLOT(onRemoveElement())); + connect(SetFirstButton, SIGNAL( clicked() ), this, SLOT( onSetFirst() ) ); + connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + /* to close dialog if study change */ + connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); - connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()) , this, SLOT(ClickOnCancel())); + this->show(); /* displays Dialog */ + + SetFirstButton->setEnabled(false); + buttonOk->setEnabled(false); + buttonApply->setEnabled(false); - // Move widget on the bottom right corner of main widget - int x, y; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); - this->show(); // displays Dialog + // Init Mesh field from selection + SelectionIntoArgument(); - LineEditMesh->setFocus(); - mySelectionMgr->clearFilters(); - mySelectionMgr->installFilter(myMeshFilter); + // dialog customization + if (myAction == 1) { + setCaption(tr("SMESH_MERGE_ELEMENTS")); + GroupConstructors->setTitle(tr("SMESH_MERGE_ELEMENTS")); + GroupCoincident->setTitle(tr("COINCIDENT_ELEMENTS")); + } + + myHelpFileName = "merge_elements.htm"; +} - SelectionIntoArgument(); +//================================================================================= +// function : FindGravityCenter() +// purpose : +//================================================================================= +void SMESHGUI_EditMeshDlg::FindGravityCenter(TColStd_MapOfInteger & theElemsIdMap, + list< gp_XYZ > & theGrCentersXYZ) +{ + if (!myActor) + return; + + SMDS_Mesh* aMesh = 0; + aMesh = myActor->GetObject()->GetMesh(); + if (!aMesh) + return; + + int nbNodes; + + TColStd_MapIteratorOfMapOfInteger idIter( theElemsIdMap ); + for( ; idIter.More(); idIter.Next() ) { + const SMDS_MeshElement* anElem = aMesh->FindElement(idIter.Key()); + if ( !anElem ) + continue; + + gp_XYZ anXYZ(0., 0., 0.); + SMDS_ElemIteratorPtr nodeIt = anElem->nodesIterator(); + for ( nbNodes = 0; nodeIt->more(); nbNodes++ ) { + const SMDS_MeshNode* node = static_cast( nodeIt->next() ); + anXYZ.Add( gp_XYZ( node->X(), node->Y(), node->Z() ) ); + } + anXYZ.Divide( nbNodes ); + + theGrCentersXYZ.push_back( anXYZ ); + } } //================================================================================= // function : ClickOnApply() // purpose : //================================================================================= -void SMESHGUI_EditMeshDlg::ClickOnApply() +bool SMESHGUI_EditMeshDlg::ClickOnApply() { - if (!myMesh->_is_nil()) { - try { - QApplication::setOverrideCursor(Qt::waitCursor); + if (mySMESHGUI->isActiveStudyLocked() || myMesh->_is_nil()) + return false; - if (myAction == 1) { - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); - aMeshEditor->MergeEqualElements(); - } + try { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); + + QApplication::setOverrideCursor(Qt::waitCursor); + + SMESH::long_array_var anIds = new SMESH::long_array; + SMESH::array_of_long_array_var aGroupsOfElements = new SMESH::array_of_long_array; + + aGroupsOfElements->length(ListCoincident->count()); + QListBoxItem* item = ListCoincident->firstItem(); - QApplication::restoreOverrideCursor(); - } catch(...) { + int anArrayNum = 0; + while (item) { + QStringList aListIds = QStringList(""); + aListIds = QStringList::split(" ", item->text(), false); + + anIds->length(aListIds.count()); + for (int i = 0; i < aListIds.count(); i++) + anIds[i] = aListIds[i].toInt(); + + aGroupsOfElements[anArrayNum++] = anIds.inout(); + item = item->next(); } - //mySelectionMgr->clearSelected(); - SMESH::UpdateView(); + if( myAction == 0 ) + aMeshEditor->MergeNodes (aGroupsOfElements.inout()); + else + aMeshEditor->MergeElements (aGroupsOfElements.inout()); + + QApplication::restoreOverrideCursor(); + } catch(...) { } + + SMESH::UpdateView(); + + onDetect(); + return true; } //================================================================================= @@ -210,8 +659,8 @@ void SMESHGUI_EditMeshDlg::ClickOnApply() //================================================================================= void SMESHGUI_EditMeshDlg::ClickOnOk() { - ClickOnApply(); - ClickOnCancel(); + if (ClickOnApply()) + ClickOnCancel(); } //================================================================================= @@ -220,44 +669,425 @@ void SMESHGUI_EditMeshDlg::ClickOnOk() //================================================================================= void SMESHGUI_EditMeshDlg::ClickOnCancel() { - //mySelectionMgr->clearSelected(); + myIdPreview->SetPointsLabeled(false); mySelectionMgr->clearFilters(); + //mySelectionMgr->clearSelected(); + SMESH::SetPointRepresentation(false); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(ActorSelection); disconnect(mySelectionMgr, 0, this, 0); mySMESHGUI->ResetState(); reject(); } //================================================================================= -// function : SelectionIntoArgument() -// purpose : Called when selection as changed or other case +// function : ClickOnHelp() +// purpose : //================================================================================= -void SMESHGUI_EditMeshDlg::SelectionIntoArgument() +void SMESHGUI_EditMeshDlg::ClickOnHelp() +{ + 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")); + } +} + +//================================================================================= +// function : onEditGroup() +// purpose : +//================================================================================= +void SMESHGUI_EditMeshDlg::onEditGroup() { - if (!GroupButtons->isEnabled()) // inactive + int nbSel = 0; + for (int i = 0; i < ListCoincident->count(); i++) { + if (ListCoincident->isSelected(i)) + nbSel++; + if (nbSel > 1) { + ListEdit->clear(); + return; + } + } + if (nbSel == 0) { + ListEdit->clear(); return; + } + + QString aNewIds = ""; - QString aString = ""; + QListBoxItem* anItem; + for (anItem = ListEdit->firstItem(); anItem != 0; anItem = anItem->next()) + aNewIds+=QString(" %1").arg(anItem->text()); + ListCoincident->changeItem(aNewIds, ListCoincident->currentItem()); + ListCoincident->setSelected(ListCoincident->currentItem(), true); + +} + +//================================================================================= +// function : updateControls() +// purpose : +//================================================================================= +void SMESHGUI_EditMeshDlg::updateControls() +{ + if (ListEdit->count() == 0) + SetFirstButton->setEnabled(false); + bool enable = !(myMesh->_is_nil()) && ListCoincident->count(); + buttonOk->setEnabled(enable); + buttonApply->setEnabled(enable); +} + +//================================================================================= +// function : onDetect() +// purpose : +//================================================================================= +void SMESHGUI_EditMeshDlg::onDetect() +{ + if ( myMesh->_is_nil() || LineEditMesh->text().isEmpty() ) + return; + + try { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); + + QApplication::setOverrideCursor(Qt::waitCursor); + ListCoincident->clear(); + ListEdit->clear(); + + SMESH::array_of_long_array_var aGroupsArray; + + switch (myAction) { + case 0 : + if(!mySubMeshOrGroup->_is_nil()) + aMeshEditor->FindCoincidentNodesOnPart(mySubMeshOrGroup, SpinBoxTolerance->GetValue(), aGroupsArray); + else + aMeshEditor->FindCoincidentNodes(SpinBoxTolerance->GetValue(), aGroupsArray); + break; + case 1 : + if(!mySubMeshOrGroup->_is_nil()) + aMeshEditor->FindEqualElements(mySubMeshOrGroup, aGroupsArray); + else + aMeshEditor->FindEqualElements(myMesh, aGroupsArray); + break; + } + + QListBoxItem* anItem = 0; + for (int i = 0; i < aGroupsArray->length(); i++) { + SMESH::long_array& aGroup = aGroupsArray[i]; + + QString anIDs; + for (int j = 0; j < aGroup.length(); j++) + anIDs+=QString(" %1").arg(aGroup[j]); + + anItem = new QListBoxText(anIDs); + ListCoincident->insertItem(anItem); + } + QApplication::restoreOverrideCursor(); + } catch(...) { + } + + ListCoincident->selectAll(true); + updateControls(); +} + +//================================================================================= +// function : onSelectGroup() +// purpose : +//================================================================================= +void SMESHGUI_EditMeshDlg::onSelectGroup() +{ + if (myIsBusy || !myActor) + return; + myEditCurrentArgument = (QWidget*)ListCoincident; + + ListEdit->clear(); + + TColStd_MapOfInteger anIndices; + QListBoxItem* anItem; + int NbOfSelected = 0; + for (anItem = ListCoincident->firstItem(); anItem != 0; anItem = anItem->next()) { + if (anItem->isSelected()) { + QStringList aListIds = QStringList(""); + aListIds = QStringList::split(" ", anItem->text(), false); + for (int i = 0; i < aListIds.count(); i++) + anIndices.Add(aListIds[i].toInt()); + NbOfSelected++; + ListEdit->clear(); + if (NbOfSelected == 1) { + ListEdit->insertStringList(aListIds); + ListEdit->selectAll(true); + } + } + } + mySelector->AddOrRemoveIndex(myActor->getIO(), anIndices, false); SALOME_ListIO aList; - mySelectionMgr->selectedObjects(aList); - int nbSel = SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString); - - // mesh - if (nbSel != 1) { - myMesh = SMESH::SMESH_Mesh::_nil(); - aString = ""; - } else { - Handle(SALOME_InteractiveObject) IO = aList.First(); - myMesh = SMESH::IObjectToInterface(IO); - if (myMesh->_is_nil()) - aString = ""; + aList.Append(myActor->getIO()); + mySelectionMgr->setSelectedObjects(aList,false); + + if (myAction == 0) { + myIdPreview->SetPointsData(myActor->GetObject()->GetMesh(), anIndices); + myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility()); + } + else { + list< gp_XYZ > aGrCentersXYZ; + FindGravityCenter(anIndices, aGrCentersXYZ); + myIdPreview->SetElemsData( anIndices, aGrCentersXYZ); + myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility()); + } + + updateControls(); +} + +//================================================================================= +// function : onSelectAll() +// purpose : +//================================================================================= +void SMESHGUI_EditMeshDlg::onSelectAll (bool isToggled) +{ + ListCoincident->selectAll(isToggled); +} + +//================================================================================= +// function : onSelectElementFromGroup() +// purpose : +//================================================================================= +void SMESHGUI_EditMeshDlg::onSelectElementFromGroup() +{ + if (myIsBusy || !myActor) + return; + + int nbSel = 0; + TColStd_MapOfInteger anIndices; + QListBoxItem* anItem; + for (anItem = ListEdit->firstItem(); anItem != 0; anItem = anItem->next()) { + if (anItem->isSelected()) { + int anId = anItem->text().toInt(); + anIndices.Add(anId); + nbSel++; + if (nbSel == 1) + SetFirstButton->setEnabled(true); + } + } + if (nbSel == 0 || nbSel > 1) + SetFirstButton->setEnabled(false); + + mySelector->AddOrRemoveIndex(myActor->getIO(), anIndices, false); + SALOME_ListIO aList; + aList.Append(myActor->getIO()); + mySelectionMgr->setSelectedObjects(aList); + + if (myAction == 0) { + myIdPreview->SetPointsData(myActor->GetObject()->GetMesh(), anIndices); + myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility()); + } + else { + list< gp_XYZ > aGrCentersXYZ; + FindGravityCenter(anIndices, aGrCentersXYZ); + myIdPreview->SetElemsData(anIndices, aGrCentersXYZ); + myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility()); + } +} + +//================================================================================= +// function : onAddGroup() +// purpose : +//================================================================================= +void SMESHGUI_EditMeshDlg::onAddGroup() +{ + if ( myMesh->_is_nil() || LineEditMesh->text().isEmpty() ) + return; + + QString anIDs = ""; + SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), anIDs); + + ListCoincident->clearSelection(); + QListBoxItem* anItem = new QListBoxText(anIDs); + ListCoincident->insertItem(anItem); + int nbGroups = ListCoincident->count(); + if (nbGroups) { + ListCoincident->setCurrentItem(nbGroups-1); + ListCoincident->setSelected(nbGroups-1, true); + } + else { + ListCoincident->setCurrentItem(0); + ListCoincident->setSelected(0, true); + } + + updateControls(); +} + +//================================================================================= +// function : onRemoveGroup() +// purpose : +//================================================================================= +void SMESHGUI_EditMeshDlg::onRemoveGroup() +{ + if (myEditCurrentArgument != (QWidget*)ListCoincident) + return; + myIsBusy = true; + + for (int i = ListCoincident->count(); i > 0; i--) + if (ListCoincident->isSelected(i-1)) + ListCoincident->removeItem(i-1); + + ListEdit->clear(); + updateControls(); + + myIsBusy = false; +} + +//================================================================================= +// function : onAddElement() +// purpose : +//================================================================================= +void SMESHGUI_EditMeshDlg::onAddElement() +{ + if (!myActor) + return; + myIsBusy = true; + + QString aListStr = ""; + int aNbNnodes = 0; + + aNbNnodes = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aListStr); + if (aNbNnodes < 1) + return; + + QStringList aNodes = QStringList::split(" ", aListStr); + QListBoxItem* anItem = 0; + + for (QStringList::iterator it = aNodes.begin(); it != aNodes.end(); ++it) { + anItem = ListEdit->findItem(*it, Qt::ExactMatch); + if (!anItem) { + anItem = new QListBoxText(*it); + ListEdit->insertItem(anItem); + } + ListEdit->setSelected(anItem, true); } - LineEditMesh->setText(aString); + myIsBusy = false; + onEditGroup(); +} - bool isEnabled = (!myMesh->_is_nil()); - buttonOk->setEnabled(isEnabled); - buttonApply->setEnabled(isEnabled); +//================================================================================= +// function : onRemoveElement() +// purpose : +//================================================================================= +void SMESHGUI_EditMeshDlg::onRemoveElement() +{ + if (myEditCurrentArgument != (QWidget*)ListCoincident) + return; + myIsBusy = true; + + for (int i = ListEdit->count(); i > 0; i--) + if (ListEdit->isSelected(i-1)) + ListEdit->removeItem(i-1); + + myIsBusy = false; + onEditGroup(); +} + +//================================================================================= +// function : onSetFirst() +// purpose : +//================================================================================= +void SMESHGUI_EditMeshDlg::onSetFirst() +{ + if (myEditCurrentArgument != (QWidget*)ListCoincident) + return; + myIsBusy = true; + + QListBoxItem* anItem; + for (anItem = ListEdit->firstItem(); anItem != 0; anItem = anItem->next()) { + if (anItem->isSelected()) { + ListEdit->takeItem(anItem); + ListEdit->insertItem(anItem, 0); + } + } + + myIsBusy = false; + onEditGroup(); +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void SMESHGUI_EditMeshDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + disconnect(mySelectionMgr, 0, this, 0); + mySelectionMgr->clearSelected(); + mySelectionMgr->clearFilters(); + + if (send == SelectMeshButton) { + myEditCurrentArgument = (QWidget*)LineEditMesh; + SMESH::SetPointRepresentation(false); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(ActorSelection); + mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter); + } + + myEditCurrentArgument->setFocus(); + connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + SelectionIntoArgument(); +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void SMESHGUI_EditMeshDlg::SelectionIntoArgument() +{ + if (myEditCurrentArgument == (QWidget*)LineEditMesh) { + QString aString = ""; + LineEditMesh->setText(aString); + + ListCoincident->clear(); + ListEdit->clear(); + myActor = 0; + + int nbSel = SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString); + if (nbSel != 1) + return; + + SALOME_ListIO aList; + mySelectionMgr->selectedObjects(aList, SVTK_Viewer::Type()); + + Handle(SALOME_InteractiveObject) IO = aList.First(); + myMesh = SMESH::GetMeshByIO(IO); + + if (myMesh->_is_nil()) + return; + + myActor = SMESH::FindActorByEntry(IO->getEntry()); + if (!myActor) + myActor = SMESH::FindActorByObject(myMesh); + if(!myActor) + return; + + mySubMeshOrGroup = SMESH::SMESH_IDSource::_nil(); + + if ((!SMESH::IObjectToInterface(IO)->_is_nil() || //SUBMESH OR GROUP + !SMESH::IObjectToInterface(IO)->_is_nil()) && + !SMESH::IObjectToInterface(IO)->_is_nil()) + mySubMeshOrGroup = SMESH::IObjectToInterface(IO); + + LineEditMesh->setText(aString); + + if (myAction == 0) { + SMESH::SetPointRepresentation(true); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(NodeSelection); + } + else + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(CellSelection); + } } //================================================================================= @@ -269,6 +1099,8 @@ void SMESHGUI_EditMeshDlg::DeactivateActiveDialog() if (GroupConstructors->isEnabled()) { GroupConstructors->setEnabled(false); GroupMesh->setEnabled(false); + GroupCoincident->setEnabled(false); + GroupEdit->setEnabled(false); GroupButtons->setEnabled(false); mySMESHGUI->ResetState(); mySMESHGUI->SetActiveDialogBox(0); @@ -285,6 +1117,8 @@ void SMESHGUI_EditMeshDlg::ActivateThisDialog() mySMESHGUI->EmitSignalDeactivateDialog(); GroupConstructors->setEnabled(true); GroupMesh->setEnabled(true); + GroupCoincident->setEnabled(true); + GroupEdit->setEnabled(true); GroupButtons->setEnabled(true); mySMESHGUI->SetActiveDialogBox((QDialog*)this); @@ -295,18 +1129,17 @@ void SMESHGUI_EditMeshDlg::ActivateThisDialog() // function : enterEvent() // purpose : //================================================================================= -void SMESHGUI_EditMeshDlg::enterEvent(QEvent* e) +void SMESHGUI_EditMeshDlg::enterEvent(QEvent*) { - if (GroupConstructors->isEnabled()) - return; - ActivateThisDialog(); + if (!GroupConstructors->isEnabled()) + ActivateThisDialog(); } //================================================================================= // function : closeEvent() // purpose : //================================================================================= -void SMESHGUI_EditMeshDlg::closeEvent(QCloseEvent* e) +void SMESHGUI_EditMeshDlg::closeEvent(QCloseEvent*) { /* same than click on cancel button */ this->ClickOnCancel(); @@ -316,8 +1149,25 @@ void SMESHGUI_EditMeshDlg::closeEvent(QCloseEvent* e) //function : hideEvent //purpose : caused by ESC key //======================================================================= -void SMESHGUI_EditMeshDlg::hideEvent (QHideEvent * e) +void SMESHGUI_EditMeshDlg::hideEvent (QHideEvent *) { if (!isMinimized()) ClickOnCancel(); } + +//================================================================================= +// function : keyPressEvent() +// purpose : +//================================================================================= +void SMESHGUI_EditMeshDlg::keyPressEvent( QKeyEvent* e) +{ + QDialog::keyPressEvent( e ); + if ( e->isAccepted() ) + return; + + if ( e->key() == Key_F1 ) + { + e->accept(); + ClickOnHelp(); + } +}