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