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