Salome HOME
Merge branch 'hydro/imps_2015'
[modules/geom.git] / src / GEOMGUI / GeometryGUI.cxx
1 // Copyright (C) 2007-2015  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::OpClipping:           // MENU OPERATION - CLIPPING RANGE
619   case GEOMOp::OpShapesOnShape:      // MENU OPERATION - GET SHAPES ON SHAPE
620   case GEOMOp::OpFillet2d:           // MENU OPERATION - FILLET 2D
621   case GEOMOp::OpFillet1d:           // MENU OPERATION - FILLET 1D
622   case GEOMOp::OpSharedShapes:       // MENU OPERATION - GET SHARED SHAPES
623   case GEOMOp::OpExtrudedBoss:       // MENU OPERATION - EXTRUDED BOSS
624   case GEOMOp::OpExtrudedCut:        // MENU OPERATION - EXTRUDED CUT
625   case GEOMOp::OpTransferData:       // MENU OPERATION - TRANSFER DATA
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::OpClipping,        "CLIPPING" );
1005   createGeomAction( GEOMOp::OpShapesOnShape,  "GET_SHAPES_ON_SHAPE" );
1006   createGeomAction( GEOMOp::OpSharedShapes,   "GET_SHARED_SHAPES" );
1007   createGeomAction( GEOMOp::OpTransferData,   "TRANSFER_DATA" );
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
1266   createMenu( separator(), operId, -1 );
1267
1268   createMenu( GEOMOp::OpFillet1d,      operId, -1 );
1269   createMenu( GEOMOp::OpFillet2d,      operId, -1 );
1270   createMenu( GEOMOp::OpFillet3d,      operId, -1 );
1271   createMenu( GEOMOp::OpChamfer,       operId, -1 );
1272   createMenu( GEOMOp::OpExtrudedBoss,  operId, -1 );
1273   createMenu( GEOMOp::OpExtrudedCut,   operId, -1 );
1274   //createMenu( GEOMOp::OpClipping,      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
1442   int featTbId = createTool( tr( "TOOL_FEATURES" ), QString( "GEOMModification" ) );
1443   createTool( GEOMOp::OpFillet1d,        featTbId );
1444   createTool( GEOMOp::OpFillet2d,        featTbId );
1445   createTool( GEOMOp::OpFillet3d,        featTbId );
1446   createTool( GEOMOp::OpChamfer,         featTbId );
1447   createTool( GEOMOp::OpExtrudedBoss,    featTbId );
1448   createTool( GEOMOp::OpExtrudedCut,     featTbId );
1449
1450   int buildTbId = createTool( tr( "TOOL_BUILD" ), QString( "GEOMBuild" ) );
1451   createTool( GEOMOp::OpEdge,     buildTbId );
1452   createTool( GEOMOp::OpWire,     buildTbId );
1453   createTool( GEOMOp::OpFace,     buildTbId );
1454   createTool( GEOMOp::OpShell,    buildTbId );
1455   createTool( GEOMOp::OpSolid,    buildTbId );
1456   createTool( GEOMOp::OpCompound, buildTbId );
1457
1458   int measureTbId = createTool( tr( "TOOL_MEASURES" ), QString( "GEOMMeasures" ) );
1459   createTool( GEOMOp::OpPointCoordinates, measureTbId );
1460   createTool( GEOMOp::OpProperties,       measureTbId );
1461   createTool( GEOMOp::OpCenterMass,       measureTbId );
1462   createTool( GEOMOp::OpInertia,          measureTbId );
1463   createTool( GEOMOp::OpNormale,          measureTbId );
1464   createTool( separator(),                measureTbId );
1465   createTool( GEOMOp::OpBoundingBox,      measureTbId );
1466   createTool( GEOMOp::OpMinDistance,      measureTbId );
1467   createTool( GEOMOp::OpAngle,            measureTbId );
1468   createTool( GEOMOp::OpTolerance  ,      measureTbId );
1469   createTool( separator(),                measureTbId );
1470   createTool( GEOMOp::OpFreeBoundaries,   measureTbId );
1471   createTool( GEOMOp::OpFreeFaces,        measureTbId );
1472   createTool( separator(),                measureTbId );
1473   createTool( GEOMOp::OpWhatIs,           measureTbId );
1474   createTool( GEOMOp::OpCheckShape,       measureTbId );
1475   createTool( GEOMOp::OpCheckCompound,    measureTbId );
1476   createTool( GEOMOp::OpGetNonBlocks,     measureTbId );
1477   createTool( GEOMOp::OpCheckSelfInters,  measureTbId );
1478   createTool( GEOMOp::OpFastCheckInters,  measureTbId );
1479
1480   int picturesTbId = createTool( tr( "TOOL_PICTURES" ), QString( "GEOMPictures" ) );
1481   createTool( GEOMOp::OpPictureImport,    picturesTbId );
1482 #ifdef WITH_OPENCV
1483   createTool( GEOMOp::OpFeatureDetect,  picturesTbId );
1484 #endif
1485
1486   //int advancedTbId = createTool( tr( "TOOL_ADVANCED" ) );
1487   //createTool( GEOMOp::OpSmoothingSurface, advancedTbId );
1488   //@@ 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 @@//
1489
1490   // ---- create popup menus --------------------------
1491
1492   QString clientOCCorVTK = "(client='OCCViewer' or client='VTKViewer')";
1493   QString clientOCC = "(client='OCCViewer')";
1494   QString clientOCCorVTK_AndSomeVisible = clientOCCorVTK + " and selcount>0 and isVisible";
1495   QString clientOCC_AndSomeVisible = clientOCC + " and selcount>0 and isVisible";
1496
1497   QString clientOCCorOB = "(client='ObjectBrowser' or client='OCCViewer')";
1498   QString clientOCCorVTKorOB = "(client='ObjectBrowser' or client='OCCViewer' or client='VTKViewer')";
1499   QString clientOCCorVTKorOB_AndSomeVisible = clientOCCorVTKorOB + " and selcount>0 and isVisible";
1500   QString clientOCCorOB_AndSomeVisible = clientOCCorOB + " and selcount>0 and isVisible";
1501
1502   QString autoColorPrefix =
1503     "(client='ObjectBrowser' or client='OCCViewer' or client='VTKViewer') and type='Shape' and selcount=1";
1504
1505   QtxPopupMgr* mgr = popupMgr();
1506
1507   mgr->insert( action(  GEOMOp::OpDelete ), -1, -1 );  // delete
1508   mgr->setRule( action( GEOMOp::OpDelete ), QString("$type in {'Shape' 'Group' 'Folder' 'Field' 'FieldStep'} and selcount>0"), QtxPopupMgr::VisibleRule );
1509   mgr->insert( action(  GEOMOp::OpGroupCreatePopup ), -1, -1 ); // create group
1510   mgr->setRule( action( GEOMOp::OpGroupCreatePopup ), QString("type='Shape' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1511   mgr->insert( action(  GEOMOp::OpEditFieldPopup ), -1, -1 ); // edit field
1512   mgr->setRule( action( GEOMOp::OpEditFieldPopup ), QString("(type='Field' or type='FieldStep') and isOCC=true"), QtxPopupMgr::VisibleRule );
1513   mgr->insert( action(  GEOMOp::OpDiscloseChildren ), -1, -1 ); // disclose child items
1514   mgr->setRule( action( GEOMOp::OpDiscloseChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasConcealedChildren=true"), QtxPopupMgr::VisibleRule );
1515
1516   mgr->insert( action(  GEOMOp::OpConcealChildren ), -1, -1 ); // conceal child items
1517   mgr->setRule( action( GEOMOp::OpConcealChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasDisclosedChildren=true"), QtxPopupMgr::VisibleRule );
1518   mgr->insert( action(  GEOMOp::OpGroupEdit ), -1, -1 );  // edit group
1519   mgr->setRule( action( GEOMOp::OpGroupEdit ),  QString("client='ObjectBrowser' and type='Group' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1520   mgr->insert( separator(), -1, -1 );     // -----------
1521
1522   //QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and (selcount>0) and isOCC=true and topLevel=false";
1523   QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and isFolder=false and (selcount>0) and isOCC=true";
1524   mgr->insert( action(GEOMOp::OpBringToFront ), -1, -1 ); // bring to front
1525   mgr->setRule(action(GEOMOp::OpBringToFront), bringRule + " and autoBringToFront = false", QtxPopupMgr::VisibleRule );
1526   mgr->setRule(action(GEOMOp::OpBringToFront), "topLevel=true", QtxPopupMgr::ToggleRule );
1527   mgr->insert( action(GEOMOp::OpClsBringToFront ), -1, -1 ); // clear bring to front
1528   mgr->setRule( action(GEOMOp::OpClsBringToFront ), clientOCC + " and autoBringToFront = false", QtxPopupMgr::VisibleRule );
1529   mgr->insert( separator(), -1, -1 );     // -----------
1530   dispmodeId = mgr->insert(  tr( "MEN_DISPLAY_MODE" ), -1, -1 ); // display mode menu
1531   mgr->insert( action(  GEOMOp::OpWireframe ), dispmodeId, -1 ); // wireframe
1532   mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1533   mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK + " and displaymode='Wireframe'", QtxPopupMgr::ToggleRule );
1534   mgr->insert( action(  GEOMOp::OpShading ), dispmodeId, -1 ); // shading
1535   mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1536   mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK + " and displaymode='Shading'", QtxPopupMgr::ToggleRule );
1537   mgr->insert( action(  GEOMOp::OpShadingWithEdges ), dispmodeId, -1 ); // shading with edges
1538   mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1539   mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK + " and displaymode='ShadingWithEdges'", QtxPopupMgr::ToggleRule );
1540   mgr->insert( action(  GEOMOp::OpTexture ), dispmodeId, -1 ); // wireframe
1541   mgr->setRule( action( GEOMOp::OpTexture ), clientOCC_AndSomeVisible, QtxPopupMgr::VisibleRule );
1542   mgr->setRule( action( GEOMOp::OpTexture), clientOCC + " and displaymode='Texture'", QtxPopupMgr::ToggleRule );
1543   mgr->insert( separator(), dispmodeId, -1 );
1544   mgr->insert( action(  GEOMOp::OpVectors ), dispmodeId, -1 ); // vectors
1545   mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK_AndSomeVisible  + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1546   mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK + " and isVectorsMode", QtxPopupMgr::ToggleRule );
1547   mgr->insert( action(  GEOMOp::OpVertices ), dispmodeId, -1 ); // vertices
1548   mgr->setRule( action( GEOMOp::OpVertices ), clientOCCorVTK_AndSomeVisible  + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1549   mgr->setRule( action( GEOMOp::OpVertices ), clientOCCorVTK + " and isVerticesMode", QtxPopupMgr::ToggleRule );
1550   mgr->insert( action(  GEOMOp::OpShowName ), dispmodeId, -1 ); // show name
1551   mgr->setRule( action( GEOMOp::OpShowName ), clientOCCorVTK_AndSomeVisible  + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1552   mgr->setRule( action( GEOMOp::OpShowName ), clientOCCorVTK + " and isNameMode", QtxPopupMgr::ToggleRule );
1553   mgr->insert( separator(), -1, -1 );     // -----------
1554
1555   mgr->insert( action(  GEOMOp::OpColor ), -1, -1 ); // color
1556   mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})" + "and isPhysicalMaterial=false", QtxPopupMgr::VisibleRule );
1557   mgr->insert( action(  GEOMOp::OpTransparency ), -1, -1 ); // transparency
1558   mgr->setRule( action( GEOMOp::OpTransparency ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1559   mgr->insert( action(  GEOMOp::OpIsos ), -1, -1 ); // isos
1560   mgr->setRule( action( GEOMOp::OpIsos ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1561   mgr->insert( action(  GEOMOp::OpDeflection ), -1, -1 ); // deflection
1562   mgr->setRule( action( GEOMOp::OpDeflection ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1563   mgr->insert( action(  GEOMOp::OpPointMarker ), -1, -1 ); // point marker
1564   mgr->setRule( action( GEOMOp::OpPointMarker ), clientOCCorOB + " and $type in {'Shape' 'Group' 'Field' 'FieldStep'} and selcount>0 and isOCC=true", QtxPopupMgr::VisibleRule );
1565
1566   // material properties
1567   mgr->insert( action(  GEOMOp::OpMaterialProperties ), -1, -1 );
1568   mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1569
1570  // texture
1571   mgr->insert( action(  GEOMOp::OpSetTexture ), -1, -1 );
1572   mgr->setRule( action( GEOMOp::OpSetTexture ), clientOCCorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1573
1574   int lineW = mgr->insert(  tr( "MEN_LINE_WIDTH" ), -1, -1 ); // line width menu
1575   mgr->insert( action(  GEOMOp::OpEdgeWidth ), lineW, -1 ); // edge width
1576   mgr->setRule( action( GEOMOp::OpEdgeWidth ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1577
1578   mgr->insert( action(  GEOMOp::OpIsosWidth ), lineW, -1 ); // isos width
1579   mgr->setRule( action( GEOMOp::OpIsosWidth ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1580
1581   mgr->insert( separator(), -1, -1 );     // -----------
1582   mgr->insert( action(  GEOMOp::OpAutoColor ), -1, -1 ); // auto color
1583   mgr->setRule( action( GEOMOp::OpAutoColor ), autoColorPrefix + " and isAutoColor=false", QtxPopupMgr::VisibleRule );
1584   mgr->insert( action(  GEOMOp::OpNoAutoColor ), -1, -1 ); // disable auto color
1585   mgr->setRule( action( GEOMOp::OpNoAutoColor ), autoColorPrefix + " and isAutoColor=true", QtxPopupMgr::VisibleRule );
1586   mgr->insert( separator(), -1, -1 );     // -----------
1587
1588   QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ",
1589           onlyComponent = "((type='Component') and selcount=1)",
1590           rule = canDisplay + "and ((($type in {%1}) and( %2 )) or " + onlyComponent + ")",
1591           types = "'Shape' 'Group' 'FieldStep'";
1592
1593   mgr->insert( action(  GEOMOp::OpShow ), -1, -1 ); // display
1594   mgr->setRule( action( GEOMOp::OpShow ), rule.arg( types ).arg( "not isVisible" ), QtxPopupMgr::VisibleRule );
1595
1596   mgr->insert( action(  GEOMOp::OpHide ), -1, -1 ); // erase
1597   mgr->setRule( action( GEOMOp::OpHide ), rule.arg( types ).arg( "isVisible" ), QtxPopupMgr::VisibleRule );
1598
1599   mgr->insert( action(  GEOMOp::OpHideAll ), -1, -1 ); // erase All
1600   mgr->setRule( action( GEOMOp::OpHideAll ), clientOCCorVTK, QtxPopupMgr::VisibleRule );
1601
1602   QString selectOnly = "(client='OCCViewer' or client='VTKViewer') and (selcount=0)";
1603
1604   int selectonlyId = mgr->insert( tr("MEN_SELECT_ONLY"), -1, -1);                //select only menu
1605   mgr->insert( action(GEOMOp::OpSelectVertex),   selectonlyId, -1);                                  //Vertex
1606   mgr->setRule(action(GEOMOp::OpSelectVertex),   selectOnly, QtxPopupMgr::VisibleRule);
1607   mgr->setRule(action(GEOMOp::OpSelectVertex),   selectOnly + " and selectionmode='VERTEX'", QtxPopupMgr::ToggleRule);
1608   mgr->insert( action(GEOMOp::OpSelectEdge),     selectonlyId, -1);                                  //Edge
1609   mgr->setRule(action(GEOMOp::OpSelectEdge),     selectOnly, QtxPopupMgr::VisibleRule);
1610   mgr->setRule(action(GEOMOp::OpSelectEdge),     selectOnly + " and selectionmode='EDGE'", QtxPopupMgr::ToggleRule);
1611   mgr->insert( action(GEOMOp::OpSelectWire),     selectonlyId, -1);                                  //Wire
1612   mgr->setRule(action(GEOMOp::OpSelectWire),     selectOnly, QtxPopupMgr::VisibleRule);
1613   mgr->setRule(action(GEOMOp::OpSelectWire),     selectOnly + " and selectionmode='WIRE'", QtxPopupMgr::ToggleRule);
1614   mgr->insert( action(GEOMOp::OpSelectFace),     selectonlyId, -1);                                  //Face
1615   mgr->setRule(action(GEOMOp::OpSelectFace),     selectOnly, QtxPopupMgr::VisibleRule);
1616   mgr->setRule(action(GEOMOp::OpSelectFace),     selectOnly + " and selectionmode='FACE'", QtxPopupMgr::ToggleRule);
1617   mgr->insert( action(GEOMOp::OpSelectShell),    selectonlyId, -1);                                  //Shell
1618   mgr->setRule(action(GEOMOp::OpSelectShell),    selectOnly, QtxPopupMgr::VisibleRule);
1619   mgr->setRule(action(GEOMOp::OpSelectShell),    selectOnly + " and selectionmode='SHELL'", QtxPopupMgr::ToggleRule);
1620   mgr->insert( action(GEOMOp::OpSelectSolid),    selectonlyId, -1);                                  //Solid
1621   mgr->setRule(action(GEOMOp::OpSelectSolid),    selectOnly, QtxPopupMgr::VisibleRule);
1622   mgr->setRule(action(GEOMOp::OpSelectSolid),    selectOnly + " and selectionmode='SOLID'", QtxPopupMgr::ToggleRule);
1623   mgr->insert( action(GEOMOp::OpSelectCompound), selectonlyId, -1);                                  //Compound
1624   mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly, QtxPopupMgr::VisibleRule);
1625   mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly + " and selectionmode='COMPOUND'", QtxPopupMgr::ToggleRule);
1626   mgr->insert( separator(), selectonlyId, -1);
1627   mgr->insert( action(GEOMOp::OpSelectAll),      selectonlyId, -1);                                  //Clear selection filter
1628   mgr->setRule(action(GEOMOp::OpSelectAll),      selectOnly, QtxPopupMgr::VisibleRule);
1629   mgr->setRule(action(GEOMOp::OpSelectAll),      selectOnly + " and selectionmode='ALL'", QtxPopupMgr::ToggleRule);
1630   mgr->insert( action(GEOMOp::OpShowOnly ), -1, -1 ); // display only
1631   mgr->setRule(action(GEOMOp::OpShowOnly ), rule.arg( types ).arg( "true" ), QtxPopupMgr::VisibleRule );
1632   mgr->insert( action(GEOMOp::OpShowOnlyChildren ), -1, -1 ); // display only children
1633   mgr->setRule(action(GEOMOp::OpShowOnlyChildren ), (canDisplay + "and ($type in {%1}) and client='ObjectBrowser' and hasChildren=true").arg( types ), QtxPopupMgr::VisibleRule );
1634
1635   QString aDimensionRule = "($component={'GEOM'}) and selcount=1 and isVisible and type='Shape' and %1";
1636
1637   mgr->insert( separator(), -1, -1 ); // -----------
1638   mgr->insert( action( GEOMOp::OpShowAllDimensions ), -1, -1 ); // show all dimensions
1639   mgr->setRule( action( GEOMOp::OpShowAllDimensions ), aDimensionRule.arg( "hasHiddenDimensions" ), QtxPopupMgr::VisibleRule );
1640   mgr->insert( action( GEOMOp::OpHideAllDimensions ), -1, -1 ); // hide all dimensions
1641   mgr->setRule( action( GEOMOp::OpHideAllDimensions ), aDimensionRule.arg( "hasVisibleDimensions" ), QtxPopupMgr::VisibleRule );
1642
1643   mgr->insert( separator(), -1, -1 );     // -----------
1644   mgr->insert( action(  GEOMOp::OpUnpublishObject ), -1, -1 ); // Unpublish object
1645   mgr->setRule( action( GEOMOp::OpUnpublishObject ), QString("client='ObjectBrowser' and $type in {'Shape' 'Group' 'Field' 'FieldStep'} and selcount>0"), QtxPopupMgr::VisibleRule );
1646
1647   mgr->insert( action(  GEOMOp::OpPublishObject ), -1, -1 ); // Publish object
1648   mgr->setRule( action( GEOMOp::OpPublishObject ), QString("client='ObjectBrowser' and isComponent=true"), QtxPopupMgr::VisibleRule );
1649
1650   mgr->insert( action(  GEOMOp::OpReimport ), -1, -1 );  // delete
1651   mgr->setRule( action( GEOMOp::OpReimport ), QString("$imported in {'true'} and selcount>0"), QtxPopupMgr::VisibleRule );
1652
1653   mgr->insert( separator(), -1, -1 );     // -----------
1654   mgr->insert( action(  GEOMOp::OpCreateFolder ), -1, -1 ); // Create Folder
1655   mgr->setRule( action( GEOMOp::OpCreateFolder ), QString("client='ObjectBrowser' and $component={'GEOM'} and (isComponent=true or isFolder=true)"), QtxPopupMgr::VisibleRule );
1656
1657   mgr->insert( separator(), -1, -1 );     // -----------
1658   mgr->insert( action(  GEOMOp::OpSortChildren ), -1, -1 ); // Sort child items
1659   mgr->setRule( action( GEOMOp::OpSortChildren ), QString("client='ObjectBrowser' and $component={'GEOM'} and nbChildren>1"), QtxPopupMgr::VisibleRule );
1660
1661 #ifndef DISABLE_GRAPHICSVIEW
1662   mgr->insert( separator(), -1, -1 );     // -----------
1663   mgr->insert( action(  GEOMOp::OpShowDependencyTree ), -1, -1 ); // Show dependency tree
1664   mgr->setRule( action( GEOMOp::OpShowDependencyTree ), clientOCCorVTKorOB + " and selcount>0 and ($component={'GEOM'}) and type='Shape'", QtxPopupMgr::VisibleRule );
1665 #endif
1666
1667   mgr->insert( separator(), -1, -1 );     // -----------
1668   mgr->insert( action(  GEOMOp::OpReduceStudy ), -1, -1 ); // Reduce Study
1669   mgr->setRule( action( GEOMOp::OpReduceStudy ), clientOCCorVTKorOB + " and selcount>0 and ($component={'GEOM'}) and type='Shape'", QtxPopupMgr::VisibleRule );
1670
1671   mgr->hide( mgr->actionId( action( myEraseAll ) ) );
1672
1673   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1674   if (resMgr) {
1675     GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)resMgr->integerValue("Geometry", "toplevel_dm", 0));
1676     QColor c = resMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) );
1677     GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c));
1678   }
1679
1680   // create plugin actions and menus
1681   addPluginActions();
1682 }
1683
1684 //=======================================================================
1685 // function : GeometryGUI::addPluginActions()
1686 // purpose  :
1687 //=======================================================================
1688 void GeometryGUI::addPluginActions()
1689 {
1690   // Resource manager
1691   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1692   if (!resMgr) return;
1693
1694   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
1695   if (!appStudy) return;
1696
1697   // Find names of a resource XML files ("AdvancedGEOM.xml" and others);
1698
1699   GEOMUtils::PluginInfo plugins = GEOMUtils::ReadPluginInfo();
1700
1701   int id = GEOMOp::OpLastOperationID; // TODO?
1702
1703   // loop on plugins
1704   GEOMUtils::PluginInfo::const_iterator it;
1705   for ( it = plugins.begin(); it != plugins.end(); ++it ) {
1706     // bind action lib and label to its ID for activateOperation() method proper work
1707     GEOMUtils::PluginData pdata = (*it);
1708     myPluginLibs[pdata.name.c_str()] = pdata.clientLib.c_str();
1709     std::list<GEOMUtils::ActionData> actions = (*it).actions;
1710     std::list<GEOMUtils::ActionData>::const_iterator ait;
1711     for ( ait = actions.begin(); ait != actions.end(); ++ait ) {
1712       GEOMUtils::ActionData adata = (*ait);
1713       // icon
1714       QPixmap icon;
1715       if ( !adata.icon.empty() )
1716         icon = resMgr->loadPixmap( pdata.name.c_str(), adata.icon.c_str() );
1717       // menu text (path)
1718       QStringList smenus = QString( adata.menuText.c_str() ).split( "/" );
1719       QString actionName = smenus.last();
1720       actionName = actionName.toUpper().prepend( "MEN_" );
1721       smenus.removeLast();
1722
1723       // path to action in toolbar
1724       QStringList stools = QString( adata.toolTip.c_str() ).split( "/" );
1725       QString actionTool = stools.last();
1726       actionTool = actionTool.toUpper().prepend( "TOP_" );
1727       stools.removeLast();
1728       
1729       QString actionStat = adata.statusText.c_str();
1730       actionStat = actionStat.toUpper().prepend( "STB_" );
1731
1732       createAction( id, // ~ adata.label
1733                     tr( actionTool.toLatin1().constData() ),
1734                     icon,
1735                     tr( actionName.toLatin1().constData() ),
1736                     tr( actionStat.toLatin1().constData() ),
1737                     QKeySequence( tr( adata.accel.c_str() ) ),
1738                     application()->desktop(),
1739                     false /*toggle*/,
1740                     this, SLOT( OnGUIEvent() ),
1741                     QString() /*shortcutAction*/ );
1742       
1743       int menuId = -1;
1744       foreach ( QString subMenu, smenus ) {
1745         QStringList subMenuList = subMenu.split( ":" );
1746         QString subMenuName = subMenuList[0].toUpper().prepend( "MEN_" );
1747         int subMenuGroup = subMenuList.size() > 1 ? subMenuList[1].toInt() : -1;
1748         menuId = createMenu( tr( subMenuName.toLatin1().constData() ), menuId, -1, subMenuGroup );
1749       }
1750       createMenu( id, menuId, -1 );
1751       
1752       if ( !stools.isEmpty() ) {
1753         QString subTool = stools[0];
1754         subTool = subTool.toUpper().prepend( "TOOL_" );
1755         int toolId = createTool( tr( subTool.toLatin1().constData() ) );
1756         createTool(id, toolId);
1757       }
1758
1759       // add action id to map
1760       PluginAction anAction( pdata.clientLib.c_str(), adata.label.c_str() );
1761       myPluginActions[id] = anAction;
1762       
1763       id++;
1764     }
1765   }
1766 }
1767
1768 //=======================================================================
1769 // function : GeometryGUI::activateModule()
1770 // purpose  : Called when GEOM module is activated
1771 //=======================================================================
1772 bool GeometryGUI::activateModule( SUIT_Study* study )
1773 {
1774   if ( CORBA::is_nil( myComponentGeom ) )
1775     return false;
1776
1777   bool res = SalomeApp_Module::activateModule( study );
1778
1779   if ( !res )
1780     return false;
1781   setMenuShown( true );
1782   setToolShown( true );
1783
1784   // import Python module that manages GEOM plugins (need to be here because SalomePyQt API uses active module)
1785   PyGILState_STATE gstate = PyGILState_Ensure();
1786   PyObject* pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
1787   if ( !pluginsmanager ) {
1788     PyErr_Print();
1789   }
1790   else {
1791     PyObject* result =
1792       PyObject_CallMethod(pluginsmanager, (char*)"initialize", (char*)"isss", 1, "geom",
1793                           tr("MEN_NEW_ENTITY").toUtf8().data(),
1794                           tr("GEOM_PLUGINS_OTHER").toUtf8().data());
1795     if ( !result )
1796       PyErr_Print();
1797     Py_XDECREF(result);
1798   }
1799   PyGILState_Release(gstate);
1800   // end of GEOM plugins loading
1801
1802   connect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1803           this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1804
1805   // Reset actions accelerator keys
1806   action(GEOMOp::OpDelete)->setEnabled( true ); // Delete: Key_Delete
1807
1808   GUIMap::Iterator it;
1809   for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1810     it.value()->activate( application()->desktop() );
1811
1812   LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1813
1814   connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
1815   connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( onAutoBringToFront() ));
1816   connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
1817
1818   if ( !myCreationInfoWdg )
1819     myCreationInfoWdg = new GEOMGUI_CreationInfoWdg( getApp() );
1820   getApp()->insertDockWindow( myCreationInfoWdg->getWinID(), myCreationInfoWdg );
1821   getApp()->placeDockWindow( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
1822
1823   if ( !myTextTreeWdg )
1824     myTextTreeWdg = new GEOMGUI_TextTreeWdg( getApp() );
1825   getApp()->insertDockWindow( myTextTreeWdg->getWinID(), myTextTreeWdg );
1826   getApp()->placeDockWindow( myTextTreeWdg->getWinID(), Qt::LeftDockWidgetArea );
1827
1828   //NPAL 19674
1829   SALOME_ListIO selected;
1830   sm->selectedObjects( selected );
1831   sm->clearSelected();
1832
1833   SUIT_ViewManager* vm;
1834   ViewManagerList OCCViewManagers, VTKViewManagers;
1835
1836   application()->viewManagers( OCCViewer_Viewer::Type(), OCCViewManagers );
1837   QListIterator<SUIT_ViewManager*> itOCC( OCCViewManagers );
1838   while ( itOCC.hasNext() && (vm = itOCC.next()) )
1839     onViewManagerAdded(vm);
1840
1841   application()->viewManagers( SVTK_Viewer::Type(), VTKViewManagers );
1842   QListIterator<SUIT_ViewManager*> itVTK( VTKViewManagers );
1843   while ( itVTK.hasNext() && (vm = itVTK.next()) )
1844     onViewManagerAdded(vm);
1845
1846   sm->setSelectedObjects( selected, true );   //NPAL 19674
1847
1848   QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1849   if ( viewMenu )
1850     connect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1851
1852   // 0020836 (Basic vectors and origin)
1853   SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
1854   if ( aResourceMgr->booleanValue( "Geometry", "auto_create_base_objects", false ) ) {
1855     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
1856     if ( appStudy ) {
1857       _PTR(Study) studyDS = appStudy->studyDS();
1858       if ( studyDS ) {
1859         _PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
1860         if ( !aSComponent ) // create objects automatically only if there is no GEOM component
1861           createOriginAndBaseVectors();
1862       }
1863     }
1864   }
1865
1866   Py_XDECREF(pluginsmanager);
1867   return true;
1868 }
1869
1870 //=======================================================================
1871 // function : GeometryGUI::deactivateModule()
1872 // purpose  : Called when GEOM module is deactivated
1873 //=======================================================================
1874 bool GeometryGUI::deactivateModule( SUIT_Study* study )
1875 {
1876   QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1877   if ( viewMenu )
1878     disconnect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1879
1880   setMenuShown( false );
1881   setToolShown( false );
1882
1883   disconnect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1884              this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1885
1886   LightApp_SelectionMgr* selMrg = getApp()->selectionMgr();
1887
1888   disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
1889   disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
1890   if ( myCreationInfoWdg ) {
1891     getApp()->removeDockWindow( myCreationInfoWdg->getWinID() );
1892     myCreationInfoWdg = 0;
1893   }
1894   if ( myTextTreeWdg ) {
1895     getApp()->removeDockWindow( myTextTreeWdg->getWinID() );
1896     disconnect( application(), 0, myTextTreeWdg, 0 );
1897     myTextTreeWdg = 0;
1898   }
1899
1900   EmitSignalCloseAllDialogs();
1901
1902   GUIMap::Iterator it;
1903   for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1904     it.value()->deactivate();
1905
1906   // Unset actions accelerator keys
1907   action(GEOMOp::OpDelete)->setEnabled( false ); // Delete: Key_Delete
1908
1909   qDeleteAll(myOCCSelectors);
1910   myOCCSelectors.clear();
1911   selMrg->setEnabled( true, OCCViewer_Viewer::Type() );
1912
1913   qDeleteAll(myVTKSelectors);
1914   myVTKSelectors.clear();
1915   selMrg->setEnabled( true, SVTK_Viewer::Type() );
1916
1917   return SalomeApp_Module::deactivateModule( study );
1918 }
1919
1920 //=======================================================================
1921 // function : onWindowActivated()
1922 // purpose  : update menu items' status - disable non-OCC-viewer-compatible actions
1923 //=======================================================================
1924 void GeometryGUI::onWindowActivated( SUIT_ViewWindow* win )
1925 {
1926   if ( !win )
1927     return;
1928
1929   const bool ViewOCC = ( win->getViewManager() ? win->getViewManager()->getType() == OCCViewer_Viewer::Type() : false );
1930   //const bool ViewVTK = ( win->getViewManager() ? win->getViewManager()->getType() == SVTK_Viewer::Type() : false );
1931
1932   // disable non-OCC viewframe menu commands
1933 //  action( GEOMOp::Op2dSketcher )->setEnabled( ViewOCC ); // SKETCHER
1934   action( GEOMOp::OpSuppressFaces )->setEnabled( ViewOCC ); // SuppressFace
1935   action( GEOMOp::OpSuppressHoles )->setEnabled( ViewOCC ); // SuppressHole
1936   action( GEOMOp::OpCloseContour )->setEnabled( ViewOCC ); // CloseContour
1937   action( GEOMOp::OpRemoveIntWires )->setEnabled( ViewOCC ); // RemoveInternalWires
1938   action( GEOMOp::OpAddPointOnEdge )->setEnabled( ViewOCC ); // AddPointOnEdge
1939 //  action( GEOMOp::OpFreeBoundaries )->setEnabled( ViewOCC ); // Free boundaries
1940
1941   action( GEOMOp::OpGroupCreate )->setEnabled( ViewOCC ); // Create Group
1942   action( GEOMOp::OpGroupEdit )->setEnabled( ViewOCC ); // Edit Group
1943   action( GEOMOp::OpCreateField )->setEnabled( ViewOCC ); // Create Field
1944   action( GEOMOp::OpEditField )->setEnabled( ViewOCC ); // Edit Field
1945
1946   action( GEOMOp::OpMultiTransform )->setEnabled( ViewOCC ); // MENU BLOCKS - MULTI-TRANSFORMATION
1947 }
1948
1949 void GeometryGUI::windows( QMap<int, int>& mappa ) const
1950 {
1951   mappa.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
1952   mappa.insert( SalomeApp_Application::WT_NoteBook, Qt::LeftDockWidgetArea );
1953 #ifndef DISABLE_PYCONSOLE
1954   mappa.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
1955 #endif
1956   if ( myCreationInfoWdg )
1957     mappa.insert( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
1958   if ( myTextTreeWdg )
1959     mappa.insert( myTextTreeWdg->getWinID(), Qt::LeftDockWidgetArea );
1960 }
1961
1962 void GeometryGUI::viewManagers( QStringList& lst ) const
1963 {
1964   lst.append( OCCViewer_Viewer::Type() );
1965 }
1966
1967 void GeometryGUI::onViewManagerAdded( SUIT_ViewManager* vm )
1968 {
1969   if ( vm && vm->getType() == OCCViewer_Viewer::Type() )
1970   {
1971     qDebug( "connect" );
1972     connect( vm, SIGNAL( keyPress  ( SUIT_ViewWindow*, QKeyEvent* ) ),
1973              this, SLOT( OnKeyPress( SUIT_ViewWindow*, QKeyEvent* ) ) );
1974     connect( vm, SIGNAL( mousePress( SUIT_ViewWindow*, QMouseEvent* ) ),
1975              this, SLOT( OnMousePress( SUIT_ViewWindow*, QMouseEvent* ) ) );
1976     connect( vm, SIGNAL( mouseMove ( SUIT_ViewWindow*, QMouseEvent* ) ),
1977              this, SLOT( OnMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) );
1978     connect( vm, SIGNAL( mouseRelease ( SUIT_ViewWindow*, QMouseEvent* ) ),
1979              this, SLOT( OnMouseRelease( SUIT_ViewWindow*, QMouseEvent* ) ) );
1980
1981     LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1982     myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
1983
1984     // disable OCC selectors
1985     getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
1986     QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1987     while ( itOCCSel.hasNext() )
1988       if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1989         sr->setEnabled(true);
1990   }
1991   else if ( vm->getType() == SVTK_Viewer::Type() )
1992   {
1993     LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1994     myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
1995
1996     // disable VTK selectors
1997     getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
1998     QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1999     while ( itVTKSel.hasNext() )
2000       if ( LightApp_VTKSelector* sr = itVTKSel.next() )
2001         sr->setEnabled(true);
2002   }
2003 }
2004
2005 void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm )
2006 {
2007   SUIT_ViewModel* viewer = vm->getViewModel();
2008   if ( vm->getType() == OCCViewer_Viewer::Type() )
2009   {
2010     QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
2011     while ( itOCCSel.hasNext() )
2012       if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
2013         if ( sr->viewer() == viewer )
2014         {
2015           /*delete*/ myOCCSelectors.takeAt( myOCCSelectors.indexOf( sr ) );
2016           break;
2017         }
2018   }
2019   if ( vm->getType() == SVTK_Viewer::Type() )
2020   {
2021     QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
2022     while ( itVTKSel.hasNext() )
2023       if ( LightApp_VTKSelector* sr = itVTKSel.next() )
2024         if ( sr->viewer() == viewer )
2025         {
2026           /*delete*/ myVTKSelectors.takeAt( myVTKSelectors.indexOf( sr ) );
2027           break;
2028         }
2029   }
2030 }
2031
2032 //================================================================================
2033 /*!
2034  * \brief Slot called when selection changed. Shows creation info of a selected object
2035  */
2036 //================================================================================
2037
2038 void GeometryGUI::updateCreationInfo()
2039 {
2040   if ( myCreationInfoWdg )
2041     myCreationInfoWdg->clear();
2042
2043   // Code below is commented to have myCreationInfoWdg filled as soon as it is shown again
2044   // if ( !myCreationInfoWdg->isVisible() )
2045   //   return;
2046
2047   // look for a sole selected GEOM_Object
2048   GEOM::GEOM_BaseObject_var geomObj;
2049
2050   SALOME_ListIO selected;
2051   getApp()->selectionMgr()->selectedObjects( selected );
2052
2053   _PTR(Study) study = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() )->studyDS();
2054   SALOME_ListIteratorOfListIO selIt( selected );
2055   for ( ; selIt.More(); selIt.Next() )
2056   {
2057     Handle(SALOME_InteractiveObject) io = selIt.Value();
2058     if ( !io->hasEntry() ) continue;
2059     _PTR(SObject) sobj = study->FindObjectID( io->getEntry() );
2060     if ( !sobj ) continue;
2061     CORBA::Object_var          obj = GeometryGUI::ClientSObjectToObject( sobj );
2062     GEOM::GEOM_BaseObject_var gobj = GEOM::GEOM_BaseObject::_narrow( obj );
2063     if ( !gobj->_is_nil() )
2064     {
2065       if ( !geomObj->_is_nil() )
2066         return; // several GEOM objects selected
2067       geomObj = gobj;
2068     }
2069   }
2070   if ( geomObj->_is_nil() ) return;
2071
2072   // pass creation info of geomObj to myCreationInfoWdg
2073
2074   if ( myCreationInfoWdg ) {
2075
2076     GEOM::CreationInformationSeq_var info;
2077     try {
2078       OCC_CATCH_SIGNALS;
2079       info = geomObj->GetCreationInformation();
2080     }
2081     catch (...) {
2082     }
2083     myCreationInfoWdg->setInfo( info );
2084   }
2085 }
2086
2087 void GeometryGUI::onAutoBringToFront()
2088 {
2089   bool isAutoBringToFront = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "auto_bring_to_front", "false" );
2090   if( !isAutoBringToFront )
2091     return;
2092   
2093   SUIT_ViewWindow* SUIT_window = application()->desktop()->activeWindow();
2094   if ( !SUIT_window || SUIT_window->getViewManager()->getType() != OCCViewer_Viewer::Type() )
2095         return;
2096
2097   SalomeApp_Study* appStudy = dynamic_cast< SalomeApp_Study* >( getApp()->activeStudy() );
2098   if (!appStudy) return;
2099
2100   GEOM_Displayer displayer( appStudy );
2101   
2102   SALOME_View* window = displayer.GetActiveView();
2103   if ( !window ) return;
2104   
2105   int aMgrId = dynamic_cast< SUIT_ViewModel* >( window )->getViewManager()->getGlobalId();
2106   
2107   SALOME_ListIO selected;
2108   getApp()->selectionMgr()->selectedObjects( selected );
2109   if (!myTopLevelIOList.IsEmpty())
2110   {
2111     for( SALOME_ListIteratorOfListIO It( myTopLevelIOList ); It.More(); It.Next() )
2112     {
2113       Handle( SALOME_InteractiveObject ) io = It.Value();
2114       bool isSelected = false;
2115       for( SALOME_ListIteratorOfListIO It_sel( selected ); It_sel.More(); It_sel.Next() )
2116       {
2117         Handle( SALOME_InteractiveObject ) sel_io = It_sel.Value();
2118         if( io->isSame( sel_io ) )
2119           isSelected = true;
2120       }
2121       if (!isSelected && appStudy->findObjectByEntry(io->getEntry()))
2122       {
2123         appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), false );
2124         if ( window->isVisible( io ) ) displayer.Redisplay( io, false );     
2125       }
2126     }
2127   }
2128   
2129   myTopLevelIOList.Assign(selected);
2130   for( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() )
2131   {
2132     Handle( SALOME_InteractiveObject ) io = It.Value();
2133     appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), true );
2134     if ( window->isVisible( io ) ) displayer.Redisplay( io, false );     
2135   }
2136     
2137   displayer.UpdateViewer();
2138   GeometryGUI::Modified();
2139 }
2140
2141 void GeometryGUI::updateFieldColorScale()
2142 {
2143   if( SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) )
2144   {
2145     GEOM_Displayer aDisplayer( aStudy );
2146     aDisplayer.UpdateColorScale();
2147   }
2148 }
2149
2150 QString GeometryGUI::engineIOR() const
2151 {
2152   if ( !CORBA::is_nil( GetGeomGen() ) )
2153     return QString( getApp()->orb()->object_to_string( GetGeomGen() ) );
2154   return "";
2155 }
2156
2157 Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture
2158       (SalomeApp_Study* theStudy, int theId, int& theWidth, int& theHeight)
2159 {
2160   theWidth = theHeight = 0;
2161
2162   Handle(TColStd_HArray1OfByte) aTexture;
2163
2164   if (theStudy) {
2165     TextureMap aTextureMap = myTextureMap[ theStudy->studyDS()->StudyId() ];
2166     aTexture = aTextureMap[ theId ];
2167     if ( aTexture.IsNull() ) {
2168       GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGen()->GetIInsertOperations( theStudy->studyDS()->StudyId() );
2169       if ( !aInsOp->_is_nil() ) {
2170         CORBA::Long aWidth, aHeight;
2171         SALOMEDS::TMPFile_var aStream = aInsOp->GetTexture( theId, aWidth, aHeight );
2172         if ( aWidth > 0 && aHeight > 0 && aStream->length() > 0 ) {
2173           theWidth  = aWidth;
2174           theHeight = aHeight;
2175
2176           aTexture  = new TColStd_HArray1OfByte (1, aStream->length());
2177
2178           for (int i = 0; i < aStream->length(); i++)
2179             aTexture->SetValue( i+1, (Standard_Byte)aStream[i] );
2180           aTextureMap[ theId ] = aTexture;
2181         }
2182       }
2183     }
2184   }
2185   return aTexture;
2186 }
2187
2188 LightApp_Selection* GeometryGUI::createSelection() const
2189 {
2190   return new GEOMGUI_Selection();
2191 }
2192
2193 void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
2194 {
2195   SalomeApp_Module::contextMenuPopup( client, menu, title );
2196   SALOME_ListIO lst;
2197   getApp()->selectionMgr()->selectedObjects( lst );
2198
2199   //Add submenu for predefined materials
2200   bool isPredefMat = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "predef_materials" );
2201   if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() > 0 ) {
2202     QtxPopupMgr* mgr = popupMgr();
2203     //get parrent for submenu
2204     QAction* act = mgr->action( mgr->actionId( action(  GEOMOp::OpMaterialProperties ) ) );
2205     //Clear old  menu
2206     QMenu* oldMenu = act->menu() ;
2207     if( oldMenu ) {
2208       delete oldMenu;
2209     }
2210     if( isPredefMat ){
2211       QMenu* matMenu = new QMenu();
2212       QSignalMapper* signalMapper = new QSignalMapper( matMenu );
2213
2214       //Get current material model for the object
2215       QVariant v;
2216       LightApp_Application* anApp = dynamic_cast<LightApp_Application*>( getApp() );
2217       if ( anApp && anApp->activeViewManager() ) {
2218         LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( anApp->activeStudy() );
2219         if( aStudy ) {
2220           v = aStudy->getObjectProperty( anApp->activeViewManager()->getGlobalId(), lst.Last()->getEntry(), GEOM::propertyName( GEOM::Material ), QVariant() );
2221         }
2222       }
2223       QString curModel = "";
2224       if ( v.canConvert<QString>() ) curModel = v.toString();
2225       // get list of all predefined materials
2226       QStringList materials = Material_ResourceMgr::resourceMgr()->materials();
2227       bool found = false;
2228       foreach ( QString material, materials )
2229       {
2230         QAction* menAct = matMenu->addAction( material );
2231         connect(menAct, SIGNAL( toggled( bool ) ), signalMapper, SLOT( map() ) );
2232         signalMapper->setMapping( menAct, material );
2233         menAct->setCheckable( true );
2234         // Set checked if this material is current
2235         Material_Model aModel;
2236         aModel.fromResources( material );
2237         if ( !found && aModel.toProperties() == curModel ) {
2238           menAct->setChecked( true );
2239           found = true;
2240         }
2241       }
2242       matMenu->insertAction( matMenu->addSeparator(), action(  GEOMOp::OpPredefMaterCustom ) );
2243       matMenu->insertSeparator( action(  GEOMOp::OpPredefMaterCustom ) );
2244       connect( signalMapper, SIGNAL( mapped( const QString & ) ),
2245                  this, SLOT( OnSetMaterial( const QString & ) ) );
2246       act->setMenu( matMenu );
2247     }
2248   }
2249   //Set name
2250   if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() == 1 ) {
2251     Handle(SALOME_InteractiveObject) io = lst.First();
2252     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
2253     _PTR(Study) study = appStudy->studyDS();
2254     _PTR(SObject) obj = study->FindObjectID( io->getEntry() );
2255     if ( obj ) {
2256       QString aName = QString( obj->GetName().c_str() );
2257       aName.remove( QRegExp("\\s+$") );
2258       title = aName;
2259     }
2260   }
2261 }
2262
2263 void GeometryGUI::OnSetMaterial(const QString& theName)
2264 {
2265   OnGUIEvent( GEOMOp::OpPredefMaterial, QVariant( theName ) );
2266 }
2267
2268
2269 void GeometryGUI::createPreferences()
2270 {
2271   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
2272
2273   int tabId = addPreference( tr( "PREF_TAB_SETTINGS" ) );
2274
2275   int genGroup = addPreference( tr( "PREF_GROUP_GENERAL" ), tabId );
2276   setPreferenceProperty( genGroup, "columns", 2 );
2277
2278   int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), genGroup,
2279                                 LightApp_Preferences::Selector,
2280                                 "Geometry", "display_mode" );
2281
2282   addPreference( tr( "PREF_SHADING_COLOR" ), genGroup,
2283                  LightApp_Preferences::Color, "Geometry", "shading_color" );
2284
2285   addPreference( tr( "PREF_EDGES_IN_SHADING" ), genGroup,
2286                  LightApp_Preferences::Color, "Geometry", "edges_in_shading_color" );
2287
2288   addPreference( tr( "PREF_WIREFRAME_COLOR" ), genGroup,
2289                  LightApp_Preferences::Color, "Geometry", "wireframe_color" );
2290
2291   addPreference( tr( "PREF_FREE_BOUND_COLOR" ), genGroup,
2292                  LightApp_Preferences::Color, "Geometry", "free_bound_color" );
2293
2294   addPreference( tr( "PREF_LINE_COLOR"), genGroup,
2295                  LightApp_Preferences::Color, "Geometry", "line_color" );
2296
2297   addPreference( tr( "PREF_POINT_COLOR"), genGroup,
2298                  LightApp_Preferences::Color, "Geometry", "point_color" );
2299
2300   addPreference( tr( "PREF_ISOS_COLOR" ), genGroup,
2301                  LightApp_Preferences::Color, "Geometry", "isos_color" );
2302
2303   addPreference( tr( "PREF_LABEL_COLOR" ), genGroup,
2304                  LightApp_Preferences::Color, "Geometry", "label_color" );
2305
2306   addPreference( "", genGroup, LightApp_Preferences::Space );
2307
2308   addPreference( tr( "PREF_TOPLEVEL_COLOR" ), genGroup,
2309                  LightApp_Preferences::Color, "Geometry", "toplevel_color" );
2310
2311   int top_lev_dm = addPreference( tr( "PREF_TOPLEVEL_DM" ), genGroup,
2312                       LightApp_Preferences::Selector, "Geometry", "toplevel_dm" );
2313
2314   int transparency = addPreference( tr( "PREF_TRANSPARENCY" ), genGroup,
2315                                     LightApp_Preferences::IntSpin, "Geometry", "transparency" );
2316
2317   int defl = addPreference( tr( "PREF_DEFLECTION" ), genGroup,
2318                             LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" );
2319
2320   addPreference( tr( "PREF_PREDEF_MATERIALS" ), genGroup,
2321                  LightApp_Preferences::Bool, "Geometry", "predef_materials" );
2322
2323   int material = addPreference( tr( "PREF_MATERIAL" ), genGroup,
2324                                 LightApp_Preferences::Selector,
2325                                 "Geometry", "material" );
2326
2327   addPreference( tr( "PREF_EDITGROUP_COLOR" ), genGroup,
2328                  LightApp_Preferences::Color, "Geometry", "editgroup_color" );
2329
2330   const int nb = 4;
2331   int wd[nb];
2332   int iter=0;
2333
2334   wd[iter++] = addPreference( tr( "PREF_EDGE_WIDTH" ), genGroup,
2335                               LightApp_Preferences::IntSpin, "Geometry", "edge_width" );
2336
2337   wd[iter++] = addPreference( tr( "PREF_ISOLINES_WIDTH" ), genGroup,
2338                               LightApp_Preferences::IntSpin, "Geometry", "isolines_width" );
2339
2340   wd[iter++] = addPreference( tr( "PREF_PREVIEW_EDGE_WIDTH" ), genGroup,
2341                                      LightApp_Preferences::IntSpin, "Geometry", "preview_edge_width" );
2342
2343   wd[iter++] = addPreference( tr( "PREF_MEASURES_LINE_WIDTH" ), genGroup,
2344                               LightApp_Preferences::IntSpin, "Geometry", "measures_line_width" );
2345
2346   for (int i = 0; i < nb; i++) {
2347     setPreferenceProperty( wd[i], "min", 1 );
2348     setPreferenceProperty( wd[i], "max", 5 );
2349   }
2350
2351   int step = addPreference( tr( "PREF_STEP_VALUE" ), genGroup,
2352                             LightApp_Preferences::IntSpin, "Geometry", "SettingsGeomStep" );
2353
2354   addPreference( tr( "PREF_AUTO_BRING_TO_FRONT" ), genGroup,
2355                  LightApp_Preferences::Bool, "Geometry", "auto_bring_to_front" );
2356
2357   int aDimGroupId = addPreference( tr( "PREF_DIMENSIONS" ), tabId );
2358   setPreferenceProperty( aDimGroupId, "columns", 2 );
2359
2360   addPreference( tr( "PREF_DIMENSIONS_COLOR" ), aDimGroupId,
2361                  LightApp_Preferences::Color, "Geometry", "dimensions_color" );
2362
2363   int aDimLineWidthId = addPreference( tr( "PREF_DIMENSIONS_LINE_WIDTH" ), aDimGroupId, 
2364                                        LightApp_Preferences::IntSpin, "Geometry", "dimensions_line_width" );
2365
2366   setPreferenceProperty( aDimLineWidthId, "min", 1 );
2367   setPreferenceProperty( aDimLineWidthId, "max", 5 );
2368
2369   int aDimFontId = addPreference( tr( "PREF_DIMENSIONS_FONT" ), aDimGroupId, LightApp_Preferences::Font, "Geometry", "dimensions_font" );
2370
2371   int f = QtxFontEdit::Family | QtxFontEdit::Size;
2372   setPreferenceProperty( aDimFontId, "features", f );
2373   setPreferenceProperty( aDimFontId, "mode", QtxFontEdit::Custom );
2374
2375   Handle(Font_FontMgr) fmgr = Font_FontMgr::GetInstance();
2376   QString aFontFile = "";
2377   resMgr->value("resources", "GEOM", aFontFile);
2378   aFontFile = aFontFile + QDir::separator() + "Y14.5M-2009.ttf";
2379   // add enginier font into combobox
2380   int fontID = QFontDatabase::addApplicationFont( aFontFile );
2381   Handle(Font_SystemFont) sf = new Font_SystemFont( 
2382     new TCollection_HAsciiString("Y14.5M-2009"), 
2383     Font_FA_Regular, 
2384     new TCollection_HAsciiString(aFontFile.toLatin1().data()) );
2385   // register font in OCC font manager
2386   fmgr->RegisterFont( sf, Standard_False );
2387
2388   // get list of supported fonts by OCC
2389   QStringList anOCCFonts;
2390   TColStd_SequenceOfHAsciiString theFontsNames;
2391   fmgr->GetAvailableFontsNames( theFontsNames );
2392   for(Standard_Integer i=1; i<=theFontsNames.Length(); i++) {
2393     Handle(TCollection_HAsciiString) str = theFontsNames(i);
2394     anOCCFonts << str->ToCString();
2395   }
2396   anOCCFonts.removeDuplicates();
2397   // set the supported fonts into combobox to use its only
2398   setPreferenceProperty( aDimFontId, "fonts", anOCCFonts );
2399
2400   int aDimArrLengthId = addPreference( tr( "PREF_DIMENSIONS_ARROW_LENGTH" ), aDimGroupId,
2401                                        LightApp_Preferences::DblSpin, "Geometry", "dimensions_arrow_length" );
2402
2403   setPreferenceProperty( aDimArrLengthId, "min", 1e-9 );
2404   setPreferenceProperty( aDimArrLengthId, "max", 1e+9 );
2405   setPreferenceProperty( aDimArrLengthId, "precision", 9 );
2406
2407   int aLengthUnitsId = addPreference( tr( "PREF_DIMENSIONS_LENGTH_UNITS" ), aDimGroupId,
2408                                       LightApp_Preferences::Selector, "Geometry", "dimensions_length_units" );
2409
2410   int anAngUnitsId = addPreference( tr( "PREF_DIMENSIONS_ANGLE_UNITS" ), aDimGroupId,
2411                                    LightApp_Preferences::Selector, "Geometry", "dimensions_angle_units" );
2412
2413   QStringList aListOfLengthUnits;
2414   aListOfLengthUnits << "m";
2415   aListOfLengthUnits << "cm";
2416   aListOfLengthUnits << "mm";
2417   aListOfLengthUnits << "in.";
2418   aListOfLengthUnits << "ft.";
2419
2420   QStringList aListOfAngUnits;
2421   aListOfAngUnits << "rad";
2422   aListOfAngUnits << "deg";
2423
2424   setPreferenceProperty( aLengthUnitsId, "strings", aListOfLengthUnits );
2425   setPreferenceProperty( anAngUnitsId,   "strings", aListOfAngUnits );
2426
2427   addPreference( tr( "PREF_DIMENSIONS_SHOW_UNITS" ), aDimGroupId,
2428                  LightApp_Preferences::Bool, "Geometry", "dimensions_show_units" );
2429
2430   int aDimDefFlyout = addPreference( tr( "PREF_DIMENSIONS_DEFAULT_FLYOUT" ), aDimGroupId,
2431                                      LightApp_Preferences::DblSpin, "Geometry", "dimensions_default_flyout" );
2432
2433   setPreferenceProperty( aDimDefFlyout, "min", 1e-9 );
2434   setPreferenceProperty( aDimDefFlyout, "max", 1e+9 );
2435   setPreferenceProperty( aDimDefFlyout, "precision", 9 );
2436
2437   addPreference( tr( "PREF_DIMENSIONS_USE_TEXT3D" ), aDimGroupId,
2438                  LightApp_Preferences::Bool, "Geometry", "dimensions_use_text3d" );
2439
2440   int isoGroup = addPreference( tr( "PREF_ISOS" ), tabId );
2441   setPreferenceProperty( isoGroup, "columns", 2 );
2442   int isoU = addPreference( tr( "PREF_ISOS_U" ), isoGroup,
2443                             LightApp_Preferences::IntSpin, "Geometry", "iso_number_u" );
2444   setPreferenceProperty( isoU, "min", 0 );
2445   setPreferenceProperty( isoU, "max", 100000 );
2446   int isoV = addPreference( tr( "PREF_ISOS_V" ), isoGroup,
2447                             LightApp_Preferences::IntSpin, "Geometry", "iso_number_v" );
2448   setPreferenceProperty( isoV, "min", 0 );
2449   setPreferenceProperty( isoV, "max", 100000 );
2450
2451   // Quantities with individual precision settings
2452   int precGroup = addPreference( tr( "GEOM_PREF_GROUP_PRECISION" ), tabId );
2453   setPreferenceProperty( precGroup, "columns", 2 );
2454
2455   const int nbQuantities = 8;
2456   int prec[nbQuantities], ii = 0;
2457   prec[ii++] = addPreference( tr( "GEOM_PREF_length_precision" ), precGroup,
2458                               LightApp_Preferences::IntSpin, "Geometry", "length_precision" );
2459   prec[ii++] = addPreference( tr( "GEOM_PREF_angle_precision" ), precGroup,
2460                               LightApp_Preferences::IntSpin, "Geometry", "angle_precision" );
2461   prec[ii++] = addPreference( tr( "GEOM_PREF_len_tol_precision" ), precGroup,
2462                               LightApp_Preferences::IntSpin, "Geometry", "len_tol_precision" );
2463   prec[ii++] = addPreference( tr( "GEOM_PREF_ang_tol_precision" ), precGroup,
2464                               LightApp_Preferences::IntSpin, "Geometry", "ang_tol_precision" );
2465   prec[ii++] = addPreference( tr( "GEOM_PREF_weight_precision" ), precGroup,
2466                               LightApp_Preferences::IntSpin, "Geometry", "weight_precision" );
2467   prec[ii++] = addPreference( tr( "GEOM_PREF_density_precision" ), precGroup,
2468                               LightApp_Preferences::IntSpin, "Geometry", "density_precision" );
2469   prec[ii++] = addPreference( tr( "GEOM_PREF_parametric_precision" ), precGroup,
2470                               LightApp_Preferences::IntSpin, "Geometry", "parametric_precision" );
2471   prec[ii  ] = addPreference( tr( "GEOM_PREF_param_tol_precision" ), precGroup,
2472                               LightApp_Preferences::IntSpin, "Geometry", "param_tol_precision" );
2473
2474   // Set property for precision value for spinboxes
2475   for ( ii = 0; ii < nbQuantities; ii++ ){
2476     setPreferenceProperty( prec[ii], "min", -14 );
2477     setPreferenceProperty( prec[ii], "max", 14 );
2478     setPreferenceProperty( prec[ii], "precision", 2 );
2479   }
2480
2481   int VertexGroup = addPreference( tr( "PREF_GROUP_VERTEX" ), tabId );
2482   setPreferenceProperty( VertexGroup, "columns", 2 );
2483
2484   int typeOfMarker = addPreference( tr( "PREF_TYPE_OF_MARKER" ), VertexGroup,
2485                                     LightApp_Preferences::Selector, "Geometry", "type_of_marker" );
2486
2487   int markerScale = addPreference( tr( "PREF_MARKER_SCALE" ), VertexGroup,
2488                                    LightApp_Preferences::Selector, "Geometry", "marker_scale" );
2489
2490   // Set property for default display mode
2491   QStringList aModesList;
2492   aModesList.append( tr("MEN_WIREFRAME") );
2493   aModesList.append( tr("MEN_SHADING") );
2494   aModesList.append( tr("MEN_SHADING_WITH_EDGES") );
2495   aModesList.append( tr("MEN_TEXTURE") );
2496
2497   QList<QVariant> anIndexesList;
2498   anIndexesList.append(0);
2499   anIndexesList.append(1);
2500   anIndexesList.append(2);
2501   anIndexesList.append(3);
2502
2503   setPreferenceProperty( dispmode, "strings", aModesList );
2504   setPreferenceProperty( dispmode, "indexes", anIndexesList );
2505
2506   // Set property for top level display mode
2507   QStringList aTopModesList;
2508   aTopModesList.append( tr("MEN_SHOW_ADD_WACTOR") );
2509   aTopModesList.append( tr("MEN_KEEP_CURRENT_DM") );
2510   aTopModesList.append( tr("MEN_WIREFRAME") );
2511   aTopModesList.append( tr("MEN_SHADING") );
2512   aTopModesList.append( tr("MEN_SHADING_WITH_EDGES") );
2513
2514   QList<QVariant> aTopIndexesList;
2515   aTopIndexesList.append(0);
2516   aTopIndexesList.append(1);
2517   aTopIndexesList.append(2);
2518   aTopIndexesList.append(3);
2519   aTopIndexesList.append(4);
2520
2521   setPreferenceProperty( top_lev_dm, "strings", aTopModesList );
2522   setPreferenceProperty( top_lev_dm, "indexes", aTopIndexesList );
2523
2524   // Set property for step value for spinboxes
2525   setPreferenceProperty( step, "min", 1 );
2526   setPreferenceProperty( step, "max", 10000 );
2527   setPreferenceProperty( step, "precision", 3 );
2528
2529   // Set property for trandparency value for spinboxes
2530   setPreferenceProperty( transparency, "min", 0 );
2531   setPreferenceProperty( transparency, "max", 100 );
2532
2533   // Set property for deflection value for spinboxes
2534   setPreferenceProperty( defl, "min", GEOM::minDeflection() );
2535   setPreferenceProperty( defl, "max", 1.0 );
2536   setPreferenceProperty( defl, "step", 1.0e-04 );
2537   setPreferenceProperty( defl, "precision", 6 );
2538
2539   // Set property for default material
2540   setPreferenceProperty( material, "strings", Material_ResourceMgr::resourceMgr()->materials() );
2541
2542   // Set property vertex marker type
2543   QList<QVariant> aMarkerTypeIndicesList;
2544   QList<QVariant> aMarkerTypeIconsList;
2545
2546   for ( int i = GEOM::MT_POINT; i < GEOM::MT_USER; i++ ) {
2547     QString icoFile = QString( "ICON_VERTEX_MARKER_%1" ).arg( i );
2548     QPixmap pixmap = resMgr->loadPixmap( "GEOM", tr( qPrintable( icoFile ) ) );
2549     aMarkerTypeIndicesList << (i-1);
2550     aMarkerTypeIconsList << pixmap;
2551   }
2552
2553   setPreferenceProperty( typeOfMarker, "indexes", aMarkerTypeIndicesList );
2554   setPreferenceProperty( typeOfMarker, "icons",   aMarkerTypeIconsList );
2555
2556   // Set property for vertex marker scale
2557   QList<QVariant> aMarkerScaleIndicesList;
2558   QStringList     aMarkerScaleValuesList;
2559
2560   for ( int iii = GEOM::MS_10; iii <= GEOM::MS_70; iii++ ) {
2561     aMarkerScaleIndicesList << iii;
2562     aMarkerScaleValuesList  << QString::number( (iii-(int)GEOM::MS_10)*0.5 + 1.0 );
2563   }
2564
2565   setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList );
2566   setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
2567
2568   // Scalar bar for field step presentation
2569   int scalarBarGroup = addPreference( tr( "PREF_GROUP_SCALAR_BAR" ), tabId );
2570   setPreferenceProperty( scalarBarGroup, "columns", 2 );
2571
2572   int sbXPosition = addPreference( tr( "PREF_SCALAR_BAR_X_POSITION" ), scalarBarGroup,
2573                                    LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_x_position" );
2574   setPreferenceProperty( sbXPosition, "min", 0 );
2575   setPreferenceProperty( sbXPosition, "max", 1 );
2576   setPreferenceProperty( sbXPosition, "step", 0.05 );
2577
2578   int sbYPosition = addPreference( tr( "PREF_SCALAR_BAR_Y_POSITION" ), scalarBarGroup,
2579                                    LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_y_position" );
2580   setPreferenceProperty( sbYPosition, "min", 0 );
2581   setPreferenceProperty( sbYPosition, "max", 1 );
2582   setPreferenceProperty( sbYPosition, "step", 0.05 );
2583
2584   int sbWidth = addPreference( tr( "PREF_SCALAR_BAR_WIDTH" ), scalarBarGroup,
2585                                LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_width" );
2586   setPreferenceProperty( sbWidth, "min", 0 );
2587   setPreferenceProperty( sbWidth, "max", 1 );
2588   setPreferenceProperty( sbWidth, "step", 0.05 );
2589
2590   int sbHeight = addPreference( tr( "PREF_SCALAR_BAR_HEIGHT" ), scalarBarGroup,
2591                                 LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_height" );
2592   setPreferenceProperty( sbHeight, "min", 0 );
2593   setPreferenceProperty( sbHeight, "max", 1 );
2594   setPreferenceProperty( sbHeight, "step", 0.05 );
2595
2596   int sbTextHeight = addPreference( tr( "PREF_SCALAR_BAR_TEXT_HEIGHT" ), scalarBarGroup,
2597                                     LightApp_Preferences::IntSpin, "Geometry", "scalar_bar_text_height" );
2598   setPreferenceProperty( sbTextHeight, "min", 6 );
2599   setPreferenceProperty( sbTextHeight, "max", 24 );
2600   setPreferenceProperty( sbTextHeight, "step", 1 );
2601
2602   int sbNbIntervals = addPreference( tr( "PREF_SCALAR_BAR_NUMBER_OF_INTERVALS" ), scalarBarGroup,
2603                                      LightApp_Preferences::IntSpin, "Geometry", "scalar_bar_nb_intervals" );
2604   setPreferenceProperty( sbNbIntervals, "min", 2 );
2605   setPreferenceProperty( sbNbIntervals, "max", 64 );
2606   setPreferenceProperty( sbNbIntervals, "step", 1 );
2607
2608   int originGroup = addPreference( tr( "PREF_GROUP_ORIGIN_AND_BASE_VECTORS" ), tabId );
2609   setPreferenceProperty( originGroup, "columns", 2 );
2610
2611   int baseVectorsLength = addPreference( tr( "PREF_BASE_VECTORS_LENGTH" ), originGroup,
2612                                          LightApp_Preferences::DblSpin, "Geometry", "base_vectors_length" );
2613   setPreferenceProperty( baseVectorsLength, "min", 0.01 );
2614   setPreferenceProperty( baseVectorsLength, "max", 1000 );
2615
2616   addPreference( tr( "PREF_AUTO_CREATE" ), originGroup,
2617                  LightApp_Preferences::Bool, "Geometry", "auto_create_base_objects" );
2618
2619   int operationsGroup = addPreference( tr( "PREF_GROUP_OPERATIONS" ), tabId );
2620   setPreferenceProperty( operationsGroup, "columns", 2 );
2621
2622   addPreference( tr( "GEOM_PREVIEW" ), operationsGroup,
2623                  LightApp_Preferences::Bool, "Geometry", "geom_preview" );
2624
2625   addPreference( tr( "PREF_HIDE_INPUT_OBJECT" ), operationsGroup,
2626                  LightApp_Preferences::Bool, "Geometry", "hide_input_object" );
2627
2628   int DependencyViewId = addPreference( tr( "PREF_TAB_DEPENDENCY_VIEW" ) );
2629
2630   int treeGeneralGroup = addPreference( tr( "PREF_GROUP_GENERAL" ), DependencyViewId );
2631
2632   int hierarchy_type = addPreference( tr( "PREF_HIERARCHY_TYPE" ), treeGeneralGroup,
2633                       LightApp_Preferences::Selector, "Geometry", "dependency_tree_hierarchy_type" );
2634
2635   QStringList aHierarchyTypeList;
2636   aHierarchyTypeList.append( tr("MEN_BOTH_ASCENDANTS_DESCENDANTS") );
2637   aHierarchyTypeList.append( tr("MEN_ONLY_ASCENDANTS") );
2638   aHierarchyTypeList.append( tr("MEN_ONLY_DESCENDANTS") );
2639
2640   QList<QVariant> aHierarchyTypeIndexesList;
2641   aHierarchyTypeIndexesList.append(0);
2642   aHierarchyTypeIndexesList.append(1);
2643   aHierarchyTypeIndexesList.append(2);
2644
2645   setPreferenceProperty( hierarchy_type, "strings", aHierarchyTypeList );
2646   setPreferenceProperty( hierarchy_type, "indexes", aHierarchyTypeIndexesList );
2647
2648   addPreference( tr( "GEOM_MOVE_POSSIBILITY" ), treeGeneralGroup,
2649                  LightApp_Preferences::Bool, "Geometry", "dependency_tree_move_nodes" );
2650
2651   int treeColorGroup = addPreference( tr( "PREF_GROUP_DEPENDENCY_VIEW_COLOR" ), DependencyViewId );
2652
2653   addPreference( tr( "PREF_DEPENDENCY_VIEW_BACKGROUND_COLOR"), treeColorGroup,
2654                  LightApp_Preferences::Color, "Geometry", "dependency_tree_background_color" );
2655
2656   addPreference( tr( "PREF_DEPENDENCY_VIEW_NODE_COLOR"), treeColorGroup,
2657                  LightApp_Preferences::Color, "Geometry", "dependency_tree_node_color" );
2658   addPreference( tr( "PREF_DEPENDENCY_VIEW_MAIN_NODE_COLOR"), treeColorGroup,
2659                  LightApp_Preferences::Color, "Geometry", "dependency_tree_main_node_color" );
2660   addPreference( tr( "PREF_DEPENDENCY_VIEW_UNPUBLISH_NODE_COLOR"), treeColorGroup,
2661                  LightApp_Preferences::Color, "Geometry", "dependency_tree_unpublish_node_color" );
2662   addPreference( tr( "PREF_DEPENDENCY_VIEW_SELECT_NODE_COLOR"), treeColorGroup,
2663                  LightApp_Preferences::Color, "Geometry", "dependency_tree_select_node_color" );
2664
2665   addPreference( tr( "PREF_DEPENDENCY_VIEW_ARROW_COLOR"), treeColorGroup,
2666                  LightApp_Preferences::Color, "Geometry", "dependency_tree_arrow_color" );
2667   addPreference( tr( "PREF_DEPENDENCY_VIEW_HIGHLIGHT_ARROW_COLOR"), treeColorGroup,
2668                  LightApp_Preferences::Color, "Geometry", "dependency_tree_highlight_arrow_color" );
2669   addPreference( tr( "PREF_DEPENDENCY_VIEW_SELECT_ARROW_COLOR"), treeColorGroup,
2670                  LightApp_Preferences::Color, "Geometry", "dependency_tree_select_arrow_color" );
2671
2672
2673
2674
2675 }
2676
2677 void GeometryGUI::preferencesChanged( const QString& section, const QString& param )
2678 {
2679   if (section == "Geometry") {
2680     SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
2681     if (param == QString("SettingsGeomStep")) {
2682       double spin_step = aResourceMgr->doubleValue(section, param, 100.);
2683       EmitSignalDefaultStepValueChanged(spin_step);
2684     }
2685     else if (param == QString("toplevel_color")) {
2686       QColor c = aResourceMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) );
2687       GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c));
2688     }
2689     else if (param == QString("toplevel_dm")) {
2690       GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)aResourceMgr->integerValue("Geometry", "toplevel_dm", 0));
2691     }
2692     else if (param == QString("scalar_bar_x_position") ||
2693              param == QString("scalar_bar_y_position") ||
2694              param == QString("scalar_bar_width") ||
2695              param == QString("scalar_bar_height") ||
2696              param == QString("scalar_bar_text_height") ||
2697              param == QString("scalar_bar_nb_intervals")) {
2698       if( SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) )
2699       {
2700         GEOM_Displayer aDisplayer( aStudy );
2701         bool anIsRedisplayFieldSteps = param == QString("scalar_bar_nb_intervals");
2702         aDisplayer.UpdateColorScale( anIsRedisplayFieldSteps, true );
2703       }
2704     }
2705     else if ( param == QString("dimensions_color")        ||
2706               param == QString("dimensions_line_width")   ||
2707               param == QString("dimensions_font")         ||
2708               param == QString("dimensions_arrow_length") ||
2709               param == QString("dimensions_show_units")   ||
2710               param == QString("dimensions_length_units") ||
2711               param == QString("dimensions_angle_units")  ||
2712               param == QString("dimensions_use_text3d")  ||
2713               param == QString("label_color") )
2714     {
2715       SalomeApp_Application* anApp = getApp();
2716       if ( !anApp )
2717       {
2718         return;
2719       }
2720
2721       SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( anApp->activeStudy() );
2722       if ( !aStudy )
2723       {
2724         return;
2725       }
2726
2727       GEOM_Displayer aDisplayer( aStudy );
2728
2729       ViewManagerList aVMs;
2730       anApp->viewManagers( OCCViewer_Viewer::Type(), aVMs );
2731       ViewManagerList::Iterator anIt = aVMs.begin();
2732       for ( ; anIt != aVMs.end(); ++anIt )
2733       {
2734         SOCC_Viewer* aViewer = dynamic_cast<SOCC_Viewer*>( (*anIt)->getViewModel() );
2735         if ( !aViewer )
2736         {
2737           continue;
2738         }
2739
2740         SALOME_ListIO aVisible;
2741         aViewer->GetVisible( aVisible );
2742         aDisplayer.Redisplay( aVisible, false, aViewer );
2743       }
2744       if ( param == QString( "label_color" ) ) {
2745         ViewManagerList aVMsVTK;
2746         anApp->viewManagers( SVTK_Viewer::Type(), aVMsVTK );
2747         ViewManagerList::Iterator anIt = aVMsVTK.begin();
2748         for ( ; anIt != aVMsVTK.end(); ++anIt )
2749         {
2750             SVTK_Viewer* aViewer = dynamic_cast<SVTK_Viewer*>( (*anIt)->getViewModel() );
2751             if ( !aViewer )
2752             {
2753               continue;
2754             }
2755             SALOME_ListIO aVisible;
2756             aViewer->GetVisible( aVisible );
2757             aDisplayer.Redisplay( aVisible, false, aViewer );
2758           }
2759       }
2760       aDisplayer.UpdateViewer();
2761     }
2762     else if ( param.startsWith( "dependency_tree") )
2763       emit SignalDependencyTreeParamChanged( section, param );
2764   }
2765 }
2766
2767 LightApp_Displayer* GeometryGUI::displayer()
2768 {
2769   if ( !myDisplayer )
2770     myDisplayer = new GEOM_Displayer( dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) );
2771   return myDisplayer;
2772 }
2773
2774 void GeometryGUI::setLocalSelectionMode(const int mode)
2775 {
2776   myLocalSelectionMode = mode;
2777 }
2778
2779 int GeometryGUI::getLocalSelectionMode() const
2780 {
2781   return myLocalSelectionMode;
2782 }
2783
2784 const char gSeparator = '_'; // character used to separate parameter names
2785 const char gDigitsSep = ':'; // character used to separate numeric parameter values (color = r:g:b)
2786
2787 /*!
2788  * \brief Store visual parameters
2789  *
2790  * This method is called just before the study document is saved.
2791  * Store visual parameters in AttributeParameter attribute(s)
2792  */
2793 void GeometryGUI::storeVisualParameters (int savePoint)
2794 {
2795   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
2796   if ( !appStudy || !appStudy->studyDS() )
2797     return;
2798   _PTR(Study) studyDS = appStudy->studyDS();
2799
2800   // componentName is used for encoding of entries when storing them in IParameters
2801   std::string componentName = myComponentGeom->ComponentDataType();
2802   //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
2803   //if (!aSComponent) return;
2804
2805   // IParameters
2806   _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
2807                                                              componentName.c_str(),
2808                                                              savePoint);
2809   _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
2810
2811   QSet<QString> anEntriesToStoreShared;
2812   QList<SUIT_ViewManager*> lst;
2813   QList<SUIT_ViewManager*>::Iterator it;
2814
2815   // main cycle to store parameters of displayed objects
2816   lst.clear();
2817   getApp()->viewManagers(lst);
2818   for (it = lst.begin(); it != lst.end(); it++) {
2819     SUIT_ViewManager* vman = *it;
2820     QString vType = vman->getType();
2821     int aMgrId = vman->getGlobalId();
2822     // saving VTK actors properties
2823     QVector<SUIT_ViewWindow*> views = vman->getViews();
2824     for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++) {
2825       const ObjMap& anObjects = appStudy->getObjectProperties(aMgrId);
2826       ObjMap::ConstIterator o_it = anObjects.begin();
2827       for (; o_it != anObjects.end(); o_it++) {
2828         const PropMap& aProps = o_it.value();
2829
2830         //Check that object exists in the study
2831         _PTR(SObject) obj( studyDS->FindObjectID( o_it.key().toLatin1().data() ) );
2832         if ( !obj || !(aProps.count() > 0))
2833           continue;
2834         // entry is "encoded" = it does NOT contain component adress, since it is a
2835         // subject to change on next component loading
2836
2837         std::string entry = ip->encodeEntry(o_it.key().toLatin1().data(), componentName);
2838
2839         _PTR(GenericAttribute) anAttr;
2840         if (!obj->FindAttribute(anAttr, "AttributeIOR"))
2841           continue;
2842
2843         // remember entry of object to store shared GEOM properties
2844         // (e.g. dimension properties).
2845         if ( vType == OCCViewer_Viewer::Type() )
2846         {
2847           anEntriesToStoreShared.insert( o_it.key() );
2848         }
2849
2850         QString param, occParam = vType;
2851         occParam += GEOM::sectionSeparator();
2852         occParam += QString::number(aMgrId);
2853         occParam += GEOM::sectionSeparator();
2854
2855         if (aProps.contains(GEOM::propertyName( GEOM::Visibility ))) {
2856           param = occParam + GEOM::propertyName( GEOM::Visibility );
2857           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Visibility )).toBool() ? "On" : "Off");
2858         }
2859
2860         if (aProps.contains(GEOM::propertyName( GEOM::DisplayMode ))) {
2861           param = occParam + GEOM::propertyName( GEOM::DisplayMode );
2862           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::DisplayMode )).toString().toStdString());
2863         }
2864
2865         if (aProps.contains(GEOM::propertyName( GEOM::Color ))) {
2866           QColor c = aProps.value(GEOM::propertyName( GEOM::Color )).value<QColor>();
2867           QStringList val;
2868           val << QString::number(c.redF());
2869           val << QString::number(c.greenF());
2870           val << QString::number(c.blueF());
2871           param = occParam + GEOM::propertyName( GEOM::Color );
2872           ip->setParameter(entry, param.toStdString(), val.join( GEOM::subSectionSeparator()).toStdString());
2873         }
2874         
2875         if (aProps.contains(GEOM::propertyName( GEOM::Texture ))) {
2876           param = occParam + GEOM::propertyName( GEOM::Texture );
2877           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Texture )).toString().toStdString());
2878         }
2879
2880         if (vType == SVTK_Viewer::Type()) {
2881           if (aProps.contains(GEOM::propertyName( GEOM::Opacity ))) {
2882             param = occParam + GEOM::propertyName( GEOM::Opacity );
2883             ip->setParameter(entry, param.toStdString(), QString::number(1. - aProps.value(GEOM::propertyName( GEOM::Transparency )).toDouble()).toStdString());
2884           }
2885         } else if (vType == SOCC_Viewer::Type()) {
2886           if (aProps.contains(GEOM::propertyName( GEOM::Transparency ))) {
2887             param = occParam + GEOM::propertyName( GEOM::Transparency );
2888             ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Transparency )).toString().toStdString());
2889           }
2890
2891           if (aProps.contains(GEOM::propertyName( GEOM::TopLevel ))) {
2892             param = occParam + GEOM::propertyName( GEOM::TopLevel );
2893             ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::TopLevel )).toString().toStdString());
2894           }
2895         }
2896
2897         if (aProps.contains(GEOM::propertyName( GEOM::NbIsos ))) {
2898           param = occParam + GEOM::propertyName( GEOM::NbIsos );
2899           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::NbIsos )).toString().toStdString());
2900         }
2901
2902         if (aProps.contains(GEOM::propertyName( GEOM::EdgesDirection ))) {
2903           param = occParam + GEOM::propertyName( GEOM::EdgesDirection );
2904           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::EdgesDirection )).toString().toStdString());
2905         }
2906
2907         if (aProps.contains(GEOM::propertyName( GEOM::Vertices ))) {
2908           param = occParam + GEOM::propertyName( GEOM::Vertices );
2909           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Vertices )).toString().toStdString());
2910         }
2911
2912         if (aProps.contains(GEOM::propertyName( GEOM::ShowName ))) {
2913           param = occParam + GEOM::propertyName( GEOM::ShowName );
2914           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::ShowName )).toString().toStdString());
2915         }
2916
2917         if (aProps.contains(GEOM::propertyName( GEOM::Deflection ))) {
2918           param = occParam + GEOM::propertyName( GEOM::Deflection );
2919           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Deflection )).toString().toStdString());
2920         }
2921
2922         //Marker type of the vertex - ONLY for the "Vertex" and "Compound of the Vertex"
2923         if (aProps.contains(GEOM::propertyName( GEOM::PointMarker ))) {
2924           param = occParam + GEOM::propertyName( GEOM::PointMarker );
2925           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::PointMarker )).toString().toStdString());
2926         }
2927
2928         if (aProps.contains(GEOM::propertyName( GEOM::Material ))) {
2929           param = occParam + GEOM::propertyName( GEOM::Material );
2930           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Material )).toString().toStdString());
2931         }
2932
2933         if (aProps.contains(GEOM::propertyName( GEOM::LineWidth ))) {
2934              param = occParam + GEOM::propertyName( GEOM::LineWidth );
2935            ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::LineWidth )).toString().toStdString());
2936         }
2937
2938         if (aProps.contains(GEOM::propertyName( GEOM::IsosWidth ))) {
2939           param = occParam + GEOM::propertyName( GEOM::IsosWidth );
2940           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::IsosWidth )).toString().toStdString());
2941         }
2942       } // object iterator
2943     } // for (views)
2944   } // for (viewManagers)
2945
2946   // store dimension attributes of objects:
2947   // since the displayed object always persists in property map, we remember the object entries
2948   // on the passes when we store viewer related properties - to avoid extra iterations on GEOM component tree.
2949   QString aDimensionParam = OCCViewer_Viewer::Type() + GEOM::sectionSeparator() + GEOM::propertyName( GEOM::Dimensions );
2950   QSet<QString>::ConstIterator aEntryIt = anEntriesToStoreShared.constBegin();
2951   for ( ; aEntryIt != anEntriesToStoreShared.constEnd(); ++aEntryIt )
2952   {
2953     std::string aStudyEntry = (*aEntryIt).toLatin1().data();
2954     std::string aStoreEntry = ip->encodeEntry( aStudyEntry, componentName);
2955
2956     GEOMGUI_DimensionProperty aDimensions( appStudy, aStudyEntry );
2957
2958     if ( aDimensions.GetNumber() == 0 )
2959     {
2960       continue;
2961     }
2962
2963     ip->setParameter( aStoreEntry, aDimensionParam.toStdString(), ((QString)aDimensions).toLatin1().data() );
2964   }
2965 }
2966
2967 /*!
2968  * \brief Restore visual parameters
2969  *
2970  * This method is called after the study document is opened.
2971  * Restore visual parameters from AttributeParameter attribute(s)
2972  */
2973 void GeometryGUI::restoreVisualParameters (int savePoint)
2974 {
2975   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
2976   if (!appStudy || !appStudy->studyDS())
2977     return;
2978   _PTR(Study) studyDS = appStudy->studyDS();
2979
2980   // componentName is used for encoding of entries when storing them in IParameters
2981   std::string componentName = myComponentGeom->ComponentDataType();
2982   //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
2983   //if (!aSComponent) return;
2984
2985   // IParameters
2986   _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
2987                                                              componentName.c_str(),
2988                                                              savePoint);
2989   _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
2990
2991   std::vector<std::string> entries = ip->getEntries();
2992
2993   for (std::vector<std::string>::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt)
2994   {
2995     // entry is a normal entry - it should be "decoded" (setting base adress of component)
2996     QString entry (ip->decodeEntry(*entIt).c_str());
2997
2998     // Check that the entry corresponds to a real object in the Study
2999     // as the object may be deleted or modified after the visual state is saved.
3000     _PTR(SObject) so = studyDS->FindObjectID(entry.toLatin1().data());
3001     if (!so) continue; //Skip the not existent entry
3002
3003     std::vector<std::string> paramNames = ip->getAllParameterNames( *entIt );
3004     std::vector<std::string> paramValues = ip->getAllParameterValues( *entIt );
3005
3006     std::vector<std::string>::iterator namesIt = paramNames.begin();
3007     std::vector<std::string>::iterator valuesIt = paramValues.begin();
3008
3009     // actors are stored in a map after displaying of them for
3010     // quicker access in the future: map < viewID to actor >
3011     NCollection_DataMap<int, GEOM_Actor*          > vtkActors;
3012     NCollection_DataMap<int, Handle(GEOM_AISShape)> occActors;
3013
3014     QString viewerTypStr;
3015     QString viewIndexStr;
3016     int viewIndex;
3017     QVector<PropMap> aListOfMap;
3018
3019     for (; namesIt != paramNames.end(); ++namesIt, ++valuesIt)
3020     {
3021       // visual parameters are stored in strings as follows: 
3022       //   1) ViewerType_ViewIndex_ParamName
3023       //   2) ViewerType_ParamName (shared for GEOM module)
3024       // '_' is used as separator and should not be used in viewer type or parameter names.
3025       QStringList lst = QString((*namesIt).c_str()).split( GEOM::sectionSeparator(), QString::SkipEmptyParts);
3026
3027       bool isShared = lst.size() == 2;
3028       bool isViewer = lst.size() == 3;
3029       if ( !isShared && !isViewer )
3030       {
3031         continue;
3032       }
3033
3034       // shared visual parameters
3035       if ( isShared )
3036       {
3037         QString aParamNameStr( lst[1] );
3038         QString aValuesStr( (*valuesIt).c_str() );
3039
3040         // shared dimension properties are stored as attribute
3041         if ( aParamNameStr == GEOM::propertyName( GEOM::Dimensions ) )
3042         {
3043           GEOMGUI_DimensionProperty aDimensionProp( aValuesStr );
3044           aDimensionProp.SaveToAttribute( appStudy, entry.toLatin1().data() );
3045         }
3046
3047         continue;
3048       }
3049
3050       // per view visual parameters
3051       viewerTypStr = lst[0];
3052       viewIndexStr = lst[1];
3053       QString paramNameStr = lst[2];
3054
3055       bool ok;
3056       viewIndex = viewIndexStr.toUInt(&ok);
3057       if (!ok) // bad conversion of view index to integer
3058         continue;
3059
3060       if ((viewIndex + 1) > aListOfMap.count()) {
3061         aListOfMap.resize(viewIndex + 1);
3062       }
3063
3064       QString val((*valuesIt).c_str());
3065       if (paramNameStr == GEOM::propertyName( GEOM::Visibility )) {
3066         aListOfMap[viewIndex].insert(GEOM::propertyName( GEOM::Visibility ), val == "On");
3067       } else if (paramNameStr == GEOM::propertyName( GEOM::Opacity )) {
3068         aListOfMap[viewIndex].insert(GEOM::propertyName( GEOM::Transparency ), 1. - val.toDouble());
3069       } else if (paramNameStr == GEOM::propertyName( GEOM::Transparency )) {
3070         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Transparency ), val.toDouble() );
3071       } else if (paramNameStr == GEOM::propertyName( GEOM::TopLevel )) {
3072         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::TopLevel ), val == "true" || val == "1");
3073       } else if (paramNameStr == GEOM::propertyName( GEOM::DisplayMode )) {
3074         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::DisplayMode ), val.toInt());
3075       } else if (paramNameStr == GEOM::propertyName( GEOM::NbIsos )) {
3076         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::NbIsos ), val);
3077       } else if (paramNameStr == GEOM::propertyName( GEOM::Color )) {
3078         QStringList rgb = val.split(GEOM::subSectionSeparator());
3079         if (rgb.count() == 3) {
3080           QColor c = QColor::fromRgbF(rgb[0].toDouble(), rgb[1].toDouble(), rgb[2].toDouble());
3081           aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Color ), c);
3082         }
3083       } else if (paramNameStr == GEOM::propertyName( GEOM::Texture )) {
3084         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Texture ), val );
3085       } else if (paramNameStr == GEOM::propertyName( GEOM::EdgesDirection )) {
3086         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::EdgesDirection ), val == "true" || val == "1");
3087       } else if (paramNameStr == GEOM::propertyName( GEOM::Vertices )) {
3088         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Vertices ), val == "true" || val == "1");
3089       } else if (paramNameStr == GEOM::propertyName( GEOM::ShowName )) {
3090         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::ShowName ), val == "true" || val == "1");
3091       } else if (paramNameStr == GEOM::propertyName( GEOM::Deflection )) {
3092         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Deflection ), val.toDouble());
3093       } else if (paramNameStr == GEOM::propertyName( GEOM::PointMarker )) {
3094         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::PointMarker ), val);
3095       } else if (paramNameStr == GEOM::propertyName( GEOM::Material )) {
3096         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Material ), val);
3097       } else if (paramNameStr == GEOM::propertyName( GEOM::LineWidth )) {
3098         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::LineWidth ), val.toInt());
3099       } else if (paramNameStr == GEOM::propertyName( GEOM::IsosWidth )) {
3100         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::IsosWidth ), val.toInt());
3101       }
3102     } // for names/parameters iterator
3103
3104     QList<SUIT_ViewManager*> lst = getApp()->viewManagers();
3105
3106     for (int index = 0; index < aListOfMap.count(); index++) {
3107       appStudy->setObjectProperties(index, entry, aListOfMap[index]);
3108
3109       //Get Visibility property of the current PropMap
3110       if (aListOfMap[index].value(GEOM::propertyName( GEOM::Visibility )) == 1) {
3111         SUIT_ViewManager* vman = lst.at(index);
3112         SUIT_ViewModel* vmodel = vman->getViewModel();
3113         displayer()->Display(entry, true, dynamic_cast<SALOME_View*>(vmodel));
3114       }
3115     }
3116   } // for entries iterator
3117
3118   // update all VTK and OCC views
3119   QList<SUIT_ViewManager*> lst;
3120   getApp()->viewManagers(lst);
3121   for (QList<SUIT_ViewManager*>::Iterator it = lst.begin(); it != lst.end(); it++) {
3122     SUIT_ViewModel* vmodel = (*it)->getViewModel();
3123     if (!vmodel)
3124       continue;
3125     if (vmodel->getType() == SVTK_Viewer::Type()) {
3126       SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) (*it)->getActiveView();
3127       vtkView->getRenderer()->ResetCameraClippingRange();
3128       vtkView->Repaint();
3129     }
3130     else if (vmodel->getType() == SOCC_Viewer::Type()) {
3131       //SOCC_ViewWindow* occView = (SOCC_ViewWindow*) (*it)->getActiveView();
3132       SALOME_View* occVMod = dynamic_cast<SALOME_View*>(vmodel);
3133       if (occVMod)
3134         occVMod->Repaint();
3135     }
3136   }
3137 }
3138
3139 // Compute current name mode of the viewer
3140 void UpdateNameMode( SalomeApp_Application* app )
3141 {
3142   bool isMode = false;
3143   SalomeApp_Study* aStudy = dynamic_cast< SalomeApp_Study* >( app->activeStudy() );
3144   SUIT_ViewWindow* viewWindow = app->desktop()->activeWindow();
3145   GEOM_Displayer displayer( aStudy );
3146   int aMgrId = viewWindow->getViewManager()->getGlobalId();
3147
3148   SALOME_View* window = displayer.GetActiveView();
3149   if ( !window ) return;
3150
3151   SALOME_ListIO anIOlst;
3152   window->GetVisible( anIOlst );
3153
3154   for ( SALOME_ListIteratorOfListIO It( anIOlst ); It.More(); It.Next() ) {
3155     Handle( SALOME_InteractiveObject ) io = It.Value();
3156     QVariant v = aStudy->getObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::ShowName ), QVariant() );
3157     bool isIONameMode =  v.isValid() ? v.toBool() : false;
3158     if( isIONameMode )
3159       isMode = true;
3160   }
3161   viewWindow->setProperty( "NameMode", isMode );
3162 }
3163
3164 void GeometryGUI::onViewAboutToShow()
3165 {
3166   SUIT_ViewWindow* window = application()->desktop()->activeWindow();
3167   QAction* a = action( GEOMOp::OpSwitchVectors );
3168   QAction* aVerticesAction = action( GEOMOp::OpSwitchVertices );
3169   QAction* aNameAction = action( GEOMOp::OpSwitchName );
3170   if ( window ) {
3171     a->setEnabled(true);
3172     bool vmode = window->property("VectorsMode").toBool();
3173     a->setText ( vmode == 1 ? tr( "MEN_VECTOR_MODE_OFF" ) : tr("MEN_VECTOR_MODE_ON") );
3174     aVerticesAction->setEnabled(true);
3175     vmode = window->property("VerticesMode").toBool();
3176     aVerticesAction->setText ( vmode == 1 ? tr( "MEN_VERTICES_MODE_OFF" ) : tr("MEN_VERTICES_MODE_ON") );
3177     UpdateNameMode( getApp() );
3178     aNameAction->setEnabled(true);
3179     vmode = window->property("NameMode").toBool();
3180     aNameAction->setText ( vmode == 1 ? tr( "MEN_NAME_MODE_OFF" ) : tr("MEN_NAME_MODE_ON") );
3181   } else {
3182     a->setText ( tr("MEN_VECTOR_MODE_ON") );
3183     a->setEnabled(false);
3184     aVerticesAction->setText ( tr("MEN_VERTICES_MODE_ON") );
3185     aVerticesAction->setEnabled(false);
3186     aNameAction->setText ( tr("MEN_NAME_MODE_ON") );
3187     aNameAction->setEnabled(false);
3188   }
3189 }
3190
3191 /*!
3192   \brief Return action by id
3193   \param id identifier of the action
3194   \return action
3195 */
3196 QAction* GeometryGUI::getAction(const int id) {
3197   return action(id);
3198 }
3199
3200 /*!
3201   \brief GEOM module message handler
3202
3203   This method can be re-implemented in the subclasses.
3204   This is a GEOM module message handler.
3205
3206   \param msg the message received.
3207 */
3208 void GeometryGUI::message(const QString& msg)
3209 {
3210   // dispatch message
3211   QStringList data = msg.split("/");
3212   const int nbStrings = data.count();
3213
3214   if (nbStrings > 0) {
3215     if (data[0] == "modified") {
3216       // get mesh entry
3217       QString anIOR = nbStrings > 1 ? data[1] : QString();
3218
3219       if ( anIOR.isEmpty() ) {
3220         return;
3221       }
3222
3223       // Get the geom object.
3224       GEOM::GEOM_Object_ptr anObj = GeometryGUI::GetObjectFromIOR (anIOR);
3225
3226       // Clear the shape buffer
3227       GeometryGUI::ClearShapeBuffer (anObj);
3228     }
3229   }
3230 }
3231
3232 /*!
3233   \brief Clears the shape buffer.
3234
3235   This is a static method. It clears the shape buffer.
3236
3237   \param theObj the object
3238 */
3239 void GeometryGUI::ClearShapeBuffer( GEOM::GEOM_Object_ptr theObj )
3240 {
3241   if ( CORBA::is_nil( theObj ) )
3242     return;
3243
3244   CORBA::String_var IOR = SalomeApp_Application::orb()->object_to_string( theObj );
3245   TCollection_AsciiString asciiIOR( (char *)IOR.in() );
3246   GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
3247
3248   SALOMEDSClient_StudyManager *aManager = SalomeApp_Application::studyMgr();
3249
3250   if (!aManager)
3251     return;
3252
3253   _PTR(Study) aStudy = aManager->GetStudyByID(theObj->GetStudyID());
3254
3255   if ( !aStudy )
3256     return;
3257
3258   _PTR(SObject) aSObj ( aStudy->FindObjectIOR( std::string( IOR ) ) );
3259   if ( !aSObj )
3260     return;
3261
3262   _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) );
3263   for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) {
3264     _PTR(GenericAttribute) anAttr;
3265     if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) {
3266       _PTR(AttributeIOR) anIOR ( anAttr );
3267       TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() );
3268       GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
3269     }
3270   }
3271 }
3272
3273 /*!
3274   \brief Returns the object from IOR.
3275
3276   This is a static method. It returns the object from its IOR.
3277
3278   \param IOR object IOR
3279   \return GEOM object.
3280 */
3281 GEOM::GEOM_Object_ptr GeometryGUI::GetObjectFromIOR( const QString& IOR )
3282 {
3283   GEOM::GEOM_Object_var geomObj;
3284   if ( !IOR.isEmpty() ) {
3285     CORBA::Object_var corbaObj = SalomeApp_Application::orb()->string_to_object
3286       ( IOR.toLatin1().constData() );
3287     if ( !CORBA::is_nil( corbaObj ) )
3288       geomObj = GEOM::GEOM_Object::_narrow( corbaObj );
3289   }
3290   return geomObj._retn();
3291 }
3292
3293 /*!
3294   \brief Returns IOR of the object.
3295
3296   This is a static method. It returns the object's IOR.
3297
3298   \param object the GEOM object.
3299   \return object's IOR.
3300 */
3301 QString GeometryGUI::GetIORFromObject( GEOM::GEOM_Object_ptr object )
3302 {
3303   QString IOR;
3304   if ( !CORBA::is_nil( object ) ) {
3305     CORBA::String_var anIOR =
3306       SalomeApp_Application::orb()->object_to_string( object );
3307     IOR = anIOR.in();
3308   }
3309   return IOR;
3310 }
3311
3312 /*!
3313   \brief Check if this object is can't be renamed in place
3314
3315   This method can be re-implemented in the subclasses.
3316   Return true in case if object isn't reference or component (module root).
3317
3318   \param entry column id
3319   \return \c true if the item can be renamed by the user in place (e.g. in the Object browser)
3320 */
3321 bool GeometryGUI::renameAllowed( const QString& entry) const {
3322
3323   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
3324   SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
3325   SalomeApp_DataObject* obj = appStudy ? dynamic_cast<SalomeApp_DataObject*>(appStudy->findObjectByEntry(entry)) : 0;
3326
3327   return (app && appStudy && obj && !appStudy->isComponent(entry) && !obj->isReference());
3328 }
3329
3330 /*!
3331   Rename object by entry.
3332   \param entry entry of the object
3333   \param name new name of the object
3334   \brief Return \c true if rename operation finished successfully, \c false otherwise.
3335 */
3336 bool GeometryGUI::renameObject( const QString& entry, const QString& name)
3337 {
3338   bool result = false;
3339
3340   SalomeApp_Application* app =
3341     dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication());
3342   SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
3343
3344   if (!appStudy)
3345     return result;
3346
3347   _PTR(Study) aStudy = appStudy->studyDS();
3348
3349   if (!aStudy)
3350     return result;
3351
3352   bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
3353   if ( aLocked ) {
3354     SUIT_MessageBox::warning ( app->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
3355     return result;
3356   }
3357
3358   _PTR(SObject) obj ( aStudy->FindObjectID(qPrintable(entry)) );
3359   _PTR(GenericAttribute) anAttr;
3360   if ( obj ) {
3361     if ( obj->FindAttribute(anAttr, "AttributeName") ) {
3362       _PTR(AttributeName) aName (anAttr);
3363
3364       aName->SetValue( name.toLatin1().data() ); // rename the SObject
3365       GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(obj));
3366       if (!CORBA::is_nil(anObj)) {
3367         anObj->SetName( name.toLatin1().data() );  // Rename the corresponding GEOM_Object
3368         emit SignalDependencyTreeRenameObject( anObj->GetEntry() );
3369       }
3370       result = true;
3371     }
3372   }
3373   return result;
3374 }
3375
3376 void GeometryGUI::updateMaterials()
3377 {
3378   LightApp_Preferences* pref = preferences();
3379   if ( pref ) {
3380     QStringList materials = Material_ResourceMgr::resourceMgr()->materials();
3381     QString currentMaterial = SUIT_Session::session()->resourceMgr()->stringValue( "Geometry", "material" );
3382     if ( !materials.contains( currentMaterial ) )
3383       // user material set as default in the preferences, might be removed
3384       SUIT_Session::session()->resourceMgr()->setValue( "Geometry", "material", QString( "Plastic" ) );
3385
3386     QtxPreferenceItem* prefItem = pref->rootItem()->findItem( tr( "PREF_MATERIAL" ), true );
3387     if ( prefItem ) {
3388       setPreferenceProperty( prefItem->id(),
3389                              "strings", materials );
3390       prefItem->retrieve();
3391     }
3392   }
3393 }
3394
3395 /*!
3396   \brief Check if the module allows "drag" operation of its objects.
3397
3398   Overloaded from LightApp_Module class.
3399   
3400   This function is a part of the general drag-n-drop mechanism.
3401   The goal of this function is to check data object passed as a parameter
3402   and decide if it can be dragged or no.
3403
3404   \param what data object being tested for drag operation
3405   \return \c true if module allows dragging of the specified object
3406   \sa isDropAccepted(), dropObjects()
3407 */
3408 bool GeometryGUI::isDraggable( const SUIT_DataObject* what ) const
3409 {
3410   // we allow dragging object under root and object from folder
3411   int aLevel = what->level();
3412   bool anObjectInFolder = false;
3413   if ( aLevel > 2 ) {
3414     const SalomeApp_DataObject* dataObj = dynamic_cast<const SalomeApp_DataObject*>( what );
3415     if ( dataObj ) {
3416       _PTR(SObject) aSO = dataObj->object();
3417       if ( aSO ) {
3418         _PTR(GenericAttribute) anAttr;
3419         _PTR(SObject) aFatherSO = aSO->GetStudy()->GetUseCaseBuilder()->GetFather( aSO );
3420         if ( aFatherSO && aFatherSO->FindAttribute(anAttr, "AttributeLocalID") ) {
3421           _PTR(AttributeLocalID) aLocalID( anAttr );
3422           anObjectInFolder = aLocalID->Value() == 999;
3423         }
3424       }
3425     }
3426   }
3427   return aLevel == 2 || anObjectInFolder;
3428 }
3429
3430 /*!
3431   \brief Check if the module allows "drop" operation on the given object.
3432
3433   Overloaded from LightApp_Module class.
3434
3435   This function is a part of the general drag-n-drop mechanism.
3436   The goal of this function is to check data object passed as a parameter
3437   and decide if it can be used as a target for the "drop" operation.
3438   The processing of the drop operation itself is done in the dropObjects() function.
3439
3440   \param where target data object
3441   \return \c true if module supports dropping on the \a where data object
3442   \sa isDraggable(), dropObjects()
3443 */
3444 bool GeometryGUI::isDropAccepted( const SUIT_DataObject* where ) const
3445 {
3446   // we allow dropping into folder and top-level GEOM object
3447   int aLevel = where->level();
3448   bool isFolder = false;
3449   if ( aLevel > 1 ) {
3450     const SalomeApp_DataObject* dataObj = dynamic_cast<const SalomeApp_DataObject*>( where );
3451     if ( dataObj ) {
3452       _PTR(SObject) aSO = dataObj->object();
3453       if ( aSO ) {
3454         _PTR(GenericAttribute) anAttr;
3455         if ( aSO->FindAttribute(anAttr, "AttributeLocalID") ) {
3456           _PTR(AttributeLocalID) aLocalID( anAttr );
3457           isFolder = aLocalID->Value() == 999;
3458         }
3459       }
3460     }
3461   }
3462   return aLevel == 1 || isFolder;
3463 }
3464
3465 /*!
3466   \brief Complete drag-n-drop operation.
3467   
3468   Overloaded from LightApp_Module class.
3469
3470   This function is a part of the general drag-n-drop mechanism.
3471   Its goal is to handle dropping of the objects being dragged according
3472   to the chosen operation (move). The dropping is performed in the
3473   context of the parent data object \a where and the \a row (position in the 
3474   children index) at which the data should be dropped. If \a row is equal to -1,
3475   this means that objects are added to the end of the children list.
3476
3477   \param what objects being dropped
3478   \param where target data object
3479   \param row child index at which the drop operation is performed
3480   \param action drag-n-drop operation (Qt::DropAction) - move
3481
3482   \sa isDraggable(), isDropAccepted()
3483 */
3484 void GeometryGUI::dropObjects( const DataObjectList& what, SUIT_DataObject* where,
3485                                const int row, Qt::DropAction action )
3486 {
3487   if (action != Qt::CopyAction && action != Qt::MoveAction)
3488     return; // unsupported action
3489
3490   // get parent object
3491   SalomeApp_DataObject* dataObj = dynamic_cast<SalomeApp_DataObject*>( where );
3492   if ( !dataObj ) return; // wrong parent
3493   _PTR(SObject) parentObj = dataObj->object();
3494
3495   // Find the current Study and StudyBuilder
3496   _PTR(Study) aStudy = parentObj->GetStudy();
3497   _PTR(UseCaseBuilder) aUseCaseBuilder = aStudy->GetUseCaseBuilder();
3498   // collect all parents of the target node
3499   QStringList parentIDs;
3500   _PTR(SObject) parent = parentObj;
3501   while( !parent->IsNull() ) {
3502     parentIDs << parent->GetID().c_str();
3503     parent = aUseCaseBuilder->GetFather(parent);
3504   }
3505
3506   // collect objects being dropped
3507   GEOM::object_list_var objects = new GEOM::object_list();
3508   objects->length( what.count() );
3509   int count = 0;
3510   for ( int i = 0; i < what.count(); i++ ) {
3511     dataObj = dynamic_cast<SalomeApp_DataObject*>( what[i] );
3512     if ( !dataObj ) continue;  // skip wrong objects
3513     _PTR(SObject) sobj = dataObj->object();
3514     // check that dropped object is not a parent of target object
3515     if ( parentIDs.contains( sobj->GetID().c_str() ) ) {
3516       return; // it's not allowed to move node into it's child 
3517     }
3518     objects[i] = _CAST(SObject, sobj)->GetSObject();
3519     count++;
3520   }
3521   objects->length( count );
3522
3523   // call engine function
3524   GetGeomGen()->Move( objects.in(),                              // what
3525                       _CAST(SObject, parentObj)->GetSObject(),   // where
3526                       row );                                     // row
3527
3528   // update Object browser
3529   getApp()->updateObjectBrowser( false );
3530 }
3531
3532 void GeometryGUI::emitDimensionsUpdated( QString entry )
3533 {
3534   emit DimensionsUpdated( entry );
3535 }