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