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