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