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