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