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