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