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