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