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