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