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