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