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