From: eap Date: Wed, 15 Sep 2010 11:42:59 +0000 (+0000) Subject: rename SMESHGUI_EditMeshDlg to SMESHGUI_MergeDlg X-Git-Tag: V5_1_5a1~56 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=b44f6a0f674ad02c8edad071030f98c6a5fcdb83;p=modules%2Fsmesh.git rename SMESHGUI_EditMeshDlg to SMESHGUI_MergeDlg --- diff --git a/src/SMESHGUI/Makefile.am b/src/SMESHGUI/Makefile.am index 76bf1cb16..aef8dcfb4 100644 --- a/src/SMESHGUI/Makefile.am +++ b/src/SMESHGUI/Makefile.am @@ -72,7 +72,7 @@ salomeinclude_HEADERS = \ SMESHGUI_SymmetryDlg.h \ SMESHGUI_SewingDlg.h \ SMESHGUI_DuplicateNodesDlg.h \ - SMESHGUI_EditMeshDlg.h \ + SMESHGUI_MergeDlg.h \ SMESHGUI_MeshUtils.h \ SMESHGUI_CreatePolyhedralVolumeDlg.h \ SMESHGUI_Operation.h \ @@ -136,7 +136,7 @@ dist_libSMESH_la_SOURCES = \ SMESHGUI_SymmetryDlg.cxx \ SMESHGUI_SewingDlg.cxx \ SMESHGUI_DuplicateNodesDlg.cxx \ - SMESHGUI_EditMeshDlg.cxx \ + SMESHGUI_MergeDlg.cxx \ SMESHGUI_Utils.cxx \ SMESHGUI_GEOMGenUtils.cxx \ SMESHGUI_MeshUtils.cxx \ @@ -206,7 +206,7 @@ MOC_FILES = \ SMESHGUI_SymmetryDlg_moc.cxx \ SMESHGUI_SewingDlg_moc.cxx \ SMESHGUI_DuplicateNodesDlg_moc.cxx \ - SMESHGUI_EditMeshDlg_moc.cxx \ + SMESHGUI_MergeDlg_moc.cxx \ SMESHGUI_CreatePolyhedralVolumeDlg_moc.cxx \ SMESHGUI_Operation_moc.cxx \ SMESHGUI_SelectionOp_moc.cxx \ diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index d610ab3cd..3926ebb6a 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -34,7 +34,7 @@ #include "SMESHGUI_CreatePolyhedralVolumeDlg.h" #include "SMESHGUI_DeleteGroupDlg.h" #include "SMESHGUI_Displayer.h" -#include "SMESHGUI_EditMeshDlg.h" +#include "SMESHGUI_MergeDlg.h" #include "SMESHGUI_ExtrusionAlongPathDlg.h" #include "SMESHGUI_ExtrusionDlg.h" #include "SMESHGUI_FileInfoDlg.h" @@ -2690,7 +2690,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if(checkLock(aStudy)) break; if(vtkwnd) { EmitSignalDeactivateDialog(); - ( new SMESHGUI_EditMeshDlg( this, 0 ) )->show(); + ( new SMESHGUI_MergeDlg( this, 0 ) )->show(); } else { SUIT_MessageBox::warning(SMESHGUI::desktop(), @@ -2703,7 +2703,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if (checkLock(aStudy)) break; if (vtkwnd) { EmitSignalDeactivateDialog(); - ( new SMESHGUI_EditMeshDlg( this, 1 ) )->show(); + ( new SMESHGUI_MergeDlg( this, 1 ) )->show(); } else { SUIT_MessageBox::warning(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); diff --git a/src/SMESHGUI/SMESHGUI_EditMeshDlg.cxx b/src/SMESHGUI/SMESHGUI_EditMeshDlg.cxx deleted file mode 100644 index 64559a58a..000000000 --- a/src/SMESHGUI/SMESHGUI_EditMeshDlg.cxx +++ /dev/null @@ -1,1280 +0,0 @@ -// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 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 -// - -// SMESH SMESHGUI : GUI for SMESH component -// File : SMESHGUI_EditMeshDlg.cxx -// Author : Open CASCADE S.A.S. -// SMESH includes -// -#include "SMESHGUI_EditMeshDlg.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" -#include "SMESHGUI_VTKUtils.h" -#include "SMESHGUI_MeshUtils.h" -#include "SMESHGUI_SpinBox.h" - -#include -#include -#include -#include - -// SALOME GUI includes -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -// OCCT includes -#include -#include - -// IDL includes -#include -#include CORBA_SERVER_HEADER(SMESH_Group) -#include CORBA_SERVER_HEADER(SMESH_MeshEditor) - -// VTK includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if !defined(VTK_XVERSION) -#define VTK_XVERSION (VTK_MAJOR_VERSION<<16)+(VTK_MINOR_VERSION<<8)+(VTK_BUILD_VERSION) -#endif - -// Qt includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define SPACING 6 -#define MARGIN 11 - -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; - - std::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()); -#if (VTK_XVERSION < 0x050200) - myPtsLabeledDataMapper->SetLabelFormat("%g"); -#endif - 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, - std::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; - std::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(); //vtk 5.0 porting - myPtsLabeledDataMapper->Delete(); - - //myPtsSelectVisiblePoints->UnRegisterAllOutputs(); //vtk 5.0 porting - myPtsSelectVisiblePoints->Delete(); - - //myPtsMaskPoints->UnRegisterAllOutputs(); //vtk 5.0 porting - 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, - int theAction) - : QDialog(SMESH::GetDesktop(theModule)), - mySMESHGUI(theModule), - mySelectionMgr(SMESH::GetSelectionMgr(theModule)), - myAction(theAction) -{ - setModal(false); - setAttribute(Qt::WA_DeleteOnClose, true); - setWindowTitle(myAction == 1 ? tr("SMESH_MERGE_ELEMENTS") : tr("SMESH_MERGE_NODES")); - - myIdPreview = new SMESH::TIdPreview(SMESH::GetViewWindow( mySMESHGUI )); - - 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); - - QVBoxLayout* DlgLayout = new QVBoxLayout(this); - DlgLayout->setSpacing(SPACING); - DlgLayout->setMargin(MARGIN); - - /***************************************************************/ - GroupConstructors = new QGroupBox(myAction == 1 ? - tr("SMESH_MERGE_ELEMENTS") : - tr("SMESH_MERGE_NODES"), - this); - - QButtonGroup* ButtonGroup = new QButtonGroup(this); - QHBoxLayout* GroupConstructorsLayout = new QHBoxLayout(GroupConstructors); - GroupConstructorsLayout->setSpacing(SPACING); - GroupConstructorsLayout->setMargin(MARGIN); - - RadioButton = new QRadioButton(GroupConstructors); - RadioButton->setIcon(myAction == 1 ? IconMergeElems : IconMergeNodes); - RadioButton->setChecked(true); - GroupConstructorsLayout->addWidget(RadioButton); - ButtonGroup->addButton(RadioButton, 0); - - /***************************************************************/ - // Controls for mesh defining - GroupMesh = new QGroupBox(tr("SMESH_SELECT_WHOLE_MESH"), this); - QHBoxLayout* GroupMeshLayout = new QHBoxLayout(GroupMesh); - GroupMeshLayout->setSpacing(SPACING); - GroupMeshLayout->setMargin(MARGIN); - - TextLabelName = new QLabel(tr("SMESH_NAME"), GroupMesh); - SelectMeshButton = new QPushButton(GroupMesh); - SelectMeshButton->setIcon(IconSelect); - LineEditMesh = new QLineEdit(GroupMesh); - LineEditMesh->setReadOnly(true); - - GroupMeshLayout->addWidget(TextLabelName); - GroupMeshLayout->addWidget(SelectMeshButton); - GroupMeshLayout->addWidget(LineEditMesh); - - /***************************************************************/ - // Controls for switch dialog behaviour - - TypeBox = new QGroupBox( tr( "SMESH_MODE" ), this ); - GroupType = new QButtonGroup( this ); - QHBoxLayout* aTypeBoxLayout = new QHBoxLayout( TypeBox ); - aTypeBoxLayout->setMargin( MARGIN ); - aTypeBoxLayout->setSpacing( SPACING ); - - QRadioButton* rb1 = new QRadioButton( tr( "SMESH_AUTOMATIC" ), TypeBox ); - QRadioButton* rb2 = new QRadioButton( tr( "SMESH_MANUAL" ), TypeBox ); - GroupType->addButton( rb1, 0 ); - GroupType->addButton( rb2, 1 ); - aTypeBoxLayout->addWidget( rb1 ); - aTypeBoxLayout->addWidget( rb2 ); - - myTypeId = 0; - - /***************************************************************/ - // Controls for coincident elements detecting - GroupCoincident = new QGroupBox(myAction == 1 ? - tr("COINCIDENT_ELEMENTS") : - tr("COINCIDENT_NODES"), - this); - - QVBoxLayout* aCoincidentLayout = new QVBoxLayout(GroupCoincident); - - GroupCoincident->setLayout(aCoincidentLayout); - - QHBoxLayout* aSpinBoxLayout = new QHBoxLayout( GroupCoincident ); - - if (myAction == 0) { // case merge nodes - TextLabelTolerance = new QLabel(tr("SMESH_TOLERANCE"), GroupCoincident); - SpinBoxTolerance = new SMESHGUI_SpinBox(GroupCoincident); - SpinBoxTolerance->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - - aSpinBoxLayout->addWidget(TextLabelTolerance); - aSpinBoxLayout->addWidget(SpinBoxTolerance); - aCoincidentLayout->addLayout(aSpinBoxLayout); - } - else { - TextLabelTolerance = 0; - SpinBoxTolerance = 0; - } - - GroupCoincidentWidget = new QWidget(GroupCoincident); - QGridLayout* GroupCoincidentLayout = new QGridLayout(GroupCoincidentWidget); - GroupCoincidentLayout->setSpacing(SPACING); - GroupCoincidentLayout->setMargin(MARGIN); - - ListCoincident = new QListWidget(GroupCoincidentWidget); - ListCoincident->setSelectionMode(QListWidget::ExtendedSelection); - - DetectButton = new QPushButton(tr("DETECT"), GroupCoincidentWidget); - AddGroupButton = new QPushButton(tr("SMESH_BUT_ADD"), GroupCoincidentWidget); - RemoveGroupButton = new QPushButton(tr("SMESH_BUT_REMOVE"), GroupCoincidentWidget); - - SelectAllCB = new QCheckBox(tr("SELECT_ALL"), GroupCoincidentWidget); - - if (myAction == 0) - GroupCoincidentWidget->hide(); - else - GroupCoincident->hide(); - - GroupCoincidentLayout->addWidget(ListCoincident, 0, 0, 4, 2); - GroupCoincidentLayout->addWidget(DetectButton, 0, 2); - GroupCoincidentLayout->addWidget(AddGroupButton, 2, 2); - GroupCoincidentLayout->addWidget(RemoveGroupButton, 3, 2); - GroupCoincidentLayout->addWidget(SelectAllCB, 4, 0, 1, 3); - GroupCoincidentLayout->setRowMinimumHeight(1, 10); - GroupCoincidentLayout->setRowStretch(1, 5); - - aCoincidentLayout->addWidget(GroupCoincidentWidget); - - /***************************************************************/ - // Controls for editing the selected group - GroupEdit = new QGroupBox(tr("EDIT_SELECTED_GROUP"), this); - QGridLayout* GroupEditLayout = new QGridLayout(GroupEdit); - GroupEditLayout->setSpacing(SPACING); - GroupEditLayout->setMargin(MARGIN); - - ListEdit = new QListWidget(GroupEdit); - //ListEdit->setRowMode(QListBox::FixedNumber); - //ListEdit->setHScrollBarMode(QScrollView::AlwaysOn); - //ListEdit->setVScrollBarMode(QScrollView::AlwaysOff); - ListEdit->setFlow( QListView::LeftToRight ); - ListEdit->setSelectionMode(QListWidget::ExtendedSelection); - - AddElemButton = new QPushButton(GroupEdit); - AddElemButton->setIcon(IconAdd); - RemoveElemButton = new QPushButton(GroupEdit); - RemoveElemButton->setIcon(IconRemove); - SetFirstButton = new QPushButton(GroupEdit); - SetFirstButton->setIcon(QPixmap(IconFirst)); - - GroupEditLayout->addWidget(ListEdit, 0, 0, 2, 1); - GroupEditLayout->addWidget(AddElemButton, 0, 1); - GroupEditLayout->addWidget(RemoveElemButton, 0, 2); - GroupEditLayout->addWidget(SetFirstButton, 1, 1, 1, 2); - - GroupEdit->hide(); - - /***************************************************************/ - GroupButtons = new QGroupBox(this); - QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons); - GroupButtonsLayout->setSpacing(SPACING); - GroupButtonsLayout->setMargin(MARGIN); - - buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons); - buttonOk->setAutoDefault(true); - buttonOk->setDefault(true); - buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons); - buttonApply->setAutoDefault(true); - buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons); - buttonCancel->setAutoDefault(true); - buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons); - buttonHelp->setAutoDefault(true); - - GroupButtonsLayout->addWidget(buttonOk); - GroupButtonsLayout->addSpacing(10); - GroupButtonsLayout->addWidget(buttonApply); - GroupButtonsLayout->addSpacing(10); - GroupButtonsLayout->addStretch(); - GroupButtonsLayout->addWidget(buttonCancel); - GroupButtonsLayout->addWidget(buttonHelp); - - /***************************************************************/ - DlgLayout->addWidget(GroupConstructors); - DlgLayout->addWidget(GroupMesh); - DlgLayout->addWidget(TypeBox); - DlgLayout->addWidget(GroupCoincident); - DlgLayout->addWidget(GroupEdit); - DlgLayout->addWidget(GroupButtons); - - this->resize(10,10); - - Init(); // Initialisations -} - -//================================================================================= -// function : ~SMESHGUI_EditMeshDlg() -// purpose : Destroys the object and frees any allocated resources -//================================================================================= -SMESHGUI_EditMeshDlg::~SMESHGUI_EditMeshDlg() -{ - delete myIdPreview; -} - -//================================================================================= -// function : Init() -// purpose : -//================================================================================= -void SMESHGUI_EditMeshDlg::Init() -{ - if (myAction == 0) { - SpinBoxTolerance->RangeStepAndValidator(0.0, COORD_MAX, 0.00001, "len_tol_precision"); - SpinBoxTolerance->SetValue(1e-05); - } - - RadioButton->setChecked(true); - - GroupType->button(0)->setChecked(true); - - myEditCurrentArgument = (QWidget*)LineEditMesh; - - myActor = 0; - mySubMeshOrGroup = SMESH::SMESH_subMesh::_nil(); - - mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector(); - - mySMESHGUI->SetActiveDialogBox((QDialog*)this); - myIsBusy = false; - - /* 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(buttonHelp, SIGNAL(clicked()), this, SLOT(ClickOnHelp())); - - connect(SelectMeshButton, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument())); - connect(DetectButton, SIGNAL (clicked()), this, SLOT(onDetect())); - connect(ListCoincident, SIGNAL (itemSelectionChanged()), 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 (itemSelectionChanged()), 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(GroupType, SIGNAL(buttonClicked(int)), this, SLOT(onTypeChanged(int))); - - 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())); - - // Init Mesh field from selection - SelectionIntoArgument(); - - // Update Buttons - updateControls(); - - if (myAction == 0) - myHelpFileName = "merging_nodes_page.html"; - else - myHelpFileName = "merging_elements_page.html"; -} - -//================================================================================= -// function : FindGravityCenter() -// purpose : -//================================================================================= -void SMESHGUI_EditMeshDlg::FindGravityCenter(TColStd_MapOfInteger & theElemsIdMap, - std::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 : -//================================================================================= -bool SMESHGUI_EditMeshDlg::ClickOnApply() -{ - if (mySMESHGUI->isActiveStudyLocked() || myMesh->_is_nil()) - return false; - - try { - if (myTypeId == 0) - onDetect(); - - SUIT_OverrideCursor aWaitCursor; - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); - - SMESH::long_array_var anIds = new SMESH::long_array; - SMESH::array_of_long_array_var aGroupsOfElements = new SMESH::array_of_long_array; - - if ( ListCoincident->count() == 0) { - if (myAction == 0) - SUIT_MessageBox::warning(this, - tr("SMESH_WARNING"), - tr("SMESH_NO_NODES_DETECTED")); - else - SUIT_MessageBox::warning(this, - tr("SMESH_WARNING"), - tr("SMESH_NO_ELEMENTS_DETECTED")); - return false; - } - - aGroupsOfElements->length(ListCoincident->count()); - - int anArrayNum = 0; - for (int i = 0; i < ListCoincident->count(); i++) { - QStringList aListIds = ListCoincident->item(i)->text().split(" ", QString::SkipEmptyParts); - - anIds->length(aListIds.count()); - for (int i = 0; i < aListIds.count(); i++) - anIds[i] = aListIds[i].toInt(); - - aGroupsOfElements[anArrayNum++] = anIds.inout(); - } - - if( myAction == 0 ) - aMeshEditor->MergeNodes (aGroupsOfElements.inout()); - else - aMeshEditor->MergeElements (aGroupsOfElements.inout()); - - if ( myTypeId == 0 ) { - if (myAction ==0) - SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INFORMATION"), - tr("SMESH_MERGED_NODES").arg(QString::number(ListCoincident->count()).toLatin1().data())); - else - SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INFORMATION"), - tr("SMESH_MERGED_ELEMENTS").arg(QString::number(ListCoincident->count()).toLatin1().data())); - } - - - } catch(...) { - } - - SMESH::UpdateView(); - SMESHGUI::Modified(); - - return true; -} - -//================================================================================= -// function : ClickOnOk() -// purpose : -//================================================================================= -void SMESHGUI_EditMeshDlg::ClickOnOk() -{ - if (ClickOnApply()) - ClickOnCancel(); -} - -//================================================================================= -// function : ClickOnCancel() -// purpose : -//================================================================================= -void SMESHGUI_EditMeshDlg::ClickOnCancel() -{ - myIdPreview->SetPointsLabeled(false); - SMESH::SetPointRepresentation(false); - disconnect(mySelectionMgr, 0, this, 0); - disconnect(mySMESHGUI, 0, this, 0); - mySMESHGUI->ResetState(); - - mySelectionMgr->clearFilters(); - //mySelectionMgr->clearSelected(); - - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); - - reject(); -} - -//================================================================================= -// function : ClickOnHelp() -// purpose : -//================================================================================= -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 { - QString platform; -#ifdef WIN32 - platform = "winapplication"; -#else - platform = "application"; -#endif - SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); - } -} - -//================================================================================= -// function : onEditGroup() -// purpose : -//================================================================================= -void SMESHGUI_EditMeshDlg::onEditGroup() -{ - QList selItems = ListCoincident->selectedItems(); - if ( selItems.count() != 1 ) { - ListEdit->clear(); - return; - } - - QStringList aNewIds; - - for (int i = 0; i < ListEdit->count(); i++ ) - aNewIds.append(ListEdit->item(i)->text()); - - ListCoincident->clearSelection(); - selItems.first()->setText(aNewIds.join(" ")); - selItems.first()->setSelected(true); -} - -//================================================================================= -// function : updateControls() -// purpose : -//================================================================================= -void SMESHGUI_EditMeshDlg::updateControls() -{ - if (ListEdit->count() == 0) - SetFirstButton->setEnabled(false); - bool enable = !(myMesh->_is_nil()) && (ListCoincident->count() || (myTypeId == 0)); - buttonOk->setEnabled(enable); - buttonApply->setEnabled(enable); -} - -//================================================================================= -// function : onDetect() -// purpose : -//================================================================================= -void SMESHGUI_EditMeshDlg::onDetect() -{ - if ( myMesh->_is_nil() || LineEditMesh->text().isEmpty() ) - return; - - try { - SUIT_OverrideCursor aWaitCursor; - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); - - 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; - } - - for (int i = 0; i < aGroupsArray->length(); i++) { - SMESH::long_array& aGroup = aGroupsArray[i]; - - QStringList anIDs; - for (int j = 0; j < aGroup.length(); j++) - anIDs.append(QString::number(aGroup[j])); - - ListCoincident->addItem(anIDs.join(" ")); - } - } catch(...) { - } - - ListCoincident->selectAll(); - updateControls(); -} - -//================================================================================= -// function : onSelectGroup() -// purpose : -//================================================================================= -void SMESHGUI_EditMeshDlg::onSelectGroup() -{ - if (myIsBusy || !myActor) - return; - myEditCurrentArgument = (QWidget*)ListCoincident; - - ListEdit->clear(); - - TColStd_MapOfInteger anIndices; - QList selItems = ListCoincident->selectedItems(); - QListWidgetItem* anItem; - QStringList aListIds; - - ListEdit->clear(); - - foreach(anItem, selItems) { - aListIds = anItem->text().split(" ", QString::SkipEmptyParts); - for (int i = 0; i < aListIds.count(); i++) - anIndices.Add(aListIds[i].toInt()); - } - - if (selItems.count() == 1) { - ListEdit->addItems(aListIds); - ListEdit->selectAll(); - } - - mySelector->AddOrRemoveIndex(myActor->getIO(), anIndices, false); - SALOME_ListIO aList; - aList.Append(myActor->getIO()); - mySelectionMgr->setSelectedObjects(aList,false); - - if (myAction == 0) { - myIdPreview->SetPointsData(myActor->GetObject()->GetMesh(), anIndices); - myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility()); - } - else { - std::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) -{ - if ( isToggled ) - ListCoincident->selectAll(); - else - ListCoincident->clearSelection(); -} - -//================================================================================= -// function : onSelectElementFromGroup() -// purpose : -//================================================================================= -void SMESHGUI_EditMeshDlg::onSelectElementFromGroup() -{ - if (myIsBusy || !myActor) - return; - - TColStd_MapOfInteger anIndices; - QList selItems = ListEdit->selectedItems(); - QListWidgetItem* anItem; - - foreach(anItem, selItems) - anIndices.Add(anItem->text().toInt()); - - SetFirstButton->setEnabled(selItems.count() == 1); - - 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 { - std::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 = ""; - int aNbElements = 0; - aNbElements = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), anIDs); - - if (aNbElements < 1) - return; - - ListCoincident->clearSelection(); - ListCoincident->addItem(anIDs); - int nbGroups = ListCoincident->count(); - if (nbGroups) { - ListCoincident->setCurrentRow(nbGroups-1); - ListCoincident->item(nbGroups-1)->setSelected(true); - } - else { - // VSR ? this code seems to be never executed!!! - ListCoincident->setCurrentRow(0); - //ListCoincident->setSelected(0, true); // VSR: no items - no selection - } - - updateControls(); -} - -//================================================================================= -// function : onRemoveGroup() -// purpose : -//================================================================================= -void SMESHGUI_EditMeshDlg::onRemoveGroup() -{ - if (myEditCurrentArgument != (QWidget*)ListCoincident) - return; - myIsBusy = true; - - QList selItems = ListCoincident->selectedItems(); - QListWidgetItem* anItem; - - foreach(anItem, selItems) - delete anItem; - - 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 = aListStr.split(" ", QString::SkipEmptyParts); - - for (QStringList::iterator it = aNodes.begin(); it != aNodes.end(); ++it) { - QList found = ListEdit->findItems(*it, Qt::MatchExactly); - if ( found.count() == 0 ) { - QListWidgetItem* anItem = new QListWidgetItem(*it); - ListEdit->addItem(anItem); - anItem->setSelected(true); - } - else { - QListWidgetItem* anItem; - foreach(anItem, found) anItem->setSelected(true); - } - } - - myIsBusy = false; - onEditGroup(); -} - -//================================================================================= -// function : onRemoveElement() -// purpose : -//================================================================================= -void SMESHGUI_EditMeshDlg::onRemoveElement() -{ - if (myEditCurrentArgument != (QWidget*)ListCoincident) - return; - myIsBusy = true; - - QList selItems = ListEdit->selectedItems(); - QListWidgetItem* anItem; - - foreach(anItem, selItems) - delete anItem; - - myIsBusy = false; - onEditGroup(); -} - -//================================================================================= -// function : onSetFirst() -// purpose : -//================================================================================= -void SMESHGUI_EditMeshDlg::onSetFirst() -{ - if (myEditCurrentArgument != (QWidget*)ListCoincident) - return; - myIsBusy = true; - - QList selItems = ListEdit->selectedItems(); - QListWidgetItem* anItem; - - foreach(anItem, selItems) { - ListEdit->takeItem(ListEdit->row(anItem)); - ListEdit->insertItem(0, anItem); - } - - 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); - if (myTypeId == 1) - 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) { - myIdPreview->SetPointsLabeled(false); - SMESH::SetPointRepresentation(false); - mySelectionMgr->clearFilters(); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); - return; - } - - SALOME_ListIO aList; - mySelectionMgr->selectedObjects(aList); - - Handle(SALOME_InteractiveObject) IO = aList.First(); - myMesh = SMESH::GetMeshByIO(IO); - - if (myMesh->_is_nil()) - return; - - LineEditMesh->setText(aString); - - myActor = SMESH::FindActorByEntry(IO->getEntry()); - if (!myActor) - myActor = SMESH::FindActorByObject(myMesh); - - if ( myActor && myTypeId ==1 ) { - mySubMeshOrGroup = SMESH::SMESH_IDSource::_nil(); - mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter); - - if ((!SMESH::IObjectToInterface(IO)->_is_nil() || //SUBMESH OR GROUP - !SMESH::IObjectToInterface(IO)->_is_nil()) && - !SMESH::IObjectToInterface(IO)->_is_nil()) - mySubMeshOrGroup = SMESH::IObjectToInterface(IO); - - 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); - } - - updateControls(); - } -} - -//================================================================================= -// function : DeactivateActiveDialog() -// purpose : -//================================================================================= -void SMESHGUI_EditMeshDlg::DeactivateActiveDialog() -{ - if (GroupConstructors->isEnabled()) { - GroupConstructors->setEnabled(false); - TypeBox->setEnabled(false); - GroupMesh->setEnabled(false); - GroupCoincident->setEnabled(false); - GroupEdit->setEnabled(false); - GroupButtons->setEnabled(false); - mySMESHGUI->ResetState(); - mySMESHGUI->SetActiveDialogBox(0); - } - - mySelectionMgr->clearSelected(); - disconnect(mySelectionMgr, 0, this, 0); -} - -//================================================================================= -// function : ActivateThisDialog() -// purpose : -//================================================================================= -void SMESHGUI_EditMeshDlg::ActivateThisDialog() -{ - /* Emit a signal to deactivate the active dialog */ - mySMESHGUI->EmitSignalDeactivateDialog(); - GroupConstructors->setEnabled(true); - TypeBox->setEnabled(true); - GroupMesh->setEnabled(true); - GroupCoincident->setEnabled(true); - GroupEdit->setEnabled(true); - GroupButtons->setEnabled(true); - - connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - mySMESHGUI->SetActiveDialogBox((QDialog*)this); - SelectionIntoArgument(); -} - -//================================================================================= -// function : enterEvent() -// purpose : -//================================================================================= -void SMESHGUI_EditMeshDlg::enterEvent(QEvent*) -{ - if (!GroupConstructors->isEnabled()) - ActivateThisDialog(); -} - -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void SMESHGUI_EditMeshDlg::closeEvent(QCloseEvent*) -{ - /* same than click on cancel button */ - ClickOnCancel(); -} - -//======================================================================= -//function : hideEvent -//purpose : caused by ESC key -//======================================================================= -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() == Qt::Key_F1 ) { - e->accept(); - ClickOnHelp(); - } -} - -//================================================================================= -// function : onTypeChanged() -// purpose : the type radio button management -//================================================================================= -void SMESHGUI_EditMeshDlg::onTypeChanged (int id) -{ - if (myTypeId == id) - return; - - myTypeId = id; - switch (id) { - case 0: - myIdPreview->SetPointsLabeled(false); - SMESH::SetPointRepresentation(false); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); - mySelectionMgr->clearFilters(); - if (myAction == 0) - GroupCoincidentWidget->hide(); - else - GroupCoincident->hide(); - GroupEdit->hide(); - break; - case 1: - SMESH::UpdateView(); - - // Costruction of the logical filter - SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH); - SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (GROUP); - - QList aListOfFilters; - if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter); - if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter); - - myMeshOrSubMeshOrGroupFilter = - new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR); - - if (myAction == 0) { - GroupCoincidentWidget->show(); - SMESH::SetPointRepresentation(true); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(NodeSelection); - } - else { - GroupCoincident->show(); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(CellSelection); - } - GroupEdit->show(); - break; - } - updateControls(); - - qApp->processEvents(); - updateGeometry(); - resize(10,10); - - SelectionIntoArgument(); -} diff --git a/src/SMESHGUI/SMESHGUI_EditMeshDlg.h b/src/SMESHGUI/SMESHGUI_EditMeshDlg.h deleted file mode 100644 index 4ff701452..000000000 --- a/src/SMESHGUI/SMESHGUI_EditMeshDlg.h +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 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 -// - -// SMESH SMESHGUI : GUI for SMESH component -// File : SMESHGUI_EditMeshDlg.h -// Author : Open CASCADE S.A.S. -// -#ifndef SMESHGUI_EDITMESHDLG_H -#define SMESHGUI_EDITMESHDLG_H - -// SMESH includes -#include "SMESH_SMESHGUI.hxx" - -// Qt includes -#include - -// OCCT includes -#include - -// STL includes -#include - -// IDL includes -#include -#include CORBA_SERVER_HEADER(SMESH_Mesh) - -class QGroupBox; -class QLabel; -class QLineEdit; -class QPushButton; -class QRadioButton; -class QCheckBox; -class QListWidget; -class QButtonGroup; -class SMESHGUI; -class SMESHGUI_SpinBox; -class SMESH_Actor; -class SVTK_Selector; -class LightApp_SelectionMgr; -class SUIT_SelectionFilter; -class TColStd_MapOfInteger; - -namespace SMESH -{ - struct TIdPreview; -} - -//================================================================================= -// class : SMESHGUI_EditMeshDlg -// purpose : -//================================================================================= -class SMESHGUI_EXPORT SMESHGUI_EditMeshDlg : public QDialog -{ - Q_OBJECT; - -public: - SMESHGUI_EditMeshDlg( SMESHGUI*, int ); - ~SMESHGUI_EditMeshDlg(); - -private: - void Init(); - void closeEvent( QCloseEvent* ); - void enterEvent( QEvent* ); /* mouse enter the QWidget */ - void hideEvent( QHideEvent* ); /* ESC key */ - void keyPressEvent( QKeyEvent* ); - void onEditGroup(); - - void FindGravityCenter( TColStd_MapOfInteger&, - std::list& ); - // add the centers of gravity of ElemsIdMap elements to the GrCentersXYZ list - -private: - SMESHGUI* mySMESHGUI; /* Current SMESHGUI object */ - LightApp_SelectionMgr* mySelectionMgr; /* User shape selection */ - SVTK_Selector* mySelector; - - QWidget* myEditCurrentArgument; - - SMESH::SMESH_Mesh_var myMesh; - SMESH::SMESH_IDSource_var mySubMeshOrGroup; - SMESH_Actor* myActor; - SUIT_SelectionFilter* myMeshOrSubMeshOrGroupFilter; - - SMESH::TIdPreview* myIdPreview; - - int myAction; - bool myIsBusy; - int myTypeId; - - // Widgets - QGroupBox* GroupConstructors; - QRadioButton* RadioButton; - - QGroupBox* GroupButtons; - QPushButton* buttonOk; - QPushButton* buttonCancel; - QPushButton* buttonApply; - QPushButton* buttonHelp; - - QGroupBox* GroupMesh; - QLabel* TextLabelName; - QPushButton* SelectMeshButton; - QLineEdit* LineEditMesh; - - QGroupBox* GroupCoincident; - QWidget* GroupCoincidentWidget; - QLabel* TextLabelTolerance; - SMESHGUI_SpinBox* SpinBoxTolerance; - QPushButton* DetectButton; - QListWidget* ListCoincident; - QPushButton* AddGroupButton; - QPushButton* RemoveGroupButton; - QCheckBox* SelectAllCB; - - QGroupBox* GroupEdit; - QListWidget* ListEdit; - QPushButton* AddElemButton; - QPushButton* RemoveElemButton; - QPushButton* SetFirstButton; - - QGroupBox* TypeBox; - QButtonGroup* GroupType; - - QString myHelpFileName; - - private slots: - void ClickOnOk(); - void ClickOnCancel(); - bool ClickOnApply(); - void ClickOnHelp(); - void updateControls(); - void onDetect(); - void onAddGroup(); - void onRemoveGroup(); - void onSelectGroup(); - void onSelectAll( bool ); - void onSelectElementFromGroup(); - void onAddElement(); - void onRemoveElement(); - void onSetFirst(); - void SetEditCurrentArgument(); - void SelectionIntoArgument(); - void DeactivateActiveDialog(); - void ActivateThisDialog(); - void onTypeChanged(int); -}; - -#endif // SMESHGUI_EDITMESHDLG_H diff --git a/src/SMESHGUI/SMESHGUI_MergeDlg.cxx b/src/SMESHGUI/SMESHGUI_MergeDlg.cxx new file mode 100644 index 000000000..ff37f9f56 --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_MergeDlg.cxx @@ -0,0 +1,1281 @@ +// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 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 +// + +// SMESH SMESHGUI : GUI for SMESH component +// File : SMESHGUI_MergeDlg.cxx +// Author : Open CASCADE S.A.S. +// SMESH includes +// +#include "SMESHGUI_MergeDlg.h" + +#include "SMESHGUI.h" +#include "SMESHGUI_Utils.h" +#include "SMESHGUI_VTKUtils.h" +#include "SMESHGUI_MeshUtils.h" +#include "SMESHGUI_SpinBox.h" + +#include +#include +#include +#include + +// SALOME GUI includes +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +// OCCT includes +#include +#include + +// IDL includes +#include +#include CORBA_SERVER_HEADER(SMESH_Group) +#include CORBA_SERVER_HEADER(SMESH_MeshEditor) + +// VTK includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if !defined(VTK_XVERSION) +#define VTK_XVERSION (VTK_MAJOR_VERSION<<16)+(VTK_MINOR_VERSION<<8)+(VTK_BUILD_VERSION) +#endif + +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SPACING 6 +#define MARGIN 11 + +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; + + std::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()); +#if (VTK_XVERSION < 0x050200) + myPtsLabeledDataMapper->SetLabelFormat("%g"); +#endif + 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, + std::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; + std::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(); //vtk 5.0 porting + myPtsLabeledDataMapper->Delete(); + + //myPtsSelectVisiblePoints->UnRegisterAllOutputs(); //vtk 5.0 porting + myPtsSelectVisiblePoints->Delete(); + + //myPtsMaskPoints->UnRegisterAllOutputs(); //vtk 5.0 porting + myPtsMaskPoints->Delete(); + + myPointLabels->Delete(); + +// myTimeStamp->Delete(); + } + }; +} + +static const char * IconFirst[] = { +"18 10 2 1", +" g None", +". g #000000", +" . . ", +" .. .. .. ", +" .. ... ... ", +" .. .... .... ", +" .. ..... ..... ", +" .. ..... ..... ", +" .. .... .... ", +" .. ... ... ", +" .. .. .. ", +" . . "}; + +//================================================================================= +// class : SMESHGUI_MergeDlg() +// purpose : +//================================================================================= +SMESHGUI_MergeDlg::SMESHGUI_MergeDlg (SMESHGUI* theModule, int theAction) + : QDialog(SMESH::GetDesktop(theModule)), + mySMESHGUI(theModule), + mySelectionMgr(SMESH::GetSelectionMgr(theModule)), + myAction(theAction) +{ + setModal(false); + setAttribute(Qt::WA_DeleteOnClose, true); + setWindowTitle(myAction == 1 ? tr("SMESH_MERGE_ELEMENTS") : tr("SMESH_MERGE_NODES")); + + myIdPreview = new SMESH::TIdPreview(SMESH::GetViewWindow( mySMESHGUI )); + + 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); + + QVBoxLayout* DlgLayout = new QVBoxLayout(this); + DlgLayout->setSpacing(SPACING); + DlgLayout->setMargin(MARGIN); + + /***************************************************************/ + GroupConstructors = new QGroupBox(myAction == 1 ? + tr("SMESH_MERGE_ELEMENTS") : + tr("SMESH_MERGE_NODES"), + this); + + QButtonGroup* ButtonGroup = new QButtonGroup(this); + QHBoxLayout* GroupConstructorsLayout = new QHBoxLayout(GroupConstructors); + GroupConstructorsLayout->setSpacing(SPACING); + GroupConstructorsLayout->setMargin(MARGIN); + + RadioButton = new QRadioButton(GroupConstructors); + RadioButton->setIcon(myAction == 1 ? IconMergeElems : IconMergeNodes); + RadioButton->setChecked(true); + GroupConstructorsLayout->addWidget(RadioButton); + ButtonGroup->addButton(RadioButton, 0); + + /***************************************************************/ + // Controls for mesh defining + GroupMesh = new QGroupBox(tr("SMESH_SELECT_WHOLE_MESH"), this); + QHBoxLayout* GroupMeshLayout = new QHBoxLayout(GroupMesh); + GroupMeshLayout->setSpacing(SPACING); + GroupMeshLayout->setMargin(MARGIN); + + TextLabelName = new QLabel(tr("SMESH_NAME"), GroupMesh); + SelectMeshButton = new QPushButton(GroupMesh); + SelectMeshButton->setIcon(IconSelect); + LineEditMesh = new QLineEdit(GroupMesh); + LineEditMesh->setReadOnly(true); + + GroupMeshLayout->addWidget(TextLabelName); + GroupMeshLayout->addWidget(SelectMeshButton); + GroupMeshLayout->addWidget(LineEditMesh); + + /***************************************************************/ + // Controls for switch dialog behaviour + + TypeBox = new QGroupBox( tr( "SMESH_MODE" ), this ); + GroupType = new QButtonGroup( this ); + QHBoxLayout* aTypeBoxLayout = new QHBoxLayout( TypeBox ); + aTypeBoxLayout->setMargin( MARGIN ); + aTypeBoxLayout->setSpacing( SPACING ); + + QRadioButton* rb1 = new QRadioButton( tr( "SMESH_AUTOMATIC" ), TypeBox ); + QRadioButton* rb2 = new QRadioButton( tr( "SMESH_MANUAL" ), TypeBox ); + GroupType->addButton( rb1, 0 ); + GroupType->addButton( rb2, 1 ); + aTypeBoxLayout->addWidget( rb1 ); + aTypeBoxLayout->addWidget( rb2 ); + + myTypeId = 0; + + /***************************************************************/ + // Controls for coincident elements detecting + GroupCoincident = new QGroupBox(myAction == 1 ? + tr("COINCIDENT_ELEMENTS") : + tr("COINCIDENT_NODES"), + this); + + QVBoxLayout* aCoincidentLayout = new QVBoxLayout(GroupCoincident); + + GroupCoincident->setLayout(aCoincidentLayout); + + QHBoxLayout* aSpinBoxLayout = new QHBoxLayout( GroupCoincident ); + + if (myAction == 0) { // case merge nodes + TextLabelTolerance = new QLabel(tr("SMESH_TOLERANCE"), GroupCoincident); + SpinBoxTolerance = new SMESHGUI_SpinBox(GroupCoincident); + SpinBoxTolerance->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); + + aSpinBoxLayout->addWidget(TextLabelTolerance); + aSpinBoxLayout->addWidget(SpinBoxTolerance); + aCoincidentLayout->addLayout(aSpinBoxLayout); + } + else { + TextLabelTolerance = 0; + SpinBoxTolerance = 0; + } + + GroupCoincidentWidget = new QWidget(GroupCoincident); + QGridLayout* GroupCoincidentLayout = new QGridLayout(GroupCoincidentWidget); + GroupCoincidentLayout->setSpacing(SPACING); + GroupCoincidentLayout->setMargin(MARGIN); + + ListCoincident = new QListWidget(GroupCoincidentWidget); + ListCoincident->setSelectionMode(QListWidget::ExtendedSelection); + + DetectButton = new QPushButton(tr("DETECT"), GroupCoincidentWidget); + AddGroupButton = new QPushButton(tr("SMESH_BUT_ADD"), GroupCoincidentWidget); + RemoveGroupButton = new QPushButton(tr("SMESH_BUT_REMOVE"), GroupCoincidentWidget); + + SelectAllCB = new QCheckBox(tr("SELECT_ALL"), GroupCoincidentWidget); + + if (myAction == 0) + GroupCoincidentWidget->hide(); + else + GroupCoincident->hide(); + + GroupCoincidentLayout->addWidget(ListCoincident, 0, 0, 4, 2); + GroupCoincidentLayout->addWidget(DetectButton, 0, 2); + GroupCoincidentLayout->addWidget(AddGroupButton, 2, 2); + GroupCoincidentLayout->addWidget(RemoveGroupButton, 3, 2); + GroupCoincidentLayout->addWidget(SelectAllCB, 4, 0, 1, 3); + GroupCoincidentLayout->setRowMinimumHeight(1, 10); + GroupCoincidentLayout->setRowStretch(1, 5); + + aCoincidentLayout->addWidget(GroupCoincidentWidget); + + /***************************************************************/ + // Controls for editing the selected group + GroupEdit = new QGroupBox(tr("EDIT_SELECTED_GROUP"), this); + QGridLayout* GroupEditLayout = new QGridLayout(GroupEdit); + GroupEditLayout->setSpacing(SPACING); + GroupEditLayout->setMargin(MARGIN); + + ListEdit = new QListWidget(GroupEdit); + //ListEdit->setRowMode(QListBox::FixedNumber); + //ListEdit->setHScrollBarMode(QScrollView::AlwaysOn); + //ListEdit->setVScrollBarMode(QScrollView::AlwaysOff); + ListEdit->setFlow( QListView::LeftToRight ); + ListEdit->setSelectionMode(QListWidget::ExtendedSelection); + + AddElemButton = new QPushButton(GroupEdit); + AddElemButton->setIcon(IconAdd); + RemoveElemButton = new QPushButton(GroupEdit); + RemoveElemButton->setIcon(IconRemove); + SetFirstButton = new QPushButton(GroupEdit); + SetFirstButton->setIcon(QPixmap(IconFirst)); + + GroupEditLayout->addWidget(ListEdit, 0, 0, 2, 1); + GroupEditLayout->addWidget(AddElemButton, 0, 1); + GroupEditLayout->addWidget(RemoveElemButton, 0, 2); + GroupEditLayout->addWidget(SetFirstButton, 1, 1, 1, 2); + + GroupEdit->hide(); + + /***************************************************************/ + GroupButtons = new QGroupBox(this); + QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons); + GroupButtonsLayout->setSpacing(SPACING); + GroupButtonsLayout->setMargin(MARGIN); + + buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), GroupButtons); + buttonOk->setAutoDefault(true); + buttonOk->setDefault(true); + buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons); + buttonApply->setAutoDefault(true); + buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons); + buttonCancel->setAutoDefault(true); + buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons); + buttonHelp->setAutoDefault(true); + + GroupButtonsLayout->addWidget(buttonOk); + GroupButtonsLayout->addSpacing(10); + GroupButtonsLayout->addWidget(buttonApply); + GroupButtonsLayout->addSpacing(10); + GroupButtonsLayout->addStretch(); + GroupButtonsLayout->addWidget(buttonCancel); + GroupButtonsLayout->addWidget(buttonHelp); + + /***************************************************************/ + DlgLayout->addWidget(GroupConstructors); + DlgLayout->addWidget(GroupMesh); + DlgLayout->addWidget(TypeBox); + DlgLayout->addWidget(GroupCoincident); + DlgLayout->addWidget(GroupEdit); + DlgLayout->addWidget(GroupButtons); + + this->resize(10,10); + + Init(); // Initialisations +} + +//================================================================================= +// function : ~SMESHGUI_MergeDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +SMESHGUI_MergeDlg::~SMESHGUI_MergeDlg() +{ + delete myIdPreview; +} + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::Init() +{ + if (myAction == 0) { + SpinBoxTolerance->RangeStepAndValidator(0.0, COORD_MAX, 0.00001, "len_tol_precision"); + SpinBoxTolerance->SetValue(1e-05); + } + + RadioButton->setChecked(true); + + GroupType->button(0)->setChecked(true); + + myEditCurrentArgument = (QWidget*)LineEditMesh; + + myActor = 0; + mySubMeshOrGroup = SMESH::SMESH_subMesh::_nil(); + + mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector(); + + mySMESHGUI->SetActiveDialogBox((QDialog*)this); + myIsBusy = false; + + /* 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(buttonHelp, SIGNAL(clicked()), this, SLOT(ClickOnHelp())); + + connect(SelectMeshButton, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument())); + connect(DetectButton, SIGNAL (clicked()), this, SLOT(onDetect())); + connect(ListCoincident, SIGNAL (itemSelectionChanged()), 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 (itemSelectionChanged()), 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(GroupType, SIGNAL(buttonClicked(int)), this, SLOT(onTypeChanged(int))); + + 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())); + + // Init Mesh field from selection + SelectionIntoArgument(); + + // Update Buttons + updateControls(); + + if (myAction == 0) + myHelpFileName = "merging_nodes_page.html"; + else + myHelpFileName = "merging_elements_page.html"; +} + +//================================================================================= +// function : FindGravityCenter() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::FindGravityCenter(TColStd_MapOfInteger & theElemsIdMap, + std::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 : +//================================================================================= +bool SMESHGUI_MergeDlg::ClickOnApply() +{ + if (mySMESHGUI->isActiveStudyLocked() || myMesh->_is_nil()) + return false; + + try { + if (myTypeId == 0) + onDetect(); + + SUIT_OverrideCursor aWaitCursor; + SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); + + SMESH::long_array_var anIds = new SMESH::long_array; + SMESH::array_of_long_array_var aGroupsOfElements = new SMESH::array_of_long_array; + + if ( ListCoincident->count() == 0) { + if (myAction == 0) + SUIT_MessageBox::warning(this, + tr("SMESH_WARNING"), + tr("SMESH_NO_NODES_DETECTED")); + else + SUIT_MessageBox::warning(this, + tr("SMESH_WARNING"), + tr("SMESH_NO_ELEMENTS_DETECTED")); + return false; + } + + aGroupsOfElements->length(ListCoincident->count()); + + int anArrayNum = 0; + for (int i = 0; i < ListCoincident->count(); i++) { + QStringList aListIds = ListCoincident->item(i)->text().split(" ", QString::SkipEmptyParts); + + anIds->length(aListIds.count()); + for (int i = 0; i < aListIds.count(); i++) + anIds[i] = aListIds[i].toInt(); + + aGroupsOfElements[anArrayNum++] = anIds.inout(); + } + + if( myAction == 0 ) + aMeshEditor->MergeNodes (aGroupsOfElements.inout()); + else + aMeshEditor->MergeElements (aGroupsOfElements.inout()); + + if ( myTypeId == 0 ) { + if (myAction ==0) + SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INFORMATION"), + tr("SMESH_MERGED_NODES").arg(QString::number(ListCoincident->count()).toLatin1().data())); + else + SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INFORMATION"), + tr("SMESH_MERGED_ELEMENTS").arg(QString::number(ListCoincident->count()).toLatin1().data())); + } + + + } catch(...) { + } + + SMESH::UpdateView(); + SMESHGUI::Modified(); + + return true; +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::ClickOnOk() +{ + if (ClickOnApply()) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnCancel() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::ClickOnCancel() +{ + myIdPreview->SetPointsLabeled(false); + SMESH::SetPointRepresentation(false); + disconnect(mySelectionMgr, 0, this, 0); + disconnect(mySMESHGUI, 0, this, 0); + mySMESHGUI->ResetState(); + + mySelectionMgr->clearFilters(); + //mySelectionMgr->clearSelected(); + + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(ActorSelection); + + reject(); +} + +//================================================================================= +// function : ClickOnHelp() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::ClickOnHelp() +{ + LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication()); + if (app) + app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName); + else { + QString platform; +#ifdef WIN32 + platform = "winapplication"; +#else + platform = "application"; +#endif + SUIT_MessageBox::warning(this, tr("WRN_WARNING"), + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); + } +} + +//================================================================================= +// function : onEditGroup() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::onEditGroup() +{ + QList selItems = ListCoincident->selectedItems(); + if ( selItems.count() != 1 ) { + ListEdit->clear(); + return; + } + + QStringList aNewIds; + + for (int i = 0; i < ListEdit->count(); i++ ) + aNewIds.append(ListEdit->item(i)->text()); + + ListCoincident->clearSelection(); + selItems.first()->setText(aNewIds.join(" ")); + selItems.first()->setSelected(true); +} + +//================================================================================= +// function : updateControls() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::updateControls() +{ + if (ListEdit->count() == 0) + SetFirstButton->setEnabled(false); + bool enable = !(myMesh->_is_nil()) && (ListCoincident->count() || (myTypeId == 0)); + buttonOk->setEnabled(enable); + buttonApply->setEnabled(enable); +} + +//================================================================================= +// function : onDetect() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::onDetect() +{ + if ( myMesh->_is_nil() || LineEditMesh->text().isEmpty() ) + return; + + try { + SUIT_OverrideCursor aWaitCursor; + SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); + + 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; + } + + for (int i = 0; i < aGroupsArray->length(); i++) { + SMESH::long_array& aGroup = aGroupsArray[i]; + + QStringList anIDs; + for (int j = 0; j < aGroup.length(); j++) + anIDs.append(QString::number(aGroup[j])); + + ListCoincident->addItem(anIDs.join(" ")); + } + } catch(...) { + } + + ListCoincident->selectAll(); + updateControls(); +} + +//================================================================================= +// function : onSelectGroup() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::onSelectGroup() +{ + if (myIsBusy || !myActor) + return; + myEditCurrentArgument = (QWidget*)ListCoincident; + + ListEdit->clear(); + + TColStd_MapOfInteger anIndices; + QList selItems = ListCoincident->selectedItems(); + QListWidgetItem* anItem; + QStringList aListIds; + + ListEdit->clear(); + + foreach(anItem, selItems) { + aListIds = anItem->text().split(" ", QString::SkipEmptyParts); + for (int i = 0; i < aListIds.count(); i++) + anIndices.Add(aListIds[i].toInt()); + } + + if (selItems.count() == 1) { + ListEdit->addItems(aListIds); + ListEdit->selectAll(); + } + + mySelector->AddOrRemoveIndex(myActor->getIO(), anIndices, false); + SALOME_ListIO aList; + aList.Append(myActor->getIO()); + mySelectionMgr->setSelectedObjects(aList,false); + + if (myAction == 0) { + myIdPreview->SetPointsData(myActor->GetObject()->GetMesh(), anIndices); + myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility()); + } + else { + std::list< gp_XYZ > aGrCentersXYZ; + FindGravityCenter(anIndices, aGrCentersXYZ); + myIdPreview->SetElemsData( anIndices, aGrCentersXYZ); + myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility()); + } + + updateControls(); +} + +//================================================================================= +// function : onSelectAll() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::onSelectAll (bool isToggled) +{ + if ( isToggled ) + ListCoincident->selectAll(); + else + ListCoincident->clearSelection(); +} + +//================================================================================= +// function : onSelectElementFromGroup() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::onSelectElementFromGroup() +{ + if (myIsBusy || !myActor) + return; + + TColStd_MapOfInteger anIndices; + QList selItems = ListEdit->selectedItems(); + QListWidgetItem* anItem; + + foreach(anItem, selItems) + anIndices.Add(anItem->text().toInt()); + + SetFirstButton->setEnabled(selItems.count() == 1); + + 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 { + std::list< gp_XYZ > aGrCentersXYZ; + FindGravityCenter(anIndices, aGrCentersXYZ); + myIdPreview->SetElemsData(anIndices, aGrCentersXYZ); + myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility()); + } +} + +//================================================================================= +// function : onAddGroup() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::onAddGroup() +{ + if ( myMesh->_is_nil() || LineEditMesh->text().isEmpty() ) + return; + + QString anIDs = ""; + int aNbElements = 0; + aNbElements = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), anIDs); + + if (aNbElements < 1) + return; + + ListCoincident->clearSelection(); + ListCoincident->addItem(anIDs); + int nbGroups = ListCoincident->count(); + if (nbGroups) { + ListCoincident->setCurrentRow(nbGroups-1); + ListCoincident->item(nbGroups-1)->setSelected(true); + } + else { + // VSR ? this code seems to be never executed!!! + ListCoincident->setCurrentRow(0); + //ListCoincident->setSelected(0, true); // VSR: no items - no selection + } + + updateControls(); +} + +//================================================================================= +// function : onRemoveGroup() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::onRemoveGroup() +{ + if (myEditCurrentArgument != (QWidget*)ListCoincident) + return; + myIsBusy = true; + + QList selItems = ListCoincident->selectedItems(); + QListWidgetItem* anItem; + + foreach(anItem, selItems) + delete anItem; + + ListEdit->clear(); + updateControls(); + + myIsBusy = false; +} + +//================================================================================= +// function : onAddElement() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::onAddElement() +{ + if (!myActor) + return; + myIsBusy = true; + + QString aListStr = ""; + int aNbNnodes = 0; + + aNbNnodes = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aListStr); + if (aNbNnodes < 1) + return; + + QStringList aNodes = aListStr.split(" ", QString::SkipEmptyParts); + + for (QStringList::iterator it = aNodes.begin(); it != aNodes.end(); ++it) { + QList found = ListEdit->findItems(*it, Qt::MatchExactly); + if ( found.count() == 0 ) { + QListWidgetItem* anItem = new QListWidgetItem(*it); + ListEdit->addItem(anItem); + anItem->setSelected(true); + } + else { + QListWidgetItem* anItem; + foreach(anItem, found) anItem->setSelected(true); + } + } + + myIsBusy = false; + onEditGroup(); +} + +//================================================================================= +// function : onRemoveElement() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::onRemoveElement() +{ + if (myEditCurrentArgument != (QWidget*)ListCoincident) + return; + myIsBusy = true; + + QList selItems = ListEdit->selectedItems(); + QListWidgetItem* anItem; + + foreach(anItem, selItems) + delete anItem; + + myIsBusy = false; + onEditGroup(); +} + +//================================================================================= +// function : onSetFirst() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::onSetFirst() +{ + if (myEditCurrentArgument != (QWidget*)ListCoincident) + return; + myIsBusy = true; + + QList selItems = ListEdit->selectedItems(); + QListWidgetItem* anItem; + + foreach(anItem, selItems) { + ListEdit->takeItem(ListEdit->row(anItem)); + ListEdit->insertItem(0, anItem); + } + + myIsBusy = false; + onEditGroup(); +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::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); + if (myTypeId == 1) + 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_MergeDlg::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) { + myIdPreview->SetPointsLabeled(false); + SMESH::SetPointRepresentation(false); + mySelectionMgr->clearFilters(); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(ActorSelection); + return; + } + + SALOME_ListIO aList; + mySelectionMgr->selectedObjects(aList); + + Handle(SALOME_InteractiveObject) IO = aList.First(); + myMesh = SMESH::GetMeshByIO(IO); + + if (myMesh->_is_nil()) + return; + + LineEditMesh->setText(aString); + + myActor = SMESH::FindActorByEntry(IO->getEntry()); + if (!myActor) + myActor = SMESH::FindActorByObject(myMesh); + + if ( myActor && myTypeId ==1 ) { + mySubMeshOrGroup = SMESH::SMESH_IDSource::_nil(); + mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter); + + if ((!SMESH::IObjectToInterface(IO)->_is_nil() || //SUBMESH OR GROUP + !SMESH::IObjectToInterface(IO)->_is_nil()) && + !SMESH::IObjectToInterface(IO)->_is_nil()) + mySubMeshOrGroup = SMESH::IObjectToInterface(IO); + + 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); + } + + updateControls(); + } +} + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::DeactivateActiveDialog() +{ + if (GroupConstructors->isEnabled()) { + GroupConstructors->setEnabled(false); + TypeBox->setEnabled(false); + GroupMesh->setEnabled(false); + GroupCoincident->setEnabled(false); + GroupEdit->setEnabled(false); + GroupButtons->setEnabled(false); + mySMESHGUI->ResetState(); + mySMESHGUI->SetActiveDialogBox(0); + } + + mySelectionMgr->clearSelected(); + disconnect(mySelectionMgr, 0, this, 0); +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::ActivateThisDialog() +{ + /* Emit a signal to deactivate the active dialog */ + mySMESHGUI->EmitSignalDeactivateDialog(); + GroupConstructors->setEnabled(true); + TypeBox->setEnabled(true); + GroupMesh->setEnabled(true); + GroupCoincident->setEnabled(true); + GroupEdit->setEnabled(true); + GroupButtons->setEnabled(true); + + connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + mySMESHGUI->SetActiveDialogBox((QDialog*)this); + SelectionIntoArgument(); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::enterEvent(QEvent*) +{ + if (!GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + +//================================================================================= +// function : closeEvent() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::closeEvent(QCloseEvent*) +{ + /* same than click on cancel button */ + ClickOnCancel(); +} + +//======================================================================= +//function : hideEvent +//purpose : caused by ESC key +//======================================================================= +void SMESHGUI_MergeDlg::hideEvent (QHideEvent *) +{ + if (!isMinimized()) + ClickOnCancel(); +} + +//================================================================================= +// function : keyPressEvent() +// purpose : +//================================================================================= +void SMESHGUI_MergeDlg::keyPressEvent( QKeyEvent* e) +{ + QDialog::keyPressEvent( e ); + if ( e->isAccepted() ) + return; + + if ( e->key() == Qt::Key_F1 ) { + e->accept(); + ClickOnHelp(); + } +} + +//================================================================================= +// function : onTypeChanged() +// purpose : the type radio button management +//================================================================================= +void SMESHGUI_MergeDlg::onTypeChanged (int id) +{ + if (myTypeId == id) + return; + + myTypeId = id; + switch (id) + { + case 0: // automatic + myIdPreview->SetPointsLabeled(false); + SMESH::SetPointRepresentation(false); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(ActorSelection); + mySelectionMgr->clearFilters(); + if (myAction == 0) + GroupCoincidentWidget->hide(); + else + GroupCoincident->hide(); + GroupEdit->hide(); + break; + + case 1: // manual + SMESH::UpdateView(); + + // Costruction of the logical filter + SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH); + SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (GROUP); + + QList aListOfFilters; + if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter); + if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter); + + myMeshOrSubMeshOrGroupFilter = + new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR); + + if (myAction == 0) { + GroupCoincidentWidget->show(); + SMESH::SetPointRepresentation(true); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(NodeSelection); + } + else { + GroupCoincident->show(); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(CellSelection); + } + GroupEdit->show(); + break; + } + updateControls(); + + qApp->processEvents(); + updateGeometry(); + resize(10,10); + + SelectionIntoArgument(); +} diff --git a/src/SMESHGUI/SMESHGUI_MergeDlg.h b/src/SMESHGUI/SMESHGUI_MergeDlg.h new file mode 100644 index 000000000..30f32374a --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_MergeDlg.h @@ -0,0 +1,167 @@ +// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 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 +// + +// SMESH SMESHGUI : GUI for SMESH component +// File : SMESHGUI_MergeDlg.h +// Author : Open CASCADE S.A.S. +// +#ifndef SMESHGUI_MergeDlg_H +#define SMESHGUI_MergeDlg_H + +// SMESH includes +#include "SMESH_SMESHGUI.hxx" + +// Qt includes +#include + +// OCCT includes +#include + +// STL includes +#include + +// IDL includes +#include +#include CORBA_SERVER_HEADER(SMESH_Mesh) + +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QRadioButton; +class QCheckBox; +class QListWidget; +class QButtonGroup; +class SMESHGUI; +class SMESHGUI_SpinBox; +class SMESH_Actor; +class SVTK_Selector; +class LightApp_SelectionMgr; +class SUIT_SelectionFilter; +class TColStd_MapOfInteger; + +namespace SMESH +{ + struct TIdPreview; +} + +//================================================================================= +// class : SMESHGUI_MergeDlg +// purpose : +//================================================================================= +class SMESHGUI_EXPORT SMESHGUI_MergeDlg : public QDialog +{ + Q_OBJECT; + +public: + SMESHGUI_MergeDlg( SMESHGUI*, int ); + ~SMESHGUI_MergeDlg(); + +private: + void Init(); + void closeEvent( QCloseEvent* ); + void enterEvent( QEvent* ); /* mouse enter the QWidget */ + void hideEvent( QHideEvent* ); /* ESC key */ + void keyPressEvent( QKeyEvent* ); + void onEditGroup(); + + void FindGravityCenter( TColStd_MapOfInteger&, + std::list& ); + // add the centers of gravity of ElemsIdMap elements to the GrCentersXYZ list + +private: + SMESHGUI* mySMESHGUI; /* Current SMESHGUI object */ + LightApp_SelectionMgr* mySelectionMgr; /* User shape selection */ + SVTK_Selector* mySelector; + + QWidget* myEditCurrentArgument; + + SMESH::SMESH_Mesh_var myMesh; + SMESH::SMESH_IDSource_var mySubMeshOrGroup; + SMESH_Actor* myActor; + SUIT_SelectionFilter* myMeshOrSubMeshOrGroupFilter; + + SMESH::TIdPreview* myIdPreview; + + int myAction; + bool myIsBusy; + int myTypeId; + + // Widgets + QGroupBox* GroupConstructors; + QRadioButton* RadioButton; + + QGroupBox* GroupButtons; + QPushButton* buttonOk; + QPushButton* buttonCancel; + QPushButton* buttonApply; + QPushButton* buttonHelp; + + QGroupBox* GroupMesh; + QLabel* TextLabelName; + QPushButton* SelectMeshButton; + QLineEdit* LineEditMesh; + + QGroupBox* GroupCoincident; + QWidget* GroupCoincidentWidget; + QLabel* TextLabelTolerance; + SMESHGUI_SpinBox* SpinBoxTolerance; + QPushButton* DetectButton; + QListWidget* ListCoincident; + QPushButton* AddGroupButton; + QPushButton* RemoveGroupButton; + QCheckBox* SelectAllCB; + + QGroupBox* GroupEdit; + QListWidget* ListEdit; + QPushButton* AddElemButton; + QPushButton* RemoveElemButton; + QPushButton* SetFirstButton; + + QGroupBox* TypeBox; + QButtonGroup* GroupType; + + QString myHelpFileName; + + private slots: + void ClickOnOk(); + void ClickOnCancel(); + bool ClickOnApply(); + void ClickOnHelp(); + void updateControls(); + void onDetect(); + void onAddGroup(); + void onRemoveGroup(); + void onSelectGroup(); + void onSelectAll( bool ); + void onSelectElementFromGroup(); + void onAddElement(); + void onRemoveElement(); + void onSetFirst(); + void SetEditCurrentArgument(); + void SelectionIntoArgument(); + void DeactivateActiveDialog(); + void ActivateThisDialog(); + void onTypeChanged(int); +}; + +#endif // SMESHGUI_MergeDlg_H diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index a830f870a..56554a396 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -3758,7 +3758,7 @@ Please select a groups and try again - SMESHGUI_EditMeshDlg + SMESHGUI_MergeDlg COINCIDENT_ELEMENTS Coincident elements