1 // SMESH SMESHGUI : GUI for SMESH component
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : SMESHGUI_MultiEditDlg.cxx
25 // Author : Sergey LITONIN
28 #include "SMESHGUI_MultiEditDlg.h"
29 #include "SMESHGUI_FilterDlg.h"
30 #include "SMESHGUI_Filter.h"
33 #include "SMESHGUI_Utils.h"
34 #include "SMESHGUI_VTKUtils.h"
35 #include "SMESHGUI_MeshUtils.h"
37 #include "QAD_Desktop.h"
38 #include "QAD_RightFrame.h"
40 #include "VTKViewer_ViewFrame.h"
42 #include "SMESH_Actor.h"
43 #include "SMDS_Mesh.hxx"
44 #include "SMDS_MeshElement.hxx"
46 #include "SALOME_Selection.h"
47 #include "SALOME_ListIteratorOfListIO.hxx"
48 #include "VTKViewer_InteractorStyleSALOME.h"
50 #include <vtkCell3D.h>
52 #include <vtkTriangle.h>
53 #include <vtkIdList.h>
54 #include <vtkIntArray.h>
55 #include <vtkCellArray.h>
56 #include <vtkUnsignedCharArray.h>
57 #include <vtkUnstructuredGrid.h>
58 #include <vtkDataSetMapper.h>
60 #include <TColStd_IndexedMapOfInteger.hxx>
61 #include <TColStd_MapIteratorOfMapOfInteger.hxx>
62 #include <Precision.hxx>
63 #include <TColStd_DataMapOfIntegerInteger.hxx>
65 #include <qcheckbox.h>
67 #include <qgroupbox.h>
70 #include <qlineedit.h>
72 #include <qpushbutton.h>
73 #include <qapplication.h>
74 #include <qhbuttongroup.h>
75 #include <qradiobutton.h>
78 #include "SALOMEconfig.h"
79 #include CORBA_SERVER_HEADER(SMESH_Group)
85 Class : SMESHGUI_MultiEditDlg
86 Description : Description : Inversion of the diagonal of a pseudo-quadrangle formed by
87 2 neighboring triangles with 1 common edge
90 //=======================================================================
91 // name : SMESHGUI_MultiEditDlg::SMESHGUI_MultiEditDlg
92 // Purpose : Constructor
93 //=======================================================================
94 SMESHGUI_MultiEditDlg::SMESHGUI_MultiEditDlg( QWidget* theParent,
95 SALOME_Selection* theSelection,
99 : QDialog( theParent, theName, false,
100 WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu )
103 mySubmeshFilter = new SMESH_TypeFilter( SUBMESH );
104 myGroupFilter = new SMESH_TypeFilter( GROUP );
108 myFilterType = theMode;
109 QVBoxLayout* aDlgLay = new QVBoxLayout( this, MARGIN, SPACING );
111 QFrame* aMainFrame = createMainFrame ( this, the3d2d );
112 QFrame* aBtnFrame = createButtonFrame( this );
114 aDlgLay->addWidget( aMainFrame );
115 aDlgLay->addWidget( aBtnFrame );
117 aDlgLay->setStretchFactor( aMainFrame, 1 );
118 aDlgLay->setStretchFactor( aBtnFrame, 0 );
119 Init( theSelection ) ;
122 //=======================================================================
123 // name : SMESHGUI_MultiEditDlg::createMainFrame
124 // Purpose : Create frame containing dialog's input fields
125 //=======================================================================
126 QFrame* SMESHGUI_MultiEditDlg::createMainFrame( QWidget* theParent, const bool the3d2d )
128 QGroupBox* aMainGrp = new QGroupBox( 1, Qt::Horizontal, theParent );
129 aMainGrp->setFrameStyle( QFrame::NoFrame );
130 aMainGrp->setInsideMargin( 0 );
132 QPixmap aPix( QAD_Desktop::getResourceManager()->loadPixmap( "SMESH",tr( "ICON_SELECT" ) ) );
134 // "Selected cells" group
135 mySelGrp = new QGroupBox( 1, Qt::Horizontal, aMainGrp );
139 myEntityTypeGrp = new QHButtonGroup( tr("SMESH_ELEMENTS_TYPE"), mySelGrp );
140 (new QRadioButton( tr("SMESH_FACE"), myEntityTypeGrp ))->setChecked( true );
141 (new QRadioButton( tr("SMESH_VOLUME"), myEntityTypeGrp ));
142 myEntityType = myEntityTypeGrp->id( myEntityTypeGrp->selected() );
145 QFrame* aFrame = new QFrame( mySelGrp );
147 myListBox = new QListBox( aFrame );
148 myListBox->setSelectionMode( QListBox::Extended );
149 myListBox->setSizePolicy( QSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding) );
150 // myListBox->setColumnMode( QListBox::FitToHeight );
152 myFilterBtn = new QPushButton( tr( "FILTER" ) , aFrame );
153 myAddBtn = new QPushButton( tr( "ADD" ) , aFrame );
154 myRemoveBtn = new QPushButton( tr( "REMOVE" ) , aFrame );
155 mySortBtn = new QPushButton( tr( "SORT_LIST" ), aFrame );
157 QGridLayout* aLay = new QGridLayout( aFrame, 5, 2, 0, 5 );
158 aLay->addMultiCellWidget( myListBox, 0, 4, 0, 0 );
159 aLay->addWidget( myFilterBtn, 0, 1 );
160 aLay->addWidget( myAddBtn, 1, 1 );
161 aLay->addWidget( myRemoveBtn, 2, 1 );
162 aLay->addWidget( mySortBtn, 3, 1 );
164 QSpacerItem* aSpacer = new QSpacerItem( 0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding );
165 aLay->addItem( aSpacer, 4, 1 );
167 myToAllChk = new QCheckBox( tr( "TO_ALL" ), mySelGrp );
169 // "Select from" group
170 QGroupBox* aGrp = new QGroupBox( 3, Qt::Horizontal, tr( "SELECT_FROM" ), aMainGrp );
172 mySubmeshChk = new QCheckBox( tr( "SMESH_SUBMESH" ), aGrp );
173 mySubmeshBtn = new QPushButton( aGrp );
174 mySubmesh = new QLineEdit( aGrp );
175 mySubmesh->setReadOnly( true );
176 mySubmeshBtn->setPixmap( aPix );
178 myGroupChk = new QCheckBox( tr( "GROUP" ), aGrp );
179 myGroupBtn = new QPushButton( aGrp );
180 myGroup = new QLineEdit( aGrp );
181 myGroup->setReadOnly( true );
182 myGroupBtn->setPixmap( aPix );
187 //=======================================================================
188 // name : SMESHGUI_MultiEditDlg::createButtonFrame
189 // Purpose : Create frame containing buttons
190 //=======================================================================
191 QFrame* SMESHGUI_MultiEditDlg::createButtonFrame( QWidget* theParent )
193 QFrame* aFrame = new QFrame( theParent );
194 aFrame->setFrameStyle( QFrame::Box | QFrame::Sunken );
196 myOkBtn = new QPushButton( tr( "SMESH_BUT_OK" ), aFrame );
197 myApplyBtn = new QPushButton( tr( "SMESH_BUT_APPLY" ), aFrame );
198 myCloseBtn = new QPushButton( tr( "SMESH_BUT_CLOSE" ), aFrame );
200 QSpacerItem* aSpacer = new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum );
202 QHBoxLayout* aLay = new QHBoxLayout( aFrame, MARGIN, SPACING );
204 aLay->addWidget( myOkBtn );
205 aLay->addWidget( myApplyBtn );
206 aLay->addItem( aSpacer);
207 aLay->addWidget( myCloseBtn );
212 //=======================================================================
213 // name : SMESHGUI_MultiEditDlg::isValid
214 // Purpose : Verify validity of input data
215 //=======================================================================
216 bool SMESHGUI_MultiEditDlg::isValid( const bool /*theMess*/ ) const
218 return (!myMesh->_is_nil() &&
219 (myListBox->count() > 0 || (myToAllChk->isChecked() && myActor)));
222 //=======================================================================
223 // name : SMESHGUI_MultiEditDlg::~SMESHGUI_MultiEditDlg
224 // Purpose : Destructor
225 //=======================================================================
226 SMESHGUI_MultiEditDlg::~SMESHGUI_MultiEditDlg()
228 if ( myFilterDlg != 0 )
230 myFilterDlg->reparent( 0, QPoint() );
235 //=======================================================================
236 // name : SMESHGUI_MultiEditDlg::Init
237 // Purpose : Init dialog fields, connect signals and slots, show dialog
238 //=======================================================================
239 void SMESHGUI_MultiEditDlg::Init( SALOME_Selection* theSelection )
241 SMESHGUI* aSMESHGUI = SMESHGUI::GetSMESHGUI();
242 mySelection = theSelection;
243 aSMESHGUI->SetActiveDialogBox( ( QDialog* )this ) ;
248 emit ListContensChanged();
251 connect( myOkBtn, SIGNAL( clicked() ), SLOT( onOk() ) );
252 connect( myCloseBtn, SIGNAL( clicked() ), SLOT( onClose() ) ) ;
253 connect( myApplyBtn, SIGNAL( clicked() ), SLOT( onApply() ) );
255 // selection and SMESHGUI
256 connect( mySelection, SIGNAL( currentSelectionChanged() ), SLOT( onSelectionDone() ) );
257 connect( aSMESHGUI, SIGNAL( SignalDeactivateActiveDialog() ), SLOT( onDeactivate() ) );
258 connect( aSMESHGUI, SIGNAL( SignalCloseAllDialogs() ), SLOT( onClose() ) );
261 connect( myFilterBtn, SIGNAL( clicked() ), SLOT( onFilterBtn() ) );
262 connect( myAddBtn , SIGNAL( clicked() ), SLOT( onAddBtn() ) );
263 connect( myRemoveBtn, SIGNAL( clicked() ), SLOT( onRemoveBtn() ) );
264 connect( mySortBtn , SIGNAL( clicked() ), SLOT( onSortListBtn() ) );
266 connect( mySubmeshChk, SIGNAL( stateChanged( int ) ), SLOT( onSubmeshChk() ) );
267 connect( myGroupChk , SIGNAL( stateChanged( int ) ), SLOT( onGroupChk() ) );
268 connect( myToAllChk , SIGNAL( stateChanged( int ) ), SLOT( onToAllChk() ) );
270 if ( myEntityTypeGrp )
271 connect( myEntityTypeGrp, SIGNAL( clicked(int) ), SLOT( on3d2dChanged(int) ) );
273 connect( myListBox, SIGNAL( selectionChanged() ), SLOT( onListSelectionChanged() ) );
277 // set selection mode
282 //=======================================================================
283 // name : SMESHGUI_MultiEditDlg::onOk
284 // Purpose : SLOT called when "Ok" button pressed.
285 // Assign filters VTK viewer and close dialog
286 //=======================================================================
287 void SMESHGUI_MultiEditDlg::onOk()
293 //=======================================================================
294 // name : SMESHGUI_MultiEditDlg::getIds
295 // Purpose : Retrive identifiers from list box
296 //=======================================================================
297 SMESH::long_array_var SMESHGUI_MultiEditDlg::getIds()
299 SMESH::long_array_var anIds = new SMESH::long_array;
301 if ( myToAllChk->isChecked() )
306 TVisualObjPtr aVisualObj = myActor->GetObject();
307 vtkUnstructuredGrid* aGrid = aVisualObj->GetUnstructuredGrid();
310 for ( int i = 0, n = aGrid->GetNumberOfCells(); i < n; i++ )
312 vtkCell* aCell = aGrid->GetCell( i );
315 vtkTriangle* aTri = vtkTriangle::SafeDownCast(aCell);
316 vtkQuad* aQua = vtkQuad::SafeDownCast(aCell);
317 vtkCell3D* a3d = vtkCell3D::SafeDownCast(aCell);
319 if ( aTri && myFilterType == SMESHGUI_TriaFilter ||
320 aQua && myFilterType == SMESHGUI_QuadFilter ||
321 ( aTri || aQua ) && myFilterType == SMESHGUI_FaceFilter ||
322 a3d && myFilterType == SMESHGUI_VolumeFilter )
324 int anObjId = aVisualObj->GetElemObjId( i );
325 myIds.Add( anObjId );
333 anIds->length( myIds.Extent() );
334 TColStd_MapIteratorOfMapOfInteger anIter( myIds );
335 for ( int i = 0; anIter.More(); anIter.Next() )
337 anIds[ i++ ] = anIter.Key();
339 return anIds._retn();
342 //=======================================================================
343 // name : SMESHGUI_MultiEditDlg::onClose
344 // Purpose : SLOT called when "Close" button pressed. Close dialog
345 //=======================================================================
346 void SMESHGUI_MultiEditDlg::onClose()
348 QAD_Application::getDesktop()->SetSelectionMode( ActorSelection );
349 disconnect( mySelection, 0, this, 0 );
350 disconnect( SMESHGUI::GetSMESHGUI(), 0, this, 0 );
351 SMESHGUI::GetSMESHGUI()->ResetState();
353 SMESH::RemoveFilter(SMESHGUI_EdgeFilter);
354 SMESH::RemoveFilter(SMESHGUI_FaceFilter);
355 SMESH::RemoveFilter(SMESHGUI_VolumeFilter);
356 SMESH::RemoveFilter(SMESHGUI_QuadFilter);
357 SMESH::RemoveFilter(SMESHGUI_TriaFilter);
358 SMESH::SetPickable();
360 mySelection->ClearIObjects();
361 mySelection->ClearFilters();
366 //=======================================================================
367 // name : SMESHGUI_MultiEditDlg::onSelectionDone
368 // Purpose : SLOT called when selection changed
369 //=======================================================================
370 void SMESHGUI_MultiEditDlg::onSelectionDone()
372 if ( myBusy || !isEnabled() ) return;
375 myMesh = SMESH::SMESH_Mesh::_nil();
378 int nbSel = mySelection->IObjectCount();
379 myListBox->clearSelection();
381 if ( mySubmeshChk->isChecked() || myGroupChk->isChecked() )
383 QLineEdit* aNameEdit = mySubmeshChk->isChecked() ? mySubmesh : myGroup;
384 int nbSel = mySelection->IObjectCount();
387 Handle(SALOME_InteractiveObject) anIO = mySelection->firstIObject();
388 anIO.IsNull() ? aNameEdit->clear() : aNameEdit->setText( anIO->getName() );
390 if ( mySubmeshChk->isChecked() )
392 SMESH::SMESH_subMesh_var aSubMesh =
393 SMESH::IObjectToInterface<SMESH::SMESH_subMesh>( anIO );
394 if ( !aSubMesh->_is_nil() )
395 myMesh = aSubMesh->GetFather();
399 SMESH::SMESH_GroupBase_var aGroup =
400 SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>( anIO );
401 if ( !aGroup->_is_nil() )
402 myMesh = aGroup->GetMesh();
405 else if ( nbSel > 1 )
407 QString aStr = mySubmeshChk->isChecked() ?
408 tr( "SMESH_SUBMESH_SELECTED" ) : tr( "SMESH_GROUP_SELECTED" );
409 aNameEdit->setText( aStr.arg( nbSel ) );
414 else if ( nbSel == 1 )
416 QString aListStr = "";
417 int aNbItems = SMESH::GetNameOfSelectedElements(mySelection, aListStr);
420 QStringList anElements = QStringList::split(" ", aListStr);
421 QListBoxItem* anItem = 0;
422 for ( QStringList::iterator it = anElements.begin(); it != anElements.end(); ++it)
424 anItem = myListBox->findItem( *it, Qt::ExactMatch );
425 if (anItem) myListBox->setSelected( anItem, true );
429 myMesh = SMESH::GetMeshByIO( mySelection->firstIObject() );
433 myActor = SMESH::FindActorByEntry(mySelection->firstIObject()->getEntry());
434 if ( !myActor && !myMesh->_is_nil() )
435 myActor = SMESH::FindActorByObject( myMesh );
436 VTKViewer_InteractorStyleSALOME* aStyle = SMESH::GetInteractorStyle();
437 Handle(VTKViewer_Filter) aFilter = aStyle->GetFilter( myFilterType );
438 if ( !aFilter.IsNull() && myActor ) {
439 aFilter->SetActor( myActor );
440 //SMESH::SetPickable( myActor );
448 //=======================================================================
449 // name : SMESHGUI_MultiEditDlg::onDeactivate
450 // Purpose : SLOT called when dialog must be deativated
451 //=======================================================================
452 void SMESHGUI_MultiEditDlg::onDeactivate()
457 //=======================================================================
458 // name : SMESHGUI_MultiEditDlg::enterEvent
459 // Purpose : Event filter
460 //=======================================================================
461 void SMESHGUI_MultiEditDlg::enterEvent( QEvent* )
463 if ( !isEnabled() ) {
464 SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog();
471 //=================================================================================
472 // function : closeEvent()
474 //=================================================================================
475 void SMESHGUI_MultiEditDlg::closeEvent( QCloseEvent* e )
479 //=======================================================================
480 //function : hideEvent
481 //purpose : caused by ESC key
482 //=======================================================================
484 void SMESHGUI_MultiEditDlg::hideEvent ( QHideEvent * e )
486 if ( !isMinimized() )
490 //=======================================================================
491 // name : SMESHGUI_MultiEditDlg::onFilterBtn
492 // Purpose : SLOT. Called when "Filter" button pressed.
493 // Start "Selection filters" dialog
494 //=======================================================================
495 void SMESHGUI_MultiEditDlg::onFilterBtn()
497 if ( myFilterDlg == 0 )
499 myFilterDlg = new SMESHGUI_FilterDlg( (QWidget*)parent(), entityType() ? SMESH::VOLUME : SMESH::FACE );
500 connect( myFilterDlg, SIGNAL( Accepted() ), SLOT( onFilterAccepted() ) );
503 myFilterDlg->Init( entityType() ? SMESH::VOLUME : SMESH::FACE );
505 myFilterDlg->SetSelection( mySelection );
506 myFilterDlg->SetMesh( myMesh );
507 myFilterDlg->SetSourceWg( myListBox );
512 //=================================================================================
513 // function : onFilterAccepted()
514 // purpose : SLOT. Called when Filter dlg closed with OK button.
515 // Uncheck "Select submesh" and "Select group" checkboxes
516 //=================================================================================
517 void SMESHGUI_MultiEditDlg::onFilterAccepted()
520 for ( int i = 0, n = myListBox->count(); i < n; i++ )
521 myIds.Add( myListBox->text( i ).toInt() );
523 emit ListContensChanged();
525 if ( mySubmeshChk->isChecked() || myGroupChk->isChecked() )
527 mySubmeshChk->blockSignals( true );
528 myGroupChk->blockSignals( true );
529 mySubmeshChk->setChecked( false );
530 myGroupChk->setChecked( false );
531 mySubmeshChk->blockSignals( false );
532 myGroupChk->blockSignals( false );
537 //=======================================================================
538 // name : SMESHGUI_MultiEditDlg::isIdValid
539 // Purpose : Verify whether Id of element satisfies to filters from viewer
540 //=======================================================================
541 bool SMESHGUI_MultiEditDlg::isIdValid( const int theId ) const
543 VTKViewer_InteractorStyleSALOME* aStyle = SMESH::GetInteractorStyle();
544 Handle(SMESHGUI_Filter) aFilter =
545 Handle(SMESHGUI_Filter)::DownCast( aStyle->GetFilter( myFilterType ) );
546 return ( !aFilter.IsNull() && aFilter->IsObjValid( theId ) );
549 //=======================================================================
550 // name : SMESHGUI_MultiEditDlg::onAddBtn
551 // Purpose : SLOT. Called when "Add" button pressed.
552 // Add selected in viewer entities in list box
553 //=======================================================================
554 void SMESHGUI_MultiEditDlg::onAddBtn()
556 int nbSelected = mySelection->IObjectCount();
557 if ( nbSelected == 0 )
560 TColStd_IndexedMapOfInteger toBeAdded;
562 if ( !mySubmeshChk->isChecked() && !myGroupChk->isChecked() )
564 if ( nbSelected == 1 )
565 SMESH::GetSelected( mySelection, toBeAdded );
567 else if ( mySubmeshChk->isChecked() )
569 SALOME_ListIteratorOfListIO anIter( mySelection->StoredIObjects() );
570 for ( ; anIter.More(); anIter.Next() )
572 SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface<SMESH::SMESH_subMesh>( anIter.Value() );
573 if ( !aSubMesh->_is_nil() )
575 if ( !myMesh->_is_nil() && aSubMesh->GetFather()->GetId() == myMesh->GetId() )
577 SMESH::long_array_var anIds = aSubMesh->GetElementsId();
578 for ( int i = 0, n = anIds->length(); i < n; i++ )
580 if ( isIdValid( anIds[ i ] ) )
581 toBeAdded.Add( anIds[ i ] );
587 else if ( myGroupChk->isChecked() )
589 SALOME_ListIteratorOfListIO anIter( mySelection->StoredIObjects() );
590 for ( ; anIter.More(); anIter.Next() )
592 SMESH::SMESH_GroupBase_var aGroup =
593 SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>( anIter.Value() );
594 if ( !aGroup->_is_nil() && ( aGroup->GetType() == SMESH::FACE || aGroup->GetType() == SMESH::VOLUME ) )
596 if ( !myMesh->_is_nil() && aGroup->GetMesh()->GetId() == myMesh->GetId() )
598 SMESH::long_array_var anIds = aGroup->GetListOfID();
599 for ( int i = 0, n = anIds->length(); i < n; i++ )
601 if ( isIdValid( anIds[ i ] ) )
602 toBeAdded.Add( anIds[ i ] );
610 bool isGroupOrSubmesh = ( mySubmeshChk->isChecked() || myGroupChk->isChecked() );
611 mySubmeshChk->setChecked( false );
612 myGroupChk->setChecked( false );
613 for( int i = 1; i <= toBeAdded.Extent(); i++ )
614 if ( myIds.Add( toBeAdded(i) ) ) {
615 QListBoxItem * item = new QListBoxText( QString( "%1" ).arg( toBeAdded(i) ));
616 myListBox->insertItem( item );
617 myListBox->setSelected( item, true );
621 emit ListContensChanged();
623 if ( isGroupOrSubmesh )
624 onListSelectionChanged();
629 //=======================================================================
630 // name : SMESHGUI_MultiEditDlg::updateButtons
631 // Purpose : Enable/disable buttons of dialog in accordance with current state
632 //=======================================================================
633 void SMESHGUI_MultiEditDlg::updateButtons()
635 bool isOk = isValid(false);
636 myOkBtn->setEnabled( isOk );
637 myApplyBtn->setEnabled( isOk );
639 bool isListBoxNonEmpty = myListBox->count() > 0;
640 bool isToAll = myToAllChk->isChecked();
641 myFilterBtn->setEnabled( !isToAll );
642 myRemoveBtn->setEnabled( isListBoxNonEmpty && !isToAll );
643 mySortBtn->setEnabled( isListBoxNonEmpty &&!isToAll );
647 mySelection->IObjectCount() != 1 ||
648 (SMESH::IObjectToInterface<SMESH::SMESH_subMesh>( mySelection->firstIObject() )->_is_nil() &&
649 SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>( mySelection->firstIObject() )->_is_nil() &&
650 SMESH::IObjectToInterface<SMESH::SMESH_Mesh>( mySelection->firstIObject() )->_is_nil()) )
651 myAddBtn->setEnabled( false );
653 myAddBtn->setEnabled( true );
655 mySubmeshChk->setEnabled( !isToAll );
656 mySubmeshBtn->setEnabled( mySubmeshChk->isChecked() );
657 mySubmesh->setEnabled( mySubmeshChk->isChecked() );
659 myGroupChk->setEnabled( !isToAll );
660 myGroupBtn->setEnabled( myGroupChk->isChecked() );
661 myGroup->setEnabled( myGroupChk->isChecked() );
663 if ( !mySubmeshChk->isChecked() )
665 if ( !myGroupChk->isChecked() )
670 //=======================================================================
671 // name : SMESHGUI_MultiEditDlg::onRemoveBtn
672 // Purpose : SLOT. Called when "Remove" button pressed.
673 // Remove selected in list box entities
674 //=======================================================================
675 void SMESHGUI_MultiEditDlg::onRemoveBtn()
679 for ( int i = 0, n = myListBox->count(); i < n; i++ )
681 for ( int i = myListBox->count(); i > 0; i--) {
682 if ( myListBox->isSelected( i - 1 ) )
684 int anId = myListBox->text( i - 1 ).toInt();
685 myIds.Remove( anId );
686 myIds.Remove( anId );
687 myListBox->removeItem( i-1 );
693 emit ListContensChanged();
697 //=======================================================================
698 // name : SMESHGUI_MultiEditDlg::onSortListBtn
699 // Purpose : SLOT. Called when "Sort list" button pressed.
700 // Sort entities of list box
701 //=======================================================================
702 void SMESHGUI_MultiEditDlg::onSortListBtn()
706 int i, k = myListBox->count();
709 QStringList aSelected;
710 std::vector<int> anArray( k );
711 QListBoxItem* anItem;
712 for ( anItem = myListBox->firstItem(), i = 0; anItem != 0; anItem = anItem->next(), i++)
714 anArray[ i ] = anItem->text().toInt();
715 if ( anItem->isSelected() )
716 aSelected.append( anItem->text() );
719 std::sort( anArray.begin(), anArray.end() );
721 for ( i = 0; i < k; i++ )
722 myListBox->insertItem( QString::number( anArray[ i ] ) );
724 for ( QStringList::iterator it = aSelected.begin(); it != aSelected.end(); ++it )
726 anItem = myListBox->findItem( *it, Qt::ExactMatch );
728 myListBox->setSelected( anItem, true );
734 //=======================================================================
735 // name : SMESHGUI_MultiEditDlg::onListSelectionChanged
736 // Purpose : SLOT. Called when selection in list box changed.
737 // Highlight in selected entities
738 //=======================================================================
739 void SMESHGUI_MultiEditDlg::onListSelectionChanged()
741 if ( myActor == 0 || myBusy )
744 if ( mySubmeshChk->isChecked() || myGroupChk->isChecked() )
747 SMESH_Actor * anActor = SMESH::FindActorByObject( myMesh );
750 TVisualObjPtr anObj = anActor->GetObject();
752 TColStd_MapOfInteger anIndexes;
753 for ( QListBoxItem* anItem = myListBox->firstItem(); anItem != 0; anItem = anItem->next() )
755 if ( anItem->isSelected() )
757 int anId = anItem->text().toInt();
758 if ( anObj->GetElemVTKId( anId ) >= 0 ) // avoid exception in hilight
763 mySelection->ClearIObjects();
764 mySelection->AddOrRemoveIndex( anActor->getIO(), anIndexes, false, false );
765 mySelection->AddIObject( anActor->getIO() );
768 //=======================================================================
769 // name : SMESHGUI_MultiEditDlg::onSubmeshChk
770 // Purpose : SLOT. Called when state of "SubMesh" check box changed.
771 // Activate/deactivate selection of submeshes
772 //=======================================================================
773 void SMESHGUI_MultiEditDlg::onSubmeshChk()
775 bool isChecked = mySubmeshChk->isChecked();
776 mySubmeshBtn->setEnabled( isChecked );
777 mySubmesh->setEnabled( isChecked );
780 if ( isChecked && myGroupChk->isChecked() )
781 myGroupChk->setChecked( false );
786 //=======================================================================
787 // name : SMESHGUI_MultiEditDlg::onGroupChk
788 // Purpose : SLOT. Called when state of "Group" check box changed.
789 // Activate/deactivate selection of groupes
790 //=======================================================================
791 void SMESHGUI_MultiEditDlg::onGroupChk()
793 bool isChecked = myGroupChk->isChecked();
794 myGroupBtn->setEnabled( isChecked );
795 myGroup->setEnabled( isChecked );
798 if ( isChecked && mySubmeshChk->isChecked() )
799 mySubmeshChk->setChecked( false );
804 //=======================================================================
805 // name : SMESHGUI_MultiEditDlg::onToAllChk
806 // Purpose : SLOT. Called when state of "Apply to all" check box changed.
807 // Activate/deactivate selection
808 //=======================================================================
809 void SMESHGUI_MultiEditDlg::onToAllChk()
811 bool isChecked = myToAllChk->isChecked();
818 emit ListContensChanged();
824 mySelection->AddIObject( myActor->getIO(), true );
828 //=======================================================================
829 // name : SMESHGUI_MultiEditDlg::setSelectionMode
830 // Purpose : Set selection mode
831 //=======================================================================
832 void SMESHGUI_MultiEditDlg::setSelectionMode()
834 SMESH::RemoveFilter(SMESHGUI_EdgeFilter);
835 SMESH::RemoveFilter(SMESHGUI_FaceFilter);
836 SMESH::RemoveFilter(SMESHGUI_VolumeFilter);
837 SMESH::RemoveFilter(SMESHGUI_QuadFilter);
838 SMESH::RemoveFilter(SMESHGUI_TriaFilter);
839 SMESH::SetPickable();
841 mySelection->ClearIObjects();
842 mySelection->ClearFilters();
844 if ( mySubmeshChk->isChecked() )
846 QAD_Application::getDesktop()->SetSelectionMode( ActorSelection, true );
847 mySelection->AddFilter( mySubmeshFilter );
849 else if ( myGroupChk->isChecked() )
851 QAD_Application::getDesktop()->SetSelectionMode( ActorSelection, true );
852 mySelection->AddFilter( myGroupFilter );
854 if ( myFilterType == SMESHGUI_VolumeFilter ) {
855 QAD_Application::getDesktop()->SetSelectionMode( VolumeSelection, true );
856 SMESH::SetFilter( new SMESHGUI_VolumesFilter() );
859 QAD_Application::getDesktop()->SetSelectionMode( FaceSelection, true );
860 if ( myFilterType == SMESHGUI_TriaFilter )
861 SMESH::SetFilter( new SMESHGUI_TriangleFilter() );
862 else if ( myFilterType == SMESHGUI_QuadFilter )
863 SMESH::SetFilter( new SMESHGUI_QuadrangleFilter() );
865 SMESH::SetFilter( new SMESHGUI_FacesFilter() );
869 //=======================================================================
870 // name : SMESHGUI_MultiEditDlg::onApply
871 // Purpose : SLOT. Called when "Apply" button clicked.
872 //=======================================================================
873 bool SMESHGUI_MultiEditDlg::onApply()
875 if ( SMESHGUI::GetSMESHGUI()->ActiveStudyLocked() )
877 if ( !isValid( true ) )
880 SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
881 if ( aMeshEditor->_is_nil() )
886 SMESH::long_array_var anIds = getIds();
888 bool aResult = process( aMeshEditor, anIds.inout() );
893 mySelection->ClearIObjects();
895 mySelection->AddIObject( myActor->getIO(), false );
900 emit ListContensChanged();
909 //=======================================================================
910 // name : SMESHGUI_MultiEditDlg::on3d2dChanged
912 //=======================================================================
913 void SMESHGUI_MultiEditDlg::on3d2dChanged(int type)
915 if ( myEntityType != type ) {
921 emit ListContensChanged();
926 myFilterType = SMESHGUI_VolumeFilter;
928 myFilterType = SMESHGUI_FaceFilter;
935 //=======================================================================
936 // name : SMESHGUI_MultiEditDlg::entityType
938 //=======================================================================
940 int SMESHGUI_MultiEditDlg::entityType()
946 Class : SMESHGUI_ChangeOrientationDlg
947 Description : Modification of orientation of faces
950 SMESHGUI_ChangeOrientationDlg::SMESHGUI_ChangeOrientationDlg( QWidget* theParent,
951 SALOME_Selection* theSelection,
952 const char* theName )
953 : SMESHGUI_MultiEditDlg( theParent, theSelection, SMESHGUI_FaceFilter, true, theName )
955 setCaption( tr( "CAPTION" ) );
958 SMESHGUI_ChangeOrientationDlg::~SMESHGUI_ChangeOrientationDlg()
962 bool SMESHGUI_ChangeOrientationDlg::process( SMESH::SMESH_MeshEditor_ptr theEditor,
963 const SMESH::long_array& theIds )
965 return theEditor->Reorient( theIds );
969 Class : SMESHGUI_UnionOfTrianglesDlg
970 Description : Construction of quadrangles by automatic association of triangles
973 SMESHGUI_UnionOfTrianglesDlg::SMESHGUI_UnionOfTrianglesDlg( QWidget* theParent,
974 SALOME_Selection* theSelection,
975 const char* theName )
976 : SMESHGUI_MultiEditDlg( theParent, theSelection, SMESHGUI_TriaFilter, false, theName )
978 setCaption( tr( "CAPTION" ) );
981 SMESHGUI_UnionOfTrianglesDlg::~SMESHGUI_UnionOfTrianglesDlg()
985 bool SMESHGUI_UnionOfTrianglesDlg::process( SMESH::SMESH_MeshEditor_ptr theEditor,
986 const SMESH::long_array& theIds )
988 return theEditor->TriToQuad(theIds, SMESH::NumericalFunctor::_nil(), 1. );
992 Class : SMESHGUI_CuttingOfQuadsDlg
993 Description : Construction of quadrangles by automatic association of triangles
996 SMESHGUI_CuttingOfQuadsDlg::SMESHGUI_CuttingOfQuadsDlg( QWidget* theParent,
997 SALOME_Selection* theSelection,
998 const char* theName )
999 : SMESHGUI_MultiEditDlg( theParent, theSelection, SMESHGUI_QuadFilter, false, theName )
1002 setCaption( tr( "CAPTION" ) );
1005 myUseDiagChk = new QCheckBox( tr( "USE_DIAGONAL_2_4" ), mySelGrp );
1006 myPreviewChk = new QCheckBox( tr( "PREVIEW" ), mySelGrp );
1008 connect( myPreviewChk, SIGNAL( stateChanged( int ) ), this, SLOT( onPreviewChk() ) );
1009 connect( myUseDiagChk, SIGNAL( stateChanged( int ) ), this, SLOT( onPreviewChk() ) );
1010 connect( this, SIGNAL( ListContensChanged() ), this, SLOT( onPreviewChk() ) );
1013 SMESHGUI_CuttingOfQuadsDlg::~SMESHGUI_CuttingOfQuadsDlg()
1017 void SMESHGUI_CuttingOfQuadsDlg::onClose()
1020 SMESHGUI_MultiEditDlg::onClose();
1023 bool SMESHGUI_CuttingOfQuadsDlg::process( SMESH::SMESH_MeshEditor_ptr theEditor,
1024 const SMESH::long_array& theIds )
1026 return theEditor->SplitQuad( theIds, !myUseDiagChk->isChecked() );
1029 void SMESHGUI_CuttingOfQuadsDlg::onPreviewChk()
1031 myPreviewChk->isChecked() ? displayPreview() : erasePreview();
1034 void SMESHGUI_CuttingOfQuadsDlg::erasePreview()
1036 if ( myPreviewActor == 0 )
1039 if ( VTKViewer_ViewFrame* vf = SMESH::GetCurrentVtkView() )
1041 vf->RemoveActor(myPreviewActor);
1044 myPreviewActor->Delete();
1048 void SMESHGUI_CuttingOfQuadsDlg::displayPreview()
1053 if ( myPreviewActor != 0 )
1056 // get Ids of elements
1057 SMESH::long_array_var anElemIds = getIds();
1058 if ( getIds()->length() == 0 )
1061 SMDS_Mesh* aMesh = myActor->GetObject()->GetMesh();
1065 bool isDiag24 = myUseDiagChk->isChecked();
1068 vtkUnstructuredGrid* aGrid = vtkUnstructuredGrid::New();
1070 vtkIdType aNbCells = anElemIds->length() * 2;
1071 vtkIdType aCellsSize = 4 * aNbCells;
1072 vtkCellArray* aConnectivity = vtkCellArray::New();
1073 aConnectivity->Allocate( aCellsSize, 0 );
1075 vtkPoints* aPoints = vtkPoints::New();
1076 aPoints->SetNumberOfPoints( anElemIds->length() * 4 );
1078 vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
1079 aCellTypesArray->SetNumberOfComponents( 1 );
1080 aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() );
1082 vtkIdList *anIdList = vtkIdList::New();
1083 anIdList->SetNumberOfIds( 3 );
1085 TColStd_DataMapOfIntegerInteger anIdToVtk;
1089 for ( int i = 0, n = anElemIds->length(); i < n; i++ )
1091 const SMDS_MeshElement* anElem = aMesh->FindElement( anElemIds[ i ] );
1092 if ( anElem == 0 || anElem->NbNodes() != 4 )
1095 SMDS_ElemIteratorPtr anIter = anElem->nodesIterator();
1097 while( anIter->more() )
1098 if ( const SMDS_MeshNode* aNode = (SMDS_MeshNode*)anIter->next() )
1100 if ( !anIdToVtk.IsBound( aNode->GetID() ) )
1102 aPoints->SetPoint( ++nbPoints, aNode->X(), aNode->Y(), aNode->Z() );
1103 anIdToVtk.Bind( aNode->GetID(), nbPoints );
1106 aNodes[ k++ ] = aNode->GetID();
1114 anIdList->SetId( 0, anIdToVtk( aNodes[ 0 ] ) );
1115 anIdList->SetId( 1, anIdToVtk( aNodes[ 1 ] ) );
1116 anIdList->SetId( 2, anIdToVtk( aNodes[ 2 ] ) );
1117 aConnectivity->InsertNextCell( anIdList );
1118 aCellTypesArray->InsertNextValue( VTK_TRIANGLE );
1120 anIdList->SetId( 0, anIdToVtk( aNodes[ 2 ] ) );
1121 anIdList->SetId( 1, anIdToVtk( aNodes[ 3 ] ) );
1122 anIdList->SetId( 2, anIdToVtk( aNodes[ 0 ] ) );
1123 aConnectivity->InsertNextCell( anIdList );
1124 aCellTypesArray->InsertNextValue( VTK_TRIANGLE );
1128 anIdList->SetId( 0, anIdToVtk( aNodes[ 1 ] ) );
1129 anIdList->SetId( 1, anIdToVtk( aNodes[ 2 ] ) );
1130 anIdList->SetId( 2, anIdToVtk( aNodes[ 3 ] ) );
1131 aConnectivity->InsertNextCell( anIdList );
1132 aCellTypesArray->InsertNextValue( VTK_TRIANGLE );
1134 anIdList->SetId( 0, anIdToVtk( aNodes[ 3 ] ) );
1135 anIdList->SetId( 1, anIdToVtk( aNodes[ 0 ] ) );
1136 anIdList->SetId( 2, anIdToVtk( aNodes[ 1 ] ) );
1137 aConnectivity->InsertNextCell( anIdList );
1138 aCellTypesArray->InsertNextValue( VTK_TRIANGLE );
1142 vtkIntArray* aCellLocationsArray = vtkIntArray::New();
1143 aCellLocationsArray->SetNumberOfComponents( 1 );
1144 aCellLocationsArray->SetNumberOfTuples( aNbCells );
1146 aConnectivity->InitTraversal();
1147 for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
1148 aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
1150 aGrid->SetPoints( aPoints );
1151 aGrid->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
1153 // Create and display actor
1154 vtkDataSetMapper* aMapper = vtkDataSetMapper::New();
1155 aMapper->SetInput( aGrid );
1157 myPreviewActor = SALOME_Actor::New();
1158 myPreviewActor->PickableOff();
1159 myPreviewActor->SetMapper( aMapper );
1161 vtkProperty* aProp = vtkProperty::New();
1162 aProp->SetRepresentationToWireframe();
1163 aProp->SetColor( 250, 0, 250 );
1164 aProp->SetLineWidth( myActor->GetLineWidth() + 1 );
1165 myPreviewActor->SetProperty( aProp );
1167 SMESH::GetCurrentVtkView()->AddActor( myPreviewActor );
1168 SMESH::GetCurrentVtkView()->Repaint();
1172 aConnectivity->Delete();
1176 aCellTypesArray->Delete();
1177 aCellLocationsArray->Delete();