Salome HOME
PR: merged from V5_1_4rc1
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_CreatePolyhedralVolumeDlg.cxx
1 //  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
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.
10 //
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.
15 //
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
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 // SMESH SMESHGUI : GUI for SMESH component
24 // File   : SMESHGUI_CreatePolyhedralVolumeDlg.cxx
25 // Author : Michael ZORIN, Open CASCADE S.A.S.
26 // SMESH includes
27 //
28 #include "SMESHGUI_CreatePolyhedralVolumeDlg.h"
29
30 #include "SMESHGUI.h"
31 #include "SMESHGUI_Utils.h"
32 #include "SMESHGUI_VTKUtils.h"
33 #include "SMESHGUI_MeshUtils.h"
34 #include "SMESHGUI_GroupUtils.h"
35 #include "SMESHGUI_IdValidator.h"
36
37 #include <SMESH_Actor.h>
38 #include <SMESH_ActorUtils.h>
39 #include <SMDS_Mesh.hxx>
40
41 // SALOME GUI includes
42 #include <SUIT_Desktop.h>
43 #include <SUIT_ResourceMgr.h>
44 #include <SUIT_Session.h>
45 #include <SUIT_MessageBox.h>
46 #include <SUIT_ViewManager.h>
47 #include <SUIT_OverrideCursor.h>
48
49 #include <SalomeApp_Application.h>
50 #include <LightApp_SelectionMgr.h>
51
52 #include <SVTK_ViewWindow.h>
53
54 // OCCT includes
55 #include <TColStd_ListOfInteger.hxx>
56 #include <TColStd_ListIteratorOfListOfInteger.hxx>
57
58 // VTK includes
59 #include <vtkCell.h>
60 #include <vtkIdList.h>
61 #include <vtkUnstructuredGrid.h>
62 #include <vtkDataSetMapper.h>
63 #include <vtkProperty.h>
64
65 // Qt includes
66 #include <QApplication>
67 #include <QButtonGroup>
68 #include <QComboBox>
69 #include <QGroupBox>
70 #include <QLabel>
71 #include <QLineEdit>
72 #include <QPushButton>
73 #include <QRadioButton>
74 #include <QCheckBox>
75 #include <QHBoxLayout>
76 #include <QVBoxLayout>
77 #include <QGridLayout>
78 #include <QListWidget>
79 #include <QKeyEvent>
80
81 // IDL includes
82 #include <SALOMEconfig.h>
83 #include CORBA_SERVER_HEADER(SMESH_MeshEditor)
84
85 #define SPACING 6
86 #define MARGIN  11
87
88 namespace SMESH
89 {
90   class TPolySimulation
91   {
92     SVTK_ViewWindow* myViewWindow;
93
94     SALOME_Actor *myPreviewActor;
95     vtkDataSetMapper* myMapper;
96     vtkUnstructuredGrid* myGrid;
97
98   public:
99
100     TPolySimulation(SalomeApp_Application* app)
101     {
102       SUIT_ViewManager* mgr = app->activeViewManager();
103       myViewWindow = mgr ? dynamic_cast<SVTK_ViewWindow*>( mgr->getActiveView() ) : NULL;
104
105       myGrid = vtkUnstructuredGrid::New();
106   
107       // Create and display actor
108       myMapper = vtkDataSetMapper::New();
109       myMapper->SetInput( myGrid );
110
111       myPreviewActor = SALOME_Actor::New();
112       myPreviewActor->PickableOff();
113       myPreviewActor->VisibilityOff();
114       myPreviewActor->SetMapper( myMapper );
115       myPreviewActor->SetRepresentation( 3 );
116
117       vtkFloatingPointType anRGB[3];
118       vtkProperty* aProp = vtkProperty::New();
119       GetColor( "SMESH", "selection_element_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) );
120       aProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
121       myPreviewActor->SetProperty( aProp );
122       vtkFloatingPointType aFactor,aUnits;
123       myPreviewActor->SetResolveCoincidentTopology(true);
124       myPreviewActor->GetPolygonOffsetParameters(aFactor,aUnits);
125       myPreviewActor->SetPolygonOffsetParameters(aFactor,0.2*aUnits);
126       aProp->Delete();
127
128       myViewWindow->AddActor( myPreviewActor );
129       
130     }
131
132
133     typedef std::vector<vtkIdType> TVTKIds;
134     void SetPosition(SMESH_Actor* theActor, 
135                      vtkIdType theType, 
136                      const TVTKIds& theIds,
137                      bool theReset=true)
138     {
139       vtkUnstructuredGrid *aGrid = theActor->GetUnstructuredGrid();
140       myGrid->SetPoints(aGrid->GetPoints());
141
142       ResetGrid(theReset);
143       
144       vtkIdList *anIds = vtkIdList::New();
145
146       for (int i = 0, iEnd = theIds.size(); i < iEnd; i++)
147         anIds->InsertId(i,theIds[i]);
148
149       myGrid->InsertNextCell(theType,anIds);
150       if(theIds.size()!=0){
151         myGrid->InsertNextCell(theType,anIds);
152         myGrid->Modified();
153       }
154         
155       anIds->Delete();
156
157       SetVisibility(true);
158
159     }
160   
161     void ResetGrid(bool theReset=true){
162       if (theReset) myGrid->Reset();
163     }
164
165     void SetVisibility(bool theVisibility){
166       myPreviewActor->SetVisibility(theVisibility);
167       RepaintCurrentView();
168     }
169
170
171     ~TPolySimulation(){
172       if( myViewWindow )
173         myViewWindow->RemoveActor(myPreviewActor);
174
175       myPreviewActor->Delete();
176
177       myMapper->RemoveAllInputs();
178       myMapper->Delete();
179
180       myGrid->Delete();
181     }
182
183   };
184 }
185
186 //=================================================================================
187 // class    : SMESHGUI_CreatePolyhedralVolumeDlgDlg()
188 // purpose  : 
189 //=================================================================================
190 SMESHGUI_CreatePolyhedralVolumeDlg::SMESHGUI_CreatePolyhedralVolumeDlg( SMESHGUI* theModule )
191   : QDialog( SMESH::GetDesktop( theModule ) ),
192     mySMESHGUI( theModule ),
193     mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
194 {
195   QPixmap image0( SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap( "SMESH",tr("ICON_SELECT")));
196
197   setModal(false);
198   setAttribute(Qt::WA_DeleteOnClose, true);
199   setWindowTitle( tr( "SMESH_CREATE_POLYHEDRAL_VOLUME_TITLE" ) );
200   setSizeGripEnabled( true );
201
202   QVBoxLayout* topLayout = new QVBoxLayout( this ); 
203   topLayout->setSpacing( SPACING );
204   topLayout->setMargin( MARGIN );
205
206   /***************************************************************/
207   ConstructorsBox = new QGroupBox(tr( "SMESH_ELEMENTS_TYPE" ), this);
208   GroupConstructors = new QButtonGroup(this);
209   QHBoxLayout* ConstructorsBoxLayout = new QHBoxLayout( ConstructorsBox );
210   ConstructorsBoxLayout->setSpacing( SPACING );
211   ConstructorsBoxLayout->setMargin( MARGIN );
212
213   RadioButton1 = new QRadioButton( tr( "MESH_NODE" ),  ConstructorsBox );
214   RadioButton2 = new QRadioButton( tr( "SMESH_FACE" ), ConstructorsBox );
215
216   ConstructorsBoxLayout->addWidget( RadioButton1 );
217   ConstructorsBoxLayout->addWidget( RadioButton2 );
218   GroupConstructors->addButton(RadioButton1, 0);
219   GroupConstructors->addButton(RadioButton2, 1);
220   
221   /***************************************************************/
222   GroupContent = new QGroupBox( tr( "SMESH_CONTENT" ), this );
223   QGridLayout* GroupContentLayout = new QGridLayout( GroupContent );
224   GroupContentLayout->setSpacing( SPACING );
225   GroupContentLayout->setMargin( MARGIN );
226   
227   TextLabelIds = new QLabel( tr( "SMESH_ID_NODES" ), GroupContent );
228   SelectElementsButton  = new QPushButton( GroupContent );
229   SelectElementsButton->setIcon( image0 );
230   LineEditElements  = new QLineEdit( GroupContent );
231   LineEditElements->setValidator( new SMESHGUI_IdValidator( this ) );
232
233   myFacesByNodesLabel = new QLabel( tr( "FACES_BY_NODES" ), GroupContent );
234   myFacesByNodes = new QListWidget( GroupContent);
235   myFacesByNodes->setSelectionMode( QListWidget::ExtendedSelection );
236   myFacesByNodes->setMinimumHeight( 150);
237
238   AddButton = new QPushButton( tr( "SMESH_BUT_ADD" ), GroupContent );
239   RemoveButton = new QPushButton( tr( "SMESH_BUT_REMOVE" ), GroupContent );
240
241   Preview = new QCheckBox( tr( "SMESH_POLYEDRE_PREVIEW" ), GroupContent );
242
243   GroupContentLayout->addWidget( TextLabelIds,         0, 0 );
244   GroupContentLayout->addWidget( SelectElementsButton, 0, 1 );
245   GroupContentLayout->addWidget( LineEditElements,     0, 2, 1, 2 );
246   GroupContentLayout->addWidget( myFacesByNodesLabel,  1, 0 );
247   GroupContentLayout->addWidget( myFacesByNodes,       2, 0, 3, 3 );
248   GroupContentLayout->addWidget( AddButton,            2, 3 );
249   GroupContentLayout->addWidget( RemoveButton,         3, 3 );
250   GroupContentLayout->addWidget( Preview,              5, 0, 1, 4 );
251
252   /***************************************************************/
253   GroupGroups = new QGroupBox( tr( "SMESH_ADD_TO_GROUP" ), this );
254   GroupGroups->setCheckable( true );
255   QHBoxLayout* GroupGroupsLayout = new QHBoxLayout(GroupGroups);
256   GroupGroupsLayout->setSpacing(SPACING);
257   GroupGroupsLayout->setMargin(MARGIN);
258
259   TextLabel_GroupName = new QLabel( tr( "SMESH_GROUP" ), GroupGroups );
260   ComboBox_GroupName = new QComboBox( GroupGroups );
261   ComboBox_GroupName->setEditable( true );
262
263   GroupGroupsLayout->addWidget( TextLabel_GroupName );
264   GroupGroupsLayout->addWidget( ComboBox_GroupName, 1 );
265
266   /***************************************************************/
267   GroupButtons = new QGroupBox( this );
268   QHBoxLayout* GroupButtonsLayout = new QHBoxLayout( GroupButtons );
269   GroupButtonsLayout->setSpacing( SPACING );
270   GroupButtonsLayout->setMargin( MARGIN );
271
272   buttonOk = new QPushButton( tr( "SMESH_BUT_APPLY_AND_CLOSE" ), GroupButtons );
273   buttonOk->setAutoDefault( true );
274   buttonOk->setDefault( true );
275   buttonApply = new QPushButton( tr( "SMESH_BUT_APPLY" ), GroupButtons );
276   buttonApply->setAutoDefault( true );
277   buttonCancel = new QPushButton( tr( "SMESH_BUT_CLOSE" ), GroupButtons );
278   buttonCancel->setAutoDefault( true );
279   buttonHelp = new QPushButton( tr("SMESH_BUT_HELP" ), GroupButtons );
280   buttonHelp->setAutoDefault(true);
281
282   GroupButtonsLayout->addWidget( buttonOk );
283   GroupButtonsLayout->addSpacing( 10 );
284   GroupButtonsLayout->addWidget( buttonApply );
285   GroupButtonsLayout->addSpacing( 10 );
286   GroupButtonsLayout->addStretch();
287   GroupButtonsLayout->addWidget( buttonCancel );
288   GroupButtonsLayout->addWidget( buttonHelp);
289
290   /***************************************************************/
291   topLayout->addWidget( ConstructorsBox );
292   topLayout->addWidget( GroupContent );
293   topLayout->addWidget( GroupGroups );
294   topLayout->addWidget( GroupButtons );
295   
296   mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
297   
298   RadioButton1->setChecked( true );
299  
300   mySMESHGUI->SetActiveDialogBox( (QDialog*)this );
301
302   myHelpFileName = "adding_nodes_and_elements_page.html#adding_polyhedrons_anchor";
303   
304   Init();
305 }
306
307 //=================================================================================
308 // function : ~SMESHGUI_CreatePolyhedralVolumeDlg()
309 // purpose  : Destroys the object and frees any allocated resources
310 //=================================================================================
311 SMESHGUI_CreatePolyhedralVolumeDlg::~SMESHGUI_CreatePolyhedralVolumeDlg()
312 {
313   delete mySimulation;
314 }
315
316 static bool busy = false;
317
318 //=================================================================================
319 // function : Init()
320 // purpose  :
321 //=================================================================================
322 void SMESHGUI_CreatePolyhedralVolumeDlg::Init()
323 {
324   myEditCurrentArgument = LineEditElements;
325   mySMESHGUI->SetActiveDialogBox( (QDialog*)this );
326
327   /* reset "Add to group" control */
328   GroupGroups->setChecked( false );
329
330   myNbOkElements = 0;
331   myActor = 0;
332
333   mySimulation = new SMESH::TPolySimulation( dynamic_cast<SalomeApp_Application*>( mySMESHGUI->application() ) );
334
335   /* signals and slots connections */
336   connect(buttonOk,     SIGNAL( clicked() ), SLOT( ClickOnOk() ) );
337   connect(buttonCancel, SIGNAL( clicked() ), SLOT( ClickOnCancel() ) );
338   connect(buttonApply,  SIGNAL( clicked() ), SLOT( ClickOnApply() ) );
339   connect(buttonHelp,   SIGNAL( clicked() ), SLOT( ClickOnHelp() ) );
340
341   connect(GroupConstructors, SIGNAL(buttonClicked(int) ), SLOT( ConstructorsClicked(int) ) );
342   connect(SelectElementsButton, SIGNAL( clicked() ), SLOT( SetEditCurrentArgument() ) );
343   connect(LineEditElements, SIGNAL( textChanged(const QString&) ), SLOT(onTextChange(const QString&)));
344
345   connect(myFacesByNodes, SIGNAL(selectionChanged()), this, SLOT(onListSelectionChanged()));
346   connect(AddButton, SIGNAL(clicked()), this, SLOT(onAdd()));
347   connect(RemoveButton, SIGNAL(clicked()), this, SLOT(onRemove()));
348   
349   connect( mySMESHGUI, SIGNAL ( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) );
350   connect( mySelectionMgr, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
351   connect( Preview, SIGNAL(toggled(bool)), this, SLOT(ClickOnPreview(bool)));
352   /* to close dialog if study change */
353   connect( mySMESHGUI, SIGNAL ( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) );
354   
355   ConstructorsClicked(0);
356   SelectionIntoArgument();
357 }
358
359
360 //=================================================================================
361 // function : ConstructorsClicked()
362 // purpose  : Radio button management
363 //=================================================================================
364 void SMESHGUI_CreatePolyhedralVolumeDlg::ConstructorsClicked(int constructorId)
365 {
366   //disconnect(mySelectionMgr, 0, this, 0);
367
368   SALOME_ListIO io;
369   mySelectionMgr->selectedObjects( io );
370   SALOME_ListIO aList;
371   mySelectionMgr->setSelectedObjects( aList );
372   myEditCurrentArgument->clear();
373   myNbOkElements = 0;
374   buttonApply->setEnabled(false);
375   buttonOk->setEnabled(false);
376   mySimulation->SetVisibility(false);
377
378   switch(constructorId)
379     {
380     case 0 :
381       { 
382         if ( myActor ){
383           myActor->SetPointRepresentation(true);
384         }
385         else
386           SMESH::SetPointRepresentation(true);
387         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
388           aViewWindow->SetSelectionMode(NodeSelection);
389         
390         AddButton->setEnabled(false);
391         RemoveButton->setEnabled(false);
392         TextLabelIds->setText( tr( "SMESH_ID_NODES" ) );
393         myFacesByNodesLabel->show();
394         myFacesByNodes->clear();
395         myFacesByNodes->show();
396         AddButton->show();
397         RemoveButton->show();
398         Preview->show();
399         break;
400       }
401     case 1 :
402       {
403         if( myActor ){
404           myActor->SetPointRepresentation(false);
405         } else {
406           SMESH::SetPointRepresentation(false);
407         }
408         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
409           aViewWindow->SetSelectionMode(FaceSelection);
410         
411         TextLabelIds->setText( tr( "SMESH_ID_FACES" ) );
412         myFacesByNodesLabel->hide();
413         myFacesByNodes->hide();
414         AddButton->hide();
415         RemoveButton->hide();
416         Preview->show();
417         break;
418       }
419     }
420   
421   //connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
422   mySelectionMgr->setSelectedObjects( io );
423
424   QApplication::instance()->processEvents();
425   updateGeometry();
426   resize(100,100);
427 }
428
429 //=================================================================================
430 // function : ClickOnPreview()
431 // purpose  :
432 //=================================================================================
433 void SMESHGUI_CreatePolyhedralVolumeDlg::ClickOnPreview(bool theToggled){
434   Preview->setChecked(theToggled);
435   displaySimulation();
436 }
437
438 //=================================================================================
439 // function : ClickOnApply()
440 // purpose  :
441 //=================================================================================
442 void SMESHGUI_CreatePolyhedralVolumeDlg::ClickOnApply()
443 {
444   if( !isValid() )
445     return;
446
447   if ( myNbOkElements>0 && !mySMESHGUI->isActiveStudyLocked())
448     {
449       if(checkEditLine(false) == -1) {return;}
450       busy = true;
451       long anElemId = -1;
452
453       bool addToGroup = GroupGroups->isChecked();
454       QString aGroupName;
455       
456       SMESH::SMESH_GroupBase_var aGroup;
457       int idx = 0;
458       if( addToGroup ) {
459         aGroupName = ComboBox_GroupName->currentText();
460         for ( int i = 1; i < ComboBox_GroupName->count(); i++ ) {
461           QString aName = ComboBox_GroupName->itemText( i );
462           if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
463             idx = i;
464         }
465         if ( idx > 0 ) {
466           SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
467           if ( !aGeomGroup->_is_nil() ) {
468             int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),
469                                                  tr( "MESH_STANDALONE_GRP_CHOSEN" ).arg( aGroupName ),
470                                                  tr( "SMESH_BUT_YES" ), tr( "SMESH_BUT_NO" ), 0, 1 );
471             if ( res == 1 ) return;
472           }
473           aGroup = myGroups[idx-1];
474         }
475       }
476
477       if (GetConstructorId() == 0)
478         {
479           SMESH::long_array_var anIdsOfNodes = new SMESH::long_array;
480           SMESH::long_array_var aQuantities  = new SMESH::long_array;
481
482           aQuantities->length( myFacesByNodes->count() );
483
484           TColStd_ListOfInteger aNodesIds;
485
486           int aNbQuantities = 0;
487           for (int i = 0; i < myFacesByNodes->count(); i++ ) {
488             QStringList anIds = myFacesByNodes->item(i)->text().split( " ", QString::SkipEmptyParts );
489             for (QStringList::iterator it = anIds.begin(); it != anIds.end(); ++it)
490               aNodesIds.Append( (*it).toInt() );
491
492             aQuantities[aNbQuantities++] = anIds.count();
493           }
494
495           anIdsOfNodes->length(aNodesIds.Extent());
496
497           int aNbIdsOfNodes = 0;
498           TColStd_ListIteratorOfListOfInteger It;
499           It.Initialize(aNodesIds);
500           for( ;It.More();It.Next())
501             anIdsOfNodes[aNbIdsOfNodes++] = It.Value();
502             
503           try{
504             SUIT_OverrideCursor aWaitCursor;
505             SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
506             anElemId = aMeshEditor->AddPolyhedralVolume(anIdsOfNodes, aQuantities);
507           }catch(SALOME::SALOME_Exception& exc){
508             INFOS("Follow exception was cought:\n\t"<<exc.details.text);
509           }catch(std::exception& exc){
510             INFOS("Follow exception was cought:\n\t"<<exc.what());
511           }catch(...){
512             INFOS("Unknown exception was cought !!!");
513           }
514         }
515       else if (GetConstructorId() == 1)
516         {
517           SMESH::long_array_var anIdsOfFaces = new SMESH::long_array;
518           
519           QStringList aListId = myEditCurrentArgument->text().split( " ", QString::SkipEmptyParts );
520           anIdsOfFaces->length(aListId.count());
521           for ( int i = 0; i < aListId.count(); i++ )
522             anIdsOfFaces[i] = aListId[i].toInt();
523           
524           try{
525             SUIT_OverrideCursor aWaitCursor;
526             SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
527             anElemId = aMeshEditor->AddPolyhedralVolumeByFaces(anIdsOfFaces);
528           }catch(SALOME::SALOME_Exception& exc){
529             INFOS("Follow exception was cought:\n\t"<<exc.details.text);
530           }catch(std::exception& exc){
531             INFOS("Follow exception was cought:\n\t"<<exc.what());
532           }catch(...){
533             INFOS("Unknown exception was cought !!!");
534           }
535         }
536
537       if ( anElemId != -1 && addToGroup && !aGroupName.isEmpty() ) {
538         SMESH::SMESH_Group_var aGroupUsed;
539         if ( aGroup->_is_nil() ) {
540           // create new group 
541           aGroupUsed = SMESH::AddGroup( myMesh, SMESH::VOLUME, aGroupName );
542           if ( !aGroupUsed->_is_nil() ) {
543             myGroups.append(SMESH::SMESH_GroupBase::_duplicate(aGroupUsed));
544             ComboBox_GroupName->addItem( aGroupName );
545           }
546         }
547         else {
548           SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( aGroup );
549           if ( !aGeomGroup->_is_nil() ) {
550             aGroupUsed = myMesh->ConvertToStandalone( aGeomGroup );
551             if ( !aGroupUsed->_is_nil() && idx > 0 ) {
552               myGroups[idx-1] = SMESH::SMESH_GroupBase::_duplicate(aGroupUsed);
553               SMESHGUI::GetSMESHGUI()->getApp()->updateObjectBrowser();
554             }
555           }
556           else
557             aGroupUsed = SMESH::SMESH_Group::_narrow( aGroup );
558         }
559         
560         if ( !aGroupUsed->_is_nil() ) {
561           SMESH::long_array_var anIdList = new SMESH::long_array;
562           anIdList->length( 1 );
563           anIdList[0] = anElemId;
564           aGroupUsed->Add( anIdList.inout() );
565         }
566       }
567
568       //SALOME_ListIO aList;
569       //mySelectionMgr->setSelectedObjects( aList );
570       SMESH::UpdateView();
571       if( myActor ){
572         unsigned int anEntityMode = myActor->GetEntityMode();
573         myActor->SetEntityMode(SMESH_Actor::eVolumes | anEntityMode);
574       }
575       //ConstructorsClicked( GetConstructorId() );
576       busy = false;
577     }
578 }
579
580 //=================================================================================
581 // function : ClickOnOk()
582 // purpose  :
583 //=================================================================================
584 void SMESHGUI_CreatePolyhedralVolumeDlg::ClickOnOk()
585 {
586   if(checkEditLine(false) == -1) {return;}
587   ClickOnApply();
588   ClickOnCancel();
589 }
590
591         
592 //=================================================================================
593 // function : ClickOnCancel()
594 // purpose  :
595 //=================================================================================
596 void SMESHGUI_CreatePolyhedralVolumeDlg::ClickOnCancel()
597 {
598   mySelectionMgr->clearFilters();
599   //SALOME_ListIO aList;
600   //mySelectionMgr->setSelectedObjects( aList );
601   SMESH::SetPointRepresentation(false);
602   mySimulation->SetVisibility(false);
603   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
604     aViewWindow->SetSelectionMode( ActorSelection );
605   disconnect( mySelectionMgr, 0, this, 0 );
606   mySMESHGUI->ResetState();
607   reject();
608 }
609
610 //=================================================================================
611 // function : ClickOnHelp()
612 // purpose  :
613 //=================================================================================
614 void SMESHGUI_CreatePolyhedralVolumeDlg::ClickOnHelp()
615 {
616   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
617   if (app) 
618     app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
619   else {
620     QString platform;
621 #ifdef WIN32
622     platform = "winapplication";
623 #else
624     platform = "application";
625 #endif
626     SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
627                              tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
628                              arg(app->resourceMgr()->stringValue("ExternalBrowser",
629                                                                  platform)).
630                              arg(myHelpFileName));
631   }
632 }
633
634 //=======================================================================
635 //function : onTextChange
636 //purpose  : 
637 //=======================================================================
638
639 void SMESHGUI_CreatePolyhedralVolumeDlg::onTextChange(const QString& theNewText)
640 {
641   if ( busy ) return;
642   if (checkEditLine() == -1) return;
643   busy = true;
644
645   mySimulation->SetVisibility(false);
646
647   SMDS_Mesh* aMesh = 0;
648   if ( myActor )
649     aMesh = myActor->GetObject()->GetMesh();
650
651   if (GetConstructorId() == 0)
652     {
653       if ( aMesh ) {
654         TColStd_MapOfInteger newIndices;
655       
656         QStringList aListId = theNewText.split( " ", QString::SkipEmptyParts );
657         for ( int i = 0; i < aListId.count(); i++ ) {
658           const SMDS_MeshNode * n = aMesh->FindNode( aListId[ i ].toInt() );
659           if ( n ) {
660             newIndices.Add(n->GetID());
661             myNbOkElements++;
662           }
663         }
664       
665         mySelector->AddOrRemoveIndex( myActor->getIO(), newIndices, false );
666       
667         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
668           aViewWindow->highlight( myActor->getIO(), true, true );
669       
670         if ( myNbOkElements>0 && aListId.count()>=3)
671           AddButton->setEnabled(true);
672         else
673           AddButton->setEnabled(false);
674       
675         displaySimulation();
676       }
677     } else if (GetConstructorId() == 1)
678       {
679         myNbOkElements = 0;
680         buttonOk->setEnabled( false );
681         buttonApply->setEnabled( false );
682       
683         // check entered ids of faces and hilight them
684         QStringList aListId;
685         if ( aMesh ) {
686           TColStd_MapOfInteger newIndices;
687       
688           aListId = theNewText.split( " ", QString::SkipEmptyParts );
689
690           for ( int i = 0; i < aListId.count(); i++ ) {
691             const SMDS_MeshElement * e = aMesh->FindElement( aListId[ i ].toInt() );
692             if ( e ) {
693               newIndices.Add(e->GetID());
694               myNbOkElements++;  
695             }
696           }
697
698           mySelector->AddOrRemoveIndex( myActor->getIO(), newIndices, false );
699           if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
700             aViewWindow->highlight( myActor->getIO(), true, true );
701       
702           if ( myNbOkElements ) {
703             if (aListId.count()>1){ 
704               buttonOk->setEnabled( true );
705               buttonApply->setEnabled( true );
706             }
707             else{
708               buttonOk->setEnabled( false );
709               buttonApply->setEnabled( false );
710             }
711             if(aListId.count()>1)
712               displaySimulation();
713           }
714         }
715       }
716   busy = false;
717 }
718
719 //=================================================================================
720 // function : SelectionIntoArgument()
721 // purpose  : Called when selection as changed or other case
722 //=================================================================================
723 void SMESHGUI_CreatePolyhedralVolumeDlg::SelectionIntoArgument()
724 {
725   if ( busy ) return;
726   
727   // clear
728   
729   if (GetConstructorId() == 1 || myFacesByNodes->count() <= 1)
730     {
731       myNbOkElements = 0;
732       AddButton->setEnabled(false);
733       buttonOk->setEnabled( false );
734       buttonApply->setEnabled( false );
735     }
736
737   myActor = 0;
738
739   busy = true;
740   myEditCurrentArgument->setText( "" );
741   busy = false;
742   if ( !GroupButtons->isEnabled() ) // inactive
743     return;
744   
745   mySimulation->SetVisibility(false);
746   
747   QString aCurrentEntry = myEntry;
748
749   // get selected mesh
750   
751   SALOME_ListIO selected;
752   mySelectionMgr->selectedObjects( selected );
753   int nbSel = selected.Extent();
754   if(nbSel != 1){
755     return;
756   }
757   
758   myEntry = selected.First()->getEntry();
759   myMesh = SMESH::GetMeshByIO( selected.First() );
760   if ( myMesh->_is_nil() )
761     return;
762   
763   // process groups
764   if ( !myMesh->_is_nil() && myEntry != aCurrentEntry ) {
765     myGroups.clear();
766     ComboBox_GroupName->clear();
767     ComboBox_GroupName->addItem( QString() );
768     SMESH::ListOfGroups aListOfGroups = *myMesh->GetGroups();
769     for ( int i = 0, n = aListOfGroups.length(); i < n; i++ ) {
770       SMESH::SMESH_GroupBase_var aGroup = aListOfGroups[i];
771       if ( !aGroup->_is_nil() && aGroup->GetType() == SMESH::VOLUME ) {
772         QString aGroupName( aGroup->GetName() );
773         if ( !aGroupName.isEmpty() ) {
774           myGroups.append(SMESH::SMESH_GroupBase::_duplicate(aGroup));
775           ComboBox_GroupName->addItem( aGroupName );
776         }
777       }
778     }
779   }
780
781   myActor = SMESH::FindActorByObject(myMesh);
782   if ( !myActor )
783     return;
784   
785   // get selected nodes/faces
786   QString aString = "";
787   int anbNodes=0,aNbFaces=0;
788   switch(GetConstructorId()){
789   case 0:{
790     anbNodes = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aString);
791     if (anbNodes >= 3)
792       AddButton->setEnabled(true);
793     else if (anbNodes < 3){
794       AddButton->setEnabled(false);
795     }
796     busy = true;
797     myEditCurrentArgument->setText( aString );
798     if (checkEditLine() == -1) {busy = false;return;}
799     busy = false;
800     break;
801   }
802   case 1:{
803     // get selected faces
804     aNbFaces = SMESH::GetNameOfSelectedElements(mySelector, myActor->getIO(), aString);
805     if (aNbFaces<=1){
806       buttonOk->setEnabled( false );
807       buttonApply->setEnabled( false );
808     } else {
809       buttonOk->setEnabled( true );
810       buttonApply->setEnabled( true );
811     }
812     busy = true;
813     myEditCurrentArgument->setText( aString );
814     if (checkEditLine() == -1) {busy = false;return;}
815     busy = false;
816     
817     // OK
818     myNbOkElements = 1;
819     break;
820   }
821   default: return;
822   }
823   if(anbNodes>2 || aNbFaces>1)
824     displaySimulation();
825 }
826
827 /*\brief int SMESHGUI_CreatePolyhedralVolumeDlg::checkEditLine()
828  * Checking of indices in edit line.
829  * If incorecct indices in edit line warning message appear and myEditCurrentArgument remove last index.
830  * \retval 1 - if all ok(or no indices in edit line), -1 - if there are incorrect indices.
831  */
832 int SMESHGUI_CreatePolyhedralVolumeDlg::checkEditLine(bool checkLast)
833 {
834   QString aString = "";
835   SMDS_Mesh* aMesh = 0;
836   
837   if(myMesh->_is_nil()) return 1;
838   if(!myActor){
839     myActor = SMESH::FindActorByObject(myMesh);
840     if(!myActor)
841       return 1;
842   }
843     
844   aMesh = myActor->GetObject()->GetMesh();
845
846   // checking for nodes
847   if (checkLast && myEditCurrentArgument->text().right(1) != QString(" ") ) return 1;
848   QStringList aListId = myEditCurrentArgument->text().split( " ", QString::SkipEmptyParts );
849   for ( int i = 0; i < aListId.count(); i++ ){
850     switch (GetConstructorId()){
851     case 0:{ // nodes
852       const SMDS_MeshNode    * aNode = aMesh->FindNode( aListId[ i ].toInt() );
853       if( !aNode ){
854         SUIT_MessageBox::warning(this,
855                                  tr("SMESH_POLYEDRE_CREATE_ERROR"),
856                                  tr("The incorrect indices of nodes!"));
857         
858         myEditCurrentArgument->clear();
859         myEditCurrentArgument->setText( aString );
860         return -1;
861       }
862
863       break;
864     }
865     case 1:{ // faces
866       bool aElemIsOK = true;
867       const SMDS_MeshElement * aElem = aMesh->FindElement( aListId[ i ].toInt() );
868       if (!aElem)
869         {
870           aElemIsOK = false;
871         }
872       else
873         {
874           SMDSAbs_ElementType aType = aMesh->GetElementType( aElem->GetID(),true );
875           if (aType != SMDSAbs_Face){
876             aElemIsOK = false;
877           }
878         }
879       if (!aElemIsOK){
880         SUIT_MessageBox::warning(this,
881                                  tr("SMESH_POLYEDRE_CREATE_ERROR"),
882                                  tr("The incorrect indices of faces!"));
883         
884         myEditCurrentArgument->clear();
885         myEditCurrentArgument->setText( aString );
886         return -1;
887       }
888       break;
889     }
890     }
891     aString += aListId[ i ] + " "; 
892   }
893
894   return 1;
895 }
896
897 //=======================================================================
898 //function : displaySimulation
899 //purpose  : 
900 //=======================================================================
901 void SMESHGUI_CreatePolyhedralVolumeDlg::displaySimulation()
902 {
903   if ( (myNbOkElements || AddButton->isEnabled()) && GroupButtons->isEnabled() && myActor)
904     {
905       SMESH::TPolySimulation::TVTKIds aVTKIds;
906       vtkIdType aType = VTK_CONVEX_POINT_SET;
907       SMDS_Mesh* aMesh = 0;
908       if ( myActor ){
909         aMesh = myActor->GetObject()->GetMesh();
910       }
911       if (GetConstructorId() == 0 && aMesh){
912         if (!AddButton->isEnabled()){
913           mySimulation->ResetGrid(true);
914           for (int i = 0; i < myFacesByNodes->count(); i++) {
915             QStringList anIds = myFacesByNodes->item(i)->text().split( " ", QString::SkipEmptyParts );
916             SMESH::TPolySimulation::TVTKIds aVTKIds_faces;
917             for (QStringList::iterator it = anIds.begin(); it != anIds.end(); ++it){
918               const SMDS_MeshNode* aNode = aMesh->FindNode( (*it).toInt() );
919               if (!aNode) continue;
920               vtkIdType aId = myActor->GetObject()->GetNodeVTKId( (*it).toInt() );
921               aVTKIds.push_back(aId);
922               aVTKIds_faces.push_back(aId);
923             }
924             if(!Preview->isChecked()){
925               aType = VTK_POLYGON;
926               mySimulation->SetPosition(myActor, aType, aVTKIds_faces,false);
927             }
928           }
929           if(myFacesByNodes->count() == 0){
930             mySimulation->SetVisibility(false);
931           } else {
932             mySimulation->SetVisibility(true);
933           }
934           if(Preview->isChecked()){
935             mySimulation->SetPosition(myActor, aType, aVTKIds);
936           }
937         } else {
938           // add ids from edit line
939           QStringList anEditIds = myEditCurrentArgument->text().split( " ", QString::SkipEmptyParts );
940           for ( int i = 0; i < anEditIds.count(); i++ )
941             aVTKIds.push_back( myActor->GetObject()->GetNodeVTKId( anEditIds[ i ].toInt() ));
942           aType = VTK_POLYGON;
943           mySimulation->SetPosition(myActor, aType, aVTKIds);
944         }
945       }else if(GetConstructorId() == 1 && aMesh){
946         QStringList aListId = myEditCurrentArgument->text().split( " ", QString::SkipEmptyParts );
947         for ( int i = 0; i < aListId.count(); i++ )
948           {
949             const SMDS_MeshElement * anElem = aMesh->FindElement( aListId[ i ].toInt() );
950             if ( !anElem ) continue;
951             SMDSAbs_ElementType aFaceType = aMesh->GetElementType( anElem->GetID(),true );
952             if (aFaceType != SMDSAbs_Face) continue;
953               
954             SMDS_ElemIteratorPtr anIter = anElem->nodesIterator();
955             SMESH::TPolySimulation::TVTKIds aVTKIds_faces;
956             while( anIter->more() )
957               if ( const SMDS_MeshNode* aNode = (SMDS_MeshNode*)anIter->next() ){
958                 vtkIdType aId = myActor->GetObject()->GetNodeVTKId( aNode->GetID() );
959                 aVTKIds.push_back(aId);
960                 aVTKIds_faces.push_back(aId);
961               }
962             if(!Preview->isChecked()){
963               aType = VTK_POLYGON;
964               mySimulation->SetPosition(myActor, aType, aVTKIds_faces);
965             }
966           }
967         if(Preview->isChecked())
968           mySimulation->SetPosition(myActor, aType, aVTKIds);
969       }
970       SMESH::UpdateView();
971     }
972 }
973
974 //=================================================================================
975 // function : SetEditCurrentArgument()
976 // purpose  :
977 //=================================================================================
978 void SMESHGUI_CreatePolyhedralVolumeDlg::SetEditCurrentArgument()
979 {
980   QPushButton* send = (QPushButton*)sender();
981   if(send == SelectElementsButton) {
982     LineEditElements->setFocus();
983     myEditCurrentArgument = LineEditElements;
984   }
985   SelectionIntoArgument();
986 }
987
988 //=================================================================================
989 // function : DeactivateActiveDialog()
990 // purpose  :
991 //=================================================================================
992 void SMESHGUI_CreatePolyhedralVolumeDlg::DeactivateActiveDialog()
993 {
994   if ( ConstructorsBox->isEnabled() ) {
995     ConstructorsBox->setEnabled(false);
996     GroupContent->setEnabled(false);
997     GroupButtons->setEnabled(false);
998     mySimulation->SetVisibility(false);
999     mySMESHGUI->ResetState();    
1000     mySMESHGUI->SetActiveDialogBox(0);
1001   }
1002 }
1003
1004
1005 //=================================================================================
1006 // function : ActivateThisDialog()
1007 // purpose  :
1008 //=================================================================================
1009 void SMESHGUI_CreatePolyhedralVolumeDlg::ActivateThisDialog()
1010 {
1011   /* Emit a signal to deactivate the active dialog */
1012   mySMESHGUI->EmitSignalDeactivateDialog();   
1013   ConstructorsBox->setEnabled(true);
1014   GroupContent->setEnabled(true);
1015   GroupButtons->setEnabled(true);
1016   
1017   mySMESHGUI->SetActiveDialogBox( (QDialog*)this );
1018
1019   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1020     aViewWindow->SetSelectionMode( FaceSelection );
1021   SelectionIntoArgument();
1022 }
1023
1024
1025 //=================================================================================
1026 // function : enterEvent()
1027 // purpose  :
1028 //=================================================================================
1029 void SMESHGUI_CreatePolyhedralVolumeDlg::enterEvent(QEvent* e)
1030 {
1031   if ( ConstructorsBox->isEnabled() )
1032     return;  
1033   ActivateThisDialog();
1034 }
1035
1036
1037 //=================================================================================
1038 // function : closeEvent()
1039 // purpose  :
1040 //=================================================================================
1041 void SMESHGUI_CreatePolyhedralVolumeDlg::closeEvent( QCloseEvent* e )
1042 {
1043   /* same than click on cancel button */
1044   ClickOnCancel();
1045 }
1046
1047
1048 //=======================================================================
1049 //function : hideEvent
1050 //purpose  : caused by ESC key
1051 //=======================================================================
1052
1053 void SMESHGUI_CreatePolyhedralVolumeDlg::hideEvent ( QHideEvent * e )
1054 {
1055   if ( !isMinimized() )
1056     ClickOnCancel();
1057 }
1058
1059
1060 //=================================================================================
1061 // function : GetConstructorId()
1062 // purpose  : 
1063 //=================================================================================
1064 int SMESHGUI_CreatePolyhedralVolumeDlg::GetConstructorId()
1065
1066   return GroupConstructors->checkedId();
1067 }
1068
1069 //=================================================================================
1070 // function : onAdd()
1071 // purpose  :
1072 //=================================================================================
1073 void SMESHGUI_CreatePolyhedralVolumeDlg::onAdd()
1074 {
1075   SALOME_ListIO selected;
1076   mySelectionMgr->selectedObjects( selected );
1077   int aNbSel = selected.Extent();
1078   if (aNbSel == 0 || !myActor || myMesh->_is_nil()) return;
1079   
1080   if (checkEditLine(false) == -1) return;
1081
1082   busy = true;
1083   if ( !(myEditCurrentArgument->text().isEmpty()) )
1084     {
1085       myFacesByNodes->addItem(myEditCurrentArgument->text());
1086       //myFacesByNodes->setSelected(myFacesByNodes->count() - 1, true);
1087       myNbOkElements = 1;
1088       myEditCurrentArgument->clear();
1089       AddButton->setEnabled(false);
1090       buttonOk->setEnabled( true );
1091       if(myFacesByNodes->count()>1) buttonApply->setEnabled( true );
1092     }
1093   busy = false;
1094   onListSelectionChanged();
1095   displaySimulation();
1096 }
1097
1098 //=================================================================================
1099 // function : onRemove()
1100 // purpose  :
1101 //=================================================================================
1102 void SMESHGUI_CreatePolyhedralVolumeDlg::onRemove()
1103 {
1104   busy = true;
1105   QList<QListWidgetItem*> selItems = myFacesByNodes->selectedItems();
1106   QListWidgetItem* anItem;
1107
1108   if ( selItems.count() > 0 ) myNbOkElements = 1;
1109
1110   foreach( anItem, selItems )
1111     delete anItem;
1112
1113   RemoveButton->setEnabled( myFacesByNodes->count() > 0 );
1114   buttonOk->setEnabled( myFacesByNodes->count() > 1 );
1115   buttonApply->setEnabled( myFacesByNodes->count() > 1 );
1116
1117   busy = false;
1118   displaySimulation();
1119 }
1120
1121 //=================================================================================
1122 // function : onListSelectionChanged()
1123 // purpose  : Called when selection in element list is changed
1124 //=================================================================================
1125 void SMESHGUI_CreatePolyhedralVolumeDlg::onListSelectionChanged()
1126 {
1127   if (busy || !myActor) return;
1128   busy = true;
1129
1130   SALOME_ListIO aList;
1131   mySelectionMgr->setSelectedObjects( aList );
1132   TColStd_MapOfInteger aIndexes;
1133
1134   QList<QListWidgetItem*> selItems = myFacesByNodes->selectedItems();
1135   QListWidgetItem* anItem;
1136   foreach( anItem, selItems ) {
1137     QStringList anIds = anItem->text().split( " ", QString::SkipEmptyParts );
1138     for (QStringList::iterator it = anIds.begin(); it != anIds.end(); ++it)
1139       aIndexes.Add((*it).toInt());
1140   }
1141   RemoveButton->setEnabled(selItems.count() > 0);
1142   mySelector->AddOrRemoveIndex(myActor->getIO(), aIndexes, true );
1143   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
1144     aViewWindow->highlight( myActor->getIO(), true, true );
1145   mySelectionMgr->clearFilters(); 
1146   aList.Append( myActor->getIO() );
1147   mySelectionMgr->setSelectedObjects( aList );
1148   
1149   busy = false;
1150 }
1151
1152 //=================================================================================
1153 // function : keyPressEvent()
1154 // purpose  :
1155 //=================================================================================
1156 void SMESHGUI_CreatePolyhedralVolumeDlg::keyPressEvent( QKeyEvent* e )
1157 {
1158   QDialog::keyPressEvent( e );
1159   if ( e->isAccepted() )
1160     return;
1161
1162   if ( e->key() == Qt::Key_F1 ) {
1163     e->accept();
1164     ClickOnHelp();
1165   }
1166 }
1167
1168 //=================================================================================
1169 // function : isValid
1170 // purpose  :
1171 //=================================================================================
1172 bool SMESHGUI_CreatePolyhedralVolumeDlg::isValid()
1173 {
1174   if( GroupGroups->isChecked() && ComboBox_GroupName->currentText().isEmpty() ) {
1175     SUIT_MessageBox::warning( this, tr( "SMESH_WRN_WARNING" ), tr( "GROUP_NAME_IS_EMPTY" ) );
1176     return false;
1177   }
1178   return true;
1179 }