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