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