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