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