Salome HOME
When the main window was maximized some dialogs were cropped at the bottom of the...
[modules/smesh.git] / src / SMESHGUI / SMESHGUI.cxx
1 //  SMESH SMESHGUI : GUI for SMESH component
2 //
3 //  Copyright (C) 2003  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
21 //
22 //
23 //
24 //  File   : SMESHGUI.cxx
25 //  Author : Nicolas REJNERI
26 //  Module : SMESH
27 //  $Header$
28
29 using namespace std;
30 #include "SMESHGUI.h"
31 #include "SMESHGUI_AddHypothesisDlg.h"
32 #include "SMESHGUI_AddAlgorithmDlg.h"
33 #include "SMESHGUI_InitMeshDlg.h"
34 #include "SMESHGUI_LocalLengthDlg.h"
35 #include "SMESHGUI_NbSegmentsDlg.h"
36 #include "SMESHGUI_AddSubMeshDlg.h"
37 #include "SMESHGUI_NodesDlg.h"
38 #include "SMESHGUI_TransparencyDlg.h"
39 #include "SMESHGUI_RemoveNodesDlg.h"
40 #include "SMESHGUI_RemoveElementsDlg.h"
41 #include "SMESHGUI_MeshInfosDlg.h"
42 #include "SMESHGUI_Preferences_ColorDlg.h"
43 #include "SMESHGUI_MaxElementAreaDlg.h"
44 #include "SMESHGUI_MaxElementVolumeDlg.h"
45 #include "SMESHGUI_Preferences_ScalarBarDlg.h"
46 #include "SMESHGUI_EditScalarBarDlg.h"
47 #include "SMESHGUI_aParameterDlg.h"
48 #include "SMESHGUI_ComputeScalarValue.h"
49 #include "SMESHGUI_MoveNodesDlg.h"
50 #include "SMESHGUI_OrientationElementsDlg.h"
51 #include "SMESHGUI_DiagonalInversionDlg.h"
52 #include "SMESHGUI_EdgesConnectivityDlg.h"
53 #include "SMESHGUI_AddFaceDlg.h"
54 #include "SMESHGUI_AddEdgeDlg.h"
55 #include "SMESHGUI_AddVolumeDlg.h"
56 #include "SMESHGUI_EditHypothesesDlg.h"
57
58 #include "SMESH_Grid.h"
59
60 // SALOME Includes
61 #include "Utils_ORB_INIT.hxx"
62 #include "Utils_SINGLETON.hxx"
63
64 #include "QAD.h"
65 #include "QAD_Tools.h"
66 #include "QAD_Config.h"
67 #include "QAD_Settings.h"
68 #include "QAD_RightFrame.h"
69 #include "QAD_MessageBox.h"   
70 #include "QAD_Resource.h"
71 #include "QAD_FileDlg.h"
72 #include "SALOMEGUI_Desktop.h"
73 #include "SALOMEGUI_NameDlg.h"
74
75 #include "OCCViewer_ViewPort.h"
76 #include "OCCViewer_ViewPort3d.h"
77 #include "OCCViewer_Viewer3d.h"
78
79 #include "GEOM_Client.hxx"
80 #include "GEOM_InteractiveObject.hxx"
81
82 #include "SALOME_NamingService.hxx"
83 #include "SALOME_ListIteratorOfListIO.hxx"
84 #include "SALOME_InteractiveObject.hxx"
85
86 #include "SALOMEGUI_ImportOperation.h"
87 #include "SALOMEGUI_QtCatchCorbaException.hxx"
88 #include "utilities.h"
89
90 #include "SMDS_Mesh.hxx"
91 #include "SMESHDS_Document.hxx"
92 #include "Document_Reader.h"
93 #include "Document_Writer.h"
94 #include "Mesh_Reader.h"
95 #include "Mesh_Writer.h"
96
97 #include "DriverDAT_R_SMESHDS_Document.h"
98 #include "DriverMED_R_SMESHDS_Document.h"
99 #include "DriverUNV_R_SMESHDS_Document.h"
100 #include "DriverDAT_W_SMESHDS_Document.h"
101 #include "DriverMED_W_SMESHDS_Document.h"
102 #include "DriverUNV_W_SMESHDS_Document.h"
103 #include "DriverDAT_R_SMESHDS_Mesh.h"
104 #include "DriverMED_R_SMESHDS_Mesh.h"
105 #include "DriverUNV_R_SMESHDS_Mesh.h"
106 #include "DriverDAT_W_SMESHDS_Mesh.h"
107 #include "DriverMED_W_SMESHDS_Mesh.h"
108 #include "DriverUNV_W_SMESHDS_Mesh.h"
109
110 // QT Includes
111 #define  INCLUDE_MENUITEM_DEF
112 #include <qapplication.h>
113 #include <qlineedit.h>
114 #include <qmenudata.h>
115 #include <qmenubar.h>
116 #include <qpopupmenu.h>
117 #include <qfont.h>
118 #include <qstring.h>
119 #include <qcheckbox.h>
120 #include <qcolordialog.h>
121 #include <qmessagebox.h>
122 #include <qspinbox.h>
123 #include <qlist.h>
124 #include <qwidget.h> 
125 #include <qevent.h> 
126 #include <qradiobutton.h> 
127
128 // VTK Includes
129 #include "VTKViewer_Common.h"
130 #include "VTKViewer_ViewFrame.h"
131 #include <vtkLegendBoxActor.h>
132 #include <vtkFeatureEdges.h>
133
134
135 // Open CASCADE Includes
136 #include <gp_Pnt.hxx>
137 #include <gp_Vec.hxx>
138
139 static GEOM_Client      ShapeReader;
140 static SMESHGUI*        smeshGUI = 0;
141 static CORBA::ORB_var   _orb;
142
143
144 //=============================================================================
145 /*!
146  *
147  */
148 //=============================================================================
149 class CustomItem : public QCustomMenuItem
150 {
151 public:
152   CustomItem( const QString& s, const QFont& f )
153     : string( s ), font( f ){};
154   ~CustomItem(){}
155   
156   void paint( QPainter* p, const QColorGroup& /*cg*/, bool /*act*/, bool /*enabled*/, int x, int y, int w, int h )
157   {
158     p->setFont ( font );
159     p->drawText( x, y, w, h, AlignHCenter | AlignVCenter | ShowPrefix | DontClip, string );
160   }
161   
162   QSize sizeHint()
163   {
164     return QFontMetrics( font ).size( AlignHCenter | AlignVCenter | ShowPrefix | DontClip,  string );
165   }
166 private:
167   QString string;
168   QFont font;
169 };
170
171 //=============================================================================
172 /*!
173  *
174  */
175 //=============================================================================
176 SMESHGUI::SMESHGUI() :
177   QObject()
178 {
179 }
180
181 //=============================================================================
182 /*!
183  *
184  */
185 //=============================================================================
186 SMESHGUI::~SMESHGUI()
187 {
188 }
189
190
191 //=============================================================================
192 /*!
193  *
194  */
195 //=============================================================================
196 SMESHGUI* SMESHGUI::GetSMESHGUI( )
197 {
198   return smeshGUI;
199 }
200
201 //=============================================================================
202 /*!
203  *
204  */
205 //=============================================================================
206 SMESHGUI* SMESHGUI::GetOrCreateSMESHGUI( QAD_Desktop* desktop )
207 {
208   if( smeshGUI == 0 ) {
209     setOrb();
210     smeshGUI = new SMESHGUI;
211     smeshGUI->myActiveDialogBox = 0 ;
212     smeshGUI->myState = -1 ;
213     smeshGUI->myDesktop = desktop ; 
214     smeshGUI->myActiveStudy = desktop->getActiveStudy();
215
216     Engines::Component_var comp = desktop->getEngine("FactoryServer", "SMESH");
217     smeshGUI->myComponentMesh = SMESH::SMESH_Gen::_narrow(comp);
218     
219     Engines::Component_var comp1 = desktop->getEngine("FactoryServer", "GEOM");    
220     smeshGUI->myComponentGeom = GEOM::GEOM_Gen::_narrow(comp1);
221       
222     /* GetCurrentStudy */
223     smeshGUI->myStudyId = smeshGUI->myActiveStudy->getStudyId();
224     
225     smeshGUI->myComponentGeom->GetCurrentStudy( smeshGUI->myStudyId );
226     //    smeshGUI->myComponentGeom->NbLabels();
227     
228     smeshGUI->myStudy = smeshGUI->myActiveStudy->getStudyDocument();
229     
230     smeshGUI->myStudyAPI = SMESHGUI_StudyAPI(smeshGUI->myStudy, smeshGUI->myComponentMesh);
231
232     smeshGUI->myDocument = new SMESHDS_Document(1);//NBU
233
234     smeshGUI->mySimulationActors = vtkActorCollection::New();
235     smeshGUI->mySimulationActors2D = vtkActor2DCollection::New();
236   } else {
237     /* study may have changed */
238     smeshGUI->myActiveStudy = desktop->getActiveStudy();
239     smeshGUI->myStudyAPI.Update(smeshGUI->myComponentMesh);
240   }
241   
242   /* Automatic Update */
243   if ( desktop->menuBar()->isItemChecked(1001) )
244     smeshGUI->myAutomaticUpdate = true;
245   else 
246     smeshGUI->myAutomaticUpdate = false;
247
248   return smeshGUI;
249 }
250
251 //=============================================================================
252 /*!
253  *
254  */
255 //=============================================================================
256 void SMESHGUI::SetState(int aState )
257 {  this->myState = aState ;  return ; }
258
259
260 //=============================================================================
261 /*!
262  *
263  */
264 //=============================================================================
265 void SMESHGUI::ResetState()
266 {  this->myState = -1 ;  return ; }
267
268
269 //=============================================================================
270 /*!
271  *
272  */
273 //=============================================================================
274 void SMESHGUI::EmitSignalDeactivateDialog()
275 {
276   emit this->SignalDeactivateActiveDialog() ;
277   return ;
278 }
279
280 //=============================================================================
281 /*!
282  *
283  */
284 //=============================================================================
285 void SMESHGUI::EmitSignalCloseAllDialogs()
286 {
287   emit this->SignalCloseAllDialogs() ;
288   return ;
289 }
290
291
292 //=============================================================================
293 /*!
294  *
295  */
296 //=============================================================================
297 QDialog* SMESHGUI::GetActiveDialogBox()
298 {
299   return this->myActiveDialogBox ;
300 }
301
302 //=============================================================================
303 /*!
304  *
305  */
306 //=============================================================================
307 void SMESHGUI::SetActiveDialogBox(QDialog* aDlg)
308 {
309   this->myActiveDialogBox = (QDialog*)aDlg ;
310   return ;
311 }
312
313
314 //=============================================================================
315 /*!
316  *
317  */
318 //=============================================================================
319 QAD_Study* SMESHGUI::GetActiveStudy()
320 {
321   return this->myActiveStudy ;
322 }
323
324
325 //=============================================================================
326 /*!
327  *
328  */
329 //=============================================================================
330 SALOMEDS::Study_ptr SMESHGUI::GetStudy()
331 {
332   return SALOMEDS::Study::_narrow( myStudy );
333 }
334
335 //=============================================================================
336 /*!
337  *
338  */
339 //=============================================================================
340 SMESHGUI_StudyAPI SMESHGUI::GetStudyAPI()
341 {
342   return myStudyAPI;
343 }
344
345 //=============================================================================
346 /*!
347  *
348  */
349 //=============================================================================
350 QAD_Desktop* SMESHGUI::GetDesktop()
351 {
352   return this->myDesktop ;
353 }
354
355 //=============================================================================
356 /*!
357  *
358  */
359 //=============================================================================
360 vtkScalarBarActor* SMESHGUI::GetScalarBar()
361 {
362   vtkRenderer* aRenderer = ((VTKViewer_ViewFrame*)myActiveStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRenderer();
363   vtkActor2DCollection* actor2DList = aRenderer->GetActors2D();
364   actor2DList->InitTraversal();
365   vtkActor2D* aActor2d =  actor2DList->GetNextActor2D();
366   while (aActor2d != NULL) {
367     if (aActor2d->IsA("vtkScalarBarActor"))
368       return vtkScalarBarActor::SafeDownCast(aActor2d);
369     actor2DList->GetNextActor2D();
370   }
371   return NULL;
372 }
373
374 //=============================================================================
375 /*!
376  *
377  */
378 //=============================================================================
379 void SMESHGUI::activeStudyChanged( QAD_Desktop* parent )
380 {
381   MESSAGE ("SMESHGUI::activeStudyChanged init.")
382   /* Create or retrieve an object SMESHGUI */
383   SMESHGUI::GetOrCreateSMESHGUI(parent); 
384   if(smeshGUI != 0) {  
385     smeshGUI->EmitSignalCloseAllDialogs() ;
386     MESSAGE( "Active study changed : SMESHGUI nullified" << endl ) ;
387     smeshGUI = 0 ;
388   }
389
390   //smeshGUI->SetSettings( parent ); //DCQ : Pb. Multi-Etudes
391   MESSAGE ("SMESHGUI::activeStudyChanged done.")
392   return ;
393 }
394
395 //=============================================================================
396 /*!
397  *
398  */
399 //=============================================================================
400 bool SMESHGUI::DefineDlgPosition(QWidget* aDlg, int& x, int& y)
401 {
402   /* Here the position is on the bottom right corner - 10 */
403         aDlg->resize(QSize().expandedTo(aDlg->minimumSizeHint()));
404   QAD_Desktop* PP = QAD_Application::getDesktop() ;
405   x = abs ( PP->x() + PP->size().width()  - aDlg->size().width()  - 10 ) ;
406   y = abs ( PP->y() + PP->size().height() - aDlg->size().height() - 10 ) ;
407   return true ;  
408 }
409
410
411 //=============================================================================
412 /*!
413  *
414  */
415 //=============================================================================
416 void SMESHGUI::EraseSimulationActors()
417 {
418   if ( myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) {  //VTK
419     vtkRenderer* theRenderer = ((VTKViewer_ViewFrame*)myActiveStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRenderer();
420     vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
421
422     if ( mySimulationActors != NULL ) {
423
424       mySimulationActors->InitTraversal();
425       vtkActor *ac = mySimulationActors->GetNextActor();
426       while(!(ac==NULL)) {
427         theRenderer->RemoveActor(ac);
428         ac = mySimulationActors->GetNextActor();
429       }
430       mySimulationActors->RemoveAllItems();
431     }
432     if ( mySimulationActors2D != NULL ) {
433       mySimulationActors2D->InitTraversal();
434       vtkActor2D *ac = mySimulationActors2D->GetNextActor2D();
435       while(!(ac==NULL)) {
436         theRenderer->RemoveActor2D(ac);
437         ac = mySimulationActors2D->GetNextActor2D();
438       }
439       mySimulationActors2D->RemoveAllItems();
440     }
441     renWin->Render();
442   }
443 }
444
445 //=============================================================================
446 /*!
447  *
448  */
449 //=============================================================================
450 SMESH::SMESH_Mesh_ptr SMESHGUI::InitMesh( GEOM::GEOM_Shape_ptr aShape, QString NameMesh )
451 {
452   try {
453     if ( !myComponentMesh->_is_nil() && !aShape->_is_nil() ) {
454       SMESH::SMESH_Mesh_var aMesh = myComponentMesh->Init( myComponentGeom, myStudyId, aShape);
455
456       if ( !aMesh->_is_nil() ) {
457         SALOMEDS::SObject_var SM = myStudyAPI.AddNewMesh ( aMesh );
458         myStudyAPI.SetName( SM, NameMesh );
459           
460         // GEOM::GEOM_Shape has non-empty StudyShapeId only after AddInStudy operation,
461         // not after loading from file, so let's use more reliable way to retrieve SObject
462         Standard_CString ShapeIOR = _orb->object_to_string(aShape);
463         SALOMEDS::SObject_var SObject = myStudy->FindObjectIOR(ShapeIOR);
464         if ( !SObject->_is_nil() && !SM->_is_nil() ) {
465           myStudyAPI.SetShape( SM, SObject );
466         }
467         return SMESH::SMESH_Mesh::_narrow(aMesh);
468       }
469     }
470   }
471   catch  (const SALOME::SALOME_Exception& S_ex) {
472     QtCatchCorbaException(S_ex);
473   }
474   myActiveStudy->updateObjBrowser(true);
475   return SMESH::SMESH_Mesh::_nil();
476 }
477
478 //=============================================================================
479 /*!
480  *
481  */
482 //=============================================================================
483 SMESH::SMESH_subMesh_ptr SMESHGUI::AddSubMesh( SMESH::SMESH_Mesh_ptr aMesh, GEOM::GEOM_Shape_ptr aShape, QString NameMesh )
484 {
485   try {
486     SMESH::SMESH_subMesh_var aSubMesh = aMesh->GetElementsOnShape(aShape);
487     SALOMEDS::SObject_var SO_Mesh = myStudyAPI.FindMesh(aMesh);
488     Standard_CString ShapeIOR = _orb->object_to_string(aShape);
489     SALOMEDS::SObject_var SO_GeomShape = myStudy->FindObjectIOR(ShapeIOR);
490     
491     if ( !SO_GeomShape->_is_nil() && !SO_Mesh->_is_nil() && !aSubMesh->_is_nil() && !aMesh->_is_nil() ) {
492       SALOMEDS::SObject_var SO = myStudyAPI.AddSubMeshOnShape(SO_Mesh, SO_GeomShape, aSubMesh, aShape->ShapeType() );
493       myStudyAPI.SetName(SO, NameMesh);
494     
495       SMESH_Actor* amesh = SMESH_Actor::New();
496       Handle(SALOME_InteractiveObject) IO = new SALOME_InteractiveObject(SO->GetID(),
497                                                                          "MESH",
498                                                                          strdup(NameMesh));
499       amesh->setIO( IO );
500       amesh->setName( strdup(NameMesh) );
501       DisplayActor(amesh, false);
502       return SMESH::SMESH_subMesh::_narrow( aSubMesh );
503     }
504   }
505   catch  (const SALOME::SALOME_Exception& S_ex) {
506     QtCatchCorbaException(S_ex);
507   }
508   myActiveStudy->updateObjBrowser(true);
509   return SMESH::SMESH_subMesh::_nil();
510 }
511
512
513 //=============================================================================
514 /*!
515  *
516  */
517 //=============================================================================
518 SMESH::SMESH_Hypothesis_ptr SMESHGUI::CreateHypothesis( QString TypeHypothesis, 
519                                                         QString NameHypothesis )
520 {
521   SMESH::SMESH_Hypothesis_var Hyp;
522   try {
523     Hyp = myComponentMesh->CreateHypothesis( TypeHypothesis, myStudyId );
524     if ( !Hyp->_is_nil() ) {
525       SALOMEDS::SObject_var SHyp = myStudyAPI.AddNewHypothesis( Hyp );
526       myStudyAPI.SetName( SHyp, NameHypothesis);
527     }
528   }
529   catch  (const SALOME::SALOME_Exception& S_ex) {
530     QtCatchCorbaException(S_ex);
531   }
532
533   return SMESH::SMESH_Hypothesis::_narrow( Hyp );
534 }
535
536 //=============================================================================
537 /*!
538  *
539  */
540 //=============================================================================
541 void SMESHGUI::AddHypothesisOnMesh( SMESH::SMESH_Mesh_ptr aMesh, SMESH::SMESH_Hypothesis_ptr aHyp )
542 {
543   if ( !aMesh->_is_nil() ) {
544     QApplication::setOverrideCursor( Qt::waitCursor );
545     SALOMEDS::SObject_var SM = myStudyAPI.FindMesh( aMesh );
546     GEOM::GEOM_Shape_var aShape = myStudyAPI.GetShapeOnMeshOrSubMesh( SM );
547     try {
548       bool res = aMesh->AddHypothesis( aShape, aHyp );
549       if (res) {
550         SALOMEDS::SObject_var SH = myStudyAPI.FindHypothesisOrAlgorithms( aHyp );
551         if ( !SM->_is_nil() && !SH->_is_nil() ) {
552           myStudyAPI.SetHypothesis( SM, SH );
553           myStudyAPI.ModifiedMesh( SM, false );
554         }
555         QApplication::restoreOverrideCursor();
556       } else {
557         QApplication::restoreOverrideCursor();
558         QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
559                                 tr ("SMESH_WRN_HYPOTHESIS_ALREADYEXIST"), tr ("SMESH_BUT_YES") );
560       }
561     }
562     catch  (const SALOME::SALOME_Exception& S_ex) {
563       QtCatchCorbaException(S_ex);
564     }
565   }
566   myActiveStudy->updateObjBrowser(true);
567   QApplication::restoreOverrideCursor();
568 }
569
570 //=============================================================================
571 /*!
572  *
573  */
574 //=============================================================================
575 void SMESHGUI::RemoveHypothesisOrAlgorithmOnMesh( const Handle(SALOME_InteractiveObject)& IObject )
576 {
577   if ( IObject->hasReference() ) {
578     SMESH::SMESH_Hypothesis_var anHyp;
579     SALOMEDS::SObject_var SO_Hypothesis = smeshGUI->myStudy->FindObjectID(IObject->getEntry() );
580     SALOMEDS::GenericAttribute_var anAttr;
581     SALOMEDS::AttributeIOR_var     anIOR;
582
583     if ( !SO_Hypothesis->_is_nil() ) {
584       QApplication::setOverrideCursor( Qt::waitCursor );
585       if (SO_Hypothesis->FindAttribute(anAttr, "AttributeIOR")) {
586         anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
587         anHyp = SMESH::SMESH_Hypothesis::_narrow( _orb->string_to_object(anIOR->Value()) );
588       }
589
590       SALOMEDS::SObject_var SO_Applied_Hypothesis = smeshGUI->myStudy->FindObjectID(IObject->getReference());
591       if ( !SO_Applied_Hypothesis->_is_nil() ) {
592         SALOMEDS::SObject_var MorSM = smeshGUI->myStudyAPI.GetMeshOrSubmesh( SO_Applied_Hypothesis );
593         if ( !MorSM->_is_nil() ) {
594           smeshGUI->myStudyAPI.ModifiedMesh( MorSM, false );
595
596           GEOM::GEOM_Shape_var aShape = smeshGUI->myStudyAPI.GetShapeOnMeshOrSubMesh( MorSM );
597           if ( !aShape->_is_nil() ) {
598             if (MorSM->FindAttribute(anAttr, "AttributeIOR")) {
599               anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
600               SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( _orb->string_to_object(anIOR->Value()) );
601               SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( _orb->string_to_object(anIOR->Value()) );
602               if ( !aMesh->_is_nil() ) {
603                 bool res = aMesh->RemoveHypothesis( aShape, anHyp );
604                 if ( !res ) {
605                   QApplication::restoreOverrideCursor();
606                   QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
607                                           tr ("SMESH_WRN_HYPOTHESIS_NOTEXIST"), tr ("SMESH_BUT_YES") );
608                 }
609               } else if ( !aSubMesh->_is_nil() ) {
610                 aMesh = aSubMesh->GetFather();
611                 if ( !aMesh->_is_nil() ) {
612                   bool res = aMesh->RemoveHypothesis( aShape, anHyp );
613                   if ( !res ) {
614                     QApplication::restoreOverrideCursor();
615                     QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
616                                             tr ("SMESH_WRN_HYPOTHESIS_NOTEXIST"), tr ("SMESH_BUT_YES") );
617                   }
618                 }
619               }
620               if ( myAutomaticUpdate ) {
621                 SMESH_Actor* Mesh = smeshGUI->ReadScript(aMesh);
622                 if ( Mesh != NULL ) {
623 #ifdef TRACE
624                   Dump( Mesh );
625 #endif
626                   DisplayActor( Mesh );
627                   DisplayEdges( Mesh ); 
628                   smeshGUI->ChangeRepresentation( Mesh, Mesh->getDisplayMode() );
629                 }
630               }
631             }
632           }
633         }
634         smeshGUI->myStudyAPI.UnSetHypothesis( SO_Applied_Hypothesis );
635       }
636     }    
637   } else if ( IObject->hasEntry() ) {
638     MESSAGE ( "IObject entry " << IObject->getEntry() )    
639   }
640   QApplication::restoreOverrideCursor();
641 }
642
643 //=============================================================================
644 /*!
645  *
646  */
647 //=============================================================================
648 void SMESHGUI::RemoveHypothesisOrAlgorithmOnMesh( SALOMEDS::SObject_ptr MorSM, SMESH::SMESH_Hypothesis_ptr anHyp )
649 {
650   SALOMEDS::SObject_var             AHR, aRef;
651   SALOMEDS::GenericAttribute_var    anAttr;
652   SALOMEDS::AttributeIOR_var        anIOR;
653
654   if ( !MorSM->_is_nil() ) {
655     GEOM::GEOM_Shape_var aShape = smeshGUI->myStudyAPI.GetShapeOnMeshOrSubMesh( MorSM );
656     if ( !aShape->_is_nil() ) {
657       if (MorSM->FindAttribute(anAttr, "AttributeIOR")) {
658         anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
659         SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( _orb->string_to_object(anIOR->Value()) );
660         SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( _orb->string_to_object(anIOR->Value()) );
661         if ( !aMesh->_is_nil() ) {
662           bool res = aMesh->RemoveHypothesis( aShape, anHyp );
663           if ( !res ) {
664             QApplication::restoreOverrideCursor();
665             QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
666                                     tr ("SMESH_WRN_HYPOTHESIS_NOTEXIST"), tr ("SMESH_BUT_YES") );
667           }
668         } else if ( !aSubMesh->_is_nil() ) {
669           aMesh = aSubMesh->GetFather();
670           if ( !aMesh->_is_nil() ) {
671             bool res = aMesh->RemoveHypothesis( aShape, anHyp );
672             if ( !res ) {
673               QApplication::restoreOverrideCursor();
674               QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
675                                       tr ("SMESH_WRN_HYPOTHESIS_NOTEXIST"), tr ("SMESH_BUT_YES") );
676             }
677           }
678         }
679         if ( myAutomaticUpdate ) {
680           SMESH_Actor* Mesh = smeshGUI->ReadScript(aMesh);
681           if ( Mesh != NULL ) {
682 #ifdef TRACE
683             Dump( Mesh );
684 #endif
685             DisplayActor( Mesh );
686             DisplayEdges( Mesh ); 
687             // smeshGUI->ChangeRepresentation( Mesh, Mesh->getDisplayMode() );
688           }
689         }
690       }
691     }
692
693     if ( MorSM->FindSubObject (2, AHR)) {
694       SALOMEDS::ChildIterator_var it = myStudy->NewChildIterator(AHR);
695       for (; it->More();it->Next()) {
696         SALOMEDS::SObject_var Obj = it->Value();
697         if ( Obj->ReferencedObject(aRef) ) {
698           if (aRef->FindAttribute(anAttr, "AttributeIOR")) {
699             anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
700             if ( strcmp( anIOR->Value(), _orb->object_to_string(anHyp) ) == 0 ) {
701               smeshGUI->myStudyAPI.UnSetHypothesis( Obj );
702               break;
703             }
704           }
705         }
706       }
707     }
708     if ( MorSM->FindSubObject (3, AHR)) {
709       SALOMEDS::ChildIterator_var it = myStudy->NewChildIterator(AHR);
710       for (; it->More();it->Next()) {
711         SALOMEDS::SObject_var Obj = it->Value();
712         if ( Obj->ReferencedObject(aRef) ) {
713           if (aRef->FindAttribute(anAttr, "AttributeIOR")) {
714             anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
715             if ( strcmp( anIOR->Value(), _orb->object_to_string(anHyp) ) == 0 ) {
716               smeshGUI->myStudyAPI.UnSetAlgorithm( Obj );
717               break;
718             }
719           }
720         }
721       }
722     }    
723    smeshGUI->myStudyAPI.ModifiedMesh( MorSM, false );
724   } 
725   QApplication::restoreOverrideCursor();
726 }
727
728 //=============================================================================
729 /*!
730  *
731  */
732 //=============================================================================
733 void SMESHGUI::AddAlgorithmOnMesh( SMESH::SMESH_Mesh_ptr aMesh, SMESH::SMESH_Hypothesis_ptr aHyp )
734 {
735   if ( !aMesh->_is_nil() ) {
736     QApplication::setOverrideCursor( Qt::waitCursor );
737     SALOMEDS::SObject_var SM = myStudyAPI.FindMesh( aMesh );
738     GEOM::GEOM_Shape_var aShape = myStudyAPI.GetShapeOnMeshOrSubMesh( SM );
739     try {
740       bool res = aMesh->AddHypothesis( aShape, aHyp );
741       if (res) {
742         SALOMEDS::SObject_var SH = myStudyAPI.FindHypothesisOrAlgorithms( aHyp );
743         if ( !SM->_is_nil() && !SH->_is_nil() ) { 
744           myStudyAPI.SetAlgorithms( SM, SH );    
745           myStudyAPI.ModifiedMesh( SM, false );
746         }
747       } else {
748         QApplication::restoreOverrideCursor();
749         QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
750                                 tr ("SMESH_WRN_ALGORITHM_ALREADYEXIST"), tr ("SMESH_BUT_YES") );
751       }
752     }
753     catch  (const SALOME::SALOME_Exception& S_ex) {
754       QtCatchCorbaException(S_ex);
755     }
756   }
757   myActiveStudy->updateObjBrowser(true);
758   QApplication::restoreOverrideCursor();
759 }
760
761 //=============================================================================
762 /*!
763  *
764  */
765 //=============================================================================
766 void SMESHGUI::AddHypothesisOnSubMesh( SMESH::SMESH_subMesh_ptr aSubMesh, SMESH::SMESH_Hypothesis_ptr aHyp )
767 {
768   if ( !aSubMesh->_is_nil() ) {
769     QApplication::setOverrideCursor( Qt::waitCursor );
770     try {
771       SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
772       SALOMEDS::SObject_var SsubM = myStudyAPI.FindSubMesh( aSubMesh );
773       GEOM::GEOM_Shape_var aShape = myStudyAPI.GetShapeOnMeshOrSubMesh( SsubM );
774       if ( !aMesh->_is_nil() ) {
775         bool res = aMesh->AddHypothesis( aShape, aHyp );
776         if (res) {      
777           SALOMEDS::SObject_var SH = myStudyAPI.FindHypothesisOrAlgorithms( aHyp );
778           if ( !SsubM->_is_nil() && !SH->_is_nil() ) {
779             myStudyAPI.SetHypothesis( SsubM, SH );
780             myStudyAPI.ModifiedMesh( SsubM, false );
781           }
782         } else {
783           QApplication::restoreOverrideCursor();
784           QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
785                                   tr ("SMESH_WRN_HYPOTHESIS_ALREADYEXIST"), tr ("SMESH_BUT_YES") );
786         }
787       }
788     }
789     catch  (const SALOME::SALOME_Exception& S_ex) {
790       QtCatchCorbaException(S_ex);
791     }
792   }
793   myActiveStudy->updateObjBrowser(true);
794   QApplication::restoreOverrideCursor();
795 }
796
797 //=============================================================================
798 /*!
799  *
800  */
801 //=============================================================================
802 void SMESHGUI::AddAlgorithmOnSubMesh( SMESH::SMESH_subMesh_ptr aSubMesh, SMESH::SMESH_Hypothesis_ptr aHyp )
803 {
804   if ( !aSubMesh->_is_nil() ) {
805     QApplication::setOverrideCursor( Qt::waitCursor );
806     try {
807       SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
808       SALOMEDS::SObject_var SsubM = myStudyAPI.FindSubMesh( aSubMesh );
809       GEOM::GEOM_Shape_var aShape = myStudyAPI.GetShapeOnMeshOrSubMesh( SsubM );
810       if ( !aMesh->_is_nil() ) {
811         bool res = aMesh->AddHypothesis( aShape, aHyp );
812         if (res) {
813           SALOMEDS::SObject_var SH = myStudyAPI.FindHypothesisOrAlgorithms( aHyp );
814           if ( !SsubM->_is_nil() && !SH->_is_nil() ) {
815             myStudyAPI.SetAlgorithms( SsubM, SH ); 
816             myStudyAPI.ModifiedMesh( SsubM, false );
817           }
818         } else {
819           QApplication::restoreOverrideCursor();
820           QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
821                                   tr ("SMESH_WRN_ALGORITHM_ALREADYEXIST"), tr ("SMESH_BUT_YES") );
822         }
823       }
824     }
825     catch  (const SALOME::SALOME_Exception& S_ex) {
826       QtCatchCorbaException(S_ex);
827     }
828   }
829   myActiveStudy->updateObjBrowser(true);
830   QApplication::restoreOverrideCursor();
831 }
832
833 //=============================================================================
834 /*!
835  *
836  */
837 //=============================================================================
838 void SMESHGUI::CreateAlgorithm( QString TypeAlgo, QString NameAlgo )
839 {
840   SMESH::SMESH_Hypothesis_var Hyp;
841   try {
842     if ( TypeAlgo.compare("Regular_1D") == 0 )
843       Hyp = myComponentMesh->CreateHypothesis( TypeAlgo, myStudyId );
844     else if ( TypeAlgo.compare("MEFISTO_2D") == 0 )
845       Hyp = myComponentMesh->CreateHypothesis( TypeAlgo, myStudyId );
846     else if ( TypeAlgo.compare("Quadrangle_2D") == 0 )
847       Hyp = myComponentMesh->CreateHypothesis( TypeAlgo, myStudyId );
848     else if ( TypeAlgo.compare("Hexa_3D") == 0 )
849       Hyp = myComponentMesh->CreateHypothesis( TypeAlgo, myStudyId );
850     
851     if ( !Hyp->_is_nil() ) {
852       SALOMEDS::SObject_var SHyp = myStudyAPI.AddNewAlgorithms( Hyp );
853       myStudyAPI.SetName( SHyp, NameAlgo);
854     }
855   }
856   catch  (const SALOME::SALOME_Exception& S_ex) {
857     QtCatchCorbaException(S_ex);
858   }
859   myActiveStudy->updateObjBrowser(true);
860 }
861
862
863 //=============================================================================
864 /*!
865  *
866  */
867 //=============================================================================
868 void SMESHGUI::CreateLocalLength( QString TypeHypothesis, QString NameHypothesis, double Length )
869 {
870   QApplication::setOverrideCursor( Qt::waitCursor );
871   try {
872     SMESH::SMESH_Hypothesis_var Hyp = SMESH::SMESH_Hypothesis::_narrow( CreateHypothesis( TypeHypothesis, NameHypothesis ) );
873     SMESH::SMESH_LocalLength_var LL = SMESH::SMESH_LocalLength::_narrow( Hyp );
874     if ( !LL->_is_nil() )
875       LL->SetLength( Length );
876   }
877   catch  (const SALOME::SALOME_Exception& S_ex) {
878     QtCatchCorbaException(S_ex);
879   }
880   myActiveStudy->updateObjBrowser(true);
881   QApplication::restoreOverrideCursor();
882 }
883
884 //=============================================================================
885 /*!
886  *
887  */
888 //=============================================================================
889 void SMESHGUI::CreateMaxElementArea( QString TypeHypothesis, QString NameHypothesis, double MaxArea )
890 {
891   QApplication::setOverrideCursor( Qt::waitCursor );
892   try {
893     SMESH::SMESH_Hypothesis_var Hyp = SMESH::SMESH_Hypothesis::_narrow( CreateHypothesis( TypeHypothesis, NameHypothesis  ) );
894     SMESH::SMESH_MaxElementArea_var MaxElArea = SMESH::SMESH_MaxElementArea::_narrow( Hyp );
895     if ( !MaxElArea->_is_nil() )
896       MaxElArea->SetMaxElementArea( MaxArea );
897   }
898   catch  (SALOME::SALOME_Exception& S_ex) {
899     QtCatchCorbaException(S_ex);
900   } 
901
902   myActiveStudy->updateObjBrowser(true);
903   QApplication::restoreOverrideCursor();
904 }
905
906 //=============================================================================
907 /*!
908  *
909  */
910 //=============================================================================
911 void SMESHGUI::CreateMaxElementVolume( QString TypeHypothesis, QString NameHypothesis, double MaxVolume )
912 {
913   QApplication::setOverrideCursor( Qt::waitCursor );
914   try {
915     SMESH::SMESH_Hypothesis_var Hyp = SMESH::SMESH_Hypothesis::_narrow( CreateHypothesis( TypeHypothesis, NameHypothesis  ) );
916     SMESH::SMESH_MaxElementVolume_var MaxElVolume = SMESH::SMESH_MaxElementVolume::_narrow( Hyp );
917     if ( !MaxElVolume->_is_nil() )
918       MaxElVolume->SetMaxElementVolume( MaxVolume );
919   }
920   catch  (const SALOME::SALOME_Exception& S_ex) {
921     QtCatchCorbaException(S_ex);
922   } 
923   myActiveStudy->updateObjBrowser(true);
924   QApplication::restoreOverrideCursor();
925 }
926
927 //=============================================================================
928 /*!
929  *
930  */
931 //=============================================================================
932 void SMESHGUI::CreateNbSegments( QString TypeHypothesis, QString NameHypothesis, double nbSegments )
933 {
934   QApplication::setOverrideCursor( Qt::waitCursor );
935   try {
936     SMESH::SMESH_Hypothesis_var Hyp = SMESH::SMESH_Hypothesis::_narrow( CreateHypothesis( TypeHypothesis, NameHypothesis  ) );
937     SMESH::SMESH_NumberOfSegments_var NbS = SMESH::SMESH_NumberOfSegments::_narrow( Hyp );
938     if ( !NbS->_is_nil() )
939       NbS->SetNumberOfSegments( nbSegments );
940   }
941   catch  (const SALOME::SALOME_Exception& S_ex) {
942     QtCatchCorbaException(S_ex);
943   } 
944   myActiveStudy->updateObjBrowser(true);
945   QApplication::restoreOverrideCursor();
946 }
947
948 //=============================================================================
949 /*!
950  *
951  */
952 //=============================================================================
953 int SMESHGUI::GetNameOfSelectedIObjects( SALOME_Selection* Sel, QString& aName )
954 {
955   int nbSel = Sel->IObjectCount() ;
956   if ( nbSel == 1 ) {
957     Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
958     aName = IObject->getName();
959   } else {
960     aName = tr( "SMESH_OBJECTS_SELECTED" ).arg( nbSel );
961   }
962   return nbSel;
963 }
964
965 //=============================================================================
966 /*!
967  *
968  */
969 //=============================================================================
970 int SMESHGUI::GetNameOfSelectedNodes( SALOME_Selection* Sel, QString& aName )
971 {
972   int nbNodes = 0;
973   int nbSel = Sel->IObjectCount() ;
974   if ( nbSel == 1 ) {
975     Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
976     if ( !IObject->hasEntry() )
977       return -1;
978
979     Standard_Boolean res;
980     SMESH_Actor* ac = FindActorByEntry( IObject->getEntry(), res, true );
981     if ( !res )
982       return -1;
983
984     TColStd_MapOfInteger MapIndex;
985     Sel->GetIndex( IObject, MapIndex );
986     TColStd_MapIteratorOfMapOfInteger ite( MapIndex );
987     aName = " ";
988     nbNodes = MapIndex.Extent();
989     for ( ; ite.More(); ite.Next() ) {
990       aName = aName + QString("%1").arg(ac->GetIdSMESHDSNode(ite.Key())) + " ";
991     }
992   } else {
993     aName = "";
994   }
995   return nbNodes;
996 }
997
998 //=============================================================================
999 /*!
1000  *
1001  */
1002 //=============================================================================
1003 int SMESHGUI::GetNameOfSelectedElements( SALOME_Selection* Sel, QString& aName )
1004 {
1005   int nbElements = 0;
1006   int nbSel = Sel->IObjectCount() ;
1007   if ( nbSel == 1 ) {
1008     Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
1009     if ( !IObject->hasEntry() )
1010       return -1;
1011
1012     Standard_Boolean res;
1013     SMESH_Actor* ac = FindActorByEntry( IObject->getEntry(), res, true );
1014     if ( !res )
1015       return -1;
1016
1017     TColStd_MapOfInteger MapIndex;
1018     Sel->GetIndex( IObject, MapIndex );
1019     TColStd_MapIteratorOfMapOfInteger ite( MapIndex );
1020     aName = " ";
1021     nbElements = MapIndex.Extent();
1022     MESSAGE("GetNameOfSelectedElements(): number = " << nbElements);
1023     for ( ; ite.More(); ite.Next() ) {
1024       int idVTK = ite.Key();
1025       MESSAGE("GetNameOfSelectedElements(): VTK Id = " << idVTK);
1026       aName = aName + QString("%1").arg(ac->GetIdSMESHDSElement(idVTK)) + " ";
1027     }
1028   } else {
1029     aName = "";
1030   }
1031   return nbElements;
1032 }
1033
1034
1035 //=============================================================================
1036 /*!
1037  *
1038  */
1039 //=============================================================================
1040 int SMESHGUI::GetNameOfSelectedEdges( SALOME_Selection* Sel, QString& aName )
1041 {
1042   int nbElements = 0;
1043   int nbSel = Sel->IObjectCount() ;
1044   if ( nbSel == 1 ) {
1045     Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
1046     if ( !IObject->hasEntry() )
1047       return -1;
1048
1049     Standard_Boolean res;
1050     SMESH_Actor* ac = FindActorByEntry( IObject->getEntry(), res, true );
1051     if ( !res )
1052       return -1;
1053
1054     TColStd_MapOfInteger MapIndex;
1055     Sel->GetIndex( IObject, MapIndex );
1056     TColStd_MapIteratorOfMapOfInteger ite( MapIndex );
1057     aName = " ";
1058     nbElements = MapIndex.Extent();
1059     for ( ; ite.More(); ite.Next() ) {
1060       aName = aName + QString("%1").arg(ite.Key()) + " ";
1061     }
1062   } else {
1063     aName = "";
1064   }
1065   return nbElements;
1066 }
1067
1068
1069 //=============================================================================
1070 /*!
1071  *
1072  */
1073 //=============================================================================
1074 SMESH_Actor* SMESHGUI::FindActorByEntry(QString entry, 
1075                                         Standard_Boolean& testResult,
1076                                         bool onlyInActiveView)
1077 {
1078   int nbSf = myActiveStudy->getStudyFramesCount();
1079   for ( int i = 0; i < nbSf; i++ ) {
1080     QAD_StudyFrame* sf = myActiveStudy->getStudyFrame(i);
1081     if ( sf->getTypeView() == VIEW_VTK ) {
1082       vtkRenderer* Renderer = ((VTKViewer_ViewFrame*)sf->getRightFrame()->getViewFrame())->getRenderer();
1083       vtkActorCollection* theActors = Renderer->GetActors();
1084       theActors->InitTraversal();
1085       vtkActor *ac = theActors->GetNextActor();
1086       while(!(ac==NULL)) {
1087         if ( ac->IsA("SMESH_Actor") ) {
1088           SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( ac );
1089           if ( anActor->hasIO() ) {
1090             Handle(SALOME_InteractiveObject) IO = anActor->getIO();
1091             if ( strcmp( IO->getEntry(), entry ) == 0 ) {
1092               if ( onlyInActiveView ) {
1093                 if ( sf == myActiveStudy->getActiveStudyFrame() ) {
1094                   testResult = true;
1095                   return anActor;
1096                 }
1097               } else {
1098                 testResult = true;
1099                 return anActor;
1100               }
1101             }
1102           }
1103         }
1104         ac = theActors->GetNextActor();
1105       }
1106     }
1107   }
1108
1109   MESSAGE ( " Actor Not Found " )
1110   testResult = false;
1111   return SMESH_Actor::New();
1112 }
1113
1114 //=============================================================================
1115 /*!
1116  *
1117  */
1118 //=============================================================================
1119 SMESH_Actor* SMESHGUI::FindActor(SMESH::SMESH_Mesh_ptr aMesh, 
1120                                  Standard_Boolean& testResult,
1121                                  bool onlyInActiveView)
1122 {
1123   SALOMEDS::SObject_var SM = myStudyAPI.FindMesh( aMesh );
1124   if ( SM->_is_nil() ) {
1125     MESSAGE ( " Actor Not Found " )
1126     
1127     testResult = false;
1128     return SMESH_Actor::New();
1129   }
1130
1131   return FindActorByEntry( SM->GetID(), testResult, onlyInActiveView);
1132 }
1133
1134 //=============================================================================
1135 /*!
1136  *
1137  */
1138 //=============================================================================
1139 SMESH::SMESH_Mesh_ptr SMESHGUI::ConvertIOinMesh(const Handle(SALOME_InteractiveObject)& IO, 
1140                                                 Standard_Boolean& testResult)
1141 {
1142   SMESH::SMESH_Mesh_var aMesh;
1143   testResult = false ;
1144
1145   /* case SObject */
1146   if ( IO->hasEntry() ) {
1147     SALOMEDS::SObject_var obj = myStudy->FindObjectID( IO->getEntry() );
1148     SALOMEDS::GenericAttribute_var anAttr;
1149     SALOMEDS::AttributeIOR_var     anIOR;
1150     if ( !obj->_is_nil() ) {
1151        if (obj->FindAttribute(anAttr, "AttributeIOR")) {
1152          anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
1153          aMesh = SMESH::SMESH_Mesh::_narrow( _orb->string_to_object(anIOR->Value()) );
1154          if ( !aMesh->_is_nil() ) {
1155            testResult = true ;
1156            return SMESH::SMESH_Mesh::_duplicate( aMesh );
1157          }
1158        }
1159     }
1160   } 
1161   return SMESH::SMESH_Mesh::_nil();
1162 }
1163
1164 //=============================================================================
1165 /*!
1166  *
1167  */
1168 //=============================================================================
1169 SMESH::SMESH_subMesh_ptr SMESHGUI::ConvertIOinSubMesh(const Handle(SALOME_InteractiveObject)& IO, 
1170                                                       Standard_Boolean& testResult)
1171 {
1172   SMESH::SMESH_subMesh_var aSubMesh;
1173   testResult = false ;
1174
1175   /* case SObject */
1176   if ( IO->hasEntry() ) {
1177     SALOMEDS::SObject_var obj = myStudy->FindObjectID( IO->getEntry() );
1178     SALOMEDS::GenericAttribute_var anAttr;
1179     SALOMEDS::AttributeIOR_var     anIOR;
1180     if ( !obj->_is_nil() ) {
1181        if (obj->FindAttribute(anAttr, "AttributeIOR")) {
1182          anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
1183          aSubMesh = SMESH::SMESH_subMesh::_narrow( _orb->string_to_object(anIOR->Value()) );
1184          if ( !aSubMesh->_is_nil() ) {
1185            testResult = true ;
1186            return SMESH::SMESH_subMesh::_duplicate( aSubMesh );
1187          }
1188        }
1189     }
1190   } 
1191   return SMESH::SMESH_subMesh::_nil();
1192 }
1193
1194 //=============================================================================
1195 /*!
1196  *
1197  */
1198 //=============================================================================
1199 SMESH::SMESH_Hypothesis_ptr SMESHGUI::ConvertIOinSMESHHypothesis( const Handle(SALOME_InteractiveObject)& IO, 
1200                                                                   Standard_Boolean& testResult )
1201 {
1202   SMESH::SMESH_Hypothesis_var aHyp ;
1203   testResult = false ;
1204
1205   /* case SObject */
1206   if ( IO->hasEntry() ) {
1207     SALOMEDS::SObject_var obj = myStudy->FindObjectID( IO->getEntry() );
1208     SALOMEDS::GenericAttribute_var anAttr;
1209     SALOMEDS::AttributeIOR_var     anIOR;
1210     if ( !obj->_is_nil() ) {
1211        if (obj->FindAttribute(anAttr, "AttributeIOR")) {
1212          anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
1213          aHyp = SMESH::SMESH_Hypothesis::_narrow( _orb->string_to_object(anIOR->Value()));
1214          if ( !aHyp->_is_nil() ) {
1215            testResult = true ;
1216            return SMESH::SMESH_Hypothesis::_duplicate( aHyp );
1217          }
1218        }
1219     }
1220   } 
1221   return SMESH::SMESH_Hypothesis::_nil();
1222 }
1223
1224
1225
1226 //=============================================================================
1227 /*!
1228  *
1229  */
1230 //=============================================================================
1231 GEOM::GEOM_Shape_ptr SMESHGUI::ConvertIOinGEOMShape( const Handle(SALOME_InteractiveObject)& IO, 
1232                                                Standard_Boolean& testResult )
1233 {
1234   GEOM::GEOM_Shape_var aShape ;
1235   testResult = false ;
1236
1237   /* case SObject */
1238   if ( IO->hasEntry() ) {
1239     SALOMEDS::SObject_var obj = myStudy->FindObjectID( IO->getEntry() );
1240     SALOMEDS::GenericAttribute_var anAttr;
1241     SALOMEDS::AttributeIOR_var     anIOR;
1242     if ( !obj->_is_nil() ) {
1243        if (obj->FindAttribute(anAttr, "AttributeIOR")) {
1244          anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
1245          aShape = myComponentGeom->GetIORFromString(anIOR->Value()) ;
1246          if ( !aShape->_is_nil() ) {
1247            testResult = true ;
1248            return GEOM::GEOM_Shape::_duplicate( aShape );
1249          }
1250        }
1251     }
1252   }
1253   return GEOM::GEOM_Shape::_nil();
1254 }
1255
1256
1257 //=============================================================================
1258 /*!
1259  *
1260  */
1261 //=============================================================================
1262 void SMESHGUI::SetViewMode(int commandId)
1263 {
1264   SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1265   int nbSel = Sel->IObjectCount();
1266   if ( nbSel >= 1 ) {
1267     SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
1268     for ( ; It.More(); It.Next() ) {
1269       Handle(SALOME_InteractiveObject) IObject = It.Value();
1270       if ( IObject->hasEntry() ) {
1271         Standard_Boolean res;
1272         SMESH_Actor* ac = FindActorByEntry( IObject->getEntry(), res, true );
1273         if ( res ) {
1274           switch (commandId) {
1275           case 211: {
1276             ChangeRepresentation( ac, 0 );
1277             break;
1278           }
1279           case 212: {
1280             ChangeRepresentation( ac, 1 );
1281             break;
1282           }
1283           case 213: {
1284             ChangeRepresentation( ac, 2 );
1285             break;
1286           }
1287           case 1132: {
1288             ChangeRepresentation( ac, 3 );
1289             break;
1290           }
1291           }
1292         }
1293       }
1294     }
1295     if ( commandId == 1133 ) {
1296       ChangeRepresentation( SMESH_Actor::New(), 4 );
1297     }
1298   }
1299 }
1300
1301 //=============================================================================
1302 /*!
1303  *
1304  */
1305 //=============================================================================
1306 void SMESHGUI::ChangeRepresentation( SMESH_Actor* ac, int type )
1307 {
1308   if (ac->DataSource == NULL && type != 4 )
1309     return;
1310
1311   if ( type != 4 ) {
1312     if ( ac->getMapper() == NULL ) {
1313       return;
1314     }
1315   }
1316   switch (type) {
1317   case 0 : {
1318     QApplication::setOverrideCursor( Qt::waitCursor );
1319     if (ac->getDisplayMode()==2) {
1320       vtkDataSetMapper* meshMapper = (vtkDataSetMapper*) (ac->getMapper());
1321       meshMapper->SetInput(ac->DataSource);
1322     }
1323     ac->setDisplayMode(0);
1324     ac->GetProperty()->SetRepresentationToWireframe();
1325     //    ac->SetActorProperty( ac->GetProperty() );
1326     QApplication::restoreOverrideCursor();
1327     break;
1328   }
1329   case 1 : {
1330     QApplication::setOverrideCursor( Qt::waitCursor );
1331     if (ac->getDisplayMode()==2) {
1332       vtkDataSetMapper* meshMapper = (vtkDataSetMapper*) (ac->getMapper());
1333       meshMapper->SetInput(ac->DataSource);
1334     }
1335     ac->setDisplayMode(1);
1336     ac->GetProperty()->SetRepresentationToSurface();
1337     QApplication::restoreOverrideCursor();
1338     //    ac->SetActorProperty( ac->GetProperty() );
1339     break;
1340   }
1341   case 2 : {
1342     //    if (!(ac->getDisplayMode()==2)) {
1343     //    ChangeRepresentation(ac, 1);
1344     QApplication::setOverrideCursor( Qt::waitCursor );
1345     ac->setDisplayMode(2);
1346     vtkDataSetMapper* meshMapper = (vtkDataSetMapper*) (ac->getMapper());
1347     meshMapper->SetInput(ac->DataSource);
1348     vtkShrinkFilter *shrink = vtkShrinkFilter::New();
1349     shrink->SetInput(meshMapper->GetInput());
1350     shrink->SetShrinkFactor(ac->GetShrinkFactor());
1351     
1352     meshMapper->SetInput( shrink->GetOutput() );
1353     ac->SetMapper( meshMapper );
1354     QApplication::restoreOverrideCursor();
1355     //    }
1356     break;
1357   }
1358   case 3:
1359     {
1360       float color[3];
1361       float edgecolor[3];
1362       float backfacecolor[3];
1363       float nodecolor[3];
1364       ac->GetColor(color[0],color[1],color[2]);
1365       QColor c(color[0]*255,color[1]*255,color[2]*255);
1366       ac->GetEdgeColor(edgecolor[0],edgecolor[1],edgecolor[2]);
1367       QColor e(edgecolor[0]*255,edgecolor[1]*255,edgecolor[2]*255);
1368       ac->GetBackfaceProperty()->GetColor(backfacecolor);
1369       QColor b(backfacecolor[0]*255,backfacecolor[1]*255,backfacecolor[2]*255);
1370       ac->GetNodeColor(nodecolor[0], nodecolor[1], nodecolor[2] ) ;
1371       QColor n(nodecolor[0]*255, nodecolor[1]*255, nodecolor[2]*255 ) ;
1372
1373       int Edgewidth = (int)ac->EdgeDevice->GetProperty()->GetLineWidth();
1374       if ( Edgewidth == 0 )
1375         Edgewidth = 1;
1376       int intValue = ac->GetNodeSize() ;
1377       float Shrink = ac->GetShrinkFactor();
1378  
1379       SMESHGUI_Preferences_ColorDlg *aDlg = new SMESHGUI_Preferences_ColorDlg( QAD_Application::getDesktop(), "" ) ;
1380       aDlg->SetColor(1,c);
1381       aDlg->SetColor(2,e);
1382       aDlg->SetColor(3,n);
1383       aDlg->SetColor(4,b);
1384       aDlg->SetIntValue(1,Edgewidth);
1385       aDlg->SetIntValue(2,intValue);
1386       aDlg->SetIntValue(3,int(Shrink*100.));
1387
1388       if ( aDlg->exec() ) {
1389         QApplication::setOverrideCursor( Qt::waitCursor );
1390         QColor color = aDlg->GetColor(1);
1391         QColor edgecolor = aDlg->GetColor(2);
1392         QColor nodecolor = aDlg->GetColor(3);
1393         QColor backfacecolor = aDlg->GetColor(4);
1394         /* actor color and backface color */
1395         ac->GetProperty()->SetColor(float(color.red())/255.,float(color.green())/255.,float(color.blue())/255.);
1396         ac->SetColor(float(color.red())/255.,float(color.green())/255.,float(color.blue())/255.);
1397         ac->GetBackfaceProperty()->SetColor(float(backfacecolor.red())/255.,float(backfacecolor.green())/255.,float(backfacecolor.blue())/255.);
1398
1399         /* edge color */
1400         ac->EdgeDevice->GetProperty()->SetColor(float(edgecolor.red())/255.,
1401                                                 float(edgecolor.green())/255.,
1402                                                 float(edgecolor.blue())/255.);
1403         ac->EdgeShrinkDevice->GetProperty()->SetColor(float(edgecolor.red())/255.,
1404                                                       float(edgecolor.green())/255.,
1405                                                       float(edgecolor.blue())/255.);
1406         ac->SetEdgeColor(float(edgecolor.red())/255.,
1407                          float(edgecolor.green())/255.,
1408                          float(edgecolor.blue())/255.);
1409
1410         /* Shrink factor and size edges */
1411         ac->SetShrinkFactor( aDlg->GetIntValue(3)/100. );
1412         ac->EdgeDevice->GetProperty()->SetLineWidth( aDlg->GetIntValue(1) );    
1413         ac->EdgeShrinkDevice->GetProperty()->SetLineWidth( aDlg->GetIntValue(1) );
1414
1415         /* Nodes color and size */
1416         ac->SetNodeColor(float(nodecolor.red())/255.,
1417                          float(nodecolor.green())/255.,
1418                          float(nodecolor.blue())/255.);
1419         ac->SetNodeSize(aDlg->GetIntValue(2)) ;
1420         
1421         if (ac->getDisplayMode()==2) {
1422           vtkDataSetMapper* meshMapper = (vtkDataSetMapper*) (ac->getMapper());
1423           meshMapper->SetInput(ac->DataSource);
1424           vtkShrinkFilter *shrink = vtkShrinkFilter::New();
1425           shrink->SetInput(meshMapper->GetInput());
1426           shrink->SetShrinkFactor(ac->GetShrinkFactor());
1427           
1428           meshMapper->SetInput( shrink->GetOutput() );
1429           ac->SetMapper( meshMapper );
1430         }
1431       }
1432       delete aDlg;
1433       QApplication::restoreOverrideCursor();
1434       break;
1435     }
1436   case 4:
1437     {
1438       EmitSignalDeactivateDialog() ;
1439       SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1440       SMESHGUI_TransparencyDlg *aDlg = new SMESHGUI_TransparencyDlg( QAD_Application::getDesktop(), "", Sel) ;
1441       break;
1442     }
1443   case 5: {
1444     QApplication::setOverrideCursor( Qt::waitCursor );
1445     ac->GetProperty()->SetRepresentationToPoints();
1446     QApplication::restoreOverrideCursor();
1447     break;
1448   }
1449   }
1450
1451   QApplication::setOverrideCursor( Qt::waitCursor );
1452   if ( myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) { //VTK
1453     vtkRenderer *theRenderer = ((VTKViewer_ViewFrame*)myActiveStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRenderer();
1454     theRenderer->Render();
1455   }
1456   QApplication::restoreOverrideCursor();
1457 }
1458
1459 //=============================================================================
1460 /*!
1461  *
1462  */
1463 //=============================================================================
1464 void SMESHGUI::UpdateView()
1465 {
1466   if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK) 
1467     return;
1468
1469   vtkRenderer *theRenderer = ((VTKViewer_ViewFrame*)myActiveStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRenderer();
1470   theRenderer->Render();
1471 }
1472
1473 //=============================================================================
1474 /*!
1475  *
1476  */
1477 //=============================================================================
1478 void SMESHGUI::DisplayActor(SMESH_Actor* ac, bool visibility)
1479 {
1480   if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK) 
1481     return;
1482
1483   MESSAGE("DisplayActor(): DataSource = " << ac->DataSource);
1484
1485   vtkRenderer *theRenderer = ((VTKViewer_ViewFrame*)myActiveStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRenderer();
1486   vtkActorCollection* theActors = theRenderer->GetActors();
1487   theActors->InitTraversal();
1488   if ( theActors->IsItemPresent(ac) == 0 ) {
1489     vtkProperty* prop = vtkProperty::New();
1490     prop->SetColor( QAD_CONFIG->getSetting("SMESH:SettingsFillColorRed").toFloat()/255., 
1491                     QAD_CONFIG->getSetting("SMESH:SettingsFillColorGreen").toFloat()/255.,
1492                     QAD_CONFIG->getSetting("SMESH:SettingsFillColorBlue").toFloat()/255. ) ;
1493
1494     prop->SetPointSize( QAD_CONFIG->getSetting("SMESH:SettingsNodesSize").toInt());
1495     prop->SetLineWidth( QAD_CONFIG->getSetting("SMESH:SettingsWidth").toInt() );
1496     ac->SetProperty( prop );
1497     ac->SetColor( QAD_CONFIG->getSetting("SMESH:SettingsFillColorRed").toFloat()/255., 
1498                   QAD_CONFIG->getSetting("SMESH:SettingsFillColorGreen").toFloat()/255.,
1499                   QAD_CONFIG->getSetting("SMESH:SettingsFillColorBlue").toFloat()/255. );
1500
1501     //    prop->BackfaceCullingOn();
1502     vtkProperty* backprop = vtkProperty::New();
1503     backprop->SetColor( QAD_CONFIG->getSetting("SMESH:SettingsBackFaceColorRed").toFloat()/255., 
1504                         QAD_CONFIG->getSetting("SMESH:SettingsBackFaceColorGreen").toFloat()/255.,
1505                         QAD_CONFIG->getSetting("SMESH:SettingsBackFaceColorBlue").toFloat()/255. ) ;
1506     ac->SetBackfaceProperty(backprop);
1507
1508     int intValue = QAD_CONFIG->getSetting("SMESH:SettingsShrinkCoeff").toInt();
1509     if (intValue == 0 )
1510       intValue = 80;       
1511     ac->SetShrinkFactor( intValue/100. );
1512
1513     ac->GetMapper()->SetResolveCoincidentTopologyToShiftZBuffer();
1514     ac->GetMapper()->SetResolveCoincidentTopologyZShift(0.02);
1515
1516     QString DisplayMode = QAD_CONFIG->getSetting("SMESH:DisplayMode");
1517     if ( DisplayMode.compare("Wireframe") == 0 ){
1518       ac->setDisplayMode(0);
1519       ChangeRepresentation( ac, 0 );
1520     } else if ( DisplayMode.compare("Shading") == 0 ){
1521       ac->setDisplayMode(1);
1522       ChangeRepresentation( ac, 1 );
1523     } else if ( DisplayMode.compare("Shrink") == 0 ) {
1524       ac->setDisplayMode(2);
1525       ChangeRepresentation( ac, 2 );
1526     }
1527     theRenderer->AddActor(ac);
1528   } else {
1529     if (ac->GetMapper())
1530       ac->GetMapper()->Update();
1531   }
1532  
1533 //  if ( visibility )
1534   ac->SetVisibility(visibility);
1535 //    ac->VisibilityOn();
1536 //  else
1537 //    ac->VisibilityOff();
1538
1539   vtkRenderWindow *renWin = theRenderer->GetRenderWindow();
1540   renWin->Render();
1541 }
1542
1543 //=============================================================================
1544 /*!
1545  *
1546  */
1547 //=============================================================================
1548 void SMESHGUI::EraseActor(SMESH_Actor* ac)
1549 {
1550   if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK) 
1551     return;
1552
1553   vtkRenderer *theRenderer = ((VTKViewer_ViewFrame*)myActiveStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRenderer();
1554
1555   //NRI- : 02/12/2002 : Fixed bugId 882
1556   //  ac->EdgeDevice->VisibilityOff();
1557   //  ac->EdgeShrinkDevice->VisibilityOff();
1558   //  ac->VisibilityOff();
1559   ac->SetVisibility( false );
1560
1561   theRenderer->Render();
1562 }
1563
1564 //=============================================================================
1565 /*!
1566  *
1567  */
1568 //=============================================================================
1569 bool SMESHGUI::AddActorInSelection(SMESH_Actor* ac)
1570 {
1571   SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1572   Sel->ClearIObjects();
1573   if ( ac->hasIO() )
1574     return Sel->AddIObject( ac->getIO() );
1575   else
1576     return -1;
1577 }
1578
1579 //=============================================================================
1580 /*!
1581  *
1582  */
1583 //=============================================================================
1584 QString SMESHGUI::CheckHomogeneousSelection()
1585 {
1586   SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
1587   /* copy the list */
1588   SALOME_ListIO List;
1589   SALOME_ListIteratorOfListIO Itinit( Sel->StoredIObjects() );
1590   for (; Itinit.More(); Itinit.Next()) {
1591     List.Append(Itinit.Value());
1592   }
1593
1594   QString RefType = CheckTypeObject( Sel->firstIObject() );
1595   SALOME_ListIteratorOfListIO It( List );
1596   for (; It.More(); It.Next()) {
1597     Handle(SALOME_InteractiveObject) IObject = It.Value();
1598     QString Type = CheckTypeObject( IObject );
1599     if ( Type.compare( RefType ) != 0 )
1600       return "Heterogeneous Selection";
1601   }
1602
1603   Sel->ClearIObjects();
1604   SALOME_ListIteratorOfListIO It1( List );
1605   for(;It1.More();It1.Next()) {
1606     int res = Sel->AddIObject( It1.Value() );
1607     if ( res == -1 )
1608       myActiveStudy->highlight( It1.Value(), false );
1609     if ( res == 0 )
1610       myActiveStudy->highlight( It1.Value(), true );
1611   }
1612   return RefType;
1613 }
1614
1615 //=============================================================================
1616 /*!
1617  *
1618  */
1619 //=============================================================================
1620 QString SMESHGUI::CheckTypeObject(const Handle(SALOME_InteractiveObject)& IO)
1621 {
1622   SALOMEDS::SObject_var sobj = smeshGUI->myActiveStudy->getStudyDocument()->FindObjectID(IO->getEntry());
1623   if (!sobj->_is_nil()) {
1624     SALOMEDS::SComponent_var scomp = sobj->GetFatherComponent();
1625     if (strcmp(scomp->GetID(), IO->getEntry()) == 0) { // component is selected
1626       return "Component";
1627     }
1628   }
1629
1630   SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
1631   Sel->ClearIObjects();
1632
1633   Handle(SMESH_TypeFilter) aHypFilter = new SMESH_TypeFilter( HYPOTHESIS );
1634   Handle(SMESH_TypeFilter) anAlgoFilter = new SMESH_TypeFilter( ALGORITHM );
1635   Handle(SMESH_TypeFilter) aMeshFilter = new SMESH_TypeFilter( MESH );
1636   Handle(SMESH_TypeFilter) aSubMeshFilter = new SMESH_TypeFilter( SUBMESH );
1637   Handle(SMESH_TypeFilter) aMeshOrSubMeshFilter = new SMESH_TypeFilter( MESHorSUBMESH );
1638   Handle(SMESH_TypeFilter) aSubMeshVextexFilter = new SMESH_TypeFilter( SUBMESH_VERTEX );
1639   Handle(SMESH_TypeFilter) aSubMeshEdgeFilter = new SMESH_TypeFilter( SUBMESH_EDGE );
1640   Handle(SMESH_TypeFilter) aSubMeshFaceFilter = new SMESH_TypeFilter( SUBMESH_FACE );
1641   Handle(SMESH_TypeFilter) aSubMeshSolidFilter = new SMESH_TypeFilter( SUBMESH_SOLID );
1642   Handle(SMESH_TypeFilter) aSubMeshCompoundFilter = new SMESH_TypeFilter( SUBMESH_COMPOUND );
1643   
1644   Sel->AddFilter(aHypFilter);
1645   if ( Sel->AddIObject( IO ) != -1 ) {
1646     Sel->ClearFilters();
1647     return "Hypothesis";
1648   } 
1649
1650   Sel->ClearFilters();
1651   Sel->AddFilter(anAlgoFilter);
1652   if ( Sel->AddIObject( IO ) != -1 ) {
1653     Sel->ClearFilters();
1654     return "Algorithm";
1655   } 
1656
1657   Sel->ClearFilters();
1658   Sel->AddFilter(aMeshFilter);
1659   if ( Sel->AddIObject( IO ) != -1 ) {
1660     Sel->ClearFilters();
1661     return "Mesh";
1662   } 
1663
1664   Sel->ClearFilters();
1665   Sel->AddFilter(aSubMeshFilter);
1666   if ( Sel->AddIObject( IO ) != -1 ) {
1667     Sel->ClearFilters();
1668     return "SubMesh";
1669   } 
1670  
1671   Sel->ClearFilters();
1672   Sel->AddFilter(aSubMeshVextexFilter);
1673   if ( Sel->AddIObject( IO ) != -1 ) {
1674     Sel->ClearFilters();
1675     return "SubMeshVertex";
1676   } 
1677  
1678   Sel->ClearFilters();
1679   Sel->AddFilter(aSubMeshEdgeFilter);
1680   if ( Sel->AddIObject( IO ) != -1 ){
1681     Sel->ClearFilters();
1682     return "SubMeshEdge";
1683   } 
1684   
1685   Sel->ClearFilters();
1686   Sel->AddFilter(aSubMeshFaceFilter);
1687   if ( Sel->AddIObject( IO ) != -1 ) {
1688     Sel->ClearFilters();
1689     return "SubMeshFace";
1690   } 
1691   
1692   Sel->ClearFilters();
1693   Sel->AddFilter(aSubMeshSolidFilter);
1694   if ( Sel->AddIObject( IO ) != -1 ) {
1695     Sel->ClearFilters();
1696     return "SubMeshSolid";
1697   } 
1698   
1699   Sel->ClearFilters();
1700   Sel->AddFilter(aSubMeshCompoundFilter);
1701   if ( Sel->AddIObject( IO ) != -1 ) {
1702     Sel->ClearFilters();
1703     return "SubMeshCompound";
1704   } 
1705   
1706   Sel->ClearFilters();
1707   Sel->AddIObject( IO );
1708   return "NoType";
1709 }
1710
1711 //=============================================================================
1712 /*!
1713  *
1714  */
1715 //=============================================================================
1716 bool SMESHGUI::OnGUIEvent(int theCommandID,     QAD_Desktop* parent)
1717 {
1718   /* Create or retrieve an object SMESHGUI */
1719   SMESHGUI::GetOrCreateSMESHGUI(parent);
1720
1721   // NRI : Temporary added
1722   if ( smeshGUI->myStudy->GetProperties()->IsLocked() ) {
1723     return false;
1724   }
1725   //NRI
1726
1727   //  QAD_Viewer3d* v3d;
1728   OCCViewer_Viewer3d* v3d;
1729   
1730   Handle(AIS_InteractiveContext) ic;
1731   vtkRenderer* Renderer;
1732   vtkRenderWindow* RenWin;
1733
1734   if ( smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_OCC ) {
1735     v3d =((OCCViewer_ViewFrame*)smeshGUI->myActiveStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer(); 
1736     ic = v3d->getAISContext();
1737   } else if ( smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) {
1738     Renderer = ((VTKViewer_ViewFrame*)smeshGUI->myActiveStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRenderer();
1739     RenWin = Renderer->GetRenderWindow();
1740   }
1741
1742   switch (theCommandID)
1743     {
1744     case 33: // DELETE
1745       smeshGUI->OnEditDelete();
1746       break;
1747
1748     case 113: // IMPORT
1749     case 112:
1750     case 111: 
1751       {
1752         Import_Document(parent,theCommandID);//NBU
1753         //Import_Mesh(parent,theCommandID);
1754         break;
1755       }
1756
1757     case 122: // EXPORT MED
1758     case 121:
1759     case 123:
1760       {
1761         Export_Mesh(parent, theCommandID);
1762         break;
1763       }
1764
1765     case 200: // SCALAR BAR
1766       {
1767         smeshGUI->DisplayScalarBar(false);
1768         break;
1769       }
1770     case 201:
1771       {
1772         SMESHGUI_EditScalarBarDlg *aDlg = new SMESHGUI_EditScalarBarDlg( parent, "", false ) ;
1773         aDlg->show();
1774         break;
1775       }
1776     case 202:
1777       {
1778         smeshGUI->DisplayScalarBar( true );
1779         break;
1780       }      
1781
1782     case 1133: // DISPLAY MODE : WireFrame, Surface, Shrink
1783     case 1132:
1784     case 213:
1785     case 212:
1786     case 211:
1787       {
1788         smeshGUI->SetViewMode(theCommandID);
1789         break;
1790       }
1791       
1792     case 214 : // UPDATE
1793       {
1794         smeshGUI->Update();
1795         break;
1796       }
1797  
1798     case 300 : // ERASE
1799       {
1800         SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
1801         if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) {
1802           // VTK
1803           SALOME_ListIteratorOfListIO It(Sel->StoredIObjects());
1804           for(;It.More();It.Next()) {
1805             Handle(SALOME_InteractiveObject) IOS = It.Value();
1806             if ( IOS->hasEntry() ) {
1807               Standard_Boolean res;
1808               SMESH_Actor *ac = smeshGUI->FindActorByEntry(IOS->getEntry(), res, true );
1809               if ( res ) smeshGUI->EraseActor( ac );
1810             }
1811           }
1812         }
1813         Sel->ClearIObjects();
1814         smeshGUI->myActiveStudy->updateObjBrowser( true );
1815       }
1816      
1817     case 301 : // DISPLAY
1818       {
1819         if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) {
1820           // VTK
1821           QApplication::setOverrideCursor( Qt::waitCursor );
1822           SALOMEDS::SObject_var fatherSF = 
1823             smeshGUI->myStudy->FindObjectID(smeshGUI->myActiveStudy->getActiveStudyFrame()->entry());
1824
1825           SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
1826           SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
1827           
1828           for(;It.More();It.Next()) {
1829             Handle(SALOME_InteractiveObject) IObject = It.Value();
1830             if ( IObject->hasEntry() ) {
1831               Standard_Boolean res;
1832               SMESH_Actor *ac = smeshGUI->FindActorByEntry(IObject->getEntry(), res, true );
1833               if ( res ) {
1834                 smeshGUI->DisplayActor( ac, true );
1835                 smeshGUI->DisplayEdges( ac ); 
1836                 smeshGUI->ChangeRepresentation( ac, ac->getDisplayMode() );
1837               }
1838             }
1839           }
1840           QApplication::restoreOverrideCursor();
1841         }
1842         break;
1843       }
1844
1845     case 302 : // DISPLAY ONLY
1846       {
1847         if ( smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) {
1848           QApplication::setOverrideCursor( Qt::waitCursor );
1849           vtkActorCollection* theActors = Renderer->GetActors();
1850           theActors->InitTraversal();
1851           vtkActor *ac = theActors->GetNextActor();
1852           while(!(ac==NULL)) {
1853             if ( ac->IsA("SMESH_Actor") ) {
1854               SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( ac );
1855               if(!anActor->isHighlighted()) {
1856                 //anActor->VisibilityOff();
1857                 //NRI- : 02/12/2002 : Fixed bugId 882
1858                 //              anActor->EdgeDevice->VisibilityOff();
1859                 //              anActor->EdgeShrinkDevice->VisibilityOff();
1860                 anActor->SetVisibility( false );
1861               }
1862             }
1863             ac = theActors->GetNextActor();
1864           }
1865
1866           // Display selection
1867           SALOMEDS::SObject_var fatherSF = smeshGUI->myStudy->FindObjectID(smeshGUI->myActiveStudy->getActiveStudyFrame()->entry());
1868           
1869           SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
1870           SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
1871           
1872           for(;It.More();It.Next()) {
1873             Handle(SALOME_InteractiveObject) IObject = It.Value();
1874             SALOMEDS::SObject_var obj = smeshGUI->myStudy->FindObjectID( IObject->getEntry() );
1875             
1876             VTKViewer_RenderWindowInteractor* myRenderInter= ((VTKViewer_ViewFrame*)smeshGUI->myActiveStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRWInteractor();
1877             //      vtkQGLRenderWindowInteractor* myRenderInter= smeshGUI->myActiveStudy->getActiveStudyFrame()->getRightFrame()->getVTKView()->getRWInteractor();
1878             
1879             if(myRenderInter->isInViewer(IObject)) {
1880               if ( IObject->hasEntry() ) {
1881                 Standard_Boolean res;
1882                 SMESH_Actor *ac = smeshGUI->FindActorByEntry(IObject->getEntry(), res, true );
1883                 if ( res ) {
1884                   smeshGUI->DisplayActor( ac, true );
1885                   smeshGUI->DisplayEdges( ac ); 
1886                   smeshGUI->ChangeRepresentation( ac, ac->getDisplayMode() );
1887                 }
1888               }
1889             }
1890           }
1891           smeshGUI->myActiveStudy->updateObjBrowser( true );
1892           QApplication::restoreOverrideCursor();
1893         }
1894         break;
1895       }
1896
1897     case 400: // NODES
1898       {
1899         if ( smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) { //VTK
1900           smeshGUI->EmitSignalDeactivateDialog() ;
1901           SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
1902           Sel->ClearIObjects();
1903           smeshGUI->myDesktop->SetSelectionMode(1, true);
1904           parent->menuBar()->setItemChecked(9010, false );
1905           parent->menuBar()->setItemChecked(9011, false );
1906           smeshGUI->ViewNodes();
1907           SMESHGUI_NodesDlg *aDlg = new SMESHGUI_NodesDlg( parent, "", Sel ) ;
1908         } else {
1909           QApplication::restoreOverrideCursor();
1910             QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
1911                                    tr ("SMESH_WRN_VIEWER_VTK"), tr ("SMESH_BUT_YES") );
1912         }
1913         break;
1914       }
1915
1916     case 405: // MOVE NODE
1917       {
1918           smeshGUI->myDesktop->SetSelectionMode(1, true);
1919           SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
1920           SMESHGUI_MoveNodesDlg *aDlg = new SMESHGUI_MoveNodesDlg( parent, "", Sel ) ;
1921           break;
1922       }
1923
1924     case 701: // COMPUTE MESH 
1925       {
1926         if ( smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) { //VTK
1927           SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
1928           int nbSel = Sel->IObjectCount();
1929           if ( nbSel != 1 ) {
1930             QApplication::restoreOverrideCursor();
1931             break;
1932           }
1933
1934           SMESH::SMESH_Mesh_var aM;
1935           SMESH::SMESH_subMesh_var aSubM;
1936           Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
1937           if ( IObject->hasEntry() ) {
1938             SALOMEDS::SObject_var aMorSM = smeshGUI->myStudy->FindObjectID( IObject->getEntry() );
1939             SALOMEDS::GenericAttribute_var anAttr;
1940             SALOMEDS::AttributeIOR_var     anIOR;
1941             if ( !aMorSM->_is_nil() ) {
1942               if (aMorSM->FindAttribute(anAttr, "AttributeIOR") ) {
1943                 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
1944                 MESSAGE( "SMESHGUI::OnGUIEvent - Compute mesh : IOR = " << anIOR->Value() )
1945                 CORBA::Object_var cobj;
1946                 try {
1947                   cobj = _orb->string_to_object(anIOR->Value());
1948                   if ( CORBA::is_nil(cobj) ) {
1949                     MESSAGE( "SMESHGUI::OnGUIEvent - Compute mesh : nil object" )
1950                   }
1951                 }
1952                 catch(CORBA::COMM_FAILURE& ex) {
1953                   MESSAGE( "SMESHGUI::OnGUIEvent - Compute mesh : exception (1)" )
1954                 }
1955                 aM = SMESH::SMESH_Mesh::_narrow(cobj);
1956                 //aM = SMESH::SMESH_Mesh::_narrow( _orb->string_to_object(anIOR->Value()) );
1957                 aSubM = SMESH::SMESH_subMesh::_narrow( _orb->string_to_object(anIOR->Value()) );
1958                 if ( !aM->_is_nil() ) {
1959                   GEOM::GEOM_Shape_var refShape = smeshGUI->myStudyAPI.GetShapeOnMeshOrSubMesh(aMorSM);
1960                   if ( !refShape->_is_nil() ) {
1961                     bool compute = smeshGUI->myComponentMesh->IsReadyToCompute(aM, refShape);
1962                     if ( !compute ) {
1963                       QApplication::restoreOverrideCursor();
1964                       QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
1965                                               tr ("SMESH_WRN_MISSING_PARAMETERS"), tr ("SMESH_BUT_YES") );
1966                       break;
1967                     }
1968                     try {
1969                       smeshGUI->myComponentMesh->Compute( aM, refShape);
1970                       smeshGUI->myStudyAPI.ModifiedMesh( aMorSM, true );
1971                       // TO Do : change icon of all submeshes
1972                     }
1973                     catch  (const SALOME::SALOME_Exception& S_ex) {
1974                       QtCatchCorbaException(S_ex);
1975                     }
1976                   }
1977                 } else if ( !aSubM->_is_nil() ) {
1978                   aM = aSubM->GetFather();
1979                   GEOM::GEOM_Shape_var refShape = smeshGUI->myStudyAPI.GetShapeOnMeshOrSubMesh(aMorSM);
1980                   if ( !refShape->_is_nil() ) {
1981                     bool compute = smeshGUI->myComponentMesh->IsReadyToCompute(aM, refShape);
1982                     if ( !compute ) {
1983                       QApplication::restoreOverrideCursor();
1984                       QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
1985                                               tr ("SMESH_WRN_MISSING_PARAMETERS"), tr ("SMESH_BUT_YES") );
1986                       break;
1987                     }
1988                     try {
1989                       smeshGUI->myComponentMesh->Compute( aM, refShape);
1990                       smeshGUI->myStudyAPI.ModifiedMesh( aMorSM, true );
1991                       // TO Do : change icon of all submeshes
1992                     }
1993                     catch  (const SALOME::SALOME_Exception& S_ex) {
1994                       QtCatchCorbaException(S_ex);
1995                     }
1996                   }
1997                 }
1998               }
1999             }
2000           }
2001
2002           // Check whether the actor for the mesh exists at least in one view
2003           Standard_Boolean res;
2004           SMESH_Actor* ac = smeshGUI->FindActorByEntry(IObject->getEntry(), res, false);
2005           if (!res)
2006             smeshGUI->InitActor( aM );
2007           else {
2008             // Check whether the actor belongs to the active view
2009             VTKViewer_RenderWindowInteractor* rwInter = 
2010               ((VTKViewer_ViewFrame*)smeshGUI->myActiveStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRWInteractor();
2011
2012             // The actor belongs to inactive view -> create a copy and add it in the active view
2013             if (!rwInter->isInViewer(IObject)) {
2014               SMESH_Actor* acCopy = SMESH_Actor::New();
2015               acCopy->ShallowCopy(ac);
2016
2017               smeshGUI->DisplayActor( acCopy, false );
2018             }
2019           }
2020
2021           if ( smeshGUI->myAutomaticUpdate ) {
2022             SMESH_Actor* Mesh = smeshGUI->ReadScript(aM);
2023             if ( Mesh != NULL ) {
2024 #ifdef TRACE
2025               Dump( Mesh );
2026 #endif
2027               smeshGUI->DisplayActor( Mesh, true );
2028               smeshGUI->DisplayEdges( Mesh, true );    
2029               smeshGUI->ChangeRepresentation( Mesh, Mesh->getDisplayMode() );
2030             }
2031           }
2032         } else {
2033           QApplication::restoreOverrideCursor();
2034           QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
2035                                   tr ("SMESH_WRN_VIEWER_VTK"), tr ("SMESH_BUT_YES") );
2036         }
2037         QApplication::restoreOverrideCursor();
2038         break;
2039       }
2040
2041     case 702: // ADD SUB MESH 
2042       {
2043         if ( smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) { //VTK
2044           smeshGUI->EmitSignalDeactivateDialog() ;
2045           SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2046           SMESHGUI_AddSubMeshDlg *aDlg = new SMESHGUI_AddSubMeshDlg( parent, "", Sel ) ;
2047         } else {
2048           QApplication::restoreOverrideCursor();
2049           QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
2050                                    tr ("SMESH_WRN_VIEWER_VTK"), tr ("SMESH_BUT_YES") );
2051         }
2052         break;
2053       }
2054     
2055     case 703: // INIT MESH 
2056       {
2057         smeshGUI->EmitSignalDeactivateDialog() ;
2058         SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2059         SMESHGUI_InitMeshDlg *aDlg = new SMESHGUI_InitMeshDlg( parent, "", Sel ) ;
2060         break;
2061       }
2062
2063     case 704: // EDIT Hypothesis 
2064       {
2065         smeshGUI->EmitSignalDeactivateDialog() ;
2066         SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2067         SMESHGUI_EditHypothesesDlg *aDlg = new SMESHGUI_EditHypothesesDlg( parent, "", Sel ) ;
2068         break;
2069       }
2070
2071     case 705: //  EDIT Global Hypothesis
2072       {
2073         smeshGUI->EmitSignalDeactivateDialog() ;
2074         SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2075         SMESHGUI_EditHypothesesDlg *aDlg = new SMESHGUI_EditHypothesesDlg( parent, "", Sel ) ;
2076         break;
2077       }
2078
2079     case 706: //  EDIT Local Hypothesis
2080       {
2081         smeshGUI->EmitSignalDeactivateDialog() ;
2082         SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2083         SMESHGUI_EditHypothesesDlg *aDlg = new SMESHGUI_EditHypothesesDlg( parent, "", Sel ) ;
2084         break;
2085       }
2086
2087     case 806: // ORIENTATION ELEMENTS
2088       {
2089         smeshGUI->EmitSignalDeactivateDialog() ;
2090         SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2091         smeshGUI->myDesktop->SetSelectionMode(3, true);
2092         SMESHGUI_OrientationElementsDlg *aDlg = new SMESHGUI_OrientationElementsDlg( parent, "", Sel ) ;
2093         break;
2094       }
2095
2096     case 807: // DIAGONAL INVERSION
2097       {
2098         smeshGUI->EmitSignalDeactivateDialog() ;
2099         SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2100         Sel->ClearIObjects();
2101         smeshGUI->myDesktop->SetSelectionMode(2, true);
2102         SMESHGUI_DiagonalInversionDlg *aDlg = new SMESHGUI_DiagonalInversionDlg( parent, "", Sel ) ;
2103         break;
2104       }
2105      
2106     case 900: // MESH INFOS
2107       {
2108         smeshGUI->EmitSignalDeactivateDialog() ;
2109         SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2110         SMESHGUI_MeshInfosDlg *aDlg = new SMESHGUI_MeshInfosDlg( parent, "", Sel ) ;
2111         break;
2112       }
2113       
2114     case 1001: // AUTOMATIC UPDATE PREFERENCES
2115       {
2116         parent->menuBar()->setItemChecked(1001, !parent->menuBar()->isItemChecked(1001) );
2117         if ( parent->menuBar()->isItemChecked(1001) ) {
2118           QAD_CONFIG->addSetting("SMESH:AutomaticUpdate","true");
2119           smeshGUI->myAutomaticUpdate = true;     
2120         } else {
2121           QAD_CONFIG->addSetting("SMESH:AutomaticUpdate","false");
2122           smeshGUI->myAutomaticUpdate = false;
2123         }
2124         break;
2125       }
2126        
2127     case 1003: // MESH PREFERENCES
2128       {
2129         smeshGUI->SetDisplaySettings();
2130         break;
2131       }
2132       
2133     case 1005:
2134       {
2135         QString Bold = QAD_CONFIG->getSetting("ScalarBar:Bold");
2136         QString Italic = QAD_CONFIG->getSetting("ScalarBar:Italic");
2137         QString Shadow = QAD_CONFIG->getSetting("ScalarBar:Shadow");    
2138         QString FontFamily = QAD_CONFIG->getSetting("ScalarBar:FontFamily");
2139         QString Orientation = QAD_CONFIG->getSetting("ScalarBar:Orientation");
2140         float Width = QAD_CONFIG->getSetting("ScalarBar:Width").toFloat();  
2141         float Height = QAD_CONFIG->getSetting("ScalarBar:Height").toFloat();
2142         int NumberOfLabels = QAD_CONFIG->getSetting("ScalarBar:NumberOfLabels").toInt();
2143         int NumberOfColors = QAD_CONFIG->getSetting("ScalarBar:NumberOfColors").toInt();
2144
2145         if ( Width == 0 ) Width = 0.17;
2146         if ( Height == 0 ) Height = 0.8;
2147         if ( NumberOfLabels == 0 ) NumberOfLabels = 5;
2148         if ( NumberOfColors == 0) NumberOfColors = 64;
2149
2150         SMESHGUI_Preferences_ScalarBarDlg *aDlg = new SMESHGUI_Preferences_ScalarBarDlg( parent, "", true) ;
2151
2152         if ( Bold.compare("true") == 0 ) 
2153           aDlg->Bold->setChecked(true); else aDlg->Bold->setChecked(false);
2154         if ( Italic.compare("true") == 0 ) 
2155           aDlg->Italic->setChecked(true); else aDlg->Italic->setChecked(false);
2156         if ( Shadow.compare("true") == 0 ) 
2157           aDlg->Shadow->setChecked(true); else aDlg->Shadow->setChecked(false);
2158
2159         if ( Orientation.compare("Horizontal") == 0 ) 
2160           aDlg->RadioHoriz->setChecked(true); else aDlg->RadioVert->setChecked(true);
2161
2162         int NbItems = aDlg->ComboBox1->count();
2163         int i = 0;
2164         aDlg->ComboBox1->setCurrentItem( i );
2165         while ( i < NbItems ) {
2166           if ( FontFamily.compare( aDlg->ComboBox1->text( i ) ) == 0 )
2167             aDlg->ComboBox1->setCurrentItem( i );
2168           i++;
2169         }
2170         
2171         aDlg->LineEditWidth->setText( QString("%1").arg(Width) );
2172         aDlg->LineEditHeight->setText( QString("%1").arg(Height) );
2173
2174         aDlg->SpinBoxLabels->setValue( NumberOfLabels );
2175         aDlg->SpinBoxColors->setValue( NumberOfColors );
2176         
2177         aDlg->show();
2178         if ( aDlg->result() ) {
2179           if ( aDlg->RadioHoriz->isChecked() )
2180             Orientation = "Horizontal"; else Orientation = "Vertical";
2181           if ( aDlg->Bold->isChecked() )
2182             Bold = "true"; else Bold = "false";
2183           if ( aDlg->Italic->isChecked() )
2184             Italic = "true"; else Italic = "false";
2185           if ( aDlg->Shadow->isChecked() )
2186             Shadow = "true"; else Shadow = "false";
2187                         
2188           FontFamily = aDlg->ComboBox1->currentText();
2189           Width = aDlg->LineEditWidth->text().toFloat();
2190           Height = aDlg->LineEditHeight->text().toFloat();
2191           NumberOfColors = aDlg->SpinBoxColors->text().toInt();
2192           NumberOfLabels = aDlg->SpinBoxLabels->text().toInt();
2193
2194           
2195           vtkScalarBarActor* aScalarBar = smeshGUI->GetScalarBar();
2196           if ( aScalarBar != NULL ) {
2197             smeshGUI->SetSettingsScalarBar(aScalarBar, Bold, Italic, Shadow, 
2198                                            FontFamily, Orientation,
2199                                            Width, Height, NumberOfColors, NumberOfLabels);
2200           }
2201           
2202           QAD_CONFIG->addSetting("ScalarBar:Bold", Bold);
2203           QAD_CONFIG->addSetting("ScalarBar:Italic", Italic);
2204           QAD_CONFIG->addSetting("ScalarBar:Shadow", Shadow);    
2205           QAD_CONFIG->addSetting("ScalarBar:FontFamily", FontFamily);
2206           QAD_CONFIG->addSetting("ScalarBar:Orientation", Orientation);
2207           QAD_CONFIG->addSetting("ScalarBar:Width", Width);
2208           QAD_CONFIG->addSetting("ScalarBar:Height", Height);
2209           QAD_CONFIG->addSetting("ScalarBar:NumberOfLabels", NumberOfLabels);
2210           QAD_CONFIG->addSetting("ScalarBar:NumberOfColors", NumberOfColors);
2211         }
2212         break;
2213       }
2214       
2215     case 1100: // EDIT HYPOTHESIS
2216       {
2217         SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2218         int nbSel = Sel->IObjectCount() ;
2219
2220         if ( nbSel == 1 ) {
2221           Standard_Boolean res;
2222           SMESH::SMESH_Hypothesis_var Hyp = smeshGUI->ConvertIOinSMESHHypothesis( Sel->firstIObject(), res );
2223
2224           /* Look for all mesh objects that have this hupothesis affected in order to flag as ModifiedMesh */
2225           /* At end below '...->updateObjBrowser(true)' will change icon of mesh objects                   */
2226           /* Warning : however by internal mechanism all subMeshes icons are changed !                     */
2227           SALOMEDS::Study::ListOfSObject_var listSOmesh = smeshGUI->GetMeshesUsingAlgoOrHypothesis( Hyp) ;
2228
2229           if ( res ) {
2230             QString Name = Hyp->GetName();
2231             
2232             if ( Name.compare("LocalLength") == 0 ) {
2233               SMESH::SMESH_LocalLength_var LL = SMESH::SMESH_LocalLength::_narrow( Hyp );
2234               double beforeLength = LL->GetLength() ;
2235               double Length = smeshGUI->Parameter( res, 
2236                                                    beforeLength,
2237                                                    tr("SMESH_LOCAL_LENGTH_HYPOTHESIS"), 
2238                                                    tr("SMESH_VALUE"), 
2239                                                    1.0E-5, 1E6, 6 ) ;
2240               if ( res && Length != beforeLength ) {
2241                 LL->SetLength( Length );
2242                 for( int i=0; i<listSOmesh->length(); i++ ) {
2243                   smeshGUI->GetStudyAPI().ModifiedMesh( listSOmesh[i], false ) ;
2244                 }
2245                 break;
2246               }
2247               
2248             } else if ( Name.compare("NumberOfSegments") == 0 ) {
2249               SMESH::SMESH_NumberOfSegments_var NOS = SMESH::SMESH_NumberOfSegments::_narrow( Hyp );
2250               int beforeNbSeg = NOS->GetNumberOfSegments() ;
2251               int NbSeg = smeshGUI->Parameter( res,
2252                                                beforeNbSeg, 
2253                                                tr("SMESH_NB_SEGMENTS_HYPOTHESIS"), 
2254                                                tr("SMESH_VALUE"), 
2255                                                1, 1000000 ) ;
2256
2257               if ( res && NbSeg != beforeNbSeg ) {
2258                 NOS->SetNumberOfSegments( NbSeg );
2259                 for( int i=0; i<listSOmesh->length(); i++ ) {             
2260                   SALOMEDS::SObject_var SO = listSOmesh[i] ;
2261                   smeshGUI->GetStudyAPI().ModifiedMesh( listSOmesh[i], false ) ;
2262                 }
2263                 break;
2264               }
2265               
2266             } else if ( Name.compare("MaxElementArea") == 0 ) {
2267               SMESH::SMESH_MaxElementArea_var MEA = SMESH::SMESH_MaxElementArea::_narrow( Hyp );
2268               double beforeMaxArea = MEA->GetMaxElementArea() ;
2269               double MaxArea = smeshGUI->Parameter( res,
2270                                                     beforeMaxArea,
2271                                                     tr("SMESH_MAX_ELEMENT_AREA_HYPOTHESIS"), 
2272                                                     tr("SMESH_VALUE"), 
2273                                                     1.0E-5, 1E6, 6 ) ;
2274               if ( res && MaxArea != beforeMaxArea ) {
2275                 MEA->SetMaxElementArea( MaxArea );
2276                 for( int i=0; i<listSOmesh->length(); i++ ) {
2277                   smeshGUI->GetStudyAPI().ModifiedMesh( listSOmesh[i], false ) ;
2278                 }
2279                 break;
2280               }
2281               
2282             }  else if ( Name.compare("MaxElementVolume") == 0 ) {
2283               SMESH::SMESH_MaxElementVolume_var MEV = SMESH::SMESH_MaxElementVolume::_narrow( Hyp );
2284               double beforeMaxVolume = MEV->GetMaxElementVolume() ;
2285               double MaxVolume = smeshGUI->Parameter( res, 
2286                                                       beforeMaxVolume,
2287                                                       tr("SMESH_MAX_ELEMENT_AREA_HYPOTHESIS"), 
2288                                                       tr("SMESH_VALUE"), 
2289                                                       1.0E-5, 1E6, 6 ) ;
2290               if ( res && MaxVolume != beforeMaxVolume ) {
2291                 MEV->SetMaxElementVolume( MaxVolume );
2292                 for( int i=0; i<listSOmesh->length(); i++ ) {
2293                   smeshGUI->GetStudyAPI().ModifiedMesh( listSOmesh[i], false ) ;
2294                 }
2295                 break;
2296               }
2297               
2298             } else if ( Name.compare("Regular_1D") == 0 ) {
2299             } else if ( Name.compare("MEFISTO_2D") == 0 ) {
2300             } else {
2301             }
2302             
2303           }
2304         }
2305         break;
2306       }
2307       
2308     case 1101: // RENAME
2309       {
2310         SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2311         SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
2312         for ( ; It.More(); It.Next() ) {
2313           Handle(SALOME_InteractiveObject) IObject = It.Value();
2314
2315           SALOMEDS::SObject_var obj = smeshGUI->myStudy->FindObjectID( IObject->getEntry() );
2316           SALOMEDS::GenericAttribute_var anAttr;
2317           SALOMEDS::AttributeName_var    aName;
2318           if ( !obj->_is_nil() ) {
2319             if (obj->FindAttribute(anAttr, "AttributeName")) {
2320               aName = SALOMEDS::AttributeName::_narrow(anAttr);
2321               QString newName = QString( aName->Value() );
2322               newName = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), newName);
2323               if ( !newName.isEmpty() ) {
2324                 QApplication::setOverrideCursor( Qt::waitCursor );
2325                 smeshGUI->myActiveStudy->renameIObject( IObject, newName );
2326               }
2327               QApplication::restoreOverrideCursor();
2328             }
2329           }
2330         }
2331         break;
2332       }  
2333
2334     case 1102: // REMOVE HYPOTHESIS / ALGORITHMS
2335       {
2336         QApplication::setOverrideCursor( Qt::waitCursor );
2337         SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2338         SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
2339         for ( int i=0; It.More(); It.Next(), i++ ) {
2340           Handle(SALOME_InteractiveObject) IObject = It.Value();
2341           smeshGUI->RemoveHypothesisOrAlgorithmOnMesh( IObject );
2342         }
2343         Sel->ClearIObjects();
2344         smeshGUI->myActiveStudy->updateObjBrowser( true );
2345         QApplication::restoreOverrideCursor();
2346         break;
2347       }
2348  
2349     case 401: // GEOM::EDGE
2350       {
2351         if ( smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) { //VTK
2352           smeshGUI->EmitSignalDeactivateDialog() ;
2353           SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2354           Sel->ClearIObjects();
2355           smeshGUI->myDesktop->SetSelectionMode(1, true);
2356           parent->menuBar()->setItemChecked(9010, false );
2357           parent->menuBar()->setItemChecked(9011, false );
2358           smeshGUI->ViewNodes();
2359           SMESHGUI_AddEdgeDlg *aDlg = new SMESHGUI_AddEdgeDlg( parent, "", Sel ) ;
2360         } else {
2361           QApplication::restoreOverrideCursor();
2362             QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
2363                                    tr ("SMESH_WRN_VIEWER_VTK"), tr ("SMESH_BUT_YES") );
2364         }
2365         break;
2366       }
2367     case 4021: // TRIANGLE
2368       {
2369         if ( smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) { //VTK
2370           smeshGUI->EmitSignalDeactivateDialog() ;
2371           SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2372           Sel->ClearIObjects();
2373           smeshGUI->myDesktop->SetSelectionMode(1, true);
2374           parent->menuBar()->setItemChecked(9010, false );
2375           parent->menuBar()->setItemChecked(9011, false );
2376           smeshGUI->ViewNodes();
2377           SMESHGUI_AddFaceDlg *aDlg = new SMESHGUI_AddFaceDlg( parent, "", Sel, 3 ) ;
2378         } else {
2379           QApplication::restoreOverrideCursor();
2380             QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
2381                                    tr ("SMESH_WRN_VIEWER_VTK"), tr ("SMESH_BUT_YES") );
2382         }
2383         break;
2384       }
2385     case 4022: // QUAD
2386       {
2387         if ( smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) { //VTK
2388           smeshGUI->EmitSignalDeactivateDialog() ;
2389           SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2390           Sel->ClearIObjects();
2391           smeshGUI->myDesktop->SetSelectionMode(1, true);
2392           parent->menuBar()->setItemChecked(9010, false );
2393           parent->menuBar()->setItemChecked(9011, false );
2394           smeshGUI->ViewNodes();
2395           SMESHGUI_AddFaceDlg *aDlg = new SMESHGUI_AddFaceDlg( parent, "", Sel, 4 ) ;
2396         } else {
2397           QApplication::restoreOverrideCursor();
2398             QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
2399                                    tr ("SMESH_WRN_VIEWER_VTK"), tr ("SMESH_BUT_YES") );
2400         }
2401         break;
2402       }
2403     case 4031: // TETRA
2404       {
2405         if ( smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) { //VTK
2406           smeshGUI->EmitSignalDeactivateDialog() ;
2407           SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2408           Sel->ClearIObjects();
2409           smeshGUI->myDesktop->SetSelectionMode(1, true);
2410           parent->menuBar()->setItemChecked(9010, false );
2411           parent->menuBar()->setItemChecked(9011, false );
2412           smeshGUI->ViewNodes();
2413           SMESHGUI_AddVolumeDlg *aDlg = new SMESHGUI_AddVolumeDlg( parent, "", Sel, 4 ) ;
2414         } else {
2415           QApplication::restoreOverrideCursor();
2416             QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
2417                                    tr ("SMESH_WRN_VIEWER_VTK"), tr ("SMESH_BUT_YES") );
2418         }
2419         break;
2420       }
2421     case 4032: // HEXA
2422       {
2423         if ( smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) { //VTK
2424           smeshGUI->EmitSignalDeactivateDialog() ;
2425           SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2426           Sel->ClearIObjects();
2427           smeshGUI->myDesktop->SetSelectionMode(1, true);
2428           parent->menuBar()->setItemChecked(9010, false );
2429           parent->menuBar()->setItemChecked(9011, false );
2430           smeshGUI->ViewNodes();
2431           SMESHGUI_AddVolumeDlg *aDlg = new SMESHGUI_AddVolumeDlg( parent, "", Sel, 8 ) ;
2432         } else {
2433           QApplication::restoreOverrideCursor();
2434             QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
2435                                    tr ("SMESH_WRN_VIEWER_VTK"), tr ("SMESH_BUT_YES") );
2436         }
2437         break;
2438       }
2439
2440     case 4041: // REMOVES NODES
2441       {
2442         if ( smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) { //VTK
2443           smeshGUI->EmitSignalDeactivateDialog() ;
2444           SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2445           Sel->ClearIObjects();
2446           smeshGUI->myDesktop->SetSelectionMode(1, true);
2447           parent->menuBar()->setItemChecked(9010, false );
2448           parent->menuBar()->setItemChecked(9011, false );
2449           smeshGUI->ViewNodes();
2450           SMESHGUI_RemoveNodesDlg *aDlg = new SMESHGUI_RemoveNodesDlg( parent, "", Sel ) ;
2451         } else {
2452           QApplication::restoreOverrideCursor();
2453             QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
2454                                    tr ("SMESH_WRN_VIEWER_VTK"), tr ("SMESH_BUT_YES") );
2455         }
2456         break;
2457       }
2458     case 4042: // REMOVES ELEMENTS
2459       {
2460         if ( smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) { //VTK
2461           smeshGUI->EmitSignalDeactivateDialog() ;
2462           SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2463           Sel->ClearIObjects();
2464           smeshGUI->myDesktop->SetSelectionMode(3, true);
2465           SMESHGUI_RemoveElementsDlg *aDlg = new SMESHGUI_RemoveElementsDlg( parent, "", Sel ) ;        
2466         } else {
2467           QApplication::restoreOverrideCursor();
2468             QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
2469                                    tr ("SMESH_WRN_VIEWER_VTK"), tr ("SMESH_BUT_YES") );
2470         }
2471         break;
2472       }
2473
2474     case 5000: // HYPOTHESIS - ALGO
2475       {
2476         smeshGUI->CreateAlgorithm("Regular_1D","Wire Discretisation");  
2477         break;
2478       }
2479     case 5010: 
2480       {
2481         smeshGUI->CreateAlgorithm("MEFISTO_2D","Triangle (Mefisto)");
2482         break;
2483       }
2484     case 5011: 
2485       {
2486         smeshGUI->CreateAlgorithm("Quadrangle_2D","Quadrangle (Mapping)");      
2487         break;
2488       }
2489     case 5020: 
2490       {
2491         smeshGUI->CreateAlgorithm("Hexa_3D","Hexaedral (i,j,k)");       
2492         break;
2493       }
2494
2495     case 5030: // HYPOTHESIS - LOCAL LENGTH
2496       {
2497         smeshGUI->EmitSignalDeactivateDialog() ;
2498         SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2499         SMESHGUI_LocalLengthDlg *aDlg = new SMESHGUI_LocalLengthDlg( parent, "" ) ;
2500         break;
2501       }
2502     case 5031: // HYPOTHESIS - NB SEGMENTS
2503       {
2504         smeshGUI->EmitSignalDeactivateDialog() ;
2505         SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2506         SMESHGUI_NbSegmentsDlg *aDlg = new SMESHGUI_NbSegmentsDlg( parent, "" ) ;
2507         break;
2508       }
2509
2510     case 5032: // HYPOTHESIS - MAX ELEMENT AREA
2511       {
2512         smeshGUI->EmitSignalDeactivateDialog() ;
2513         SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2514         SMESHGUI_MaxElementAreaDlg *aDlg = new SMESHGUI_MaxElementAreaDlg( parent, "" ) ;
2515         break;
2516       }
2517
2518     case 5033: // HYPOTHESIS - MAX ELEMENT VOLUME
2519       {
2520         smeshGUI->EmitSignalDeactivateDialog() ;
2521         SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2522         SMESHGUI_MaxElementVolumeDlg *aDlg = new SMESHGUI_MaxElementVolumeDlg( parent, "" ) ;
2523         break;
2524       }
2525
2526     case 6016: // CONTROLS 
2527     case 6015:
2528     case 6014:
2529     case 6013:
2530     case 6012:
2531     case 6011:
2532     case 6001:
2533       {
2534         SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2535         int nbSel = Sel->IObjectCount();
2536         if ( nbSel != 1 )
2537           break;
2538         smeshGUI->Control(theCommandID);
2539         break;
2540       }
2541       
2542     case 6002:
2543       {
2544         if ( smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) { //VTK
2545           SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2546           SMESHGUI_EdgesConnectivityDlg *Dlg = new SMESHGUI_EdgesConnectivityDlg( parent, "", Sel ) ;
2547         } else {
2548           QApplication::restoreOverrideCursor();
2549           QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
2550                                  tr ("SMESH_WRN_VIEWER_VTK"), tr ("SMESH_BUT_YES") );
2551         }
2552         break;
2553       }
2554
2555     case 9010:
2556       {
2557         if ( !parent->menuBar()->isItemChecked(9010) ) {
2558           QApplication::setOverrideCursor( Qt::waitCursor );
2559           parent->menuBar()->setItemChecked(9011, false );
2560           
2561           smeshGUI->EraseSimulationActors();
2562           smeshGUI->mySimulationActors2D = vtkActor2DCollection::New();
2563
2564           SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2565           int nbSel = Sel->IObjectCount() ;
2566           if ( nbSel == 1 ) {
2567             Standard_Boolean res;
2568             SMESH_Actor* MeshActor = smeshGUI->FindActorByEntry(Sel->firstIObject()->getEntry(), res, true);
2569             if ( res ) {
2570               parent->menuBar()->setItemChecked(9010, !parent->menuBar()->isItemChecked(9010) );
2571
2572               // It's necessary to display SMDS IDs instead of VTK ones, so 
2573               // vtkIdFilter is unacceptable here. We have to do it manually :(
2574               vtkUnstructuredGrid* ptGrid = vtkUnstructuredGrid::New();
2575               ptGrid->CopyStructure(MeshActor->DataSource);
2576
2577               int numPts = MeshActor->DataSource->GetNumberOfPoints();
2578
2579               // Loop over points and generate ids
2580               vtkIntArray *ptIds = vtkIntArray::New();
2581               ptIds->SetNumberOfValues(numPts);
2582
2583               for (int id=0; id < numPts; id++) {
2584                 int idSMDS = MeshActor->GetIdSMESHDSNode(id);
2585                 ptIds->SetValue(id, idSMDS);
2586               }
2587
2588 // mpv porting vtk4.2.2
2589               //              vtkScalars* newScalars = vtkScalars::New();
2590               //              newScalars->SetData(ptIds);
2591               //              ptGrid->GetPointData()->SetScalars(newScalars);
2592               ptGrid->GetPointData()->SetScalars(ptIds);
2593               //              newScalars->Delete();
2594 // mpv
2595               ptIds->Delete();
2596               
2597               vtkMaskPoints* mask = vtkMaskPoints::New();
2598               mask->SetInput(ptGrid);
2599               mask->SetOnRatio( 1 );
2600               //            mask->SetMaximumNumberOfPoints( 50 );
2601               //            mask->RandomModeOn();
2602               
2603               vtkSelectVisiblePoints* visPts = vtkSelectVisiblePoints::New();
2604               visPts->SetInput(mask->GetOutput());
2605               visPts->SetRenderer(((VTKViewer_ViewFrame*)smeshGUI->myActiveStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRenderer());
2606               //visPts->SetSelectInvisible(1);
2607               visPts->SelectInvisibleOff();
2608               visPts->SetTolerance(0.1);
2609             
2610               vtkLabeledDataMapper* ldm = vtkLabeledDataMapper::New();
2611               ldm->SetInput(visPts->GetOutput());
2612               ldm->SetLabelFormat("%g");
2613               ldm->SetLabelModeToLabelScalars();
2614               //ldm->SetLabelModeToLabelFieldData();
2615               
2616               ldm->SetFontFamilyToTimes();
2617               ldm->SetFontSize(6 * parent->font().pointSize() / 5);
2618               ldm->SetBold(1);
2619               ldm->SetItalic(0);
2620               ldm->SetShadow(0);
2621               
2622               vtkActor2D* pointLabels = vtkActor2D::New();
2623               pointLabels->SetMapper(ldm);
2624               pointLabels->GetProperty()->SetColor(0,1,0);
2625               
2626               visPts->Delete();
2627               ldm->Delete();
2628               smeshGUI->mySimulationActors2D->AddItem( pointLabels );
2629               ((VTKViewer_ViewFrame*)smeshGUI->myActiveStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRenderer()->AddActor2D( pointLabels );
2630             }
2631           } 
2632         } else {
2633           QApplication::setOverrideCursor( Qt::waitCursor );
2634           parent->menuBar()->setItemChecked(9010, !parent->menuBar()->isItemChecked(9010) );
2635           smeshGUI->EraseSimulationActors();
2636           smeshGUI->ScalarVisibilityOff();
2637         }
2638         QApplication::restoreOverrideCursor();
2639         break;
2640       }
2641     case 9011:
2642       { 
2643         if ( !parent->menuBar()->isItemChecked(9011) ) {
2644           QApplication::setOverrideCursor( Qt::waitCursor );
2645           parent->menuBar()->setItemChecked(9010, false );
2646
2647           smeshGUI->EraseSimulationActors();
2648           smeshGUI->mySimulationActors2D = vtkActor2DCollection::New();
2649
2650           SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2651           int nbSel = Sel->IObjectCount() ;
2652           if ( nbSel == 1 ) {
2653             Standard_Boolean res;
2654             SMESH_Actor* MeshActor = smeshGUI->FindActorByEntry(Sel->firstIObject()->getEntry(), res, true);
2655             if ( res ) {
2656               parent->menuBar()->setItemChecked(9011, !parent->menuBar()->isItemChecked(9011) );
2657
2658               // It's necessary to display SMDS IDs instead of VTK ones, so 
2659               // vtkIdFilter is unacceptable here. We have to do it manually :(
2660               vtkUnstructuredGrid* elGrid = vtkUnstructuredGrid::New();
2661               elGrid->CopyStructure(MeshActor->DataSource);
2662
2663               int numCells = MeshActor->DataSource->GetNumberOfCells();
2664
2665               // Loop over points and generate ids
2666               vtkIntArray *cellIds = vtkIntArray::New();
2667               cellIds->SetNumberOfValues(numCells);
2668
2669               for (int id=0; id < numCells; id++) {
2670                 int idSMDS = MeshActor->GetIdSMESHDSElement(id);
2671                 cellIds->SetValue(id, idSMDS);
2672               }
2673
2674 // mpv porting vk4.2.2
2675               //              vtkScalars* newScalars = vtkScalars::New();
2676               //              newScalars->SetData(cellIds);
2677               elGrid->GetCellData()->SetScalars(cellIds);
2678               //              elGrid->GetCellData()->SetScalars(newScalars);
2679               //              newScalars->Delete();
2680 //mpv
2681
2682               cellIds->Delete();
2683             
2684               vtkCellCenters* cc = vtkCellCenters::New();
2685               cc->SetInput(elGrid);
2686
2687               vtkSelectVisiblePoints* visCells = vtkSelectVisiblePoints::New();
2688               visCells->SetInput(cc->GetOutput());
2689               visCells->SetRenderer(((VTKViewer_ViewFrame*)smeshGUI->myActiveStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRenderer());
2690               visCells->SelectInvisibleOff();
2691               visCells->SetTolerance(0.1);
2692               //            visCells->SetSelectInvisible(1);
2693             
2694               vtkLabeledDataMapper* ldm = vtkLabeledDataMapper::New();
2695               ldm->SetInput(visCells->GetOutput());
2696               ldm->SetLabelFormat("%g");
2697               ldm->SetLabelModeToLabelScalars();
2698             
2699               ldm->SetFontFamilyToTimes();
2700               ldm->SetFontSize(6 * parent->font().pointSize() / 5);
2701               ldm->SetBold(1);
2702               ldm->SetItalic(0);
2703               ldm->SetShadow(0);
2704             
2705               vtkActor2D* cellLabels = vtkActor2D::New();
2706               cellLabels->SetMapper(ldm);
2707               cellLabels->GetProperty()->SetColor(1,0,0);
2708             
2709               cc->Delete();
2710               visCells->Delete();
2711               ldm->Delete();
2712               smeshGUI->mySimulationActors2D->AddItem( cellLabels );
2713               ((VTKViewer_ViewFrame*)smeshGUI->myActiveStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRenderer()->AddActor2D( cellLabels );
2714             }
2715           } 
2716         } else {
2717           QApplication::setOverrideCursor( Qt::waitCursor );
2718           parent->menuBar()->setItemChecked(9011, !parent->menuBar()->isItemChecked(9011) );
2719           smeshGUI->EraseSimulationActors();
2720           smeshGUI->ScalarVisibilityOff();
2721         }
2722         QApplication::restoreOverrideCursor();
2723         break;
2724       }
2725
2726     case 10001: // DISPLAY MODE PREFERENCE
2727       {
2728         parent->menuBar()->setItemChecked(10001, !parent->menuBar()->isItemChecked(10001) );
2729         parent->menuBar()->setItemChecked(10002, false );
2730         parent->menuBar()->setItemChecked(10003, false );
2731         QAD_CONFIG->addSetting("SMESH:DisplayMode", "Wireframe");
2732         break;
2733       }
2734     case 10002:
2735       {
2736         parent->menuBar()->setItemChecked(10002, !parent->menuBar()->isItemChecked(10002) );
2737         parent->menuBar()->setItemChecked(10001, false );
2738         parent->menuBar()->setItemChecked(10003, false );
2739         QAD_CONFIG->addSetting("SMESH:DisplayMode", "Shading");
2740         break;
2741       }
2742     case 10003:
2743       {
2744         parent->menuBar()->setItemChecked(10003, !parent->menuBar()->isItemChecked(10003) );
2745         parent->menuBar()->setItemChecked(10002, false );
2746         parent->menuBar()->setItemChecked(10001, false );
2747         QAD_CONFIG->addSetting("SMESH:DisplayMode", "Shrink");
2748         break;
2749       }
2750
2751     }
2752   
2753   smeshGUI->myActiveStudy->updateObjBrowser(true);
2754   return true ;
2755 }
2756
2757
2758 //=============================================================================
2759 /*! function : GetMeshesUsingAlgoOrHypothesis()
2760  *  purpose  : return a list of Study objects (mesh kind) that have 'AlgoOrHyp' affected.
2761  *           : However is supposed here that father of father of an hypothesis is a Mesh Object.
2762  */
2763 //=============================================================================      
2764 SALOMEDS::Study::ListOfSObject* SMESHGUI::GetMeshesUsingAlgoOrHypothesis( SMESH::SMESH_Hypothesis_ptr AlgoOrHyp ) 
2765 {
2766   SALOMEDS::Study::ListOfSObject_var listSOmesh = new SALOMEDS::Study::ListOfSObject ;
2767   listSOmesh->length(0) ;
2768   unsigned int index = 0 ;
2769   if( !AlgoOrHyp->_is_nil() ) {
2770     SALOMEDS::SObject_var SO_Hypothesis = smeshGUI->GetStudyAPI().FindHypothesisOrAlgorithms( AlgoOrHyp );
2771     if( !SO_Hypothesis->_is_nil() ) {
2772       SALOMEDS::Study::ListOfSObject_var listSO = smeshGUI->myStudy->FindDependances(SO_Hypothesis) ;
2773       for( unsigned int i=0; i<listSO->length(); i++ ) {
2774         SALOMEDS::SObject_var SO = listSO[i] ;
2775         if( !SO->_is_nil() ) {
2776           SALOMEDS::SObject_var SOfatherFather = SO->GetFather()->GetFather() ;
2777           if( !SOfatherFather->_is_nil() ) {
2778             index++ ;
2779             listSOmesh->length(index) ;
2780             listSOmesh[index-1] = SOfatherFather ;
2781           }
2782         }
2783       }
2784     }
2785   }
2786   return listSOmesh._retn() ;
2787 }
2788
2789
2790 //=============================================================================
2791 /*!
2792  *
2793  */
2794 //=============================================================================
2795 void SMESHGUI::Import_Mesh(QAD_Desktop* parent, int theCommandID)
2796 {
2797   QString filter;
2798   string myExtension;
2799   Mesh_Reader* myReader;
2800   
2801   if (theCommandID==113) {
2802     filter = tr("MED files (*.med)");
2803     myExtension = string("MED");
2804     myReader = new DriverMED_R_SMESHDS_Mesh;
2805   }
2806   else if (theCommandID==112) {
2807     filter = tr("IDEAS files (*.unv)");
2808     myExtension = string("UNV");
2809   }
2810   else if (theCommandID==111) {
2811     filter = tr("DAT files (*.dat)");
2812     myExtension = string("MED");
2813     myReader = new DriverDAT_R_SMESHDS_Mesh;
2814   }
2815
2816   QString filename = QAD_FileDlg::getFileName(parent,
2817                                               "",
2818                                               filter,
2819                                               tr("Import mesh"),
2820                                               true);
2821   if ( !filename.isEmpty() ) {
2822     QApplication::setOverrideCursor( Qt::waitCursor );
2823     string myClass = string("SMESHDS_Mesh");
2824 //    Mesh_Reader* myReader = SMESHDriver::GetMeshReader(myExtension, myClass);
2825     
2826     int myMeshId = (smeshGUI->myDocument)->NewMesh();
2827     SMDS_Mesh* myMesh = (smeshGUI->myDocument)->GetMesh(myMeshId);
2828
2829     myReader->SetFile(string(filename.latin1()));
2830     myReader->SetMesh(myMesh);
2831     myReader->SetMeshId(myMeshId);
2832     myReader->Read();
2833
2834     QApplication::restoreOverrideCursor();
2835   }
2836 }
2837   
2838 //=============================================================================
2839 /*!
2840  *
2841  */
2842 //=============================================================================
2843 void SMESHGUI::Export_Mesh(QAD_Desktop* parent, int theCommandID)
2844 {
2845   SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() );
2846   int nbSel = Sel->IObjectCount() ;
2847   if ( nbSel == 1 ) {
2848     Standard_Boolean res;
2849     Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
2850     SMESH::SMESH_Mesh_var aMesh = smeshGUI->ConvertIOinMesh( IObject, res );
2851     if ( res ) {
2852       if (theCommandID==122) { // EXPORT MED
2853         QString filename = QAD_FileDlg::getFileName(parent,
2854                                                     "",
2855                                                     tr("MED files (*.med)"),
2856                                                     tr("Export mesh"),
2857                                                     false);
2858         if ( !filename.isEmpty() ) {
2859           QApplication::setOverrideCursor( Qt::waitCursor );
2860           aMesh->ExportMED( filename.latin1() );
2861           QApplication::restoreOverrideCursor();
2862         }
2863       }
2864       else if (theCommandID==121) { // EXPORT DAT
2865         QString filename = QAD_FileDlg::getFileName(parent,
2866                                                     "",
2867                                                     tr("DAT files (*.dat)"),
2868                                                     tr("Export mesh"),
2869                                                     false);
2870         if ( !filename.isEmpty() ) {
2871           QApplication::setOverrideCursor( Qt::waitCursor );
2872           aMesh->ExportDAT( filename.latin1() );
2873           QApplication::restoreOverrideCursor();
2874         }
2875       }
2876       else if (theCommandID==123) { // EXPORT UNV
2877         QString filename = QAD_FileDlg::getFileName(parent,
2878                                                     "",
2879                                                     tr("IDEAS files (*.unv)"),
2880                                                     tr("Export mesh"),
2881                                                     false);
2882         if ( !filename.isEmpty() ) {
2883           QApplication::setOverrideCursor( Qt::waitCursor );
2884           aMesh->ExportUNV( filename.latin1() );
2885           QApplication::restoreOverrideCursor();
2886         }
2887         else 
2888           aMesh->ExportDAT( filename.latin1() );
2889
2890         QApplication::restoreOverrideCursor();
2891
2892         if ( IObject->hasEntry() )
2893           {
2894         MESSAGE("---");
2895             SALOMEDS::SObject_var SO = smeshGUI->myStudy->FindObjectID( IObject->getEntry() );
2896             SALOMEDS::GenericAttribute_var anAttr;
2897             SALOMEDS::AttributeComment_var    aFileName;
2898             SALOMEDS::StudyBuilder_var aStudyBuilder = smeshGUI->myStudy->NewBuilder();
2899             anAttr = aStudyBuilder->FindOrCreateAttribute(SO, "AttributeComment");
2900             aFileName = SALOMEDS::AttributeComment::_narrow(anAttr);
2901             aFileName->SetValue(filename.latin1());
2902           }
2903       }
2904     }
2905   }
2906 }
2907   
2908 //=============================================================================
2909 /*!
2910  *
2911  */
2912 //=============================================================================
2913 void SMESHGUI::Import_Document(QAD_Desktop* parent, int theCommandID)
2914 {
2915   QString filter;
2916   string myExtension;
2917   Document_Reader* myReader;
2918
2919   if (theCommandID==113) {
2920     filter = tr("MED files (*.med)");
2921     myExtension = string("MED");
2922     myReader = new DriverMED_R_SMESHDS_Document;
2923   }
2924   else if (theCommandID==112) {
2925     filter = tr("IDEAS files (*.unv)");
2926     myExtension = string("UNV");
2927     myReader = new DriverUNV_R_SMESHDS_Document;
2928   }
2929   else if (theCommandID==111) {
2930     filter = tr("DAT files (*.dat)");
2931     myExtension = string("DAT");
2932     myReader = new DriverDAT_R_SMESHDS_Document;
2933   }
2934
2935   QString filename = QAD_FileDlg::getFileName(parent,
2936                                               "",
2937                                               filter,
2938                                               tr("Import document"),
2939                                               true);
2940   if ( !filename.isEmpty() ) {
2941     QApplication::setOverrideCursor( Qt::waitCursor );
2942     string myClass = string("SMESHDS_Document");
2943 //    Document_Reader* myReader = SMESHDriver::GetDocumentReader(myExtension, myClass);
2944         SMESHDS_Document* newDocument = new SMESHDS_Document(1);
2945
2946     myReader->SetFile(string(filename.latin1()));
2947     myReader->SetDocument(smeshGUI->myDocument);
2948     myReader->Read();
2949     QApplication::restoreOverrideCursor();
2950   }
2951 }
2952   
2953 void SMESHGUI::Export_Document(QAD_Desktop* parent, int theCommandID)
2954 {
2955   QString filter;
2956   Document_Writer* myWriter;
2957   string myExtension;
2958
2959   if (theCommandID==122) {
2960     filter = tr("MED files (*.med)");
2961     myExtension = string("MED");
2962     myWriter = new DriverMED_W_SMESHDS_Document;
2963   }
2964   else if (theCommandID==121) {
2965     filter = tr("DAT files (*.dat)");
2966     myExtension = string("DAT");
2967     myWriter = new DriverDAT_W_SMESHDS_Document;
2968   } else if (theCommandID==123) {
2969     filter = tr("IDEAS files (*.unv)");
2970     myExtension = string("UNV");
2971     myWriter = new DriverUNV_W_SMESHDS_Document;
2972   }
2973
2974   QString filename = QAD_FileDlg::getFileName(parent,
2975                                               "",
2976                                               filter,
2977                                               tr("Export document"),
2978                                               false);
2979   if ( !filename.isEmpty() ) {
2980     QApplication::setOverrideCursor( Qt::waitCursor );
2981     string myClass = string("SMESHDS_Document");
2982     //Document_Writer* myWriter = SMESHDriver::GetDocumentWriter(myExtension, myClass);
2983
2984     myWriter->SetFile(string(filename.latin1()));
2985     myWriter->SetDocument(smeshGUI->myDocument);
2986
2987     //StudyContextStruct* myStudyContext = _impl.GetStudyContext(myStudyId);
2988     //Handle(SMESHDS_Document) myDocument = myStudyContext->myDocument;
2989     //myWriter->SetDocument(myDocument);
2990
2991     myWriter->Write();
2992     QApplication::restoreOverrideCursor();
2993   }
2994 }
2995   
2996 //=============================================================================
2997 /*!
2998  *
2999  */
3000 //=============================================================================
3001 bool SMESHGUI::OnMousePress(QMouseEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame)
3002 {
3003   SMESHGUI::GetOrCreateSMESHGUI(parent);
3004   return false ;
3005 }
3006
3007
3008 //=============================================================================
3009 /*!
3010  *
3011  */
3012 //=============================================================================
3013 bool SMESHGUI::OnMouseMove (QMouseEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame)
3014 {
3015   SMESHGUI::GetOrCreateSMESHGUI(parent);
3016
3017   return true;
3018 }
3019
3020
3021 //=============================================================================
3022 /*!
3023  *
3024  */
3025 //=============================================================================
3026 bool SMESHGUI::OnKeyPress (QKeyEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame)
3027 {
3028   SMESHGUI::GetOrCreateSMESHGUI(parent);
3029
3030   return true ;
3031 }
3032
3033
3034 //=============================================================================
3035 /*!
3036  *
3037  */
3038 //=============================================================================
3039 bool SMESHGUI::SetSettings( QAD_Desktop* parent )
3040 {
3041   SMESHGUI::GetOrCreateSMESHGUI(parent);
3042
3043   /* Display mode */
3044   QString DisplayMode = QAD_CONFIG->getSetting("SMESH:DisplayMode");
3045   if ( DisplayMode.compare("") == 0 ) {
3046     DisplayMode = "Shading";
3047     QAD_CONFIG->addSetting("SMESH:DisplayMode","Shading");
3048   }
3049
3050   if ( DisplayMode.compare("Wireframe") == 0 ){
3051     parent->menuBar()->setItemChecked(10003, false );
3052     parent->menuBar()->setItemChecked(10002, false );
3053     parent->menuBar()->setItemChecked(10001, true );
3054   } else if ( DisplayMode.compare("Shading") == 0 ){
3055     parent->menuBar()->setItemChecked(10003, false );
3056     parent->menuBar()->setItemChecked(10002, true );
3057     parent->menuBar()->setItemChecked(10001, false );
3058   } else if ( DisplayMode.compare("Shrink") == 0 ) {
3059     parent->menuBar()->setItemChecked(10003, true );
3060     parent->menuBar()->setItemChecked(10002, false );
3061     parent->menuBar()->setItemChecked(10001, false );
3062   }
3063
3064   /* Automatic Update */
3065   QString AutoUpdate = QAD_CONFIG->getSetting("SMESH:AutomaticUpdate");
3066   if ( AutoUpdate.compare("true") == 0 ) {
3067     parent->menuBar()->setItemChecked(1001, true );
3068     smeshGUI->myAutomaticUpdate = true;
3069   } else {
3070     parent->menuBar()->setItemChecked(1001, false );
3071     smeshGUI->myAutomaticUpdate = false;
3072   }
3073
3074   /* menus disable */
3075   parent->menuBar()->setItemEnabled( 11, false); // IMPORT
3076    
3077   return true;
3078 }
3079
3080
3081 //=============================================================================
3082 /*!
3083  *
3084  */
3085 //=============================================================================
3086 void SMESHGUI::DefinePopup( QString & theContext, QString & theParent, QString & theObject )
3087 {
3088   /* Create or retrieve an object SMESHGUI */
3089   SMESHGUI::GetOrCreateSMESHGUI(QAD_Application::getDesktop());
3090
3091   // NRI : Temporary added
3092   //  if ( smeshGUI->myStudy->GetProperties()->IsLocked() ) {
3093   //    theObject = "NothingSelected";
3094   //    theContext = "NothingSelected";
3095   //  }
3096   // NRI
3097
3098   SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->g