Salome HOME
Typo-fix by Kunda
[modules/geom.git] / src / GEOMGUI / GeometryGUI.cxx
1 // Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 //  File   : GeometryGUI.cxx
23 //  Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
24
25 #include <Standard_math.hxx>  // E.A. must be included before Python.h to fix compilation on windows
26 #ifdef HAVE_FINITE
27 #undef HAVE_FINITE            // VSR: avoid compilation warning on Linux : "HAVE_FINITE" redefined
28 #endif
29 #include "Python.h"
30 #include "GeometryGUI.h"
31 #include "GeometryGUI_Operations.h"
32 #include "GEOMPluginGUI.h"
33 #include "GEOMGUI_OCCSelector.h"
34 #include "GEOMGUI_Selection.h"
35 #include "GEOMGUI_CreationInfoWdg.h"
36 #include "GEOMGUI_TextTreeWdg.h"
37 #include "GEOMGUI_DimensionProperty.h"
38 #include "GEOM_Constants.h"
39 #include "GEOM_Displayer.h"
40 #include "GEOM_AISShape.hxx"
41 #include "GEOMUtils_XmlHandler.hxx"
42 #include "GEOMGUI_AnnotationMgr.h"
43 #include "GEOMGUI_TextTreeSelector.h"
44
45 #include "GEOM_Actor.h"
46
47 #include <Material_ResourceMgr.h>
48 #include <Material_Model.h>
49
50 #include <SUIT_Desktop.h>
51 #include <SUIT_MessageBox.h>
52 #include <SUIT_ResourceMgr.h>
53 #include <SUIT_Session.h>
54 #include <SUIT_ViewManager.h>
55
56 #include <OCCViewer_ViewWindow.h>
57 #include <OCCViewer_ViewPort3d.h>
58 #include <OCCViewer_ViewModel.h>
59 #include <OCCViewer_ViewManager.h>
60
61 #include <SOCC_ViewModel.h>
62 #include <SOCC_ViewWindow.h>
63
64 #include <SVTK_ViewWindow.h>
65 #include <SVTK_RenderWindowInteractor.h>
66 #include <SVTK_InteractorStyle.h>
67 #include <SVTK_ViewModel.h>
68
69 #ifndef DISABLE_GRAPHICSVIEW
70 #include <GraphicsView_Viewer.h>
71 #endif
72
73 #include <SalomeApp_Application.h>
74 #include <SalomeApp_DataObject.h>
75 #include <SalomeApp_Study.h>
76 #include <SalomeApp_Tools.h>
77
78 #include <LightApp_SelectionMgr.h>
79 #include <LightApp_VTKSelector.h>
80 #include <LightApp_DataObject.h>
81 #include <LightApp_Preferences.h>
82
83 #include <SALOME_LifeCycleCORBA.hxx>
84 #include <SALOME_ListIO.hxx>
85
86 #include <SALOMEDSClient_ClientFactory.hxx>
87 #include <SALOMEDSClient_IParameters.hxx>
88
89 #include <SALOMEDS_SObject.hxx>
90
91 #include <Basics_OCCTVersion.hxx>
92 #include <QtxFontEdit.h>
93
94 // External includes
95 #include <QDir>
96 #include <QSet>
97 #include <QMenu>
98 #include <QTime>
99 #include <QAction>
100 #include <QFileInfo>
101 #include <QString>
102 #include <QPainter>
103 #include <QSignalMapper>
104 #include <QFontDatabase>
105
106 #include <AIS_ListOfInteractive.hxx>
107 #include <AIS_ListIteratorOfListOfInteractive.hxx>
108 #include <Prs3d_Drawer.hxx>
109 #include <Prs3d_IsoAspect.hxx>
110 #include <Aspect_TypeOfMarker.hxx>
111 #include <OSD_SharedLibrary.hxx>
112 #include <NCollection_DataMap.hxx>
113
114 #include <TColStd_HArray1OfByte.hxx>
115 #include <TColStd_SequenceOfHAsciiString.hxx>
116
117 #include <utilities.h>
118
119 #include <vtkCamera.h>
120 #include <vtkRenderer.h>
121
122 #include <Standard_Failure.hxx>
123 #include <Standard_ErrorHandler.hxx>
124
125 #include <Font_SystemFont.hxx>
126 #include <Font_FontMgr.hxx>
127 #include <TCollection_HAsciiString.hxx>
128
129 #include "GEOM_version.h"
130 #include "GEOMImpl_Types.hxx" // dangerous hxx (defines short-name macros) - include after all
131
132 extern "C" {
133   Standard_EXPORT CAM_Module* createModule() {
134     return new GeometryGUI();
135   }
136
137   Standard_EXPORT char* getModuleVersion() {
138     return (char*)GEOM_VERSION_STR;
139   }
140 }
141
142 GeometryGUI::StudyTextureMap GeometryGUI::myTextureMap;
143
144 GEOM::GEOM_Gen_var GeometryGUI::myComponentGeom = GEOM::GEOM_Gen::_nil();
145
146 GEOM::GEOM_Gen_var GeometryGUI::GetGeomGen()
147 {
148   // Bug 12290: exception in Mesh GUI on GEOMBase::GetShape() if Geometry GUI hasn't been loaded
149   if (CORBA::is_nil(myComponentGeom))
150     InitGeomGen();
151   return GeometryGUI::myComponentGeom;
152 }
153
154 bool GeometryGUI::InitGeomGen()
155 {
156   GeometryGUI aGG;
157   if ( CORBA::is_nil( myComponentGeom ) ) return false;
158   return true;
159 }
160
161 //=======================================================================
162 // function : ClientSObjectToObject
163 // purpose  :
164 //=======================================================================
165 CORBA::Object_var GeometryGUI::ClientSObjectToObject (_PTR(SObject) theSObject)
166 {
167   _PTR(GenericAttribute) anAttr;
168   CORBA::Object_var anObj;
169   try {
170     std::string aValue = theSObject->GetIOR();
171     if (strcmp(aValue.c_str(), "") != 0) {
172       CORBA::ORB_ptr anORB = SalomeApp_Application::orb();
173       anObj = anORB->string_to_object(aValue.c_str());
174     }
175   } catch(...) {
176     INFOS("ClientSObjectToObject - Unknown exception has occurred!!!");
177   }
178   return anObj._retn();
179 }
180
181 //=======================================================================
182 // function : ClientStudyToStudy
183 // purpose  :
184 //=======================================================================
185 SALOMEDS::Study_var GeometryGUI::ClientStudyToStudy (_PTR(Study) theStudy)
186 {
187   SALOME_NamingService *aNamingService = SalomeApp_Application::namingService();
188   CORBA::Object_var aSMObject = aNamingService->Resolve("/myStudyManager");
189   SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow(aSMObject);
190   int aStudyID = theStudy->StudyId();
191   SALOMEDS::Study_var aDSStudy = aStudyManager->GetStudyByID(aStudyID);
192   return aDSStudy._retn();
193 }
194
195 void GeometryGUI::Modified (bool theIsUpdateActions)
196 {
197   if ( SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() ) ) {
198     if ( SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) ) {
199       appStudy->Modified();
200       if ( theIsUpdateActions )
201         app->updateActions();
202     }
203   }
204 }
205
206 //=======================================================================
207 // function : GeometryGUI::GeometryGUI()
208 // purpose  : Constructor
209 //=======================================================================
210 GeometryGUI::GeometryGUI() :
211   SalomeApp_Module( "GEOM" ),
212   myTopLevelIOList()
213 {
214   if ( CORBA::is_nil( myComponentGeom ) )
215   {
216     Engines::EngineComponent_var comp =
217       SalomeApp_Application::lcc()->FindOrLoad_Component( "FactoryServer", "GEOM" );
218     myComponentGeom = GEOM::GEOM_Gen::_narrow( comp );
219   }
220
221   myActiveDialogBox = 0;
222
223   gp_Pnt origin = gp_Pnt(0., 0., 0.);
224   gp_Dir direction = gp_Dir(0., 0., 1.);
225   myWorkingPlane = gp_Ax3(origin, direction);
226
227   myDisplayer = 0;
228   myLocalSelectionMode = GEOM_ALLOBJECTS;
229
230   myCreationInfoWdg = 0;
231   myTextTreeWdg = 0;
232   myAnnotationMgr = 0;
233
234   connect( Material_ResourceMgr::resourceMgr(), SIGNAL( changed() ), this, SLOT( updateMaterials() ) );
235
236   Q_INIT_RESOURCE( GEOMGUI );
237 }
238
239 //=======================================================================
240 // function : GeometryGUI::~GeometryGUI()
241 // purpose  : Destructor
242 //=======================================================================
243 GeometryGUI::~GeometryGUI()
244 {
245   while (!myOCCSelectors.isEmpty())
246     delete myOCCSelectors.takeFirst();
247
248   while (!myVTKSelectors.isEmpty())
249     delete myVTKSelectors.takeFirst();
250
251   qDeleteAll(myGUIMap);
252 }
253
254 //=======================================================================
255 // function : GeometryGUI::getLibrary()
256 // purpose  : get or load GUI library by name [ internal ]
257 //=======================================================================
258 typedef GEOMGUI* (*LibraryGUI)( GeometryGUI* );
259 GEOMGUI* GeometryGUI::getLibrary( const QString& libraryName )
260 {
261   if ( !myGUIMap.contains( libraryName ) ) {
262     // try to load library if it is not loaded yet
263 #if defined(WIN32)
264     QString dirs = getenv( "PATH" );
265 #elif defined(__APPLE__)
266     QString dirs = getenv( "DYLD_LIBRARY_PATH" );
267 #else
268     QString dirs = getenv( "LD_LIBRARY_PATH" );
269 #endif
270 #if defined(WIN32)
271     QString sep  = ";";
272 #else
273     QString sep  = ":";
274 #endif
275
276     if ( !dirs.isEmpty() ) {
277       QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries
278       QListIterator<QString> it( dirList ); it.toBack();
279       while ( it.hasPrevious() ) {
280         QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName );
281         if ( fi.exists() ) {
282           OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() );
283           bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY );
284           if ( !res ) {
285             MESSAGE( "Can't open library : " << aSharedLibrary.DlError() );
286             continue; // continue search further
287           }
288           OSD_Function osdF = aSharedLibrary.DlSymb( "GetLibGUI" );
289           if ( osdF != NULL ) {
290             LibraryGUI func = (GEOMGUI* (*) (GeometryGUI*))osdF;
291             GEOMGUI* libGUI = (*func)( this );
292             if ( libGUI ) {
293               myGUIMap[ libraryName ] = libGUI;
294               break; // found and loaded!
295             }
296           }
297         }
298       }
299     }
300   }
301   return myGUIMap.contains( libraryName ) ? myGUIMap[ libraryName ] : 0;
302 }
303
304 //=======================================================================
305 // function : GeometryGUI::getPluginLibrary()
306 // purpose  : get or load GUI Plugin library by name [ internal ]
307 //=======================================================================
308 typedef GEOMPluginGUI* (*PluginLibraryGUI)( GeometryGUI* );
309 GEOMPluginGUI* GeometryGUI::getPluginLibrary( const QString& libraryName )
310 {
311   if ( !myGUIMap.contains( libraryName ) ) {
312     // try to load library if it is not loaded yet
313
314 #if defined(WIN32)
315     QString dirs = getenv( "PATH" );
316 #elif defined(__APPLE__)
317     QString dirs = getenv( "DYLD_LIBRARY_PATH" );
318 #else
319     QString dirs = getenv( "LD_LIBRARY_PATH" );
320 #endif
321 #if defined(WIN32)
322     QString sep  = ";";
323 #else
324     QString sep  = ":";
325 #endif
326
327     if ( !dirs.isEmpty() ) {
328       QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries
329       QListIterator<QString> it( dirList ); it.toBack();
330       while ( it.hasPrevious() ) {
331         QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName );
332         if ( fi.exists() ) {
333           OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() );
334           bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY );
335           if ( !res ) {
336             MESSAGE( "Can't open library : " << aSharedLibrary.DlError() );
337             continue; // continue search further
338           }
339           OSD_Function osdF = aSharedLibrary.DlSymb( "GetLibGUI" );
340           if ( osdF != NULL ) {
341             PluginLibraryGUI func = (GEOMPluginGUI* (*) (GeometryGUI*))osdF;
342             GEOMPluginGUI* libGUI = (*func)( this );
343             if ( libGUI ) {
344               myGUIMap[ libraryName ] = libGUI;
345               break; // found and loaded!
346             }
347           }
348         }
349       }
350     }
351   }
352   return myGUIMap.contains( libraryName ) ? (GEOMPluginGUI*)myGUIMap[ libraryName ] : 0;
353 }
354
355 //=======================================================================
356 // function : GeometryGUI::ActiveWorkingPlane()
357 // purpose  : Activate Working Plane View
358 //=======================================================================
359 void GeometryGUI::ActiveWorkingPlane()
360 {
361   gp_Dir DZ = myWorkingPlane.Direction();
362   gp_Dir DY = myWorkingPlane.YDirection();
363
364   SUIT_ViewWindow* window = application()->desktop()->activeWindow();
365   bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
366   bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
367
368   if ( ViewOCC ) {
369     OCCViewer_ViewWindow* vw = dynamic_cast<OCCViewer_ViewWindow*>( window );
370     if ( vw ) {
371       Handle(V3d_View) view3d =  vw->getViewPort()->getView();
372
373       view3d->SetProj(DZ.X(), DZ.Y(), DZ.Z());
374       view3d->SetUp(DY.X(), DY.Y(), DY.Z());
375       vw->onViewFitAll();
376     }
377   }
378   else if ( ViewVTK ) {
379     SVTK_ViewWindow* vw = dynamic_cast<SVTK_ViewWindow*>( window );
380     if ( vw ) {
381       vtkCamera* camera = vw->getRenderer()->GetActiveCamera();
382
383       camera->SetPosition(DZ.X(), DZ.Y(), DZ.Z());
384       camera->SetViewUp(DY.X(), DY.Y(), DY.Z());
385       camera->SetFocalPoint(0,0,0);
386
387       vw->onFitAll();
388     }
389   }
390 }
391
392 //=======================================================================
393 // function : GeometryGUI::SetActiveDialogBox()
394 // purpose  : Set active dialog box
395 //=======================================================================
396 GEOMGUI_AnnotationMgr* GeometryGUI::GetAnnotationMgr()
397 {
398   if ( !myAnnotationMgr )
399     myAnnotationMgr = new GEOMGUI_AnnotationMgr( getApp() );
400   return myAnnotationMgr;
401 }
402
403 //=======================================================================
404 // function : GeometryGUI::SetActiveDialogBox()
405 // purpose  : Set active dialog box
406 //=======================================================================
407 GEOMGUI_TextTreeWdg* GeometryGUI::GetTextTreeWdg() const
408 {
409   return myTextTreeWdg;
410 }
411
412 //=======================================================================
413 // function : GeometryGUI::SetActiveDialogBox()
414 // purpose  : Set active dialog box
415 //=======================================================================
416 void GeometryGUI::SetActiveDialogBox( QDialog* aDlg )
417 {
418   myActiveDialogBox = (QDialog*)aDlg;
419 }
420
421 //=======================================================================
422 // function : GeometryGUI::EmitSignalDeactivateDialog()
423 // purpose  : Emit a signal to deactivate the active dialog Box
424 //=======================================================================
425 void GeometryGUI::EmitSignalDeactivateDialog()
426 {
427   emit SignalDeactivateActiveDialog();
428 }
429
430 //=======================================================================
431 // function : GeometryGUI::EmitSignalCloseAllDialogs()
432 // purpose  : Emit a signal to close all non modal dialogs box
433 //=======================================================================
434 void GeometryGUI::EmitSignalCloseAllDialogs()
435 {
436   emit SignalCloseAllDialogs();
437 }
438
439 //=======================================================================
440 // function : GeometryGUI::EmitSignalDefaultStepValueChanged()
441 // purpose  : Emit a signal to inform that default real spin box step has
442 //            been changed
443 //=======================================================================
444 void GeometryGUI::EmitSignalDefaultStepValueChanged(double newVal)
445 {
446   emit SignalDefaultStepValueChanged(newVal);
447 }
448
449 //=======================================================================
450 // function : GeometryGUI::OnGUIEvent()
451 // purpose  : common slot for all menu/toolbar actions
452 //=======================================================================
453 void GeometryGUI::OnGUIEvent()
454 {
455   const QObject* obj = sender();
456   if ( !obj || !obj->inherits( "QAction" ) )
457     return;
458   int id = actionId((QAction*)obj);
459   if ( id != -1 )
460     OnGUIEvent( id );
461 }
462
463 //=======================================================================
464 // function : GeometryGUI::OnGUIEvent()
465 // purpose  : manage all events on GUI [static]
466 //=======================================================================
467 void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
468 {
469   SUIT_Application* anApp = application();
470   if (!anApp) return;
471   SUIT_Desktop* desk = anApp->desktop();
472
473   // check type of the active viewframe
474   SUIT_ViewWindow* window = desk->activeWindow();
475   bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
476   bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
477 #ifndef DISABLE_GRAPHICSVIEW
478   bool ViewDep = ( window && window->getViewManager()->getType() == GraphicsView_Viewer::Type() );
479 #else
480   bool ViewDep = 0;
481 #endif
482   // if current viewframe is not of OCC and not of VTK type - return immediately
483   // fix for IPAL8958 - allow some commands to execute even when NO viewer is active (rename for example)
484   QList<int> NotViewerDependentCommands;
485   NotViewerDependentCommands << GEOMOp::OpDelete
486                              << GEOMOp::OpShow
487                              << GEOMOp::OpShowOnly
488                              << GEOMOp::OpShowOnlyChildren
489                              << GEOMOp::OpDiscloseChildren
490                              << GEOMOp::OpConcealChildren
491                              << GEOMOp::OpUnpublishObject
492                              << GEOMOp::OpPublishObject
493                              << GEOMOp::OpPointMarker
494                              << GEOMOp::OpCreateFolder
495                              << GEOMOp::OpSortChildren;
496   if ( !ViewOCC && !ViewVTK && !ViewDep && !NotViewerDependentCommands.contains( id ) ) {
497     // activate OCC viewer
498     getApp()->getViewManager(OCCViewer_Viewer::Type(), /*create=*/true);
499   }
500
501   // fix for IPAL9103, point 2
502   if ( CORBA::is_nil( GetGeomGen() ) ) {
503     SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_GET_ENGINE" ), tr( "GEOM_BUT_OK" ) );
504     return;
505   }
506
507   QString libName;
508   // find corresponding GUI library
509   switch ( id ) {
510   case GEOMOp::OpOriginAndVectors:   // MENU BASIC - ORIGIN AND BASE VECTORS
511     createOriginAndBaseVectors(); // internal operation
512     return;
513   case GEOMOp::OpSelectVertex:       // POPUP MENU - SELECT ONLY - VERTEX
514   case GEOMOp::OpSelectEdge:         // POPUP MENU - SELECT ONLY - EDGE
515   case GEOMOp::OpSelectWire:         // POPUP MENU - SELECT ONLY - WIRE
516   case GEOMOp::OpSelectFace:         // POPUP MENU - SELECT ONLY - FACE
517   case GEOMOp::OpSelectShell:        // POPUP MENU - SELECT ONLY - SHELL
518   case GEOMOp::OpSelectSolid:        // POPUP MENU - SELECT ONLY - SOLID
519   case GEOMOp::OpSelectCompound:     // POPUP MENU - SELECT ONLY - COMPOUND
520   case GEOMOp::OpSelectAll:          // POPUP MENU - SELECT ONLY - SELECT ALL
521   case GEOMOp::OpDelete:             // MENU EDIT - DELETE
522 #ifndef DISABLE_PYCONSOLE
523   case GEOMOp::OpCheckGeom:          // MENU TOOLS - CHECK GEOMETRY
524 #endif
525   case GEOMOp::OpMaterialsLibrary:   // MENU TOOLS - MATERIALS LIBRARY
526   case GEOMOp::OpDeflection:         // POPUP MENU - DEFLECTION COEFFICIENT
527   case GEOMOp::OpColor:              // POPUP MENU - COLOR
528   case GEOMOp::OpSetTexture:         // POPUP MENU - SETTEXTURE
529   case GEOMOp::OpTransparency:       // POPUP MENU - TRANSPARENCY
530   case GEOMOp::OpIncrTransparency:   // SHORTCUT   - INCREASE TRANSPARENCY
531   case GEOMOp::OpDecrTransparency:   // SHORTCUT   - DECREASE TRANSPARENCY
532   case GEOMOp::OpIsos:               // POPUP MENU - ISOS
533   case GEOMOp::OpIncrNbIsos:         // SHORTCUT   - INCREASE NB ISOS
534   case GEOMOp::OpDecrNbIsos:         // SHORTCUT   - DECREASE NB ISOS
535   case GEOMOp::OpAutoColor:          // POPUP MENU - AUTO COLOR
536   case GEOMOp::OpNoAutoColor:        // POPUP MENU - DISABLE AUTO COLOR
537   case GEOMOp::OpDiscloseChildren:   // POPUP MENU - DISCLOSE CHILD ITEMS
538   case GEOMOp::OpConcealChildren:    // POPUP MENU - CONCEAL CHILD ITEMS
539   case GEOMOp::OpUnpublishObject:    // POPUP MENU - UNPUBLISH
540   case GEOMOp::OpPublishObject:      // ROOT GEOM OBJECT - POPUP MENU - PUBLISH
541   case GEOMOp::OpPointMarker:        // POPUP MENU - POINT MARKER
542   case GEOMOp::OpMaterialProperties: // POPUP MENU - MATERIAL PROPERTIES
543   case GEOMOp::OpPredefMaterial:     // POPUP MENU - <SOME MATERIAL>
544   case GEOMOp::OpPredefMaterCustom:  // POPUP MENU - MATERIAL PROPERTIES - CUSTOM...
545   case GEOMOp::OpEdgeWidth:          // POPUP MENU - LINE WIDTH - EDGE WIDTH
546   case GEOMOp::OpIsosWidth:          // POPUP MENU - LINE WIDTH - ISOS WIDTH
547   case GEOMOp::OpBringToFront:       // POPUP MENU - BRING TO FRONT
548   case GEOMOp::OpClsBringToFront:    //
549   case GEOMOp::OpCreateFolder:       // POPUP MENU - CREATE FOLDER
550   case GEOMOp::OpSortChildren:       // POPUP MENU - SORT CHILD ITEMS
551 #ifndef DISABLE_GRAPHICSVIEW
552   case GEOMOp::OpShowDependencyTree: // POPUP MENU - SHOW DEPENDENCY TREE
553 #endif
554   case GEOMOp::OpReduceStudy:        // POPUP MENU - REDUCE STUDY
555     libName = "GEOMToolsGUI";
556     break;
557   case GEOMOp::OpDMWireframe:        // MENU VIEW - WIREFRAME
558   case GEOMOp::OpDMShading:          // MENU VIEW - SHADING
559   case GEOMOp::OpDMShadingWithEdges: // MENU VIEW - SHADING
560   case GEOMOp::OpDMTexture:          // MENU VIEW - TEXTURE
561   case GEOMOp::OpShowAll:            // MENU VIEW - SHOW ALL
562   case GEOMOp::OpShowOnly:           // MENU VIEW - DISPLAY ONLY
563   case GEOMOp::OpShowOnlyChildren:   // MENU VIEW - SHOW ONLY CHILDREN
564   case GEOMOp::OpHideAll:            // MENU VIEW - ERASE ALL
565   case GEOMOp::OpHide:               // MENU VIEW - ERASE
566   case GEOMOp::OpShow:               // MENU VIEW - DISPLAY
567   case GEOMOp::OpSwitchVectors:      // MENU VIEW - VECTOR MODE
568   case GEOMOp::OpSwitchVertices:     // MENU VIEW - VERTICES MODE
569   case GEOMOp::OpSwitchName:         // MENU VIEW - VERTICES MODE
570   case GEOMOp::OpWireframe:          // POPUP MENU - WIREFRAME
571   case GEOMOp::OpShading:            // POPUP MENU - SHADING
572   case GEOMOp::OpShadingWithEdges:   // POPUP MENU - SHADING WITH EDGES
573   case GEOMOp::OpTexture:            // POPUP MENU - TEXTURE
574   case GEOMOp::OpVectors:            // POPUP MENU - VECTORS
575   case GEOMOp::OpVertices:           // POPUP MENU - VERTICES
576   case GEOMOp::OpShowName:           // POPUP MENU - SHOW NAME
577     libName = "DisplayGUI";
578     break;
579   case GEOMOp::OpPoint:              // MENU BASIC - POINT
580   case GEOMOp::OpLine:               // MENU BASIC - LINE
581   case GEOMOp::OpCircle:             // MENU BASIC - CIRCLE
582   case GEOMOp::OpEllipse:            // MENU BASIC - ELLIPSE
583   case GEOMOp::OpArc:                // MENU BASIC - ARC
584   case GEOMOp::OpVector:             // MENU BASIC - VECTOR
585   case GEOMOp::OpPlane:              // MENU BASIC - PLANE
586   case GEOMOp::OpCurve:              // MENU BASIC - CURVE
587   case GEOMOp::OpLCS:                // MENU BASIC - LOCAL COORDINATE SYSTEM
588     libName = "BasicGUI";
589     break;
590   case GEOMOp::OpBox:                // MENU PRIMITIVE - BOX
591   case GEOMOp::OpCylinder:           // MENU PRIMITIVE - CYLINDER
592   case GEOMOp::OpSphere:             // MENU PRIMITIVE - SPHERE
593   case GEOMOp::OpTorus:              // MENU PRIMITIVE - TORUS
594   case GEOMOp::OpCone:               // MENU PRIMITIVE - CONE
595   case GEOMOp::OpRectangle:          // MENU PRIMITIVE - FACE
596   case GEOMOp::OpDisk:               // MENU PRIMITIVE - DISK
597     libName = "PrimitiveGUI";
598     break;
599   case GEOMOp::OpPrism:              // MENU GENERATION - PRISM
600   case GEOMOp::OpRevolution:         // MENU GENERATION - REVOLUTION
601   case GEOMOp::OpFilling:            // MENU GENERATION - FILLING
602   case GEOMOp::OpPipe:               // MENU GENERATION - PIPE
603   case GEOMOp::OpPipePath:           // MENU GENERATION - RESTORE PATH
604   case GEOMOp::OpThickness:          // MENU GENERATION - THICKNESS
605     libName = "GenerationGUI";
606     break;
607   case GEOMOp::Op2dSketcher:         // MENU ENTITY - SKETCHER
608   case GEOMOp::Op3dSketcher:         // MENU ENTITY - 3D SKETCHER
609   case GEOMOp::OpIsoline:            // MENU BASIC  - ISOLINE
610   case GEOMOp::OpExplode:            // MENU ENTITY - EXPLODE
611   case GEOMOp::OpSurfaceFromFace:    // MENU ENTITY - SURFACE FROM FACE
612 #ifdef WITH_OPENCV
613   case GEOMOp::OpFeatureDetect:      // MENU ENTITY - FEATURE DETECTION
614 #endif
615   case GEOMOp::OpPictureImport:      // MENU ENTITY - IMPORT PICTURE IN VIEWER
616   case GEOMOp::OpCreateField:        // MENU FIELD - CREATE FIELD
617   case GEOMOp::OpEditField:          // MENU FIELD - EDIT FIELD
618   case GEOMOp::OpEditFieldPopup:     // POPUP MENU - EDIT FIELD
619   case GEOMOp::Op2dPolylineEditor:   // MENU BASIC - POLYLINE EDITOR
620     libName = "EntityGUI";
621     break;
622   case GEOMOp::OpEdge:               // MENU BUILD - EDGE
623   case GEOMOp::OpWire:               // MENU BUILD - WIRE
624   case GEOMOp::OpFace:               // MENU BUILD - FACE
625   case GEOMOp::OpShell:              // MENU BUILD - SHELL
626   case GEOMOp::OpSolid:              // MENU BUILD - SOLID
627   case GEOMOp::OpCompound:           // MENU BUILD - COMPOUND
628     libName = "BuildGUI";
629     break;
630   case GEOMOp::OpFuse:               // MENU BOOLEAN - FUSE
631   case GEOMOp::OpCommon:             // MENU BOOLEAN - COMMON
632   case GEOMOp::OpCut:                // MENU BOOLEAN - CUT
633   case GEOMOp::OpSection:            // MENU BOOLEAN - SECTION
634     libName = "BooleanGUI";
635     break;
636   case GEOMOp::OpTranslate:          // MENU TRANSFORMATION - TRANSLATION
637   case GEOMOp::OpRotate:             // MENU TRANSFORMATION - ROTATION
638   case GEOMOp::OpChangeLoc:          // MENU TRANSFORMATION - LOCATION
639   case GEOMOp::OpMirror:             // MENU TRANSFORMATION - MIRROR
640   case GEOMOp::OpScale:              // MENU TRANSFORMATION - SCALE
641   case GEOMOp::OpOffset:             // MENU TRANSFORMATION - OFFSET
642   case GEOMOp::OpProjection:         // MENU TRANSFORMATION - PROJECTION
643   case GEOMOp::OpProjOnCyl:          // MENU TRANSFORMATION - PROJECTION ON CYLINDER
644   case GEOMOp::OpMultiTranslate:     // MENU TRANSFORMATION - MULTI-TRANSLATION
645   case GEOMOp::OpMultiRotate:        // MENU TRANSFORMATION - MULTI-ROTATION
646   case GEOMOp::OpReimport:           // CONTEXT(POPUP) MENU - RELOAD_IMPORTED
647   case GEOMOp::OpExtension:          // MENU TRANSFORMATION - EXTENSION
648     libName = "TransformationGUI";
649     break;
650   case GEOMOp::OpPartition:          // MENU OPERATION - PARTITION
651   case GEOMOp::OpArchimede:          // MENU OPERATION - ARCHIMEDE
652   case GEOMOp::OpFillet3d:           // MENU OPERATION - FILLET
653   case GEOMOp::OpChamfer:            // MENU OPERATION - CHAMFER
654   case GEOMOp::OpShapesOnShape:      // MENU OPERATION - GET SHAPES ON SHAPE
655   case GEOMOp::OpFillet2d:           // MENU OPERATION - FILLET 2D
656   case GEOMOp::OpFillet1d:           // MENU OPERATION - FILLET 1D
657   case GEOMOp::OpSharedShapes:       // MENU OPERATION - GET SHARED SHAPES
658   case GEOMOp::OpExtrudedBoss:       // MENU OPERATION - EXTRUDED BOSS
659   case GEOMOp::OpExtrudedCut:        // MENU OPERATION - EXTRUDED CUT
660   case GEOMOp::OpTransferData:       // MENU OPERATION - TRANSFER DATA
661   case GEOMOp::OpExtraction:         // MENU OPERATION - EXTRACT AND REBUILD
662     libName = "OperationGUI";
663     break;
664   case GEOMOp::OpSewing:             // MENU REPAIR - SEWING
665   case GEOMOp::OpSuppressFaces:      // MENU REPAIR - SUPPRESS FACES
666   case GEOMOp::OpSuppressHoles:      // MENU REPAIR - SUPPRESS HOLE
667   case GEOMOp::OpShapeProcess:       // MENU REPAIR - SHAPE PROCESSING
668   case GEOMOp::OpCloseContour:       // MENU REPAIR - CLOSE CONTOUR
669   case GEOMOp::OpRemoveIntWires:     // MENU REPAIR - REMOVE INTERNAL WIRES
670   case GEOMOp::OpAddPointOnEdge:     // MENU REPAIR - ADD POINT ON EDGE
671   case GEOMOp::OpFreeBoundaries:     // MENU MEASURE - FREE BOUNDARIES
672   case GEOMOp::OpFreeFaces:          // MENU MEASURE - FREE FACES
673   case GEOMOp::OpOrientation:        // MENU REPAIR - CHANGE ORIENTATION
674   case GEOMOp::OpGlueFaces:          // MENU REPAIR - GLUE FACES
675   case GEOMOp::OpGlueEdges:          // MENU REPAIR - GLUE EDGES
676   case GEOMOp::OpLimitTolerance:     // MENU REPAIR - LIMIT TOLERANCE
677   case GEOMOp::OpRemoveWebs:         // MENU REPAIR - REMOVE INTERNAL FACES
678   case GEOMOp::OpRemoveExtraEdges:   // MENU REPAIR - REMOVE EXTRA EDGES
679   case GEOMOp::OpFuseEdges:          // MENU REPAIR - FUSE COLLINEAR EDGES
680   case GEOMOp::OpUnionFaces:         // MENU REPAIR - UNION FACES
681   case GEOMOp::OpInspectObj:         // MENU REPAIR - INSPECT OBJECT
682     libName = "RepairGUI";
683     break;
684   case GEOMOp::OpProperties:         // MENU MEASURE - PROPERTIES
685   case GEOMOp::OpCenterMass:         // MENU MEASURE - CDG
686   case GEOMOp::OpInertia:            // MENU MEASURE - INERTIA
687   case GEOMOp::OpNormale:            // MENU MEASURE - NORMALE
688   case GEOMOp::OpBoundingBox:        // MENU MEASURE - BOUNDING BOX
689   case GEOMOp::OpMinDistance:        // MENU MEASURE - MIN DISTANCE
690   case GEOMOp::OpAngle:              // MENU MEASURE - ANGLE
691   case GEOMOp::OpTolerance:          // MENU MEASURE - TOLERANCE
692   case GEOMOp::OpWhatIs:             // MENU MEASURE - WHATIS
693   case GEOMOp::OpCheckShape:         // MENU MEASURE - CHECK
694   case GEOMOp::OpCheckCompound:      // MENU MEASURE - CHECK COMPOUND OF BLOCKS
695   case GEOMOp::OpGetNonBlocks:       // MENU MEASURE - Get NON BLOCKS
696   case GEOMOp::OpPointCoordinates:   // MENU MEASURE - POINT COORDINATES
697   case GEOMOp::OpCheckSelfInters:    // MENU MEASURE - CHECK SELF INTERSECTIONS
698   case GEOMOp::OpFastCheckInters:    // MENU MEASURE - FAST CHECK INTERSECTIONS
699   case GEOMOp::OpManageDimensions:   // MENU MEASURE - MANAGE DIMENSIONS
700   case GEOMOp::OpAnnotation:         // MENU MEASURE - ANNOTATION
701   case GEOMOp::OpEditAnnotation:     // POPUP MENU - EDIT ANNOTATION
702   case GEOMOp::OpDeleteAnnotation:   // POPUP MENU - DELETE ANNOTATION
703 #ifndef DISABLE_PLOT2DVIEWER
704   case GEOMOp::OpShapeStatistics:    // MENU MEASURE - SHAPE STATISTICS
705 #endif
706   case GEOMOp::OpShowAllDimensions:  // POPUP MENU - SHOW ALL DIMENSIONS
707   case GEOMOp::OpHideAllDimensions:  // POPUP MENU - HIDE ALL DIMENSIONS
708   case GEOMOp::OpShowAllAnnotations: // POPUP MENU - SHOW ALL ANNOTATIONS
709   case GEOMOp::OpHideAllAnnotations: // POPUP MENU - HIDE ALL ANNOTATIONS
710     libName = "MeasureGUI";
711     break;
712   case GEOMOp::OpGroupCreate:        // MENU GROUP - CREATE
713   case GEOMOp::OpGroupCreatePopup:   // POPUP MENU - CREATE GROUP
714   case GEOMOp::OpGroupEdit:          // MENU GROUP - EDIT
715   case GEOMOp::OpGroupUnion:         // MENU GROUP - UNION
716   case GEOMOp::OpGroupIntersect:     // MENU GROUP - INTERSECT
717   case GEOMOp::OpGroupCut:           // MENU GROUP - CUT
718     libName = "GroupGUI";
719     break;
720   case GEOMOp::OpHexaSolid:          // MENU BLOCKS - HEXAHEDRAL SOLID
721   case GEOMOp::OpMultiTransform:     // MENU BLOCKS - MULTI-TRANSFORMATION
722   case GEOMOp::OpQuadFace:           // MENU BLOCKS - QUADRANGLE FACE
723   case GEOMOp::OpPropagate:          // MENU BLOCKS - PROPAGATE
724   case GEOMOp::OpExplodeBlock:       // MENU BLOCKS - EXPLODE ON BLOCKS
725     libName = "BlocksGUI";
726     break;
727   //case GEOMOp::OpAdvancedNoOp:       // NO OPERATION (advanced operations base)
728   //case GEOMOp::OpPipeTShape:         // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE
729   //case GEOMOp::OpPipeTShapeGroups:     // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS
730   //case GEOMOp::OpDividedDisk:           // MENU NEW ENTITY - ADVANCED - DIVIDEDDISK
731   //case GEOMOp::OpDividedCylinder:           // MENU NEW ENTITY - ADVANCED - DIVIDEDCYLINDER
732   //case GEOMOp::OpSmoothingSurface:           // MENU NEW ENTITY - ADVANCED - SMOOTHINGSURFACE
733     //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@//
734     //libName = "AdvancedGUI";
735     //break;
736   default:
737     if (myPluginActions.contains(id)) {
738       libName = myPluginActions[id].first;
739
740       GEOMPluginGUI* library = 0;
741       if ( !libName.isEmpty() ) {
742 #if defined(WIN32)
743         libName = libName + ".dll";
744 #elif defined(__APPLE__)
745         libName = QString( "lib" ) + libName + ".dylib";
746 #else
747         libName = QString( "lib" ) + libName + ".so";
748 #endif
749         library = getPluginLibrary( libName );
750       }
751
752       // call method of corresponding GUI library
753       if ( library ) {
754         //QString action ("%1");
755         //action = action.arg(id);
756
757         //if( !theParam.isValid() )
758           library->OnGUIEvent( myPluginActions[id].second, desk );
759         //else
760         //  library->OnGUIEvent( id, desk, theParam);
761       }
762       else
763         SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) );
764
765       updateCreationInfo();
766       return;
767     }
768     break;
769   }
770
771   GEOMGUI* library = 0;
772   if ( !libName.isEmpty() ) {
773 #if defined(WIN32)
774     libName = libName + ".dll";
775 #elif defined(__APPLE__)
776     libName = QString( "lib" ) + libName + ".dylib";
777 #else
778     libName = QString( "lib" ) + libName + ".so";
779 #endif
780     library = getLibrary( libName );
781   }
782
783   // call method of corresponding GUI library
784   if ( library ) {
785     if( !theParam.isValid() )
786       library->OnGUIEvent( id, desk );
787     else
788       library->OnGUIEvent( id, desk, theParam);
789   }
790   else
791     SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) );
792
793   updateCreationInfo();
794 }
795
796 //=================================================================================
797 // function : GeometryGUI::activateOperation()
798 // purpose  :
799 //=================================================================================
800 bool GeometryGUI::activateOperation( int actionId )
801 {
802   OnGUIEvent(actionId);
803   return true;
804 }
805
806 //=================================================================================
807 // function : GeometryGUI::activateOperation()
808 // purpose  :
809 //=================================================================================
810 bool GeometryGUI::activateOperation( const QString& actionId )
811 {
812   bool isOk = false;
813
814   int id = actionId.toInt(&isOk);
815   if (isOk)
816     OnGUIEvent(id);
817
818   return isOk;
819 }
820
821 //=================================================================================
822 // function : GeometryGUI::activateOperation()
823 // purpose  :
824 //=================================================================================
825 bool GeometryGUI::activateOperation( const QString& actionId, const QString& plugin )
826 {
827   bool isOk = false;
828
829   QString pluginLib = plugin;
830   // TODO: if <plugin> is a plugin name, find plugin library name
831   if (myPluginLibs.contains(plugin))
832     pluginLib = myPluginLibs[plugin];
833
834   QMap<int, PluginAction>::iterator actionsIter = myPluginActions.begin();
835   for (; actionsIter != myPluginActions.end(); ++actionsIter) {
836     const PluginAction& anAction = actionsIter.value();
837     if (anAction.first == pluginLib && anAction.second == actionId) {
838       // activate operation
839       OnGUIEvent(actionsIter.key());
840       isOk = true;
841     }
842   }
843
844   return isOk;
845 }
846
847 //=================================================================================
848 // function : GeometryGUI::OnKeyPress()
849 // purpose  : Called when any key is pressed by user [static]
850 //=================================================================================
851 void GeometryGUI::OnKeyPress( SUIT_ViewWindow* w, QKeyEvent* e )
852 {
853   if ( !application() )
854     return;
855   foreach ( GEOMGUI* lib, myGUIMap )
856     lib->OnKeyPress( e, application()->desktop(), w );
857 }
858
859 //=================================================================================
860 // function : GeometryGUI::OnMouseMove()
861 // purpose  : Manages mouse move events [static]
862 //=================================================================================
863 void GeometryGUI::OnMouseMove( SUIT_ViewWindow* w, QMouseEvent* e )
864 {
865   if ( !application() )
866     return;
867   foreach ( GEOMGUI* lib, myGUIMap )
868     lib->OnMouseMove( e, application()->desktop(), w );
869 }
870
871 //=================================================================================
872 // function : GeometryGUI::OnMouseRelease()
873 // purpose  : Manages mouse release events [static]
874 //=================================================================================
875 void GeometryGUI::OnMouseRelease( SUIT_ViewWindow* w, QMouseEvent* e )
876 {
877   if ( !application() )
878     return;
879   foreach ( GEOMGUI* lib, myGUIMap )
880     lib->OnMouseRelease( e, application()->desktop(), w );
881 }
882
883 //=================================================================================
884 // function : GeometryGUI::OnMousePress()
885 // purpose  : Manage mouse press events [static]
886 //=================================================================================
887 void GeometryGUI::OnMousePress( SUIT_ViewWindow* w, QMouseEvent* e )
888 {
889   if ( !application() )
890     return;
891   foreach ( GEOMGUI* lib, myGUIMap )
892     lib->OnMousePress( e, application()->desktop(), w );
893 }
894
895 //=======================================================================
896 // function : createGeomAction
897 // purpose  :
898 //=======================================================================
899 void GeometryGUI::createGeomAction( const int id, const QString& label, const QString& icolabel,
900                                     const int accel, const bool toggle, const QString& shortcutAction )
901 {
902   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
903   QPixmap icon = icolabel.isEmpty() ? resMgr->loadPixmap( "GEOM", tr( (QString( "ICO_" )+label).toLatin1().constData() ), false )
904                                     : resMgr->loadPixmap( "GEOM", tr( icolabel.toLatin1().constData() ) );
905   createAction( id,
906                 tr( QString( "TOP_%1" ).arg( label ).toLatin1().constData() ),
907                 icon,
908                 tr( QString( "MEN_%1" ).arg( label ).toLatin1().constData() ),
909                 tr( QString( "STB_%1" ).arg( label ).toLatin1().constData() ),
910                 accel,
911                 application()->desktop(),
912                 toggle,
913                 this, SLOT( OnGUIEvent() ),
914                 shortcutAction );
915 }
916
917 //=======================================================================
918 // function : createOriginAndBaseVectors
919 // purpose  :
920 //=======================================================================
921 void GeometryGUI::createOriginAndBaseVectors()
922 {
923   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
924   bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
925   if ( aLocked ) {
926     SUIT_MessageBox::warning ( application()->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
927     return;
928   }
929   if ( appStudy ) {
930     _PTR(Study) studyDS = appStudy->studyDS();
931     if ( studyDS && !CORBA::is_nil( GetGeomGen() ) ) {
932       GEOM::GEOM_IBasicOperations_var aBasicOperations = GetGeomGen()->GetIBasicOperations( studyDS->StudyId() );
933       if ( !aBasicOperations->_is_nil() ) {
934         SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
935         double aLength = aResourceMgr->doubleValue( "Geometry", "base_vectors_length", 1.0 );
936         GEOM::GEOM_Object_var anOrigin = aBasicOperations->MakePointXYZ( 0.0, 0.0, 0.0 );
937         GEOM::GEOM_Object_var anOX = aBasicOperations->MakeVectorDXDYDZ( aLength, 0.0, 0.0 );
938         GEOM::GEOM_Object_var anOY = aBasicOperations->MakeVectorDXDYDZ( 0.0, aLength, 0.0 );
939         GEOM::GEOM_Object_var anOZ = aBasicOperations->MakeVectorDXDYDZ( 0.0, 0.0, aLength );
940
941         SALOMEDS::Study_var aDSStudy = ClientStudyToStudy( studyDS );
942         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOrigin, "O" );
943         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOX, "OX" );
944         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOY, "OY" );
945         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOZ, "OZ" );
946         anOrigin->UnRegister();
947         anOX->UnRegister();
948         anOY->UnRegister();
949         anOZ->UnRegister();
950         aBasicOperations->UnRegister();
951
952         getApp()->updateObjectBrowser( true );
953       }
954     }
955   }
956 }
957
958 //=======================================================================
959 // function : GeometryGUI::initialize()
960 // purpose  : Called when GEOM module is created
961 //=======================================================================
962 void GeometryGUI::initialize( CAM_Application* app )
963 {
964   SalomeApp_Module::initialize( app );
965
966   // ----- create actions --------------
967
968   createGeomAction( GEOMOp::OpDelete,     "DELETE", "", Qt::Key_Delete );
969
970   createGeomAction( GEOMOp::OpPoint,      "POINT" );
971   createGeomAction( GEOMOp::OpLine,       "LINE" );
972   createGeomAction( GEOMOp::OpCircle,     "CIRCLE" );
973   createGeomAction( GEOMOp::OpEllipse,    "ELLIPSE" );
974   createGeomAction( GEOMOp::OpArc,        "ARC" );
975   createGeomAction( GEOMOp::OpCurve,      "CURVE" );
976   createGeomAction( GEOMOp::OpIsoline,    "ISOLINE" );
977   createGeomAction( GEOMOp::OpVector,     "VECTOR" );
978   createGeomAction( GEOMOp::OpPlane,      "PLANE" );
979   createGeomAction( GEOMOp::OpLCS,        "LOCAL_CS" );
980   createGeomAction( GEOMOp::OpOriginAndVectors, "ORIGIN_AND_VECTORS" );
981   createGeomAction( GEOMOp::OpSurfaceFromFace,  "SURFACE_FROM_FACE" );
982
983   createGeomAction( GEOMOp::OpBox,        "BOX" );
984   createGeomAction( GEOMOp::OpCylinder,   "CYLINDER" );
985   createGeomAction( GEOMOp::OpSphere,     "SPHERE" );
986   createGeomAction( GEOMOp::OpTorus,      "TORUS" );
987   createGeomAction( GEOMOp::OpCone,       "CONE" );
988   createGeomAction( GEOMOp::OpRectangle,  "RECTANGLE" );
989   createGeomAction( GEOMOp::OpDisk,       "DISK" );
990
991   createGeomAction( GEOMOp::OpPrism,       "EXTRUSION" );
992   createGeomAction( GEOMOp::OpRevolution,  "REVOLUTION" );
993   createGeomAction( GEOMOp::OpFilling,     "FILLING" );
994   createGeomAction( GEOMOp::OpPipe,        "PIPE" );
995   createGeomAction( GEOMOp::OpPipePath,    "PIPE_PATH" );
996   createGeomAction( GEOMOp::OpThickness,   "THICKNESS" );
997
998   createGeomAction( GEOMOp::OpGroupCreate, "GROUP_CREATE" );
999   createGeomAction( GEOMOp::OpGroupEdit,   "GROUP_EDIT" );
1000   createGeomAction( GEOMOp::OpGroupUnion,  "GROUP_UNION" );
1001   createGeomAction( GEOMOp::OpGroupIntersect, "GROUP_INTERSECT" );
1002   createGeomAction( GEOMOp::OpGroupCut,    "GROUP_CUT" );
1003
1004   createGeomAction( GEOMOp::OpCreateField, "FIELD_CREATE" );
1005   createGeomAction( GEOMOp::OpEditField,   "FIELD_EDIT" );
1006
1007   createGeomAction( GEOMOp::OpReimport,    "RELOAD_IMPORTED" );
1008
1009   createGeomAction( GEOMOp::OpQuadFace,    "Q_FACE" );
1010   createGeomAction( GEOMOp::OpHexaSolid,   "HEX_SOLID" );
1011
1012   createGeomAction( GEOMOp::Op2dSketcher,  "SKETCH" );
1013   createGeomAction( GEOMOp::Op3dSketcher,  "3DSKETCH" );
1014   createGeomAction( GEOMOp::OpExplode,     "EXPLODE" );
1015 #ifdef WITH_OPENCV
1016   createGeomAction( GEOMOp::OpFeatureDetect,"FEATURE_DETECTION" );
1017 #endif
1018   createGeomAction( GEOMOp::OpPictureImport,"PICTURE_IMPORT" );
1019   createGeomAction( GEOMOp::Op2dPolylineEditor, "CURVE_CREATOR" );
1020
1021   createGeomAction( GEOMOp::OpEdge,        "EDGE" );
1022   createGeomAction( GEOMOp::OpWire,        "WIRE" );
1023   createGeomAction( GEOMOp::OpFace,        "FACE" );
1024   createGeomAction( GEOMOp::OpShell,       "SHELL" );
1025   createGeomAction( GEOMOp::OpSolid,       "SOLID" );
1026   createGeomAction( GEOMOp::OpCompound,    "COMPOUND" );
1027
1028   createGeomAction( GEOMOp::OpFuse,        "FUSE" );
1029   createGeomAction( GEOMOp::OpCommon,      "COMMON" );
1030   createGeomAction( GEOMOp::OpCut,         "CUT" );
1031   createGeomAction( GEOMOp::OpSection,     "SECTION" );
1032
1033   createGeomAction( GEOMOp::OpTranslate,      "TRANSLATION" );
1034   createGeomAction( GEOMOp::OpRotate,         "ROTATION" );
1035   createGeomAction( GEOMOp::OpChangeLoc,      "MODIFY_LOCATION" );
1036   createGeomAction( GEOMOp::OpMirror,         "MIRROR" );
1037   createGeomAction( GEOMOp::OpScale,          "SCALE" );
1038   createGeomAction( GEOMOp::OpOffset,         "OFFSET" );
1039   createGeomAction( GEOMOp::OpProjection,     "PROJECTION" );
1040   createGeomAction( GEOMOp::OpProjOnCyl,      "PROJ_ON_CYL" );
1041   createGeomAction( GEOMOp::OpMultiTranslate, "MUL_TRANSLATION" );
1042   createGeomAction( GEOMOp::OpMultiRotate,    "MUL_ROTATION" );
1043   createGeomAction( GEOMOp::OpExtension,      "EXTENSION" );
1044
1045   createGeomAction( GEOMOp::OpPartition,      "PARTITION" );
1046   createGeomAction( GEOMOp::OpArchimede,      "ARCHIMEDE" );
1047   createGeomAction( GEOMOp::OpFillet3d,       "FILLET" );
1048   createGeomAction( GEOMOp::OpChamfer,        "CHAMFER" );
1049   createGeomAction( GEOMOp::OpShapesOnShape,  "GET_SHAPES_ON_SHAPE" );
1050   createGeomAction( GEOMOp::OpSharedShapes,   "GET_SHARED_SHAPES" );
1051   createGeomAction( GEOMOp::OpTransferData,   "TRANSFER_DATA" );
1052   createGeomAction( GEOMOp::OpExtraction,     "EXTRACTION" );
1053   createGeomAction( GEOMOp::OpExtrudedCut,    "EXTRUDED_CUT" );
1054   createGeomAction( GEOMOp::OpExtrudedBoss,   "EXTRUDED_BOSS" );
1055   createGeomAction( GEOMOp::OpFillet1d,       "FILLET_1D" );
1056   createGeomAction( GEOMOp::OpFillet2d,       "FILLET_2D" );
1057
1058   createGeomAction( GEOMOp::OpMultiTransform, "MUL_TRANSFORM" );
1059   createGeomAction( GEOMOp::OpExplodeBlock,   "EXPLODE_BLOCKS" );
1060   createGeomAction( GEOMOp::OpPropagate,      "PROPAGATE" );
1061
1062   createGeomAction( GEOMOp::OpSewing,           "SEWING" );
1063   createGeomAction( GEOMOp::OpGlueFaces,        "GLUE_FACES" );
1064   createGeomAction( GEOMOp::OpGlueEdges,        "GLUE_EDGES" );
1065   createGeomAction( GEOMOp::OpLimitTolerance,   "LIMIT_TOLERANCE" );
1066   createGeomAction( GEOMOp::OpSuppressFaces,    "SUPPRESS_FACES" );
1067   createGeomAction( GEOMOp::OpSuppressHoles,    "SUPPERSS_HOLES" );
1068   createGeomAction( GEOMOp::OpShapeProcess,     "SHAPE_PROCESS" );
1069   createGeomAction( GEOMOp::OpCloseContour,     "CLOSE_CONTOUR" );
1070   createGeomAction( GEOMOp::OpRemoveIntWires,   "SUPPRESS_INT_WIRES" );
1071   createGeomAction( GEOMOp::OpAddPointOnEdge,   "POINT_ON_EDGE" );
1072   createGeomAction( GEOMOp::OpFreeBoundaries,   "CHECK_FREE_BNDS" );
1073   createGeomAction( GEOMOp::OpFreeFaces,        "CHECK_FREE_FACES" );
1074   createGeomAction( GEOMOp::OpOrientation,      "CHANGE_ORIENTATION" );
1075   createGeomAction( GEOMOp::OpRemoveWebs,       "REMOVE_WEBS" );
1076   createGeomAction( GEOMOp::OpRemoveExtraEdges, "REMOVE_EXTRA_EDGES" );
1077   createGeomAction( GEOMOp::OpFuseEdges,        "FUSE_EDGES" );
1078   createGeomAction( GEOMOp::OpUnionFaces,       "UNION_FACES" );
1079   createGeomAction( GEOMOp::OpInspectObj,       "INSPECT_OBJECT" );
1080
1081   createGeomAction( GEOMOp::OpPointCoordinates, "POINT_COORDS" );
1082   createGeomAction( GEOMOp::OpProperties,       "BASIC_PROPS" );
1083   createGeomAction( GEOMOp::OpCenterMass,       "MASS_CENTER" );
1084   createGeomAction( GEOMOp::OpInertia,          "INERTIA" );
1085   createGeomAction( GEOMOp::OpNormale,          "NORMALE" );
1086   createGeomAction( GEOMOp::OpBoundingBox,      "BND_BOX" );
1087   createGeomAction( GEOMOp::OpMinDistance,      "MIN_DIST" );
1088   createGeomAction( GEOMOp::OpAngle,            "MEASURE_ANGLE" );
1089   createGeomAction( GEOMOp::OpManageDimensions, "MANAGE_DIMENSIONS" );
1090   createGeomAction( GEOMOp::OpAnnotation,       "ANNOTATION" );
1091   createGeomAction( GEOMOp::OpEditAnnotation,   "EDIT_ANNOTATION" );
1092   createGeomAction( GEOMOp::OpDeleteAnnotation, "DELETE_ANNOTATION" );
1093
1094   createGeomAction( GEOMOp::OpTolerance,        "TOLERANCE" );
1095   createGeomAction( GEOMOp::OpWhatIs,           "WHAT_IS" );
1096   createGeomAction( GEOMOp::OpCheckShape,       "CHECK" );
1097   createGeomAction( GEOMOp::OpCheckCompound,    "CHECK_COMPOUND" );
1098   createGeomAction( GEOMOp::OpGetNonBlocks,     "GET_NON_BLOCKS" );
1099   createGeomAction( GEOMOp::OpCheckSelfInters,  "CHECK_SELF_INTERSECTIONS" );
1100   createGeomAction( GEOMOp::OpFastCheckInters,  "FAST_CHECK_INTERSECTIONS" );
1101 #ifndef DISABLE_PLOT2DVIEWER
1102   createGeomAction( GEOMOp::OpShapeStatistics,  "SHAPE_STATISTICS" );
1103 #endif
1104
1105 #ifndef DISABLE_PYCONSOLE
1106 #ifdef _DEBUG_ // PAL16821
1107   createGeomAction( GEOMOp::OpCheckGeom,        "CHECK_GEOMETRY" );
1108 #endif
1109 #endif
1110
1111   createGeomAction( GEOMOp::OpMaterialsLibrary,   "MATERIALS_LIBRARY" );
1112   createGeomAction( GEOMOp::OpDMWireframe,        "WIREFRAME" );
1113   createGeomAction( GEOMOp::OpDMShading,          "SHADING" );
1114   createGeomAction( GEOMOp::OpDMShadingWithEdges, "SHADING_WITH_EDGES" );
1115   createGeomAction( GEOMOp::OpDMTexture,          "TEXTURE" );
1116   createGeomAction( GEOMOp::OpShowAll,          "DISPLAY_ALL" );
1117   createGeomAction( GEOMOp::OpHideAll,          "ERASE_ALL" );
1118   createGeomAction( GEOMOp::OpShow,             "DISPLAY" );
1119   createGeomAction( GEOMOp::OpSwitchVectors,    "VECTOR_MODE");
1120   createGeomAction( GEOMOp::OpSwitchVertices,   "VERTICES_MODE");
1121   createGeomAction( GEOMOp::OpSwitchName,       "NAME_MODE");
1122   createGeomAction( GEOMOp::OpSelectVertex,     "VERTEX_SEL_ONLY" ,"", 0, true );
1123   createGeomAction( GEOMOp::OpSelectEdge,       "EDGE_SEL_ONLY", "", 0, true );
1124   createGeomAction( GEOMOp::OpSelectWire,       "WIRE_SEL_ONLY", "",  0, true );
1125   createGeomAction( GEOMOp::OpSelectFace,       "FACE_SEL_ONLY", "", 0, true );
1126   createGeomAction( GEOMOp::OpSelectShell,      "SHELL_SEL_ONLY", "",  0, true );
1127   createGeomAction( GEOMOp::OpSelectSolid,      "SOLID_SEL_ONLY", "", 0, true );
1128   createGeomAction( GEOMOp::OpSelectCompound,   "COMPOUND_SEL_ONLY", "",  0, true );
1129   createGeomAction( GEOMOp::OpSelectAll,        "ALL_SEL_ONLY", "",  0, true );
1130   createGeomAction( GEOMOp::OpShowOnly,         "DISPLAY_ONLY" );
1131   createGeomAction( GEOMOp::OpShowOnlyChildren, "SHOW_ONLY_CHILDREN" );
1132   createGeomAction( GEOMOp::OpBringToFront,     "BRING_TO_FRONT", "", 0, true );
1133   createGeomAction( GEOMOp::OpClsBringToFront,  "CLS_BRING_TO_FRONT" );
1134   createGeomAction( GEOMOp::OpHide,             "ERASE" );
1135
1136   createGeomAction( GEOMOp::OpWireframe,        "POP_WIREFRAME", "", 0, true );
1137   createGeomAction( GEOMOp::OpShading,          "POP_SHADING", "", 0, true );
1138   createGeomAction( GEOMOp::OpShadingWithEdges, "POP_SHADING_WITH_EDGES", "", 0, true );
1139   createGeomAction( GEOMOp::OpTexture,          "POP_TEXTURE", "", 0, true );
1140   createGeomAction( GEOMOp::OpEdgeWidth,        "EDGE_WIDTH");
1141   createGeomAction( GEOMOp::OpIsosWidth,        "ISOS_WIDTH");
1142   createGeomAction( GEOMOp::OpVectors,          "POP_VECTORS", "", 0, true );
1143   createGeomAction( GEOMOp::OpVertices,         "POP_VERTICES", "", 0, true );
1144   createGeomAction( GEOMOp::OpShowName,         "POP_SHOW_NAME", "", 0, true );
1145   createGeomAction( GEOMOp::OpDeflection,       "POP_DEFLECTION" );
1146   createGeomAction( GEOMOp::OpColor,            "POP_COLOR" );
1147   createGeomAction( GEOMOp::OpSetTexture,       "POP_SETTEXTURE" );
1148   createGeomAction( GEOMOp::OpTransparency,     "POP_TRANSPARENCY" );
1149   createGeomAction( GEOMOp::OpIsos,             "POP_ISOS" );
1150   createGeomAction( GEOMOp::OpAutoColor,        "POP_AUTO_COLOR" );
1151   createGeomAction( GEOMOp::OpNoAutoColor,      "POP_DISABLE_AUTO_COLOR" );
1152   createGeomAction( GEOMOp::OpGroupCreatePopup, "POP_CREATE_GROUP" );
1153   createGeomAction( GEOMOp::OpEditFieldPopup,   "POP_EDIT_FIELD" );
1154   createGeomAction( GEOMOp::OpDiscloseChildren, "POP_DISCLOSE_CHILDREN" );
1155   createGeomAction( GEOMOp::OpConcealChildren,  "POP_CONCEAL_CHILDREN" );
1156   createGeomAction( GEOMOp::OpUnpublishObject,  "POP_UNPUBLISH_OBJ" );
1157   createGeomAction( GEOMOp::OpPublishObject,    "POP_PUBLISH_OBJ" );
1158   createGeomAction( GEOMOp::OpPointMarker,      "POP_POINT_MARKER" );
1159   createGeomAction( GEOMOp::OpMaterialProperties,   "POP_MATERIAL_PROPERTIES" );
1160   createGeomAction( GEOMOp::OpPredefMaterCustom,    "POP_PREDEF_MATER_CUSTOM" );
1161   createGeomAction( GEOMOp::OpCreateFolder, "POP_CREATE_FOLDER" );
1162   createGeomAction( GEOMOp::OpSortChildren, "POP_SORT_CHILD_ITEMS" );
1163 #ifndef DISABLE_GRAPHICSVIEW
1164   createGeomAction( GEOMOp::OpShowDependencyTree, "POP_SHOW_DEPENDENCY_TREE" );
1165 #endif
1166   createGeomAction( GEOMOp::OpReduceStudy,        "POP_REDUCE_STUDY" );
1167   createGeomAction( GEOMOp::OpShowAllDimensions,  "POP_SHOW_ALL_DIMENSIONS" );
1168   createGeomAction( GEOMOp::OpHideAllDimensions,  "POP_HIDE_ALL_DIMENSIONS" );
1169   createGeomAction( GEOMOp::OpShowAllAnnotations, "POP_SHOW_ALL_ANNOTATIONS" );
1170   createGeomAction( GEOMOp::OpHideAllAnnotations, "POP_HIDE_ALL_ANNOTATIONS" );
1171
1172   // Create actions for increase/decrease transparency shortcuts
1173   createGeomAction( GEOMOp::OpIncrTransparency, "", "", 0, false,
1174                     "Geometry:Increase transparency");
1175   createGeomAction( GEOMOp::OpDecrTransparency, "", "", 0, false,
1176                     "Geometry:Decrease transparency");
1177
1178   // Create actions for increase/decrease number of isolines
1179   createGeomAction( GEOMOp::OpIncrNbIsos, "", "", 0, false,
1180                     "Geometry:Increase number of isolines");
1181   createGeomAction( GEOMOp::OpDecrNbIsos, "", "", 0, false,
1182                     "Geometry:Decrease number of isolines");
1183
1184   //createGeomAction( GEOMOp::OpPipeTShape, "PIPETSHAPE" );
1185   //createGeomAction( GEOMOp::OpDividedDisk, "DIVIDEDDISK" );
1186   //createGeomAction( GEOMOp::OpDividedCylinder, "DIVIDEDCYLINDER" );
1187   //createGeomAction( GEOMOp::OpSmoothingSurface, "SMOOTHINGSURFACE" );
1188   //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@//
1189
1190   // ---- create menus --------------------------
1191
1192   /*int fileId =*/ createMenu( tr( "MEN_FILE" ), -1, -1 );
1193
1194   int editId = createMenu( tr( "MEN_EDIT" ), -1, -1 );
1195   createMenu( GEOMOp::OpDelete, editId, -1 );
1196
1197   int newEntId = createMenu( tr( "MEN_NEW_ENTITY" ), -1, -1, 10 );
1198
1199   int basicId = createMenu( tr( "MEN_BASIC" ), newEntId, -1 );
1200   createMenu( GEOMOp::OpPoint,            basicId, -1 );
1201   createMenu( GEOMOp::OpLine,             basicId, -1 );
1202   createMenu( GEOMOp::OpCircle,           basicId, -1 );
1203   createMenu( GEOMOp::OpEllipse,          basicId, -1 );
1204   createMenu( GEOMOp::OpArc,              basicId, -1 );
1205   createMenu( GEOMOp::OpCurve,            basicId, -1 );
1206   createMenu( GEOMOp::Op2dSketcher,       basicId, -1 );
1207   createMenu( GEOMOp::Op2dPolylineEditor, basicId, -1 );
1208   createMenu( GEOMOp::Op3dSketcher,       basicId, -1 );
1209   createMenu( GEOMOp::OpIsoline,          basicId, -1 );
1210   createMenu( GEOMOp::OpSurfaceFromFace, basicId, -1 );
1211   createMenu( separator(),                basicId, -1 );
1212   createMenu( GEOMOp::OpVector,           basicId, -1 );
1213   createMenu( GEOMOp::OpPlane,            basicId, -1 );
1214   createMenu( GEOMOp::OpLCS,              basicId, -1 );
1215   createMenu( GEOMOp::OpOriginAndVectors, basicId, -1 );
1216
1217   int primId = createMenu( tr( "MEN_PRIMITIVES" ), newEntId, -1 );
1218   createMenu( GEOMOp::OpBox,       primId, -1 );
1219   createMenu( GEOMOp::OpCylinder,  primId, -1 );
1220   createMenu( GEOMOp::OpSphere,    primId, -1 );
1221   createMenu( GEOMOp::OpTorus,     primId, -1 );
1222   createMenu( GEOMOp::OpCone,      primId, -1 );
1223   createMenu( GEOMOp::OpRectangle, primId, -1 );
1224   createMenu( GEOMOp::OpDisk,      primId, -1 );
1225   //createMenu( GEOMOp::OpPipeTShape,primId, -1 );
1226
1227   int genId = createMenu( tr( "MEN_GENERATION" ), newEntId, -1 );
1228   createMenu( GEOMOp::OpPrism,      genId, -1 );
1229   createMenu( GEOMOp::OpRevolution, genId, -1 );
1230   createMenu( GEOMOp::OpFilling,    genId, -1 );
1231   createMenu( GEOMOp::OpPipe,       genId, -1 );
1232   createMenu( GEOMOp::OpPipePath,   genId, -1 );
1233   createMenu( GEOMOp::OpThickness,  genId, -1 );
1234
1235   //int advId = createMenu( tr( "MEN_ADVANCED" ), newEntId, -1 );
1236   //createMenu( GEOMOp::OpSmoothingSurface, advId, -1 );
1237   //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@//
1238
1239   createMenu( separator(), newEntId, -1 );
1240
1241   int groupId = createMenu( tr( "MEN_GROUP" ), newEntId, -1 );
1242   createMenu( GEOMOp::OpGroupCreate,    groupId, -1 );
1243   createMenu( GEOMOp::OpGroupEdit,      groupId, -1 );
1244   createMenu( GEOMOp::OpGroupUnion,     groupId, -1 );
1245   createMenu( GEOMOp::OpGroupIntersect, groupId, -1 );
1246   createMenu( GEOMOp::OpGroupCut,       groupId, -1 );
1247
1248   createMenu( separator(), newEntId, -1 );
1249
1250   int fieldId = createMenu( tr( "MEN_FIELD" ), newEntId, -1 );
1251   createMenu( GEOMOp::OpCreateField,    fieldId, -1 );
1252   createMenu( GEOMOp::OpEditField,      fieldId, -1 );
1253
1254   createMenu( separator(), newEntId, -1 );
1255
1256   int blocksId = createMenu( tr( "MEN_BLOCKS" ), newEntId, -1 );
1257   createMenu( GEOMOp::OpQuadFace,        blocksId, -1 );
1258   createMenu( GEOMOp::OpHexaSolid,       blocksId, -1 );
1259   //createMenu( GEOMOp::OpDividedDisk,     blocksId, -1 );
1260   //createMenu( GEOMOp::OpDividedCylinder, blocksId, -1 );
1261
1262   createMenu( separator(),          newEntId, -1 );
1263
1264   createMenu( GEOMOp::OpExplode,    newEntId, -1 );
1265
1266   int buildId = createMenu( tr( "MEN_BUILD" ), newEntId, -1 );
1267   createMenu( GEOMOp::OpEdge,     buildId, -1 );
1268   createMenu( GEOMOp::OpWire,     buildId, -1 );
1269   createMenu( GEOMOp::OpFace,     buildId, -1 );
1270   createMenu( GEOMOp::OpShell,    buildId, -1 );
1271   createMenu( GEOMOp::OpSolid,    buildId, -1 );
1272   createMenu( GEOMOp::OpCompound, buildId, -1 );
1273
1274   createMenu( separator(),          newEntId, -1 );
1275
1276   createMenu( GEOMOp::OpPictureImport, newEntId, -1 );
1277 #ifdef WITH_OPENCV
1278   createMenu( GEOMOp::OpFeatureDetect, newEntId, -1 );
1279 #endif
1280
1281   int operId = createMenu( tr( "MEN_OPERATIONS" ), -1, -1, 10 );
1282
1283   int boolId = createMenu( tr( "MEN_BOOLEAN" ), operId, -1 );
1284   createMenu( GEOMOp::OpFuse,    boolId, -1 );
1285   createMenu( GEOMOp::OpCommon,  boolId, -1 );
1286   createMenu( GEOMOp::OpCut,     boolId, -1 );
1287   createMenu( GEOMOp::OpSection, boolId, -1 );
1288
1289   int transId = createMenu( tr( "MEN_TRANSFORMATION" ), operId, -1 );
1290   createMenu( GEOMOp::OpTranslate,      transId, -1 );
1291   createMenu( GEOMOp::OpRotate,         transId, -1 );
1292   createMenu( GEOMOp::OpChangeLoc,      transId, -1 );
1293   createMenu( GEOMOp::OpMirror,         transId, -1 );
1294   createMenu( GEOMOp::OpScale,          transId, -1 );
1295   createMenu( GEOMOp::OpOffset,         transId, -1 );
1296   createMenu( GEOMOp::OpProjection,     transId, -1 );
1297   createMenu( GEOMOp::OpExtension,      transId, -1 );
1298   createMenu( GEOMOp::OpProjOnCyl,      transId, -1 );
1299   createMenu( separator(),              transId, -1 );
1300   createMenu( GEOMOp::OpMultiTranslate, transId, -1 );
1301   createMenu( GEOMOp::OpMultiRotate,    transId, -1 );
1302
1303   int blockId = createMenu( tr( "MEN_BLOCKS" ), operId, -1 );
1304   createMenu( GEOMOp::OpMultiTransform, blockId, -1 );
1305   createMenu( GEOMOp::OpExplodeBlock,   blockId, -1 );
1306   createMenu( GEOMOp::OpPropagate,      blockId, -1 );
1307
1308   createMenu( separator(), operId, -1 );
1309
1310   createMenu( GEOMOp::OpPartition,     operId, -1 );
1311   createMenu( GEOMOp::OpArchimede,     operId, -1 );
1312   createMenu( GEOMOp::OpShapesOnShape, operId, -1 );
1313   createMenu( GEOMOp::OpSharedShapes,  operId, -1 );
1314   createMenu( GEOMOp::OpTransferData,  operId, -1 );
1315   createMenu( GEOMOp::OpExtraction,    operId, -1 );
1316
1317   createMenu( separator(), operId, -1 );
1318
1319   createMenu( GEOMOp::OpFillet1d,      operId, -1 );
1320   createMenu( GEOMOp::OpFillet2d,      operId, -1 );
1321   createMenu( GEOMOp::OpFillet3d,      operId, -1 );
1322   createMenu( GEOMOp::OpChamfer,       operId, -1 );
1323   createMenu( GEOMOp::OpExtrudedBoss,  operId, -1 );
1324   createMenu( GEOMOp::OpExtrudedCut,   operId, -1 );
1325
1326   int repairId = createMenu( tr( "MEN_REPAIR" ), -1, -1, 10 );
1327   createMenu( GEOMOp::OpShapeProcess,    repairId, -1 );
1328   createMenu( GEOMOp::OpSuppressFaces,   repairId, -1 );
1329   createMenu( GEOMOp::OpCloseContour,    repairId, -1 );
1330   createMenu( GEOMOp::OpRemoveIntWires,  repairId, -1 );
1331   createMenu( GEOMOp::OpSuppressHoles,   repairId, -1 );
1332   createMenu( GEOMOp::OpSewing,          repairId, -1 );
1333   createMenu( GEOMOp::OpGlueFaces,       repairId, -1 );
1334   createMenu( GEOMOp::OpGlueEdges,       repairId, -1 );
1335   createMenu( GEOMOp::OpLimitTolerance,  repairId, -1 );
1336   createMenu( GEOMOp::OpAddPointOnEdge,  repairId, -1 );
1337   //createMenu( GEOMOp::OpFreeBoundaries,  repairId, -1 );
1338   //createMenu( GEOMOp::OpFreeFaces,       repairId, -1 );
1339   createMenu( GEOMOp::OpOrientation,      repairId, -1 );
1340   createMenu( GEOMOp::OpRemoveWebs,       repairId, -1 );
1341   createMenu( GEOMOp::OpRemoveExtraEdges, repairId, -1 );
1342   createMenu( GEOMOp::OpFuseEdges,        repairId, -1 );
1343   createMenu( GEOMOp::OpUnionFaces,       repairId, -1 );
1344
1345   int measurId = createMenu( tr( "MEN_MEASURES" ), -1, -1, 10 );
1346   createMenu( GEOMOp::OpPointCoordinates, measurId, -1 );
1347   createMenu( GEOMOp::OpProperties,       measurId, -1 );
1348   createMenu( separator(),                measurId, -1 );
1349   createMenu( GEOMOp::OpCenterMass,       measurId, -1 );
1350   createMenu( GEOMOp::OpInertia,          measurId, -1 );
1351   createMenu( GEOMOp::OpNormale,          measurId, -1 );
1352   createMenu( separator(),                measurId, -1 );
1353   createMenu( GEOMOp::OpFreeBoundaries,   measurId, -1 );
1354   createMenu( GEOMOp::OpFreeFaces,        measurId, -1 );
1355   createMenu( separator(),                measurId, -1 );
1356
1357   int dimId = createMenu( tr( "MEN_DIMENSIONS" ), measurId, -1 );
1358   createMenu( GEOMOp::OpBoundingBox,      dimId, -1 );
1359   createMenu( GEOMOp::OpMinDistance,      dimId, -1 );
1360   createMenu( GEOMOp::OpAngle,            dimId, -1 );
1361   createMenu( GEOMOp::OpManageDimensions, dimId, -1 );
1362
1363   createMenu( GEOMOp::OpAnnotation,       measurId, -1 );
1364
1365   createMenu( separator(),               measurId, -1 );
1366   createMenu( GEOMOp::OpTolerance,       measurId, -1 );
1367   createMenu( separator(),               measurId, -1 );
1368   createMenu( GEOMOp::OpWhatIs,          measurId, -1 );
1369   createMenu( GEOMOp::OpCheckShape,      measurId, -1 );
1370   createMenu( GEOMOp::OpCheckCompound,   measurId, -1 );
1371   createMenu( GEOMOp::OpGetNonBlocks,    measurId, -1 );
1372   createMenu( GEOMOp::OpCheckSelfInters, measurId, -1 );
1373   createMenu( GEOMOp::OpFastCheckInters, measurId, -1 );
1374   createMenu( GEOMOp::OpInspectObj,      measurId, -1 );
1375 #ifndef DISABLE_PLOT2DVIEWER
1376   createMenu( GEOMOp::OpShapeStatistics, measurId, -1 );
1377 #endif
1378
1379   int toolsId = createMenu( tr( "MEN_TOOLS" ), -1, -1, 50 );
1380 #ifndef DISABLE_PYCONSOLE
1381 #if defined(_DEBUG_) || defined(_DEBUG) // PAL16821
1382   createMenu( separator(),         toolsId, -1 );
1383   createMenu( GEOMOp::OpCheckGeom, toolsId, -1 );
1384 #endif
1385 #endif
1386
1387   createMenu( separator(),         toolsId, -1 );
1388   createMenu( GEOMOp::OpMaterialsLibrary, toolsId, -1 );
1389   createMenu( separator(),         toolsId, -1 );
1390
1391   int viewId = createMenu( tr( "MEN_VIEW" ), -1, -1 );
1392   createMenu( separator(),       viewId, -1 );
1393
1394   int dispmodeId = createMenu( tr( "MEN_DISPLAY_MODE" ), viewId, -1 );
1395   createMenu( GEOMOp::OpDMWireframe,        dispmodeId, -1 );
1396   createMenu( GEOMOp::OpDMShading,          dispmodeId, -1 );
1397   createMenu( GEOMOp::OpDMShadingWithEdges, dispmodeId, -1 );
1398   createMenu( GEOMOp::OpDMTexture,          dispmodeId, -1 );
1399   createMenu( separator(),                  dispmodeId, -1 );
1400   createMenu( GEOMOp::OpSwitchVectors,      dispmodeId, -1 );
1401   createMenu( GEOMOp::OpSwitchVertices,     dispmodeId, -1 );
1402   createMenu( GEOMOp::OpSwitchName,         dispmodeId, -1 );
1403
1404   createMenu( separator(),       viewId, -1 );
1405   createMenu( GEOMOp::OpShowAll, viewId, -1 );
1406   createMenu( GEOMOp::OpHideAll, viewId, -1 );
1407   createMenu( separator(),       viewId, -1 );
1408   createMenu( GEOMOp::OpPublishObject, viewId, -1 );
1409   createMenu( separator(),       viewId, -1 );
1410
1411 /*
1412   PAL9111:
1413   because of these items are accessible through object browser and viewers
1414   we have removed they from main menu
1415
1416   createMenu( GEOMOp::OpShow, viewId, -1 );
1417   createMenu( GEOMOp::OpShowOnly, viewId, -1 );
1418   createMenu( GEOMOp::OpHide, viewId, -1 );
1419 */
1420
1421   // ---- create toolbars --------------------------
1422
1423   int basicTbId = createTool( tr( "TOOL_BASIC" ), QString( "GEOMBasic" ) );
1424   createTool( GEOMOp::OpPoint,            basicTbId );
1425   createTool( GEOMOp::OpLine,             basicTbId );
1426   createTool( GEOMOp::OpCircle,           basicTbId );
1427   createTool( GEOMOp::OpEllipse,          basicTbId );
1428   createTool( GEOMOp::OpArc,              basicTbId );
1429   createTool( GEOMOp::OpCurve,            basicTbId );
1430   createTool( GEOMOp::OpVector,           basicTbId );
1431   createTool( GEOMOp::Op2dSketcher,       basicTbId ); //rnc
1432   createTool( GEOMOp::Op2dPolylineEditor, basicTbId ); 
1433   createTool( GEOMOp::Op3dSketcher,       basicTbId ); //rnc
1434   createTool( GEOMOp::OpIsoline,          basicTbId );
1435   createTool( GEOMOp::OpSurfaceFromFace,  basicTbId );
1436   createTool( GEOMOp::OpPlane,            basicTbId );
1437   createTool( GEOMOp::OpLCS,              basicTbId );
1438   createTool( GEOMOp::OpOriginAndVectors, basicTbId );
1439
1440 //   int sketchTbId = createTool( tr( "TOOL_SKETCH" ), QString( "GEOMSketch" ) );
1441 //   createTool( GEOMOp::Op2dSketcher,  sketchTbId );
1442 //   createTool( GEOMOp::Op3dSketcher,  sketchTbId );
1443
1444   int primTbId = createTool( tr( "TOOL_PRIMITIVES" ), QString( "GEOMPrimitives" ) );
1445   createTool( GEOMOp::OpBox,        primTbId );
1446   createTool( GEOMOp::OpCylinder,   primTbId );
1447   createTool( GEOMOp::OpSphere,     primTbId );
1448   createTool( GEOMOp::OpTorus,      primTbId );
1449   createTool( GEOMOp::OpCone,       primTbId );
1450   createTool( GEOMOp::OpRectangle,  primTbId );
1451   createTool( GEOMOp::OpDisk,       primTbId );
1452   //createTool( GEOMOp::OpPipeTShape, primTbId ); //rnc
1453
1454   //int blocksTbId = createTool( tr( "TOOL_BLOCKS" ), QString( "GEOMBlocks" ) );
1455   //createTool( GEOMOp::OpDividedDisk, blocksTbId );
1456   //createTool( GEOMOp::OpDividedCylinder, blocksTbId );
1457
1458   int boolTbId = createTool( tr( "TOOL_BOOLEAN" ), QString( "GEOMBooleanOperations" ) );
1459   createTool( GEOMOp::OpFuse,       boolTbId );
1460   createTool( GEOMOp::OpCommon,     boolTbId );
1461   createTool( GEOMOp::OpCut,        boolTbId );
1462   createTool( GEOMOp::OpSection,    boolTbId );
1463
1464   int genTbId = createTool( tr( "TOOL_GENERATION" ), QString( "GEOMGeneration" ) );
1465   createTool( GEOMOp::OpPrism,      genTbId );
1466   createTool( GEOMOp::OpRevolution, genTbId );
1467   createTool( GEOMOp::OpFilling,    genTbId );
1468   createTool( GEOMOp::OpPipe,       genTbId );
1469   createTool( GEOMOp::OpPipePath,   genTbId );
1470   createTool( GEOMOp::OpThickness,  genTbId );
1471
1472   int transTbId = createTool( tr( "TOOL_TRANSFORMATION" ), QString( "GEOMTransformation" ) );
1473   createTool( GEOMOp::OpTranslate,      transTbId );
1474   createTool( GEOMOp::OpRotate,         transTbId );
1475   createTool( GEOMOp::OpChangeLoc,      transTbId );
1476   createTool( GEOMOp::OpMirror,         transTbId );
1477   createTool( GEOMOp::OpScale,          transTbId );
1478   createTool( GEOMOp::OpOffset,         transTbId );
1479   createTool( GEOMOp::OpProjection,     transTbId );
1480   createTool( GEOMOp::OpExtension,      transTbId );
1481   createTool( GEOMOp::OpProjOnCyl,      transTbId );
1482   createTool( separator(),              transTbId );
1483   createTool( GEOMOp::OpMultiTranslate, transTbId );
1484   createTool( GEOMOp::OpMultiRotate,    transTbId );
1485
1486   int operTbId = createTool( tr( "TOOL_OPERATIONS" ), QString( "GEOMOperations" ) );
1487   createTool( GEOMOp::OpExplode,         operTbId );
1488   createTool( GEOMOp::OpPartition,       operTbId );
1489   createTool( GEOMOp::OpArchimede,       operTbId );
1490   createTool( GEOMOp::OpShapesOnShape,   operTbId );
1491   createTool( GEOMOp::OpSharedShapes,    operTbId );
1492   createTool( GEOMOp::OpTransferData,    operTbId );
1493   createTool( GEOMOp::OpExtraction,      operTbId );
1494
1495   int featTbId = createTool( tr( "TOOL_FEATURES" ), QString( "GEOMModification" ) );
1496   createTool( GEOMOp::OpFillet1d,        featTbId );
1497   createTool( GEOMOp::OpFillet2d,        featTbId );
1498   createTool( GEOMOp::OpFillet3d,        featTbId );
1499   createTool( GEOMOp::OpChamfer,         featTbId );
1500   createTool( GEOMOp::OpExtrudedBoss,    featTbId );
1501   createTool( GEOMOp::OpExtrudedCut,     featTbId );
1502
1503   int buildTbId = createTool( tr( "TOOL_BUILD" ), QString( "GEOMBuild" ) );
1504   createTool( GEOMOp::OpEdge,     buildTbId );
1505   createTool( GEOMOp::OpWire,     buildTbId );
1506   createTool( GEOMOp::OpFace,     buildTbId );
1507   createTool( GEOMOp::OpShell,    buildTbId );
1508   createTool( GEOMOp::OpSolid,    buildTbId );
1509   createTool( GEOMOp::OpCompound, buildTbId );
1510
1511   int measureTbId = createTool( tr( "TOOL_MEASURES" ), QString( "GEOMMeasures" ) );
1512   createTool( GEOMOp::OpPointCoordinates, measureTbId );
1513   createTool( GEOMOp::OpProperties,       measureTbId );
1514   createTool( GEOMOp::OpCenterMass,       measureTbId );
1515   createTool( GEOMOp::OpInertia,          measureTbId );
1516   createTool( GEOMOp::OpNormale,          measureTbId );
1517   createTool( separator(),                measureTbId );
1518   createTool( GEOMOp::OpBoundingBox,      measureTbId );
1519   createTool( GEOMOp::OpMinDistance,      measureTbId );
1520   createTool( GEOMOp::OpAngle,            measureTbId );
1521   createTool( GEOMOp::OpAnnotation,       measureTbId );
1522   createTool( GEOMOp::OpTolerance  ,      measureTbId );
1523   createTool( separator(),                measureTbId );
1524   createTool( GEOMOp::OpFreeBoundaries,   measureTbId );
1525   createTool( GEOMOp::OpFreeFaces,        measureTbId );
1526   createTool( separator(),                measureTbId );
1527   createTool( GEOMOp::OpWhatIs,           measureTbId );
1528   createTool( GEOMOp::OpCheckShape,       measureTbId );
1529   createTool( GEOMOp::OpCheckCompound,    measureTbId );
1530   createTool( GEOMOp::OpGetNonBlocks,     measureTbId );
1531   createTool( GEOMOp::OpCheckSelfInters,  measureTbId );
1532   createTool( GEOMOp::OpFastCheckInters,  measureTbId );
1533
1534   int picturesTbId = createTool( tr( "TOOL_PICTURES" ), QString( "GEOMPictures" ) );
1535   createTool( GEOMOp::OpPictureImport,    picturesTbId );
1536 #ifdef WITH_OPENCV
1537   createTool( GEOMOp::OpFeatureDetect,  picturesTbId );
1538 #endif
1539
1540   //int advancedTbId = createTool( tr( "TOOL_ADVANCED" ) );
1541   //createTool( GEOMOp::OpSmoothingSurface, advancedTbId );
1542   //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@//
1543
1544   // ---- create popup menus --------------------------
1545
1546   QString clientOCCorVTK = "(client='OCCViewer' or client='VTKViewer')";
1547   QString clientOCC = "(client='OCCViewer')";
1548   QString clientOCCorVTK_AndSomeVisible = clientOCCorVTK + " and selcount>0 and isVisible";
1549   QString clientOCC_AndSomeVisible = clientOCC + " and selcount>0 and isVisible";
1550
1551   QString clientOCCorOB = "(client='ObjectBrowser' or client='OCCViewer')";
1552   QString clientOCCorVTKorOB = "(client='ObjectBrowser' or client='OCCViewer' or client='VTKViewer')";
1553   QString clientOCCorVTKorOB_AndSomeVisible = clientOCCorVTKorOB + " and selcount>0 and isVisible";
1554   QString clientOCCorOB_AndSomeVisible = clientOCCorOB + " and selcount>0 and isVisible";
1555
1556   QString autoColorPrefix =
1557     "(client='ObjectBrowser' or client='OCCViewer' or client='VTKViewer') and type='Shape' and selcount=1";
1558
1559   QtxPopupMgr* mgr = popupMgr();
1560
1561   mgr->insert( action(  GEOMOp::OpDelete ), -1, -1 );  // delete
1562   mgr->setRule( action( GEOMOp::OpDelete ), QString("$type in {'Shape' 'Group' 'Folder' 'Field' 'FieldStep'} and selcount>0"), QtxPopupMgr::VisibleRule );
1563   mgr->insert( action(  GEOMOp::OpGroupCreatePopup ), -1, -1 ); // create group
1564   mgr->setRule( action( GEOMOp::OpGroupCreatePopup ), QString("type='Shape' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1565   mgr->insert( action(  GEOMOp::OpEditFieldPopup ), -1, -1 ); // edit field
1566   mgr->setRule( action( GEOMOp::OpEditFieldPopup ), QString("(type='Field' or type='FieldStep') and isOCC=true"), QtxPopupMgr::VisibleRule );
1567   mgr->insert( action(  GEOMOp::OpDiscloseChildren ), -1, -1 ); // disclose child items
1568   mgr->setRule( action( GEOMOp::OpDiscloseChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasConcealedChildren=true"), QtxPopupMgr::VisibleRule );
1569
1570   mgr->insert( action(  GEOMOp::OpConcealChildren ), -1, -1 ); // conceal child items
1571   mgr->setRule( action( GEOMOp::OpConcealChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasDisclosedChildren=true"), QtxPopupMgr::VisibleRule );
1572   mgr->insert( action(  GEOMOp::OpGroupEdit ), -1, -1 );  // edit group
1573   mgr->setRule( action( GEOMOp::OpGroupEdit ),  QString("client='ObjectBrowser' and type='Group' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1574   mgr->insert( separator(), -1, -1 );     // -----------
1575
1576   //QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and (selcount>0) and isOCC=true and topLevel=false";
1577   QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and isFolder=false and (selcount>0) and isOCC=true";
1578   mgr->insert( action(GEOMOp::OpBringToFront ), -1, -1 ); // bring to front
1579   mgr->setRule(action(GEOMOp::OpBringToFront), bringRule + " and autoBringToFront = false", QtxPopupMgr::VisibleRule );
1580   mgr->setRule(action(GEOMOp::OpBringToFront), "topLevel=true", QtxPopupMgr::ToggleRule );
1581   mgr->insert( action(GEOMOp::OpClsBringToFront ), -1, -1 ); // clear bring to front
1582   mgr->setRule( action(GEOMOp::OpClsBringToFront ), clientOCC + " and autoBringToFront = false", QtxPopupMgr::VisibleRule );
1583   mgr->insert( separator(), -1, -1 );     // -----------
1584   dispmodeId = mgr->insert(  tr( "MEN_DISPLAY_MODE" ), -1, -1 ); // display mode menu
1585   mgr->insert( action(  GEOMOp::OpWireframe ), dispmodeId, -1 ); // wireframe
1586   mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1587   mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK + " and displaymode='Wireframe'", QtxPopupMgr::ToggleRule );
1588   mgr->insert( action(  GEOMOp::OpShading ), dispmodeId, -1 ); // shading
1589   mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1590   mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK + " and displaymode='Shading'", QtxPopupMgr::ToggleRule );
1591   mgr->insert( action(  GEOMOp::OpShadingWithEdges ), dispmodeId, -1 ); // shading with edges
1592   mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1593   mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK + " and displaymode='ShadingWithEdges'", QtxPopupMgr::ToggleRule );
1594   mgr->insert( action(  GEOMOp::OpTexture ), dispmodeId, -1 ); // wireframe
1595   mgr->setRule( action( GEOMOp::OpTexture ), clientOCC_AndSomeVisible, QtxPopupMgr::VisibleRule );
1596   mgr->setRule( action( GEOMOp::OpTexture), clientOCC + " and displaymode='Texture'", QtxPopupMgr::ToggleRule );
1597   mgr->insert( separator(), dispmodeId, -1 );
1598   mgr->insert( action(  GEOMOp::OpVectors ), dispmodeId, -1 ); // vectors
1599   mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK_AndSomeVisible  + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1600   mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK + " and isVectorsMode", QtxPopupMgr::ToggleRule );
1601   mgr->insert( action(  GEOMOp::OpVertices ), dispmodeId, -1 ); // vertices
1602   mgr->setRule( action( GEOMOp::OpVertices ), clientOCCorVTK_AndSomeVisible  + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1603   mgr->setRule( action( GEOMOp::OpVertices ), clientOCCorVTK + " and isVerticesMode", QtxPopupMgr::ToggleRule );
1604   mgr->insert( action(  GEOMOp::OpShowName ), dispmodeId, -1 ); // show name
1605   mgr->setRule( action( GEOMOp::OpShowName ), clientOCCorVTK_AndSomeVisible  + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1606   mgr->setRule( action( GEOMOp::OpShowName ), clientOCCorVTK + " and isNameMode", QtxPopupMgr::ToggleRule );
1607   mgr->insert( separator(), -1, -1 );     // -----------
1608
1609   mgr->insert( action(  GEOMOp::OpColor ), -1, -1 ); // color
1610   mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})" + "and isPhysicalMaterial=false", QtxPopupMgr::VisibleRule );
1611   mgr->insert( action(  GEOMOp::OpTransparency ), -1, -1 ); // transparency
1612   mgr->setRule( action( GEOMOp::OpTransparency ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1613   mgr->insert( action(  GEOMOp::OpIsos ), -1, -1 ); // isos
1614   mgr->setRule( action( GEOMOp::OpIsos ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1615   mgr->insert( action(  GEOMOp::OpDeflection ), -1, -1 ); // deflection
1616   mgr->setRule( action( GEOMOp::OpDeflection ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1617   mgr->insert( action(  GEOMOp::OpPointMarker ), -1, -1 ); // point marker
1618   mgr->setRule( action( GEOMOp::OpPointMarker ), clientOCCorOB + " and $type in {'Shape' 'Group' 'Field' 'FieldStep'} and selcount>0 and isOCC=true", QtxPopupMgr::VisibleRule );
1619
1620   // material properties
1621   mgr->insert( action(  GEOMOp::OpMaterialProperties ), -1, -1 );
1622   mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1623
1624  // texture
1625   mgr->insert( action(  GEOMOp::OpSetTexture ), -1, -1 );
1626   mgr->setRule( action( GEOMOp::OpSetTexture ), clientOCCorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1627
1628   int lineW = mgr->insert(  tr( "MEN_LINE_WIDTH" ), -1, -1 ); // line width menu
1629   mgr->insert( action(  GEOMOp::OpEdgeWidth ), lineW, -1 ); // edge width
1630   mgr->setRule( action( GEOMOp::OpEdgeWidth ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1631
1632   mgr->insert( action(  GEOMOp::OpIsosWidth ), lineW, -1 ); // isos width
1633   mgr->setRule( action( GEOMOp::OpIsosWidth ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1634
1635   mgr->insert( separator(), -1, -1 );     // -----------
1636   mgr->insert( action(  GEOMOp::OpAutoColor ), -1, -1 ); // auto color
1637   mgr->setRule( action( GEOMOp::OpAutoColor ), autoColorPrefix + " and isAutoColor=false", QtxPopupMgr::VisibleRule );
1638   mgr->insert( action(  GEOMOp::OpNoAutoColor ), -1, -1 ); // disable auto color
1639   mgr->setRule( action( GEOMOp::OpNoAutoColor ), autoColorPrefix + " and isAutoColor=true", QtxPopupMgr::VisibleRule );
1640   mgr->insert( separator(), -1, -1 );     // -----------
1641
1642   mgr->insert( action(  GEOMOp::OpEditAnnotation ), -1, -1 );  // edit annotation
1643   mgr->setRule( action( GEOMOp::OpEditAnnotation ),  clientOCC + " and annotationsCount=1", QtxPopupMgr::VisibleRule );
1644   mgr->insert( action(  GEOMOp::OpDeleteAnnotation ), -1, -1 );  // delete annotation
1645   mgr->setRule( action( GEOMOp::OpDeleteAnnotation ),  clientOCC + " and annotationsCount>0", QtxPopupMgr::VisibleRule );
1646   mgr->insert( separator(), -1, -1 );     // -----------
1647
1648   QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ",
1649           onlyComponent = "((type='Component') and selcount=1)",
1650           rule = canDisplay + "and ((($type in {%1}) and( %2 )) or " + onlyComponent + ")",
1651           types = "'Shape' 'Group' 'FieldStep'";
1652
1653   mgr->insert( action(  GEOMOp::OpShow ), -1, -1 ); // display
1654   mgr->setRule( action( GEOMOp::OpShow ), rule.arg( types ).arg( "not isVisible" ), QtxPopupMgr::VisibleRule );
1655
1656   mgr->insert( action(  GEOMOp::OpHide ), -1, -1 ); // erase
1657   mgr->setRule( action( GEOMOp::OpHide ), rule.arg( types ).arg( "isVisible" ), QtxPopupMgr::VisibleRule );
1658
1659   mgr->insert( action(  GEOMOp::OpHideAll ), -1, -1 ); // erase All
1660   mgr->setRule( action( GEOMOp::OpHideAll ), clientOCCorVTK, QtxPopupMgr::VisibleRule );
1661
1662   QString selectOnly = "(client='OCCViewer' or client='VTKViewer') and (selcount=0)";
1663
1664   int selectonlyId = mgr->insert( tr("MEN_SELECT_ONLY"), -1, -1);                //select only menu
1665   mgr->insert( action(GEOMOp::OpSelectVertex),   selectonlyId, -1);                                  //Vertex
1666   mgr->setRule(action(GEOMOp::OpSelectVertex),   selectOnly, QtxPopupMgr::VisibleRule);
1667   mgr->setRule(action(GEOMOp::OpSelectVertex),   selectOnly + " and selectionmode='VERTEX'", QtxPopupMgr::ToggleRule);
1668   mgr->insert( action(GEOMOp::OpSelectEdge),     selectonlyId, -1);                                  //Edge
1669   mgr->setRule(action(GEOMOp::OpSelectEdge),     selectOnly, QtxPopupMgr::VisibleRule);
1670   mgr->setRule(action(GEOMOp::OpSelectEdge),     selectOnly + " and selectionmode='EDGE'", QtxPopupMgr::ToggleRule);
1671   mgr->insert( action(GEOMOp::OpSelectWire),     selectonlyId, -1);                                  //Wire
1672   mgr->setRule(action(GEOMOp::OpSelectWire),     selectOnly, QtxPopupMgr::VisibleRule);
1673   mgr->setRule(action(GEOMOp::OpSelectWire),     selectOnly + " and selectionmode='WIRE'", QtxPopupMgr::ToggleRule);
1674   mgr->insert( action(GEOMOp::OpSelectFace),     selectonlyId, -1);                                  //Face
1675   mgr->setRule(action(GEOMOp::OpSelectFace),     selectOnly, QtxPopupMgr::VisibleRule);
1676   mgr->setRule(action(GEOMOp::OpSelectFace),     selectOnly + " and selectionmode='FACE'", QtxPopupMgr::ToggleRule);
1677   mgr->insert( action(GEOMOp::OpSelectShell),    selectonlyId, -1);                                  //Shell
1678   mgr->setRule(action(GEOMOp::OpSelectShell),    selectOnly, QtxPopupMgr::VisibleRule);
1679   mgr->setRule(action(GEOMOp::OpSelectShell),    selectOnly + " and selectionmode='SHELL'", QtxPopupMgr::ToggleRule);
1680   mgr->insert( action(GEOMOp::OpSelectSolid),    selectonlyId, -1);                                  //Solid
1681   mgr->setRule(action(GEOMOp::OpSelectSolid),    selectOnly, QtxPopupMgr::VisibleRule);
1682   mgr->setRule(action(GEOMOp::OpSelectSolid),    selectOnly + " and selectionmode='SOLID'", QtxPopupMgr::ToggleRule);
1683   mgr->insert( action(GEOMOp::OpSelectCompound), selectonlyId, -1);                                  //Compound
1684   mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly, QtxPopupMgr::VisibleRule);
1685   mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly + " and selectionmode='COMPOUND'", QtxPopupMgr::ToggleRule);
1686   mgr->insert( separator(), selectonlyId, -1);
1687   mgr->insert( action(GEOMOp::OpSelectAll),      selectonlyId, -1);                                  //Clear selection filter
1688   mgr->setRule(action(GEOMOp::OpSelectAll),      selectOnly, QtxPopupMgr::VisibleRule);
1689   mgr->setRule(action(GEOMOp::OpSelectAll),      selectOnly + " and selectionmode='ALL'", QtxPopupMgr::ToggleRule);
1690   mgr->insert( action(GEOMOp::OpShowOnly ), -1, -1 ); // display only
1691   mgr->setRule(action(GEOMOp::OpShowOnly ), rule.arg( types ).arg( "true" ), QtxPopupMgr::VisibleRule );
1692   mgr->insert( action(GEOMOp::OpShowOnlyChildren ), -1, -1 ); // display only children
1693   mgr->setRule(action(GEOMOp::OpShowOnlyChildren ), (canDisplay + "and ($type in {%1}) and client='ObjectBrowser' and hasChildren=true").arg( types ), QtxPopupMgr::VisibleRule );
1694
1695   QString aDimensionRule = "($component={'GEOM'}) and selcount=1 and isVisible and type='Shape' and %1";
1696
1697   mgr->insert( separator(), -1, -1 ); // -----------
1698   mgr->insert( action( GEOMOp::OpShowAllDimensions ), -1, -1 ); // show all dimensions
1699   mgr->setRule( action( GEOMOp::OpShowAllDimensions ), aDimensionRule.arg( "hasHiddenDimensions" ), QtxPopupMgr::VisibleRule );
1700   mgr->insert( action( GEOMOp::OpHideAllDimensions ), -1, -1 ); // hide all dimensions
1701   mgr->setRule( action( GEOMOp::OpHideAllDimensions ), aDimensionRule.arg( "hasVisibleDimensions" ), QtxPopupMgr::VisibleRule );
1702   mgr->insert( action( GEOMOp::OpShowAllAnnotations ), -1, -1 ); // show all annotations
1703   mgr->setRule( action( GEOMOp::OpShowAllAnnotations ), aDimensionRule.arg( "hasHiddenAnnotations" ), QtxPopupMgr::VisibleRule );
1704   mgr->insert( action( GEOMOp::OpHideAllAnnotations ), -1, -1 ); // hide all annotations
1705   mgr->setRule( action( GEOMOp::OpHideAllAnnotations ), aDimensionRule.arg( "hasVisibleAnnotations" ), QtxPopupMgr::VisibleRule );
1706
1707   mgr->insert( separator(), -1, -1 );     // -----------
1708   mgr->insert( action(  GEOMOp::OpUnpublishObject ), -1, -1 ); // Unpublish object
1709   mgr->setRule( action( GEOMOp::OpUnpublishObject ), QString("client='ObjectBrowser' and $type in {'Shape' 'Group' 'Field' 'FieldStep'} and selcount>0"), QtxPopupMgr::VisibleRule );
1710
1711   mgr->insert( action(  GEOMOp::OpPublishObject ), -1, -1 ); // Publish object
1712   mgr->setRule( action( GEOMOp::OpPublishObject ), QString("client='ObjectBrowser' and isComponent=true"), QtxPopupMgr::VisibleRule );
1713
1714   mgr->insert( action(  GEOMOp::OpReimport ), -1, -1 );  // delete
1715   mgr->setRule( action( GEOMOp::OpReimport ), QString("$imported in {'true'} and selcount>0"), QtxPopupMgr::VisibleRule );
1716
1717   mgr->insert( separator(), -1, -1 );     // -----------
1718   mgr->insert( action(  GEOMOp::OpCreateFolder ), -1, -1 ); // Create Folder
1719   mgr->setRule( action( GEOMOp::OpCreateFolder ), QString("client='ObjectBrowser' and $component={'GEOM'} and (isComponent=true or isFolder=true)"), QtxPopupMgr::VisibleRule );
1720
1721   mgr->insert( separator(), -1, -1 );     // -----------
1722   mgr->insert( action(  GEOMOp::OpSortChildren ), -1, -1 ); // Sort child items
1723   mgr->setRule( action( GEOMOp::OpSortChildren ), QString("client='ObjectBrowser' and $component={'GEOM'} and nbChildren>1"), QtxPopupMgr::VisibleRule );
1724
1725 #ifndef DISABLE_GRAPHICSVIEW
1726   mgr->insert( separator(), -1, -1 );     // -----------
1727   mgr->insert( action(  GEOMOp::OpShowDependencyTree ), -1, -1 ); // Show dependency tree
1728   mgr->setRule( action( GEOMOp::OpShowDependencyTree ), clientOCCorVTKorOB + " and selcount>0 and ($component={'GEOM'}) and type='Shape'", QtxPopupMgr::VisibleRule );
1729 #endif
1730
1731   mgr->insert( separator(), -1, -1 );     // -----------
1732   mgr->insert( action(  GEOMOp::OpReduceStudy ), -1, -1 ); // Reduce Study
1733   mgr->setRule( action( GEOMOp::OpReduceStudy ), clientOCCorVTKorOB + " and selcount>0 and ($component={'GEOM'}) and type='Shape'", QtxPopupMgr::VisibleRule );
1734
1735   mgr->hide( mgr->actionId( action( myEraseAll ) ) );
1736
1737   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1738   if (resMgr) {
1739     GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)resMgr->integerValue("Geometry", "toplevel_dm", 0));
1740     QColor c = resMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) );
1741     GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c));
1742   }
1743
1744   // create plugin actions and menus
1745   addPluginActions();
1746 }
1747
1748 //=======================================================================
1749 // function : GeometryGUI::addPluginActions()
1750 // purpose  :
1751 //=======================================================================
1752 void GeometryGUI::addPluginActions()
1753 {
1754   // Resource manager
1755   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1756   if (!resMgr) return;
1757
1758   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
1759   if (!appStudy) return;
1760
1761   // Find names of a resource XML files ("AdvancedGEOM.xml" and others);
1762
1763   GEOMUtils::PluginInfo plugins = GEOMUtils::ReadPluginInfo();
1764
1765   int id = GEOMOp::OpLastOperationID; // TODO?
1766
1767   // loop on plugins
1768   GEOMUtils::PluginInfo::const_iterator it;
1769   for ( it = plugins.begin(); it != plugins.end(); ++it ) {
1770     // bind action lib and label to its ID for activateOperation() method proper work
1771     GEOMUtils::PluginData pdata = (*it);
1772     myPluginLibs[pdata.name.c_str()] = pdata.clientLib.c_str();
1773     std::list<GEOMUtils::ActionData> actions = (*it).actions;
1774     std::list<GEOMUtils::ActionData>::const_iterator ait;
1775     for ( ait = actions.begin(); ait != actions.end(); ++ait ) {
1776       GEOMUtils::ActionData adata = (*ait);
1777       // icon
1778       QPixmap icon;
1779       if ( !adata.icon.empty() )
1780         icon = resMgr->loadPixmap( pdata.name.c_str(), adata.icon.c_str() );
1781       // menu text (path)
1782       QStringList smenus = QString( adata.menuText.c_str() ).split( "/" );
1783       QString actionName = smenus.last();
1784       actionName = actionName.toUpper().prepend( "MEN_" );
1785       smenus.removeLast();
1786
1787       // path to action in toolbar
1788       QStringList stools = QString( adata.toolTip.c_str() ).split( "/" );
1789       QString actionTool = stools.last();
1790       actionTool = actionTool.toUpper().prepend( "TOP_" );
1791       stools.removeLast();
1792       
1793       QString actionStat = adata.statusText.c_str();
1794       actionStat = actionStat.toUpper().prepend( "STB_" );
1795
1796       createAction( id, // ~ adata.label
1797                     tr( actionTool.toLatin1().constData() ),
1798                     icon,
1799                     tr( actionName.toLatin1().constData() ),
1800                     tr( actionStat.toLatin1().constData() ),
1801                     QKeySequence( tr( adata.accel.c_str() ) ),
1802                     application()->desktop(),
1803                     false /*toggle*/,
1804                     this, SLOT( OnGUIEvent() ),
1805                     QString() /*shortcutAction*/ );
1806       
1807       int menuId = -1;
1808       foreach ( QString subMenu, smenus ) {
1809         QStringList subMenuList = subMenu.split( ":" );
1810         QString subMenuName = subMenuList[0].toUpper().prepend( "MEN_" );
1811         int subMenuGroup = subMenuList.size() > 1 ? subMenuList[1].toInt() : -1;
1812         menuId = createMenu( tr( subMenuName.toLatin1().constData() ), menuId, -1, subMenuGroup );
1813       }
1814       createMenu( id, menuId, -1 );
1815       
1816       if ( !stools.isEmpty() ) {
1817         QString subTool = stools[0];
1818         subTool = subTool.toUpper().prepend( "TOOL_" );
1819         int toolId = createTool( tr( subTool.toLatin1().constData() ) );
1820         createTool(id, toolId);
1821       }
1822
1823       // add action id to map
1824       PluginAction anAction( pdata.clientLib.c_str(), adata.label.c_str() );
1825       myPluginActions[id] = anAction;
1826       
1827       id++;
1828     }
1829   }
1830 }
1831
1832 //=======================================================================
1833 // function : GeometryGUI::activateModule()
1834 // purpose  : Called when GEOM module is activated
1835 //=======================================================================
1836 bool GeometryGUI::activateModule( SUIT_Study* study )
1837 {
1838   if ( CORBA::is_nil( myComponentGeom ) )
1839     return false;
1840
1841   bool res = SalomeApp_Module::activateModule( study );
1842
1843   if ( !res )
1844     return false;
1845   setMenuShown( true );
1846   setToolShown( true );
1847
1848   // import Python module that manages GEOM plugins (need to be here because SalomePyQt API uses active module)
1849   PyGILState_STATE gstate = PyGILState_Ensure();
1850   PyObject* pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
1851   if ( !pluginsmanager ) {
1852     PyErr_Print();
1853   }
1854   else {
1855     PyObject* result =
1856       PyObject_CallMethod(pluginsmanager, (char*)"initialize", (char*)"isss", 1, "geom",
1857                           tr("MEN_NEW_ENTITY").toUtf8().data(),
1858                           tr("GEOM_PLUGINS_OTHER").toUtf8().data());
1859     if ( !result )
1860       PyErr_Print();
1861     Py_XDECREF(result);
1862   }
1863   PyGILState_Release(gstate);
1864   // end of GEOM plugins loading
1865
1866   connect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1867           this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1868
1869   // Reset actions accelerator keys
1870   action(GEOMOp::OpDelete)->setEnabled( true ); // Delete: Key_Delete
1871
1872   GUIMap::Iterator it;
1873   for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1874     it.value()->activate( application()->desktop() );
1875
1876   LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1877
1878   connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
1879   connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( onAutoBringToFront() ));
1880   connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
1881
1882   if ( !myCreationInfoWdg )
1883     myCreationInfoWdg = new GEOMGUI_CreationInfoWdg( getApp() );
1884   getApp()->insertDockWindow( myCreationInfoWdg->getWinID(), myCreationInfoWdg );
1885   getApp()->placeDockWindow( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
1886
1887   if ( !myTextTreeWdg ) {
1888     myTextTreeWdg = new GEOMGUI_TextTreeWdg( getApp() );
1889     new GEOMGUI_TextTreeSelector( myTextTreeWdg, GetAnnotationMgr(), getApp()->selectionMgr() );
1890   }
1891
1892   getApp()->insertDockWindow( myTextTreeWdg->getWinID(), myTextTreeWdg );
1893   getApp()->placeDockWindow( myTextTreeWdg->getWinID(), Qt::LeftDockWidgetArea );
1894
1895   //NPAL 19674
1896   SALOME_ListIO selected;
1897   sm->selectedObjects( selected );
1898   sm->clearSelected();
1899
1900   SUIT_ViewManager* vm;
1901   ViewManagerList OCCViewManagers, VTKViewManagers;
1902
1903   application()->viewManagers( OCCViewer_Viewer::Type(), OCCViewManagers );
1904   QListIterator<SUIT_ViewManager*> itOCC( OCCViewManagers );
1905   while ( itOCC.hasNext() && (vm = itOCC.next()) )
1906     onViewManagerAdded(vm);
1907
1908   application()->viewManagers( SVTK_Viewer::Type(), VTKViewManagers );
1909   QListIterator<SUIT_ViewManager*> itVTK( VTKViewManagers );
1910   while ( itVTK.hasNext() && (vm = itVTK.next()) )
1911     onViewManagerAdded(vm);
1912
1913   sm->setSelectedObjects( selected, true );   //NPAL 19674
1914
1915   QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1916   if ( viewMenu )
1917     connect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1918
1919   // 0020836 (Basic vectors and origin)
1920   SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
1921   if ( aResourceMgr->booleanValue( "Geometry", "auto_create_base_objects", false ) ) {
1922     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
1923     if ( appStudy ) {
1924       _PTR(Study) studyDS = appStudy->studyDS();
1925       if ( studyDS ) {
1926         _PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
1927         if ( !aSComponent ) // create objects automatically only if there is no GEOM component
1928           createOriginAndBaseVectors();
1929       }
1930     }
1931   }
1932
1933   Py_XDECREF(pluginsmanager);
1934   return true;
1935 }
1936
1937 //=======================================================================
1938 // function : GeometryGUI::deactivateModule()
1939 // purpose  : Called when GEOM module is deactivated
1940 //=======================================================================
1941 bool GeometryGUI::deactivateModule( SUIT_Study* study )
1942 {
1943   QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1944   if ( viewMenu )
1945     disconnect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1946
1947   setMenuShown( false );
1948   setToolShown( false );
1949
1950   disconnect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1951              this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1952
1953   LightApp_SelectionMgr* selMrg = getApp()->selectionMgr();
1954
1955   disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
1956   disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
1957   if ( myCreationInfoWdg ) {
1958     getApp()->removeDockWindow( myCreationInfoWdg->getWinID() );
1959     myCreationInfoWdg = 0;
1960   }
1961   if ( myTextTreeWdg ) {
1962     getApp()->removeDockWindow( myTextTreeWdg->getWinID() );
1963     disconnect( application(), 0, myTextTreeWdg, 0 );
1964     myTextTreeWdg = 0;
1965   }
1966
1967   EmitSignalCloseAllDialogs();
1968
1969   GUIMap::Iterator it;
1970   for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1971     it.value()->deactivate();
1972
1973   // Unset actions accelerator keys
1974   action(GEOMOp::OpDelete)->setEnabled( false ); // Delete: Key_Delete
1975
1976   qDeleteAll(myOCCSelectors);
1977   myOCCSelectors.clear();
1978   selMrg->setEnabled( true, OCCViewer_Viewer::Type() );
1979
1980   qDeleteAll(myVTKSelectors);
1981   myVTKSelectors.clear();
1982   selMrg->setEnabled( true, SVTK_Viewer::Type() );
1983
1984   return SalomeApp_Module::deactivateModule( study );
1985 }
1986
1987 //=======================================================================
1988 // function : onWindowActivated()
1989 // purpose  : update menu items' status - disable non-OCC-viewer-compatible actions
1990 //=======================================================================
1991 void GeometryGUI::onWindowActivated( SUIT_ViewWindow* win )
1992 {
1993   if ( !win )
1994     return;
1995
1996   const bool ViewOCC = ( win->getViewManager() ? win->getViewManager()->getType() == OCCViewer_Viewer::Type() : false );
1997   //const bool ViewVTK = ( win->getViewManager() ? win->getViewManager()->getType() == SVTK_Viewer::Type() : false );
1998
1999   // disable non-OCC viewframe menu commands
2000 //  action( GEOMOp::Op2dSketcher )->setEnabled( ViewOCC ); // SKETCHER
2001   action( GEOMOp::OpSuppressFaces )->setEnabled( ViewOCC ); // SuppressFace
2002   action( GEOMOp::OpSuppressHoles )->setEnabled( ViewOCC ); // SuppressHole
2003   action( GEOMOp::OpCloseContour )->setEnabled( ViewOCC ); // CloseContour
2004   action( GEOMOp::OpRemoveIntWires )->setEnabled( ViewOCC ); // RemoveInternalWires
2005   action( GEOMOp::OpAddPointOnEdge )->setEnabled( ViewOCC ); // AddPointOnEdge
2006 //  action( GEOMOp::OpFreeBoundaries )->setEnabled( ViewOCC ); // Free boundaries
2007
2008   action( GEOMOp::OpGroupCreate )->setEnabled( ViewOCC ); // Create Group
2009   action( GEOMOp::OpGroupEdit )->setEnabled( ViewOCC ); // Edit Group
2010   action( GEOMOp::OpCreateField )->setEnabled( ViewOCC ); // Create Field
2011   action( GEOMOp::OpEditField )->setEnabled( ViewOCC ); // Edit Field
2012
2013   action( GEOMOp::OpMultiTransform )->setEnabled( ViewOCC ); // MENU BLOCKS - MULTI-TRANSFORMATION
2014 }
2015
2016 void GeometryGUI::windows( QMap<int, int>& mappa ) const
2017 {
2018   mappa.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2019   mappa.insert( SalomeApp_Application::WT_NoteBook, Qt::LeftDockWidgetArea );
2020 #ifndef DISABLE_PYCONSOLE
2021   mappa.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
2022 #endif
2023   if ( myCreationInfoWdg )
2024     mappa.insert( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
2025   if ( myTextTreeWdg )
2026     mappa.insert( myTextTreeWdg->getWinID(), Qt::LeftDockWidgetArea );
2027 }
2028
2029 void GeometryGUI::viewManagers( QStringList& lst ) const
2030 {
2031   lst.append( OCCViewer_Viewer::Type() );
2032 }
2033
2034 void GeometryGUI::onViewManagerAdded( SUIT_ViewManager* vm )
2035 {
2036   if ( vm && vm->getType() == OCCViewer_Viewer::Type() )
2037   {
2038     qDebug( "connect" );
2039     connect( vm, SIGNAL( keyPress  ( SUIT_ViewWindow*, QKeyEvent* ) ),
2040              this, SLOT( OnKeyPress( SUIT_ViewWindow*, QKeyEvent* ) ) );
2041     connect( vm, SIGNAL( mousePress( SUIT_ViewWindow*, QMouseEvent* ) ),
2042              this, SLOT( OnMousePress( SUIT_ViewWindow*, QMouseEvent* ) ) );
2043     connect( vm, SIGNAL( mouseMove ( SUIT_ViewWindow*, QMouseEvent* ) ),
2044              this, SLOT( OnMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) );
2045     connect( vm, SIGNAL( mouseRelease ( SUIT_ViewWindow*, QMouseEvent* ) ),
2046              this, SLOT( OnMouseRelease( SUIT_ViewWindow*, QMouseEvent* ) ) );
2047
2048     LightApp_SelectionMgr* sm = getApp()->selectionMgr();
2049     myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
2050
2051     // disable OCC selectors
2052     getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
2053     QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
2054     while ( itOCCSel.hasNext() )
2055       if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
2056         sr->setEnabled(true);
2057   }
2058   else if ( vm->getType() == SVTK_Viewer::Type() )
2059   {
2060     LightApp_SelectionMgr* sm = getApp()->selectionMgr();
2061     myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
2062
2063     // disable VTK selectors
2064     getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
2065     QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
2066     while ( itVTKSel.hasNext() )
2067       if ( LightApp_VTKSelector* sr = itVTKSel.next() )
2068         sr->setEnabled(true);
2069   }
2070 }
2071
2072 void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm )
2073 {
2074   SUIT_ViewModel* viewer = vm->getViewModel();
2075   if ( vm->getType() == OCCViewer_Viewer::Type() )
2076   {
2077     QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
2078     while ( itOCCSel.hasNext() )
2079       if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
2080         if ( sr->viewer() == viewer )
2081         {
2082           /*delete*/ myOCCSelectors.takeAt( myOCCSelectors.indexOf( sr ) );
2083           break;
2084         }
2085   }
2086   if ( vm->getType() == SVTK_Viewer::Type() )
2087   {
2088     QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
2089     while ( itVTKSel.hasNext() )
2090       if ( LightApp_VTKSelector* sr = itVTKSel.next() )
2091         if ( sr->viewer() == viewer )
2092         {
2093           /*delete*/ myVTKSelectors.takeAt( myVTKSelectors.indexOf( sr ) );
2094           break;
2095         }
2096   }
2097   SOCC_Viewer* aSOCCView = dynamic_cast<SOCC_Viewer*>(viewer);
2098   if ( aSOCCView ) {
2099     GetAnnotationMgr()->RemoveView( aSOCCView );
2100   }
2101 }
2102
2103 //================================================================================
2104 /*!
2105  * \brief Slot called when selection changed. Shows creation info of a selected object
2106  */
2107 //================================================================================
2108
2109 void GeometryGUI::updateCreationInfo()
2110 {
2111   if ( myCreationInfoWdg )
2112     myCreationInfoWdg->clear();
2113
2114   // Code below is commented to have myCreationInfoWdg filled as soon as it is shown again
2115   // if ( !myCreationInfoWdg->isVisible() )
2116   //   return;
2117
2118   // look for a sole selected GEOM_Object
2119   GEOM::GEOM_BaseObject_var geomObj;
2120
2121   SALOME_ListIO selected;
2122   getApp()->selectionMgr()->selectedObjects( selected );
2123
2124   _PTR(Study) study = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() )->studyDS();
2125   SALOME_ListIteratorOfListIO selIt( selected );
2126   for ( ; selIt.More(); selIt.Next() )
2127   {
2128     Handle(SALOME_InteractiveObject) io = selIt.Value();
2129     if ( !io->hasEntry() ) continue;
2130     _PTR(SObject) sobj = study->FindObjectID( io->getEntry() );
2131     if ( !sobj ) continue;
2132     CORBA::Object_var          obj = GeometryGUI::ClientSObjectToObject( sobj );
2133     GEOM::GEOM_BaseObject_var gobj = GEOM::GEOM_BaseObject::_narrow( obj );
2134     if ( !gobj->_is_nil() )
2135     {
2136       if ( !geomObj->_is_nil() )
2137         return; // several GEOM objects selected
2138       geomObj = gobj;
2139     }
2140   }
2141   if ( geomObj->_is_nil() ) return;
2142
2143   // pass creation info of geomObj to myCreationInfoWdg
2144
2145   if ( myCreationInfoWdg ) {
2146
2147     GEOM::CreationInformationSeq_var info;
2148     try {
2149       OCC_CATCH_SIGNALS;
2150       info = geomObj->GetCreationInformation();
2151     }
2152     catch (...) {
2153     }
2154     myCreationInfoWdg->setInfo( info );
2155   }
2156 }
2157
2158 void GeometryGUI::onAutoBringToFront()
2159 {
2160   bool isAutoBringToFront = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "auto_bring_to_front", "false" );
2161   if( !isAutoBringToFront )
2162     return;
2163   
2164   SUIT_ViewWindow* SUIT_window = application()->desktop()->activeWindow();
2165   if ( !SUIT_window || SUIT_window->getViewManager()->getType() != OCCViewer_Viewer::Type() )
2166         return;
2167
2168   SalomeApp_Study* appStudy = dynamic_cast< SalomeApp_Study* >( getApp()->activeStudy() );
2169   if (!appStudy) return;
2170
2171   GEOM_Displayer displayer( appStudy );
2172   
2173   SALOME_View* window = displayer.GetActiveView();
2174   if ( !window ) return;
2175   
2176   int aMgrId = dynamic_cast< SUIT_ViewModel* >( window )->getViewManager()->getGlobalId();
2177   
2178   SALOME_ListIO selected;
2179   getApp()->selectionMgr()->selectedObjects( selected );
2180   if (!myTopLevelIOList.IsEmpty())
2181   {
2182     for( SALOME_ListIteratorOfListIO It( myTopLevelIOList ); It.More(); It.Next() )
2183     {
2184       Handle( SALOME_InteractiveObject ) io = It.Value();
2185       bool isSelected = false;
2186       for( SALOME_ListIteratorOfListIO It_sel( selected ); It_sel.More(); It_sel.Next() )
2187       {
2188         Handle( SALOME_InteractiveObject ) sel_io = It_sel.Value();
2189         if( io->isSame( sel_io ) )
2190           isSelected = true;
2191       }
2192       if (!isSelected && appStudy->findObjectByEntry(io->getEntry()))
2193       {
2194         appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), false );
2195         if ( window->isVisible( io ) ) displayer.Redisplay( io, false );     
2196       }
2197     }
2198   }
2199   
2200   myTopLevelIOList.Assign(selected);
2201   for( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() )
2202   {
2203     Handle( SALOME_InteractiveObject ) io = It.Value();
2204     appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), true );
2205     if ( window->isVisible( io ) ) displayer.Redisplay( io, false );     
2206   }
2207     
2208   displayer.UpdateViewer();
2209   GeometryGUI::Modified();
2210 }
2211
2212 void GeometryGUI::updateFieldColorScale()
2213 {
2214   if( SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) )
2215   {
2216     GEOM_Displayer aDisplayer( aStudy );
2217     aDisplayer.UpdateColorScale();
2218   }
2219 }
2220
2221 QString GeometryGUI::engineIOR() const
2222 {
2223   if ( !CORBA::is_nil( GetGeomGen() ) )
2224     return QString( getApp()->orb()->object_to_string( GetGeomGen() ) );
2225   return "";
2226 }
2227
2228 Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture
2229       (SalomeApp_Study* theStudy, int theId, int& theWidth, int& theHeight)
2230 {
2231   theWidth = theHeight = 0;
2232
2233   Handle(TColStd_HArray1OfByte) aTexture;
2234
2235   if (theStudy) {
2236     TextureMap aTextureMap = myTextureMap[ theStudy->studyDS()->StudyId() ];
2237     aTexture = aTextureMap[ theId ];
2238     if ( aTexture.IsNull() ) {
2239       GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGen()->GetIInsertOperations( theStudy->studyDS()->StudyId() );
2240       if ( !aInsOp->_is_nil() ) {
2241         CORBA::Long aWidth, aHeight;
2242         SALOMEDS::TMPFile_var aStream = aInsOp->GetTexture( theId, aWidth, aHeight );
2243         if ( aWidth > 0 && aHeight > 0 && aStream->length() > 0 ) {
2244           theWidth  = aWidth;
2245           theHeight = aHeight;
2246
2247           aTexture  = new TColStd_HArray1OfByte (1, aStream->length());
2248
2249           for ( CORBA::ULong i = 0; i < aStream->length(); i++)
2250             aTexture->SetValue( i+1, (Standard_Byte)aStream[i] );
2251           aTextureMap[ theId ] = aTexture;
2252         }
2253       }
2254     }
2255   }
2256   return aTexture;
2257 }
2258
2259 LightApp_Selection* GeometryGUI::createSelection() const
2260 {
2261   return new GEOMGUI_Selection();
2262 }
2263
2264 void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
2265 {
2266   SalomeApp_Module::contextMenuPopup( client, menu, title );
2267   SALOME_ListIO lst;
2268   getApp()->selectionMgr()->selectedObjects( lst );
2269
2270   //Add submenu for predefined materials
2271   bool isPredefMat = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "predef_materials" );
2272   if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() > 0 ) {
2273     QtxPopupMgr* mgr = popupMgr();
2274     //get parrent for submenu
2275     QAction* act = mgr->action( mgr->actionId( action(  GEOMOp::OpMaterialProperties ) ) );
2276     //Clear old  menu
2277     QMenu* oldMenu = act->menu() ;
2278     if( oldMenu ) {
2279       delete oldMenu;
2280     }
2281     if( isPredefMat ){
2282       QMenu* matMenu = new QMenu();
2283       QSignalMapper* signalMapper = new QSignalMapper( matMenu );
2284
2285       //Get current material model for the object
2286       QVariant v;
2287       LightApp_Application* anApp = dynamic_cast<LightApp_Application*>( getApp() );
2288       if ( anApp && anApp->activeViewManager() ) {
2289         LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( anApp->activeStudy() );
2290         if( aStudy ) {
2291           v = aStudy->getObjectProperty( anApp->activeViewManager()->getGlobalId(), lst.Last()->getEntry(), GEOM::propertyName( GEOM::Material ), QVariant() );
2292         }
2293       }
2294       QString curModel = "";
2295       if ( v.canConvert<QString>() ) curModel = v.toString();
2296       // get list of all predefined materials
2297       QStringList materials = Material_ResourceMgr::resourceMgr()->materials();
2298       bool found = false;
2299       foreach ( QString material, materials )
2300       {
2301         QAction* menAct = matMenu->addAction( material );
2302         connect(menAct, SIGNAL( toggled( bool ) ), signalMapper, SLOT( map() ) );
2303         signalMapper->setMapping( menAct, material );
2304         menAct->setCheckable( true );
2305         // Set checked if this material is current
2306         Material_Model aModel;
2307         aModel.fromResources( material );
2308         if ( !found && aModel.toProperties() == curModel ) {
2309           menAct->setChecked( true );
2310           found = true;
2311         }
2312       }
2313       matMenu->insertAction( matMenu->addSeparator(), action(  GEOMOp::OpPredefMaterCustom ) );
2314       matMenu->insertSeparator( action(  GEOMOp::OpPredefMaterCustom ) );
2315       connect( signalMapper, SIGNAL( mapped( const QString & ) ),
2316                  this, SLOT( OnSetMaterial( const QString & ) ) );
2317       act->setMenu( matMenu );
2318     }
2319   }
2320   //Set name
2321   if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() == 1 ) {
2322     Handle(SALOME_InteractiveObject) io = lst.First();
2323     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
2324     _PTR(Study) study = appStudy->studyDS();
2325     _PTR(SObject) obj = study->FindObjectID( io->getEntry() );
2326     if ( obj ) {
2327       QString aName = QString( obj->GetName().c_str() );
2328       aName.remove( QRegExp("\\s+$") );
2329       title = aName;
2330     }
2331   }
2332 }
2333
2334 void GeometryGUI::OnSetMaterial(const QString& theName)
2335 {
2336   OnGUIEvent( GEOMOp::OpPredefMaterial, QVariant( theName ) );
2337 }
2338
2339
2340 void GeometryGUI::createPreferences()
2341 {
2342   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
2343
2344   int tabId = addPreference( tr( "PREF_TAB_SETTINGS" ) );
2345
2346   int genGroup = addPreference( tr( "PREF_GROUP_GENERAL" ), tabId );
2347   setPreferenceProperty( genGroup, "columns", 2 );
2348
2349   int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), genGroup,
2350                                 LightApp_Preferences::Selector,
2351                                 "Geometry", "display_mode" );
2352
2353   addPreference( tr( "PREF_SHADING_COLOR" ), genGroup,
2354                  LightApp_Preferences::Color, "Geometry", "shading_color" );
2355
2356   addPreference( tr( "PREF_EDGES_IN_SHADING" ), genGroup,
2357                  LightApp_Preferences::Color, "Geometry", "edges_in_shading_color" );
2358
2359   addPreference( tr( "PREF_WIREFRAME_COLOR" ), genGroup,
2360                  LightApp_Preferences::Color, "Geometry", "wireframe_color" );
2361
2362   addPreference( tr( "PREF_FREE_BOUND_COLOR" ), genGroup,
2363                  LightApp_Preferences::Color, "Geometry", "free_bound_color" );
2364
2365   addPreference( tr( "PREF_LINE_COLOR"), genGroup,
2366                  LightApp_Preferences::Color, "Geometry", "line_color" );
2367
2368   addPreference( tr( "PREF_POINT_COLOR"), genGroup,
2369                  LightApp_Preferences::Color, "Geometry", "point_color" );
2370
2371   addPreference( tr( "PREF_ISOS_COLOR" ), genGroup,
2372                  LightApp_Preferences::Color, "Geometry", "isos_color" );
2373
2374   addPreference( tr( "PREF_LABEL_COLOR" ), genGroup,
2375                  LightApp_Preferences::Color, "Geometry", "label_color" );
2376
2377   addPreference( "", genGroup, LightApp_Preferences::Space );
2378
2379   addPreference( tr( "PREF_TOPLEVEL_COLOR" ), genGroup,
2380                  LightApp_Preferences::Color, "Geometry", "toplevel_color" );
2381
2382   int top_lev_dm = addPreference( tr( "PREF_TOPLEVEL_DM" ), genGroup,
2383                       LightApp_Preferences::Selector, "Geometry", "toplevel_dm" );
2384
2385   int transparency = addPreference( tr( "PREF_TRANSPARENCY" ), genGroup,
2386                                     LightApp_Preferences::IntSpin, "Geometry", "transparency" );
2387
2388   int defl = addPreference( tr( "PREF_DEFLECTION" ), genGroup,
2389                             LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" );
2390
2391   addPreference( tr( "PREF_PREDEF_MATERIALS" ), genGroup,
2392                  LightApp_Preferences::Bool, "Geometry", "predef_materials" );
2393
2394   int material = addPreference( tr( "PREF_MATERIAL" ), genGroup,
2395                                 LightApp_Preferences::Selector,
2396                                 "Geometry", "material" );
2397
2398   addPreference( tr( "PREF_EDITGROUP_COLOR" ), genGroup,
2399                  LightApp_Preferences::Color, "Geometry", "editgroup_color" );
2400
2401   const int nb = 4;
2402   int wd[nb];
2403   int iter=0;
2404
2405   wd[iter++] = addPreference( tr( "PREF_EDGE_WIDTH" ), genGroup,
2406                               LightApp_Preferences::IntSpin, "Geometry", "edge_width" );
2407
2408   wd[iter++] = addPreference( tr( "PREF_ISOLINES_WIDTH" ), genGroup,
2409                               LightApp_Preferences::IntSpin, "Geometry", "isolines_width" );
2410
2411   wd[iter++] = addPreference( tr( "PREF_PREVIEW_EDGE_WIDTH" ), genGroup,
2412                                      LightApp_Preferences::IntSpin, "Geometry", "preview_edge_width" );
2413
2414   wd[iter++] = addPreference( tr( "PREF_MEASURES_LINE_WIDTH" ), genGroup,
2415                               LightApp_Preferences::IntSpin, "Geometry", "measures_line_width" );
2416
2417   for (int i = 0; i < nb; i++) {
2418     setPreferenceProperty( wd[i], "min", 1 );
2419     setPreferenceProperty( wd[i], "max", 5 );
2420   }
2421
2422   int step = addPreference( tr( "PREF_STEP_VALUE" ), genGroup,
2423                             LightApp_Preferences::IntSpin, "Geometry", "SettingsGeomStep" );
2424
2425   addPreference( tr( "PREF_AUTO_BRING_TO_FRONT" ), genGroup,
2426                  LightApp_Preferences::Bool, "Geometry", "auto_bring_to_front" );
2427
2428   // --------------------------------------------------------------------------
2429   // Dimensions (Measurements) preferences
2430   // --------------------------------------------------------------------------
2431
2432   int aDimGroupId = addPreference( tr( "PREF_DIMENSIONS" ), tabId );
2433   setPreferenceProperty( aDimGroupId, "columns", 2 );
2434
2435   addPreference( tr( "PREF_DIMENSIONS_COLOR" ), aDimGroupId,
2436                  LightApp_Preferences::Color, "Geometry", "dimensions_color" );
2437
2438   int aDimLineWidthId = addPreference( tr( "PREF_DIMENSIONS_LINE_WIDTH" ), aDimGroupId, 
2439                                        LightApp_Preferences::IntSpin, "Geometry", "dimensions_line_width" );
2440
2441   setPreferenceProperty( aDimLineWidthId, "min", 1 );
2442   setPreferenceProperty( aDimLineWidthId, "max", 5 );
2443
2444   int aDimFontId = addPreference( tr( "PREF_DIMENSIONS_FONT" ), aDimGroupId, LightApp_Preferences::Font, "Geometry", "dimensions_font" );
2445
2446   int f = QtxFontEdit::Family | QtxFontEdit::Size;
2447   setPreferenceProperty( aDimFontId, "features", f );
2448   setPreferenceProperty( aDimFontId, "mode", QtxFontEdit::Custom );
2449
2450   Handle(Font_FontMgr) fmgr = Font_FontMgr::GetInstance();
2451   QString aFontFile = "";
2452   resMgr->value("resources", "GEOM", aFontFile);
2453   aFontFile = aFontFile + QDir::separator() + "Y14.5M-2009.ttf";
2454   // add enginier font into combobox
2455   /*int fontID =*/ QFontDatabase::addApplicationFont( aFontFile );
2456   Handle(Font_SystemFont) sf = new Font_SystemFont( 
2457     new TCollection_HAsciiString("Y14.5M-2009"), 
2458     Font_FA_Regular, 
2459     new TCollection_HAsciiString(aFontFile.toLatin1().data()) );
2460   // register font in OCC font manager
2461   fmgr->RegisterFont( sf, Standard_False );
2462
2463   // get list of supported fonts by OCC
2464   QStringList anOCCFonts;
2465   TColStd_SequenceOfHAsciiString theFontsNames;
2466   fmgr->GetAvailableFontsNames( theFontsNames );
2467   for(Standard_Integer i=1; i<=theFontsNames.Length(); i++) {
2468     Handle(TCollection_HAsciiString) str = theFontsNames(i);
2469     anOCCFonts << str->ToCString();
2470   }
2471   anOCCFonts.removeDuplicates();
2472   // set the supported fonts into combobox to use its only
2473   setPreferenceProperty( aDimFontId, "fonts", anOCCFonts );
2474
2475   int aDimArrLengthId = addPreference( tr( "PREF_DIMENSIONS_ARROW_LENGTH" ), aDimGroupId,
2476                                        LightApp_Preferences::DblSpin, "Geometry", "dimensions_arrow_length" );
2477
2478   setPreferenceProperty( aDimArrLengthId, "min", 1e-9 );
2479   setPreferenceProperty( aDimArrLengthId, "max", 1e+9 );
2480   setPreferenceProperty( aDimArrLengthId, "precision", 9 );
2481
2482   int aLengthUnitsId = addPreference( tr( "PREF_DIMENSIONS_LENGTH_UNITS" ), aDimGroupId,
2483                                       LightApp_Preferences::Selector, "Geometry", "dimensions_length_units" );
2484
2485   int anAngUnitsId = addPreference( tr( "PREF_DIMENSIONS_ANGLE_UNITS" ), aDimGroupId,
2486                                    LightApp_Preferences::Selector, "Geometry", "dimensions_angle_units" );
2487
2488   QStringList aListOfLengthUnits;
2489   aListOfLengthUnits << "m";
2490   aListOfLengthUnits << "cm";
2491   aListOfLengthUnits << "mm";
2492   aListOfLengthUnits << "in.";
2493   aListOfLengthUnits << "ft.";
2494
2495   QStringList aListOfAngUnits;
2496   aListOfAngUnits << "rad";
2497   aListOfAngUnits << "deg";
2498
2499   setPreferenceProperty( aLengthUnitsId, "strings", aListOfLengthUnits );
2500   setPreferenceProperty( anAngUnitsId,   "strings", aListOfAngUnits );
2501
2502   addPreference( tr( "PREF_DIMENSIONS_SHOW_UNITS" ), aDimGroupId,
2503                  LightApp_Preferences::Bool, "Geometry", "dimensions_show_units" );
2504
2505   int aDimDefFlyout = addPreference( tr( "PREF_DIMENSIONS_DEFAULT_FLYOUT" ), aDimGroupId,
2506                                      LightApp_Preferences::DblSpin, "Geometry", "dimensions_default_flyout" );
2507
2508   setPreferenceProperty( aDimDefFlyout, "min", 1e-9 );
2509   setPreferenceProperty( aDimDefFlyout, "max", 1e+9 );
2510   setPreferenceProperty( aDimDefFlyout, "precision", 9 );
2511
2512   addPreference( tr( "PREF_DIMENSIONS_USE_TEXT3D" ), aDimGroupId,
2513                  LightApp_Preferences::Bool, "Geometry", "dimensions_use_text3d" );
2514
2515   // --------------------------------------------------------------------------
2516   // Shape annotation preferences
2517   // --------------------------------------------------------------------------
2518
2519   const int aShapeAnnGroupId = addPreference( tr( "PREF_SHAPE_ANNOTATIONS" ), tabId );
2520   setPreferenceProperty( aShapeAnnGroupId, "columns", 2 );
2521
2522   addPreference( tr( "PREF_SHAPE_ANNOTATIONS_FONT_COLOR" ), aShapeAnnGroupId, LightApp_Preferences::Color, "Geometry", "shape_annotation_font_color" );
2523   addPreference( tr( "PREF_SHAPE_ANNOTATIONS_LINE_COLOR" ), aShapeAnnGroupId, LightApp_Preferences::Color, "Geometry", "shape_annotation_line_color" );
2524   const int aShapeAnnFont = 
2525     addPreference( tr( "PREF_SHAPE_ANNOTATIONS_FONT" ), aShapeAnnGroupId, LightApp_Preferences::Font, "Geometry", "shape_annotation_font" );
2526
2527   int aShapeAnnFontFeatures = QtxFontEdit::Family | QtxFontEdit::Size | QtxFontEdit::Bold | QtxFontEdit::Italic;
2528   setPreferenceProperty( aShapeAnnFont, "features", aShapeAnnFontFeatures );
2529   setPreferenceProperty( aShapeAnnFont, "mode", QtxFontEdit::Custom );
2530   setPreferenceProperty( aShapeAnnFont, "fonts", anOCCFonts );
2531
2532   const int aShapeAnnLineWidth = 
2533     addPreference( tr( "PREF_SHAPE_ANNOTATIONS_LINE_WIDTH" ), aShapeAnnGroupId, LightApp_Preferences::IntSpin, "Geometry", "shape_annotation_line_width" );
2534
2535   setPreferenceProperty( aShapeAnnLineWidth, "min", 1 );
2536   setPreferenceProperty( aShapeAnnLineWidth, "max", 5 );
2537
2538   addPreference( tr( "PREF_SHAPE_ANNOTATIONS_AUTOHIDE" ), aShapeAnnGroupId, LightApp_Preferences::Bool, "Geometry", "shape_annotation_autohide" );
2539
2540   const int aShapeAnnLineStyle =
2541     addPreference( tr( "PREF_SHAPE_ANNOTATIONS_LINE_STYLE" ), aShapeAnnGroupId, LightApp_Preferences::Selector, "Geometry", "shape_annotation_line_style" );
2542
2543   QStringList aLineStyleList;
2544   aLineStyleList.append( tr("PREF_SHAPE_ANNOTATIONS_LINESTYLE_SOLID") );
2545   aLineStyleList.append( tr("PREF_SHAPE_ANNOTATIONS_LINESTYLE_DASH") );
2546   aLineStyleList.append( tr("PREF_SHAPE_ANNOTATIONS_LINESTYLE_DOT") );
2547   aLineStyleList.append( tr("PREF_SHAPE_ANNOTATIONS_LINESTYLE_DOTDASH") );
2548
2549   QList<QVariant> aLineStyleIds;
2550   aLineStyleIds.append(0);
2551   aLineStyleIds.append(1);
2552   aLineStyleIds.append(2);
2553   aLineStyleIds.append(3);
2554
2555   setPreferenceProperty( aShapeAnnLineStyle, "strings", aLineStyleList );
2556   setPreferenceProperty( aShapeAnnLineStyle, "indexes", aLineStyleIds );
2557
2558   // --------------------------------------------------------------------------
2559   // Isoline drawing preferences
2560   // --------------------------------------------------------------------------
2561
2562   int isoGroup = addPreference( tr( "PREF_ISOS" ), tabId );
2563   setPreferenceProperty( isoGroup, "columns", 2 );
2564   int isoU = addPreference( tr( "PREF_ISOS_U" ), isoGroup,
2565                             LightApp_Preferences::IntSpin, "Geometry", "iso_number_u" );
2566   setPreferenceProperty( isoU, "min", 0 );
2567   setPreferenceProperty( isoU, "max", 100000 );
2568   int isoV = addPreference( tr( "PREF_ISOS_V" ), isoGroup,
2569                             LightApp_Preferences::IntSpin, "Geometry", "iso_number_v" );
2570   setPreferenceProperty( isoV, "min", 0 );
2571   setPreferenceProperty( isoV, "max", 100000 );
2572
2573   // Quantities with individual precision settings
2574   int precGroup = addPreference( tr( "GEOM_PREF_GROUP_PRECISION" ), tabId );
2575   setPreferenceProperty( precGroup, "columns", 2 );
2576
2577   const int nbQuantities = 8;
2578   int prec[nbQuantities], ii = 0;
2579   prec[ii++] = addPreference( tr( "GEOM_PREF_length_precision" ), precGroup,
2580                               LightApp_Preferences::IntSpin, "Geometry", "length_precision" );
2581   prec[ii++] = addPreference( tr( "GEOM_PREF_angle_precision" ), precGroup,
2582                               LightApp_Preferences::IntSpin, "Geometry", "angle_precision" );
2583   prec[ii++] = addPreference( tr( "GEOM_PREF_len_tol_precision" ), precGroup,
2584                               LightApp_Preferences::IntSpin, "Geometry", "len_tol_precision" );
2585   prec[ii++] = addPreference( tr( "GEOM_PREF_ang_tol_precision" ), precGroup,
2586                               LightApp_Preferences::IntSpin, "Geometry", "ang_tol_precision" );
2587   prec[ii++] = addPreference( tr( "GEOM_PREF_weight_precision" ), precGroup,
2588                               LightApp_Preferences::IntSpin, "Geometry", "weight_precision" );
2589   prec[ii++] = addPreference( tr( "GEOM_PREF_density_precision" ), precGroup,
2590                               LightApp_Preferences::IntSpin, "Geometry", "density_precision" );
2591   prec[ii++] = addPreference( tr( "GEOM_PREF_parametric_precision" ), precGroup,
2592                               LightApp_Preferences::IntSpin, "Geometry", "parametric_precision" );
2593   prec[ii  ] = addPreference( tr( "GEOM_PREF_param_tol_precision" ), precGroup,
2594                               LightApp_Preferences::IntSpin, "Geometry", "param_tol_precision" );
2595
2596   // Set property for precision value for spinboxes
2597   for ( ii = 0; ii < nbQuantities; ii++ ){
2598     setPreferenceProperty( prec[ii], "min", -14 );
2599     setPreferenceProperty( prec[ii], "max", 14 );
2600     setPreferenceProperty( prec[ii], "precision", 2 );
2601   }
2602
2603   int VertexGroup = addPreference( tr( "PREF_GROUP_VERTEX" ), tabId );
2604   setPreferenceProperty( VertexGroup, "columns", 2 );
2605
2606   int typeOfMarker = addPreference( tr( "PREF_TYPE_OF_MARKER" ), VertexGroup,
2607                                     LightApp_Preferences::Selector, "Geometry", "type_of_marker" );
2608
2609   int markerScale = addPreference( tr( "PREF_MARKER_SCALE" ), VertexGroup,
2610                                    LightApp_Preferences::Selector, "Geometry", "marker_scale" );
2611
2612   // Set property for default display mode
2613   QStringList aModesList;
2614   aModesList.append( tr("MEN_WIREFRAME") );
2615   aModesList.append( tr("MEN_SHADING") );
2616   aModesList.append( tr("MEN_SHADING_WITH_EDGES") );
2617   aModesList.append( tr("MEN_TEXTURE") );
2618
2619   QList<QVariant> anIndexesList;
2620   anIndexesList.append(0);
2621   anIndexesList.append(1);
2622   anIndexesList.append(2);
2623   anIndexesList.append(3);
2624
2625   setPreferenceProperty( dispmode, "strings", aModesList );
2626   setPreferenceProperty( dispmode, "indexes", anIndexesList );
2627
2628   // Set property for top level display mode
2629   QStringList aTopModesList;
2630   aTopModesList.append( tr("MEN_SHOW_ADD_WACTOR") );
2631   aTopModesList.append( tr("MEN_KEEP_CURRENT_DM") );
2632   aTopModesList.append( tr("MEN_WIREFRAME") );
2633   aTopModesList.append( tr("MEN_SHADING") );
2634   aTopModesList.append( tr("MEN_SHADING_WITH_EDGES") );
2635
2636   QList<QVariant> aTopIndexesList;
2637   aTopIndexesList.append(0);
2638   aTopIndexesList.append(1);
2639   aTopIndexesList.append(2);
2640   aTopIndexesList.append(3);
2641   aTopIndexesList.append(4);
2642
2643   setPreferenceProperty( top_lev_dm, "strings", aTopModesList );
2644   setPreferenceProperty( top_lev_dm, "indexes", aTopIndexesList );
2645
2646   // Set property for step value for spinboxes
2647   setPreferenceProperty( step, "min", 1 );
2648   setPreferenceProperty( step, "max", 10000 );
2649   setPreferenceProperty( step, "precision", 3 );
2650
2651   // Set property for trandparency value for spinboxes
2652   setPreferenceProperty( transparency, "min", 0 );
2653   setPreferenceProperty( transparency, "max", 100 );
2654
2655   // Set property for deflection value for spinboxes
2656   setPreferenceProperty( defl, "min", GEOM::minDeflection() );
2657   setPreferenceProperty( defl, "max", 1.0 );
2658   setPreferenceProperty( defl, "step", 1.0e-04 );
2659   setPreferenceProperty( defl, "precision", 6 );
2660
2661   // Set property for default material
2662   setPreferenceProperty( material, "strings", Material_ResourceMgr::resourceMgr()->materials() );
2663
2664   // Set property vertex marker type
2665   QList<QVariant> aMarkerTypeIndicesList;
2666   QList<QVariant> aMarkerTypeIconsList;
2667
2668   for ( int i = GEOM::MT_POINT; i < GEOM::MT_USER; i++ ) {
2669     QString icoFile = QString( "ICON_VERTEX_MARKER_%1" ).arg( i );
2670     QPixmap pixmap = resMgr->loadPixmap( "GEOM", tr( qPrintable( icoFile ) ) );
2671     aMarkerTypeIndicesList << (i-1);
2672     aMarkerTypeIconsList << pixmap;
2673   }
2674
2675   setPreferenceProperty( typeOfMarker, "indexes", aMarkerTypeIndicesList );
2676   setPreferenceProperty( typeOfMarker, "icons",   aMarkerTypeIconsList );
2677
2678   // Set property for vertex marker scale
2679   QList<QVariant> aMarkerScaleIndicesList;
2680   QStringList     aMarkerScaleValuesList;
2681
2682   for ( int iii = GEOM::MS_10; iii <= GEOM::MS_70; iii++ ) {
2683     aMarkerScaleIndicesList << iii;
2684     aMarkerScaleValuesList  << QString::number( (iii-(int)GEOM::MS_10)*0.5 + 1.0 );
2685   }
2686
2687   setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList );
2688   setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
2689
2690   // Scalar bar for field step presentation
2691   int scalarBarGroup = addPreference( tr( "PREF_GROUP_SCALAR_BAR" ), tabId );
2692   setPreferenceProperty( scalarBarGroup, "columns", 2 );
2693
2694   int sbXPosition = addPreference( tr( "PREF_SCALAR_BAR_X_POSITION" ), scalarBarGroup,
2695                                    LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_x_position" );
2696   setPreferenceProperty( sbXPosition, "min", 0 );
2697   setPreferenceProperty( sbXPosition, "max", 1 );
2698   setPreferenceProperty( sbXPosition, "step", 0.05 );
2699
2700   int sbYPosition = addPreference( tr( "PREF_SCALAR_BAR_Y_POSITION" ), scalarBarGroup,
2701                                    LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_y_position" );
2702   setPreferenceProperty( sbYPosition, "min", 0 );
2703   setPreferenceProperty( sbYPosition, "max", 1 );
2704   setPreferenceProperty( sbYPosition, "step", 0.05 );
2705
2706   int sbWidth = addPreference( tr( "PREF_SCALAR_BAR_WIDTH" ), scalarBarGroup,
2707                                LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_width" );
2708   setPreferenceProperty( sbWidth, "min", 0 );
2709   setPreferenceProperty( sbWidth, "max", 1 );
2710   setPreferenceProperty( sbWidth, "step", 0.05 );
2711
2712   int sbHeight = addPreference( tr( "PREF_SCALAR_BAR_HEIGHT" ), scalarBarGroup,
2713                                 LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_height" );
2714   setPreferenceProperty( sbHeight, "min", 0 );
2715   setPreferenceProperty( sbHeight, "max", 1 );
2716   setPreferenceProperty( sbHeight, "step", 0.05 );
2717
2718   int sbTextHeight = addPreference( tr( "PREF_SCALAR_BAR_TEXT_HEIGHT" ), scalarBarGroup,
2719                                     LightApp_Preferences::IntSpin, "Geometry", "scalar_bar_text_height" );
2720   setPreferenceProperty( sbTextHeight, "min", 6 );
2721   setPreferenceProperty( sbTextHeight, "max", 24 );
2722   setPreferenceProperty( sbTextHeight, "step", 1 );
2723
2724   int sbNbIntervals = addPreference( tr( "PREF_SCALAR_BAR_NUMBER_OF_INTERVALS" ), scalarBarGroup,
2725                                      LightApp_Preferences::IntSpin, "Geometry", "scalar_bar_nb_intervals" );
2726   setPreferenceProperty( sbNbIntervals, "min", 2 );
2727   setPreferenceProperty( sbNbIntervals, "max", 64 );
2728   setPreferenceProperty( sbNbIntervals, "step", 1 );
2729
2730   int originGroup = addPreference( tr( "PREF_GROUP_ORIGIN_AND_BASE_VECTORS" ), tabId );
2731   setPreferenceProperty( originGroup, "columns", 2 );
2732
2733   int baseVectorsLength = addPreference( tr( "PREF_BASE_VECTORS_LENGTH" ), originGroup,
2734                                          LightApp_Preferences::DblSpin, "Geometry", "base_vectors_length" );
2735   setPreferenceProperty( baseVectorsLength, "min", 0.01 );
2736   setPreferenceProperty( baseVectorsLength, "max", 1000 );
2737
2738   addPreference( tr( "PREF_AUTO_CREATE" ), originGroup,
2739                  LightApp_Preferences::Bool, "Geometry", "auto_create_base_objects" );
2740
2741   int operationsGroup = addPreference( tr( "PREF_GROUP_OPERATIONS" ), tabId );
2742   setPreferenceProperty( operationsGroup, "columns", 2 );
2743
2744   addPreference( tr( "GEOM_PREVIEW" ), operationsGroup,
2745                  LightApp_Preferences::Bool, "Geometry", "geom_preview" );
2746
2747   addPreference( tr( "PREF_HIDE_INPUT_OBJECT" ), operationsGroup,
2748                  LightApp_Preferences::Bool, "Geometry", "hide_input_object" );
2749
2750   int DependencyViewId = addPreference( tr( "PREF_TAB_DEPENDENCY_VIEW" ) );
2751
2752   int treeGeneralGroup = addPreference( tr( "PREF_GROUP_GENERAL" ), DependencyViewId );
2753
2754   int hierarchy_type = addPreference( tr( "PREF_HIERARCHY_TYPE" ), treeGeneralGroup,
2755                       LightApp_Preferences::Selector, "Geometry", "dependency_tree_hierarchy_type" );
2756
2757   QStringList aHierarchyTypeList;
2758   aHierarchyTypeList.append( tr("MEN_BOTH_ASCENDANTS_DESCENDANTS") );
2759   aHierarchyTypeList.append( tr("MEN_ONLY_ASCENDANTS") );
2760   aHierarchyTypeList.append( tr("MEN_ONLY_DESCENDANTS") );
2761
2762   QList<QVariant> aHierarchyTypeIndexesList;
2763   aHierarchyTypeIndexesList.append(0);
2764   aHierarchyTypeIndexesList.append(1);
2765   aHierarchyTypeIndexesList.append(2);
2766
2767   setPreferenceProperty( hierarchy_type, "strings", aHierarchyTypeList );
2768   setPreferenceProperty( hierarchy_type, "indexes", aHierarchyTypeIndexesList );
2769
2770   addPreference( tr( "GEOM_MOVE_POSSIBILITY" ), treeGeneralGroup,
2771                  LightApp_Preferences::Bool, "Geometry", "dependency_tree_move_nodes" );
2772
2773   int treeColorGroup = addPreference( tr( "PREF_GROUP_DEPENDENCY_VIEW_COLOR" ), DependencyViewId );
2774
2775   addPreference( tr( "PREF_DEPENDENCY_VIEW_BACKGROUND_COLOR"), treeColorGroup,
2776                  LightApp_Preferences::Color, "Geometry", "dependency_tree_background_color" );
2777
2778   addPreference( tr( "PREF_DEPENDENCY_VIEW_NODE_COLOR"), treeColorGroup,
2779                  LightApp_Preferences::Color, "Geometry", "dependency_tree_node_color" );
2780   addPreference( tr( "PREF_DEPENDENCY_VIEW_MAIN_NODE_COLOR"), treeColorGroup,
2781                  LightApp_Preferences::Color, "Geometry", "dependency_tree_main_node_color" );
2782   addPreference( tr( "PREF_DEPENDENCY_VIEW_UNPUBLISH_NODE_COLOR"), treeColorGroup,
2783                  LightApp_Preferences::Color, "Geometry", "dependency_tree_unpublish_node_color" );
2784   addPreference( tr( "PREF_DEPENDENCY_VIEW_SELECT_NODE_COLOR"), treeColorGroup,
2785                  LightApp_Preferences::Color, "Geometry", "dependency_tree_select_node_color" );
2786
2787   addPreference( tr( "PREF_DEPENDENCY_VIEW_ARROW_COLOR"), treeColorGroup,
2788                  LightApp_Preferences::Color, "Geometry", "dependency_tree_arrow_color" );
2789   addPreference( tr( "PREF_DEPENDENCY_VIEW_HIGHLIGHT_ARROW_COLOR"), treeColorGroup,
2790                  LightApp_Preferences::Color, "Geometry", "dependency_tree_highlight_arrow_color" );
2791   addPreference( tr( "PREF_DEPENDENCY_VIEW_SELECT_ARROW_COLOR"), treeColorGroup,
2792                  LightApp_Preferences::Color, "Geometry", "dependency_tree_select_arrow_color" );
2793
2794
2795
2796
2797 }
2798
2799 void GeometryGUI::preferencesChanged( const QString& section, const QString& param )
2800 {
2801   if (section == "Geometry") {
2802     SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
2803     if (param == QString("SettingsGeomStep")) {
2804       double spin_step = aResourceMgr->doubleValue(section, param, 100.);
2805       EmitSignalDefaultStepValueChanged(spin_step);
2806     }
2807     else if (param == QString("toplevel_color")) {
2808       QColor c = aResourceMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) );
2809       GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c));
2810     }
2811     else if (param == QString("toplevel_dm")) {
2812       GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)aResourceMgr->integerValue("Geometry", "toplevel_dm", 0));
2813     }
2814     else if (param == QString("scalar_bar_x_position") ||
2815              param == QString("scalar_bar_y_position") ||
2816              param == QString("scalar_bar_width") ||
2817              param == QString("scalar_bar_height") ||
2818              param == QString("scalar_bar_text_height") ||
2819              param == QString("scalar_bar_nb_intervals")) {
2820       if( SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) )
2821       {
2822         GEOM_Displayer aDisplayer( aStudy );
2823         bool anIsRedisplayFieldSteps = param == QString("scalar_bar_nb_intervals");
2824         aDisplayer.UpdateColorScale( anIsRedisplayFieldSteps, true );
2825       }
2826     }
2827     else if ( param == QString("dimensions_color")            ||
2828               param == QString("dimensions_line_width")       ||
2829               param == QString("dimensions_font")             ||
2830               param == QString("dimensions_arrow_length")     ||
2831               param == QString("dimensions_show_units")       ||
2832               param == QString("dimensions_length_units")     ||
2833               param == QString("dimensions_angle_units")      ||
2834               param == QString("dimensions_use_text3d")       ||
2835               param == QString("shape_annotation_font_color") ||
2836               param == QString("shape_annotation_line_color") ||
2837               param == QString("shape_annotation_font")       ||
2838               param == QString("shape_annotation_line_width") ||
2839               param == QString("shape_annotation_autohide")   ||
2840               param == QString("shape_annotation_line_style") ||
2841               param == QString("shape_annotation_line_style") ||
2842               param == QString("label_color") )
2843     {
2844       SalomeApp_Application* anApp = getApp();
2845       if ( !anApp )
2846       {
2847         return;
2848       }
2849
2850       SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( anApp->activeStudy() );
2851       if ( !aStudy )
2852       {
2853         return;
2854       }
2855
2856       GEOM_Displayer aDisplayer( aStudy );
2857
2858       ViewManagerList aVMs;
2859       anApp->viewManagers( OCCViewer_Viewer::Type(), aVMs );
2860       ViewManagerList::Iterator anIt = aVMs.begin();
2861       for ( ; anIt != aVMs.end(); ++anIt )
2862       {
2863         SOCC_Viewer* aViewer = dynamic_cast<SOCC_Viewer*>( (*anIt)->getViewModel() );
2864         if ( !aViewer )
2865         {
2866           continue;
2867         }
2868
2869         SALOME_ListIO aVisible;
2870         aViewer->GetVisible( aVisible );
2871
2872         GEOMGUI_AnnotationMgr* anAnnotationMgr = GetAnnotationMgr();
2873         if ( anAnnotationMgr ) {
2874           SALOME_ListIteratorOfListIO anIter( aVisible );
2875           while ( anIter.More() ) {
2876             if ( anAnnotationMgr->isAnnotationEntry( anIter.Value()->getEntry() ) ) {
2877               aVisible.Remove( anIter );
2878             }
2879             else {
2880               anIter.Next();
2881             }
2882           }
2883         }
2884
2885         aDisplayer.Redisplay( aVisible, false, aViewer );
2886       }
2887       if ( param == QString( "label_color" ) ) {
2888         ViewManagerList aVMsVTK;
2889         anApp->viewManagers( SVTK_Viewer::Type(), aVMsVTK );
2890         ViewManagerList::Iterator anIt = aVMsVTK.begin();
2891         for ( ; anIt != aVMsVTK.end(); ++anIt )
2892         {
2893             SVTK_Viewer* aViewer = dynamic_cast<SVTK_Viewer*>( (*anIt)->getViewModel() );
2894             if ( !aViewer )
2895             {
2896               continue;
2897             }
2898             SALOME_ListIO aVisible;
2899             aViewer->GetVisible( aVisible );
2900             aDisplayer.Redisplay( aVisible, false, aViewer );
2901           }
2902       }
2903       aDisplayer.UpdateViewer();
2904     }
2905     else if ( param.startsWith( "dependency_tree") )
2906       emit SignalDependencyTreeParamChanged( section, param );
2907   }
2908 }
2909
2910 LightApp_Displayer* GeometryGUI::displayer()
2911 {
2912   if ( !myDisplayer )
2913     myDisplayer = new GEOM_Displayer( dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) );
2914   return myDisplayer;
2915 }
2916
2917 void GeometryGUI::setLocalSelectionMode(const int mode)
2918 {
2919   myLocalSelectionMode = mode;
2920 }
2921
2922 int GeometryGUI::getLocalSelectionMode() const
2923 {
2924   return myLocalSelectionMode;
2925 }
2926
2927 const char gSeparator = '_'; // character used to separate parameter names
2928 const char gDigitsSep = ':'; // character used to separate numeric parameter values (color = r:g:b)
2929
2930 /*!
2931  * \brief Store visual parameters
2932  *
2933  * This method is called just before the study document is saved.
2934  * Store visual parameters in AttributeParameter attribute(s)
2935  */
2936 void GeometryGUI::storeVisualParameters (int savePoint)
2937 {
2938   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
2939   if ( !appStudy || !appStudy->studyDS() )
2940     return;
2941
2942   _PTR(Study) studyDS = appStudy->studyDS();
2943
2944   // componentName is used for encoding of entries when storing them in IParameters
2945   std::string componentName = myComponentGeom->ComponentDataType();
2946   //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
2947   //if (!aSComponent) return;
2948
2949   // IParameters
2950   _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
2951                                                              componentName.c_str(),
2952                                                              savePoint);
2953   _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
2954
2955   QSet<QString> anEntriesToStoreShared;
2956   QList<SUIT_ViewManager*> lst;
2957   QList<SUIT_ViewManager*>::Iterator it;
2958
2959   GEOMGUI_AnnotationMgr* aAnnotationMgr = GetAnnotationMgr();
2960
2961   // main cycle to store parameters of displayed objects
2962   lst.clear();
2963   getApp()->viewManagers(lst);
2964   for (it = lst.begin(); it != lst.end(); it++) {
2965     SUIT_ViewManager* vman = *it;
2966     QString vType = vman->getType();
2967     SUIT_ViewModel* vmodel = vman->getViewModel();
2968     SALOME_View* aView = dynamic_cast<SALOME_View*>(vmodel);
2969
2970     int aMgrId = vman->getGlobalId();
2971     // saving VTK actors properties
2972     QVector<SUIT_ViewWindow*> views = vman->getViews();
2973     for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++) {
2974       const ObjMap& anObjects = appStudy->getObjectProperties(aMgrId);
2975       ObjMap::ConstIterator o_it = anObjects.begin();
2976       for (; o_it != anObjects.end(); o_it++) {
2977         const PropMap& aProps = o_it.value();
2978
2979         //Check that object exists in the study
2980         _PTR(SObject) obj( studyDS->FindObjectID( o_it.key().toLatin1().data() ) );
2981         if ( !obj || !(aProps.count() > 0))
2982           continue;
2983         // entry is "encoded" = it does NOT contain component address, since it is a
2984         // subject to change on next component loading
2985
2986         std::string entry = ip->encodeEntry(o_it.key().toLatin1().data(), componentName);
2987
2988         _PTR(GenericAttribute) anAttr;
2989         if (!obj->FindAttribute(anAttr, "AttributeIOR"))
2990           continue;
2991
2992         // remember entry of object to store shared GEOM properties
2993         // (e.g. dimension properties).
2994         if ( vType == OCCViewer_Viewer::Type() )
2995         {
2996           anEntriesToStoreShared.insert( o_it.key() );
2997         }
2998
2999         QString param, occParam = vType;
3000         occParam += GEOM::sectionSeparator();
3001         occParam += QString::number(aMgrId);
3002         occParam += GEOM::sectionSeparator();
3003
3004         if (aProps.contains(GEOM::propertyName( GEOM::Visibility ))) {
3005           param = occParam + GEOM::propertyName( GEOM::Visibility );
3006           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Visibility )).toBool() ? "On" : "Off");
3007         }
3008
3009         if (aProps.contains(GEOM::propertyName( GEOM::DisplayMode ))) {
3010           param = occParam + GEOM::propertyName( GEOM::DisplayMode );
3011           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::DisplayMode )).toString().toStdString());
3012         }
3013
3014         if (aProps.contains(GEOM::propertyName( GEOM::Color ))) {
3015           QColor c = aProps.value(GEOM::propertyName( GEOM::Color )).value<QColor>();
3016           QStringList val;
3017           val << QString::number(c.redF());
3018           val << QString::number(c.greenF());
3019           val << QString::number(c.blueF());
3020           param = occParam + GEOM::propertyName( GEOM::Color );
3021           ip->setParameter(entry, param.toStdString(), val.join( GEOM::subSectionSeparator()).toStdString());
3022         }
3023         
3024         if (aProps.contains(GEOM::propertyName( GEOM::Texture ))) {
3025           param = occParam + GEOM::propertyName( GEOM::Texture );
3026           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Texture )).toString().toStdString());
3027         }
3028
3029         if (vType == SVTK_Viewer::Type()) {
3030           if (aProps.contains(GEOM::propertyName( GEOM::Opacity ))) {
3031             param = occParam + GEOM::propertyName( GEOM::Opacity );
3032             ip->setParameter(entry, param.toStdString(), QString::number(1. - aProps.value(GEOM::propertyName( GEOM::Transparency )).toDouble()).toStdString());
3033           }
3034         } else if (vType == SOCC_Viewer::Type()) {
3035           if (aProps.contains(GEOM::propertyName( GEOM::Transparency ))) {
3036             param = occParam + GEOM::propertyName( GEOM::Transparency );
3037             ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Transparency )).toString().toStdString());
3038           }
3039
3040           if (aProps.contains(GEOM::propertyName( GEOM::TopLevel ))) {
3041             param = occParam + GEOM::propertyName( GEOM::TopLevel );
3042             ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::TopLevel )).toString().toStdString());
3043           }
3044         }
3045
3046         if (aProps.contains(GEOM::propertyName( GEOM::NbIsos ))) {
3047           param = occParam + GEOM::propertyName( GEOM::NbIsos );
3048           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::NbIsos )).toString().toStdString());
3049         }
3050
3051         if (aProps.contains(GEOM::propertyName( GEOM::EdgesDirection ))) {
3052           param = occParam + GEOM::propertyName( GEOM::EdgesDirection );
3053           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::EdgesDirection )).toString().toStdString());
3054         }
3055
3056         if (aProps.contains(GEOM::propertyName( GEOM::Vertices ))) {
3057           param = occParam + GEOM::propertyName( GEOM::Vertices );
3058           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Vertices )).toString().toStdString());
3059         }
3060
3061         if (aProps.contains(GEOM::propertyName( GEOM::ShowName ))) {
3062           param = occParam + GEOM::propertyName( GEOM::ShowName );
3063           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::ShowName )).toString().toStdString());
3064         }
3065
3066         if (aProps.contains(GEOM::propertyName( GEOM::Deflection ))) {
3067           param = occParam + GEOM::propertyName( GEOM::Deflection );
3068           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Deflection )).toString().toStdString());
3069         }
3070
3071         //Marker type of the vertex - ONLY for the "Vertex" and "Compound of the Vertex"
3072         if (aProps.contains(GEOM::propertyName( GEOM::PointMarker ))) {
3073           param = occParam + GEOM::propertyName( GEOM::PointMarker );
3074           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::PointMarker )).toString().toStdString());
3075         }
3076
3077         if (aProps.contains(GEOM::propertyName( GEOM::Material ))) {
3078           param = occParam + GEOM::propertyName( GEOM::Material );
3079           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Material )).toString().toStdString());
3080         }
3081
3082         if (aProps.contains(GEOM::propertyName( GEOM::LineWidth ))) {
3083              param = occParam + GEOM::propertyName( GEOM::LineWidth );
3084            ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::LineWidth )).toString().toStdString());
3085         }
3086
3087         if (aProps.contains(GEOM::propertyName( GEOM::IsosWidth ))) {
3088           param = occParam + GEOM::propertyName( GEOM::IsosWidth );
3089           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::IsosWidth )).toString().toStdString());
3090         }
3091
3092         if ( vType == SOCC_Viewer::Type() && aAnnotationMgr ) {
3093           std::string anAnnotationInfo = GetAnnotationMgr()->getDisplayedIndicesInfo(
3094                                             o_it.key().toLatin1().data(), dynamic_cast<SOCC_Viewer*>(aView) ).toStdString();
3095           if (!anAnnotationInfo.empty()) {
3096             param = occParam + "ShapeAnnotationVisibleItems";
3097             ip->setParameter(entry, param.toStdString(), anAnnotationInfo);
3098           }
3099         }
3100       } // object iterator
3101     } // for (views)
3102   } // for (viewManagers)
3103
3104   // store shape annotation and dimension attributes of objects:
3105   // since the displayed object always persists in property map, we remember the object entries
3106   // on the passes when we store viewer related properties - to avoid extra iterations on GEOM component tree.
3107   const QString aDimensionParam = OCCViewer_Viewer::Type() + GEOM::sectionSeparator() + GEOM::propertyName( GEOM::Dimensions );
3108   const QString aAnnotationParam = OCCViewer_Viewer::Type() + GEOM::sectionSeparator() + GEOM::propertyName( GEOM::ShapeAnnotations );
3109   QSet<QString>::ConstIterator aEntryIt = anEntriesToStoreShared.constBegin();
3110   for ( ; aEntryIt != anEntriesToStoreShared.constEnd(); ++aEntryIt )
3111   {
3112     std::string aStudyEntry = (*aEntryIt).toLatin1().data();
3113     std::string aStoreEntry = ip->encodeEntry( aStudyEntry, componentName );
3114
3115     // store dimension parameters
3116     GEOMGUI_DimensionProperty aDimensions( appStudy, aStudyEntry );
3117     if ( aDimensions.GetNumber() != 0 ) {
3118       ip->setParameter( aStoreEntry, aDimensionParam.toStdString(), ((QString)aDimensions).toLatin1().data() );
3119     }
3120
3121     _PTR(SObject) aObj( studyDS->FindObjectID( aStudyEntry ) );
3122     const Handle(GEOMGUI_AnnotationAttrs) aShapeAnnAttr = GEOMGUI_AnnotationAttrs::FindAttributes( aObj );
3123     if ( !aShapeAnnAttr.IsNull() ) {
3124       ip->setParameter( aStoreEntry, aAnnotationParam.toStdString(), aShapeAnnAttr->ExportAsPropertyString().toLatin1().data() );
3125     }
3126   }
3127 }
3128
3129 /*!
3130  * \brief Restore visual parameters
3131  *
3132  * This method is called after the study document is opened.
3133  * Restore visual parameters from AttributeParameter attribute(s)
3134  */
3135 void GeometryGUI::restoreVisualParameters (int savePoint)
3136 {
3137   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
3138   if (!appStudy || !appStudy->studyDS())
3139     return;
3140   _PTR(Study) studyDS = appStudy->studyDS();
3141
3142   // componentName is used for encoding of entries when storing them in IParameters
3143   std::string componentName = myComponentGeom->ComponentDataType();
3144   //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
3145   //if (!aSComponent) return;
3146
3147   // IParameters
3148   _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
3149                                                              componentName.c_str(),
3150                                                              savePoint);
3151   _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
3152
3153   std::vector<std::string> entries = ip->getEntries();
3154
3155   for (std::vector<std::string>::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt)
3156   {
3157     // entry is a normal entry - it should be "decoded" (setting base address of component)
3158     QString entry (ip->decodeEntry(*entIt).c_str());
3159
3160     // Check that the entry corresponds to a real object in the Study
3161     // as the object may be deleted or modified after the visual state is saved.
3162     _PTR(SObject) so = studyDS->FindObjectID(entry.toLatin1().data());
3163     if (!so) continue; //Skip the not existent entry
3164
3165     std::vector<std::string> paramNames = ip->getAllParameterNames( *entIt );
3166     std::vector<std::string> paramValues = ip->getAllParameterValues( *entIt );
3167
3168     std::vector<std::string>::iterator namesIt = paramNames.begin();
3169     std::vector<std::string>::iterator valuesIt = paramValues.begin();
3170
3171     // actors are stored in a map after displaying of them for
3172     // quicker access in the future: map < viewID to actor >
3173     NCollection_DataMap<int, GEOM_Actor*          > vtkActors;
3174     NCollection_DataMap<int, Handle(GEOM_AISShape)> occActors;
3175
3176     QString viewerTypStr;
3177     QString viewIndexStr;
3178     int viewIndex;
3179     QVector<PropMap> aListOfMap;
3180
3181     for (; namesIt != paramNames.end(); ++namesIt, ++valuesIt)
3182     {
3183       // visual parameters are stored in strings as follows: 
3184       //   1) ViewerType_ViewIndex_ParamName
3185       //   2) ViewerType_ParamName (shared for GEOM module)
3186       // '_' is used as separator and should not be used in viewer type or parameter names.
3187       QStringList lst = QString((*namesIt).c_str()).split( GEOM::sectionSeparator(), QString::SkipEmptyParts);
3188
3189       bool isShared = lst.size() == 2;
3190       bool isViewer = lst.size() == 3;
3191       if ( !isShared && !isViewer )
3192       {
3193         continue;
3194       }
3195
3196       // shared visual parameters
3197       if ( isShared )
3198       {
3199         QString aParamNameStr( lst[1] );
3200         QString aValuesStr( (*valuesIt).c_str() );
3201
3202         // shared dimension properties are stored as attribute
3203         if ( aParamNameStr == GEOM::propertyName( GEOM::Dimensions ) )
3204         {
3205           GEOMGUI_DimensionProperty aDimensionProp( aValuesStr );
3206           aDimensionProp.SaveToAttribute( appStudy, entry.toLatin1().data() );
3207         }
3208         else if ( aParamNameStr == GEOM::propertyName( GEOM::ShapeAnnotations ) )
3209         {
3210           Handle(GEOMGUI_AnnotationAttrs) anAttr =
3211             GEOMGUI_AnnotationAttrs::FindOrCreateAttributes( so, appStudy );
3212
3213           anAttr->ImportFromPropertyString( aValuesStr );
3214         }
3215
3216         continue;
3217       }
3218
3219       // per view visual parameters
3220       viewerTypStr = lst[0];
3221       viewIndexStr = lst[1];
3222       QString paramNameStr = lst[2];
3223
3224       bool ok;
3225       viewIndex = viewIndexStr.toUInt(&ok);
3226       if (!ok) // bad conversion of view index to integer
3227         continue;
3228
3229       if ((viewIndex + 1) > aListOfMap.count()) {
3230         aListOfMap.resize(viewIndex + 1);
3231       }
3232
3233       QString val((*valuesIt).c_str());
3234       if (paramNameStr == GEOM::propertyName( GEOM::Visibility )) {
3235         aListOfMap[viewIndex].insert(GEOM::propertyName( GEOM::Visibility ), val == "On");
3236       } else if (paramNameStr == GEOM::propertyName( GEOM::Opacity )) {
3237         aListOfMap[viewIndex].insert(GEOM::propertyName( GEOM::Transparency ), 1. - val.toDouble());
3238       } else if (paramNameStr == GEOM::propertyName( GEOM::Transparency )) {
3239         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Transparency ), val.toDouble() );
3240       } else if (paramNameStr == GEOM::propertyName( GEOM::TopLevel )) {
3241         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::TopLevel ), val == "true" || val == "1");
3242       } else if (paramNameStr == GEOM::propertyName( GEOM::DisplayMode )) {
3243         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::DisplayMode ), val.toInt());
3244       } else if (paramNameStr == GEOM::propertyName( GEOM::NbIsos )) {
3245         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::NbIsos ), val);
3246       } else if (paramNameStr == GEOM::propertyName( GEOM::Color )) {
3247         QStringList rgb = val.split(GEOM::subSectionSeparator());
3248         if (rgb.count() == 3) {
3249           QColor c = QColor::fromRgbF(rgb[0].toDouble(), rgb[1].toDouble(), rgb[2].toDouble());
3250           aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Color ), c);
3251         }
3252       } else if (paramNameStr == GEOM::propertyName( GEOM::Texture )) {
3253         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Texture ), val );
3254       } else if (paramNameStr == GEOM::propertyName( GEOM::EdgesDirection )) {
3255         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::EdgesDirection ), val == "true" || val == "1");
3256       } else if (paramNameStr == GEOM::propertyName( GEOM::Vertices )) {
3257         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Vertices ), val == "true" || val == "1");
3258       } else if (paramNameStr == GEOM::propertyName( GEOM::ShowName )) {
3259         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::ShowName ), val == "true" || val == "1");
3260       } else if (paramNameStr == GEOM::propertyName( GEOM::Deflection )) {
3261         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Deflection ), val.toDouble());
3262       } else if (paramNameStr == GEOM::propertyName( GEOM::PointMarker )) {
3263         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::PointMarker ), val);
3264       } else if (paramNameStr == GEOM::propertyName( GEOM::Material )) {
3265         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Material ), val);
3266       } else if (paramNameStr == GEOM::propertyName( GEOM::LineWidth )) {
3267         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::LineWidth ), val.toInt());
3268       } else if (paramNameStr == GEOM::propertyName( GEOM::IsosWidth )) {
3269         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::IsosWidth ), val.toInt());
3270       } else if (paramNameStr == "ShapeAnnotationVisibleItems") {
3271         aListOfMap[viewIndex].insert( "ShapeAnnotationVisibleItems", val);
3272       }
3273
3274     } // for names/parameters iterator
3275
3276     QList<SUIT_ViewManager*> lst = getApp()->viewManagers();
3277
3278     for (int index = 0; index < aListOfMap.count(); index++) {
3279       appStudy->setObjectProperties(index, entry, aListOfMap[index]);
3280
3281       //Get Visibility property of the current PropMap
3282       if (aListOfMap[index].value(GEOM::propertyName( GEOM::Visibility )) == 1) {
3283         SUIT_ViewManager* vman = lst.at(index);
3284         SUIT_ViewModel* vmodel = vman->getViewModel();
3285         SALOME_View* aView = dynamic_cast<SALOME_View*>(vmodel);
3286         displayer()->Display(entry, true, aView);
3287
3288         if ( vmodel->getType() == SOCC_Viewer::Type() ) {
3289           PropMap& aProps = aListOfMap[index];
3290           if ( aProps.contains( "ShapeAnnotationVisibleItems" ) ) {
3291             SOCC_Viewer* aSOCCView = dynamic_cast<SOCC_Viewer*>( aView );
3292             GetAnnotationMgr()->setDisplayedIndicesInfo( entry, aSOCCView, aProps["ShapeAnnotationVisibleItems"].toString() );
3293           }
3294         }
3295       }
3296     }
3297   } // for entries iterator
3298
3299   // update all VTK and OCC views
3300   QList<SUIT_ViewManager*> lst;
3301   getApp()->viewManagers(lst);
3302   for (QList<SUIT_ViewManager*>::Iterator it = lst.begin(); it != lst.end(); it++) {
3303     SUIT_ViewModel* vmodel = (*it)->getViewModel();
3304     if (!vmodel)
3305       continue;
3306     if (vmodel->getType() == SVTK_Viewer::Type()) {
3307       SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) (*it)->getActiveView();
3308       vtkView->getRenderer()->ResetCameraClippingRange();
3309       vtkView->Repaint();
3310     }
3311     else if (vmodel->getType() == SOCC_Viewer::Type()) {
3312       //SOCC_ViewWindow* occView = (SOCC_ViewWindow*) (*it)->getActiveView();
3313       SALOME_View* occVMod = dynamic_cast<SALOME_View*>(vmodel);
3314       if (occVMod)
3315         occVMod->Repaint();
3316     }
3317   }
3318
3319   if ( myTextTreeWdg ) {
3320     myTextTreeWdg->updateTree();
3321   }
3322 }
3323
3324 // Compute current name mode of the viewer
3325 void UpdateNameMode( SalomeApp_Application* app )
3326 {
3327   bool isMode = false;
3328   SalomeApp_Study* aStudy = dynamic_cast< SalomeApp_Study* >( app->activeStudy() );
3329   SUIT_ViewWindow* viewWindow = app->desktop()->activeWindow();
3330   GEOM_Displayer displayer( aStudy );
3331   int aMgrId = viewWindow->getViewManager()->getGlobalId();
3332
3333   SALOME_View* window = displayer.GetActiveView();
3334   if ( !window ) return;
3335
3336   SALOME_ListIO anIOlst;
3337   window->GetVisible( anIOlst );
3338
3339   for ( SALOME_ListIteratorOfListIO It( anIOlst ); It.More(); It.Next() ) {
3340     Handle( SALOME_InteractiveObject ) io = It.Value();
3341     QVariant v = aStudy->getObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::ShowName ), QVariant() );
3342     bool isIONameMode =  v.isValid() ? v.toBool() : false;
3343     if( isIONameMode )
3344       isMode = true;
3345   }
3346   viewWindow->setProperty( "NameMode", isMode );
3347 }
3348
3349 void GeometryGUI::onViewAboutToShow()
3350 {
3351   SUIT_ViewWindow* window = application()->desktop()->activeWindow();
3352   QAction* a = action( GEOMOp::OpSwitchVectors );
3353   QAction* aVerticesAction = action( GEOMOp::OpSwitchVertices );
3354   QAction* aNameAction = action( GEOMOp::OpSwitchName );
3355   if ( window ) {
3356     a->setEnabled(true);
3357     bool vmode = window->property("VectorsMode").toBool();
3358     a->setText ( vmode == 1 ? tr( "MEN_VECTOR_MODE_OFF" ) : tr("MEN_VECTOR_MODE_ON") );
3359     aVerticesAction->setEnabled(true);
3360     vmode = window->property("VerticesMode").toBool();
3361     aVerticesAction->setText ( vmode == 1 ? tr( "MEN_VERTICES_MODE_OFF" ) : tr("MEN_VERTICES_MODE_ON") );
3362     UpdateNameMode( getApp() );
3363     aNameAction->setEnabled(true);
3364     vmode = window->property("NameMode").toBool();
3365     aNameAction->setText ( vmode == 1 ? tr( "MEN_NAME_MODE_OFF" ) : tr("MEN_NAME_MODE_ON") );
3366   } else {
3367     a->setText ( tr("MEN_VECTOR_MODE_ON") );
3368     a->setEnabled(false);
3369     aVerticesAction->setText ( tr("MEN_VERTICES_MODE_ON") );
3370     aVerticesAction->setEnabled(false);
3371     aNameAction->setText ( tr("MEN_NAME_MODE_ON") );
3372     aNameAction->setEnabled(false);
3373   }
3374 }
3375
3376 /*!
3377   \brief Return action by id
3378   \param id identifier of the action
3379   \return action
3380 */
3381 QAction* GeometryGUI::getAction(const int id) {
3382   return action(id);
3383 }
3384
3385 /*!
3386   \brief GEOM module message handler
3387
3388   This method can be re-implemented in the subclasses.
3389   This is a GEOM module message handler.
3390
3391   \param msg the message received.
3392 */
3393 void GeometryGUI::message(const QString& msg)
3394 {
3395   // dispatch message
3396   QStringList data = msg.split("/");
3397   const int nbStrings = data.count();
3398
3399   if (nbStrings > 0) {
3400     if (data[0] == "modified") {
3401       // get mesh entry
3402       QString anIOR = nbStrings > 1 ? data[1] : QString();
3403
3404       if ( anIOR.isEmpty() ) {
3405         return;
3406       }
3407
3408       // Get the geom object.
3409       GEOM::GEOM_Object_ptr anObj = GeometryGUI::GetObjectFromIOR (anIOR);
3410
3411       // Clear the shape buffer
3412       GeometryGUI::ClearShapeBuffer (anObj);
3413     }
3414   }
3415 }
3416
3417 /*!
3418   \brief Clears the shape buffer.
3419
3420   This is a static method. It clears the shape buffer.
3421
3422   \param theObj the object
3423 */
3424 void GeometryGUI::ClearShapeBuffer( GEOM::GEOM_Object_ptr theObj )
3425 {
3426   if ( CORBA::is_nil( theObj ) )
3427     return;
3428
3429   CORBA::String_var IOR = SalomeApp_Application::orb()->object_to_string( theObj );
3430   TCollection_AsciiString asciiIOR( (char *)IOR.in() );
3431   GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
3432
3433   SALOMEDSClient_StudyManager *aManager = SalomeApp_Application::studyMgr();
3434
3435   if (!aManager)
3436     return;
3437
3438   _PTR(Study) aStudy = aManager->GetStudyByID(theObj->GetStudyID());
3439
3440   if ( !aStudy )
3441     return;
3442
3443   _PTR(SObject) aSObj ( aStudy->FindObjectIOR( std::string( IOR ) ) );
3444   if ( !aSObj )
3445     return;
3446
3447   _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) );
3448   for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) {
3449     _PTR(GenericAttribute) anAttr;
3450     if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) {
3451       _PTR(AttributeIOR) anIOR ( anAttr );
3452       TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() );
3453       GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
3454     }
3455   }
3456 }
3457
3458 /*!
3459   \brief Returns the object from IOR.
3460
3461   This is a static method. It returns the object from its IOR.
3462
3463   \param IOR object IOR
3464   \return GEOM object.
3465 */
3466 GEOM::GEOM_Object_ptr GeometryGUI::GetObjectFromIOR( const QString& IOR )
3467 {
3468   GEOM::GEOM_Object_var geomObj;
3469   if ( !IOR.isEmpty() ) {
3470     CORBA::Object_var corbaObj = SalomeApp_Application::orb()->string_to_object
3471       ( IOR.toLatin1().constData() );
3472     if ( !CORBA::is_nil( corbaObj ) )
3473       geomObj = GEOM::GEOM_Object::_narrow( corbaObj );
3474   }
3475   return geomObj._retn();
3476 }
3477
3478 /*!
3479   \brief Returns IOR of the object.
3480
3481   This is a static method. It returns the object's IOR.
3482
3483   \param object the GEOM object.
3484   \return object's IOR.
3485 */
3486 QString GeometryGUI::GetIORFromObject( GEOM::GEOM_Object_ptr object )
3487 {
3488   QString IOR;
3489   if ( !CORBA::is_nil( object ) ) {
3490     CORBA::String_var anIOR =
3491       SalomeApp_Application::orb()->object_to_string( object );
3492     IOR = anIOR.in();
3493   }
3494   return IOR;
3495 }
3496
3497 /*!
3498   \brief Check if this object is can't be renamed in place
3499
3500   This method can be re-implemented in the subclasses.
3501   Return true in case if object isn't reference or component (module root).
3502
3503   \param entry column id
3504   \return \c true if the item can be renamed by the user in place (e.g. in the Object browser)
3505 */
3506 bool GeometryGUI::renameAllowed( const QString& entry) const {
3507
3508   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
3509   SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
3510   SalomeApp_DataObject* obj = appStudy ? dynamic_cast<SalomeApp_DataObject*>(appStudy->findObjectByEntry(entry)) : 0;
3511
3512   return (app && appStudy && obj && !appStudy->isComponent(entry) && !obj->isReference());
3513 }
3514
3515 /*!
3516   Rename object by entry.
3517   \param entry entry of the object
3518   \param name new name of the object
3519   \brief Return \c true if rename operation finished successfully, \c false otherwise.
3520 */
3521 bool GeometryGUI::renameObject( const QString& entry, const QString& name)
3522 {
3523   bool result = false;
3524
3525   SalomeApp_Application* app =
3526     dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication());
3527   SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
3528
3529   if (!appStudy)
3530     return result;
3531
3532   _PTR(Study) aStudy = appStudy->studyDS();
3533
3534   if (!aStudy)
3535     return result;
3536
3537   bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
3538   if ( aLocked ) {
3539     SUIT_MessageBox::warning ( app->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
3540     return result;
3541   }
3542
3543   _PTR(SObject) obj ( aStudy->FindObjectID(qPrintable(entry)) );
3544   _PTR(GenericAttribute) anAttr;
3545   if ( obj ) {
3546     if ( obj->FindAttribute(anAttr, "AttributeName") ) {
3547       _PTR(AttributeName) aName (anAttr);
3548
3549       aName->SetValue( name.toLatin1().data() ); // rename the SObject
3550       GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(obj));
3551       if (!CORBA::is_nil(anObj)) {
3552         anObj->SetName( name.toLatin1().data() );  // Rename the corresponding GEOM_Object
3553         emit SignalDependencyTreeRenameObject( anObj->GetEntry() );
3554         emit SignalTextTreeRenameObject( entry );
3555       }
3556       result = true;
3557     }
3558   }
3559   return result;
3560 }
3561
3562 void GeometryGUI::updateMaterials()
3563 {
3564   LightApp_Preferences* pref = preferences();
3565   if ( pref ) {
3566     QStringList materials = Material_ResourceMgr::resourceMgr()->materials();
3567     QString currentMaterial = SUIT_Session::session()->resourceMgr()->stringValue( "Geometry", "material" );
3568     if ( !materials.contains( currentMaterial ) )
3569       // user material set as default in the preferences, might be removed
3570       SUIT_Session::session()->resourceMgr()->setValue( "Geometry", "material", QString( "Plastic" ) );
3571
3572     QtxPreferenceItem* prefItem = pref->rootItem()->findItem( tr( "PREF_MATERIAL" ), true );
3573     if ( prefItem ) {
3574       setPreferenceProperty( prefItem->id(),
3575                              "strings", materials );
3576       prefItem->retrieve();
3577     }
3578   }
3579 }
3580
3581 /*!
3582   \brief Check if the module allows "drag" operation of its objects.
3583
3584   Overloaded from LightApp_Module class.
3585   
3586   This function is a part of the general drag-n-drop mechanism.
3587   The goal of this function is to check data object passed as a parameter
3588   and decide if it can be dragged or no.
3589
3590   \param what data object being tested for drag operation
3591   \return \c true if module allows dragging of the specified object
3592   \sa isDropAccepted(), dropObjects()
3593 */
3594 bool GeometryGUI::isDraggable( const SUIT_DataObject* what ) const
3595 {
3596   // we allow dragging object under root and object from folder
3597   int aLevel = what->level();
3598   bool anObjectInFolder = false;
3599   if ( aLevel > 2 ) {
3600     const SalomeApp_DataObject* dataObj = dynamic_cast<const SalomeApp_DataObject*>( what );
3601     if ( dataObj ) {
3602       _PTR(SObject) aSO = dataObj->object();
3603       if ( aSO ) {
3604         _PTR(GenericAttribute) anAttr;
3605         _PTR(SObject) aFatherSO = aSO->GetStudy()->GetUseCaseBuilder()->GetFather( aSO );
3606         if ( aFatherSO && aFatherSO->FindAttribute(anAttr, "AttributeLocalID") ) {
3607           _PTR(AttributeLocalID) aLocalID( anAttr );
3608           anObjectInFolder = aLocalID->Value() == 999;
3609         }
3610       }
3611     }
3612   }
3613   return aLevel == 2 || anObjectInFolder;
3614 }
3615
3616 /*!
3617   \brief Check if the module allows "drop" operation on the given object.
3618
3619   Overloaded from LightApp_Module class.
3620
3621   This function is a part of the general drag-n-drop mechanism.
3622   The goal of this function is to check data object passed as a parameter
3623   and decide if it can be used as a target for the "drop" operation.
3624   The processing of the drop operation itself is done in the dropObjects() function.
3625
3626   \param where target data object
3627   \return \c true if module supports dropping on the \a where data object
3628   \sa isDraggable(), dropObjects()
3629 */
3630 bool GeometryGUI::isDropAccepted( const SUIT_DataObject* where ) const
3631 {
3632   // we allow dropping into folder and top-level GEOM object
3633   int aLevel = where->level();
3634   bool isFolder = false;
3635   if ( aLevel > 1 ) {
3636     const SalomeApp_DataObject* dataObj = dynamic_cast<const SalomeApp_DataObject*>( where );
3637     if ( dataObj ) {
3638       _PTR(SObject) aSO = dataObj->object();
3639       if ( aSO ) {
3640         _PTR(GenericAttribute) anAttr;
3641         if ( aSO->FindAttribute(anAttr, "AttributeLocalID") ) {
3642           _PTR(AttributeLocalID) aLocalID( anAttr );
3643           isFolder = aLocalID->Value() == 999;
3644         }
3645       }
3646     }
3647   }
3648   return aLevel == 1 || isFolder;
3649 }
3650
3651 /*!
3652   \brief Complete drag-n-drop operation.
3653   
3654   Overloaded from LightApp_Module class.
3655
3656   This function is a part of the general drag-n-drop mechanism.
3657   Its goal is to handle dropping of the objects being dragged according
3658   to the chosen operation (move). The dropping is performed in the
3659   context of the parent data object \a where and the \a row (position in the 
3660   children index) at which the data should be dropped. If \a row is equal to -1,
3661   this means that objects are added to the end of the children list.
3662
3663   \param what objects being dropped
3664   \param where target data object
3665   \param row child index at which the drop operation is performed
3666   \param action drag-n-drop operation (Qt::DropAction) - move
3667
3668   \sa isDraggable(), isDropAccepted()
3669 */
3670 void GeometryGUI::dropObjects( const DataObjectList& what, SUIT_DataObject* where,
3671                                const int row, Qt::DropAction action )
3672 {
3673   if (action != Qt::CopyAction && action != Qt::MoveAction)
3674     return; // unsupported action
3675
3676   // get parent object
3677   SalomeApp_DataObject* dataObj = dynamic_cast<SalomeApp_DataObject*>( where );
3678   if ( !dataObj ) return; // wrong parent
3679   _PTR(SObject) parentObj = dataObj->object();
3680
3681   // Find the current Study and StudyBuilder
3682   _PTR(Study) aStudy = parentObj->GetStudy();
3683   _PTR(UseCaseBuilder) aUseCaseBuilder = aStudy->GetUseCaseBuilder();
3684   // collect all parents of the target node
3685   QStringList parentIDs;
3686   _PTR(SObject) parent = parentObj;
3687   while( !parent->IsNull() ) {
3688     parentIDs << parent->GetID().c_str();
3689     parent = aUseCaseBuilder->GetFather(parent);
3690   }
3691
3692   // collect objects being dropped
3693   GEOM::object_list_var objects = new GEOM::object_list();
3694   objects->length( what.count() );
3695   int count = 0;
3696   for ( int i = 0; i < what.count(); i++ ) {
3697     dataObj = dynamic_cast<SalomeApp_DataObject*>( what[i] );
3698     if ( !dataObj ) continue;  // skip wrong objects
3699     _PTR(SObject) sobj = dataObj->object();
3700     // check that dropped object is not a parent of target object
3701     if ( parentIDs.contains( sobj->GetID().c_str() ) ) {
3702       return; // it's not allowed to move node into it's child 
3703     }
3704     objects[i] = _CAST(SObject, sobj)->GetSObject();
3705     count++;
3706   }
3707   objects->length( count );
3708
3709   // call engine function
3710   GetGeomGen()->Move( objects.in(),                              // what
3711                       _CAST(SObject, parentObj)->GetSObject(),   // where
3712                       row );                                     // row
3713
3714   // update Object browser
3715   getApp()->updateObjectBrowser( false );
3716 }
3717
3718 void GeometryGUI::emitDimensionsUpdated( QString entry )
3719 {
3720   emit DimensionsUpdated( entry );
3721 }
3722
3723 void GeometryGUI::emitAnnotationsUpdated( QString entry )
3724 {
3725   emit SignalAnnotationsUpdated( entry );
3726 }