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