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