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