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