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