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