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