Salome HOME
Fix for the "0021179: EDF 1654 SMESH GEOM: better look'n'feel" issue:
[modules/geom.git] / src / GEOMGUI / GeometryGUI.cxx
1 // Copyright (C) 2007-2011  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 //  File   : GeometryGUI.cxx
23 //  Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
24
25 #include <Standard_math.hxx>  // E.A. must be included before Python.h to fix compilation on windows
26 #ifdef HAVE_FINITE
27 #undef HAVE_FINITE            // VSR: avoid compilation warning on Linux : "HAVE_FINITE" redefined
28 #endif
29 #include "Python.h"
30 #include "GeometryGUI.h"
31 #include "GeometryGUI_Operations.h"
32 #include "GEOMGUI_OCCSelector.h"
33 #include "GEOMGUI_Selection.h"
34 #include "GEOM_Constants.h"
35 #include "GEOM_Displayer.h"
36 #include "GEOM_AISShape.hxx"
37
38 #include "GEOM_Actor.h"
39
40 #include <Material_ResourceMgr.h>
41
42 #include <SUIT_Desktop.h>
43 #include <SUIT_MessageBox.h>
44 #include <SUIT_ResourceMgr.h>
45 #include <SUIT_Session.h>
46 #include <SUIT_ViewManager.h>
47
48 #include <OCCViewer_ViewWindow.h>
49 #include <OCCViewer_ViewPort3d.h>
50 #include <OCCViewer_ViewModel.h>
51 #include <OCCViewer_ViewManager.h>
52
53 #include <SOCC_ViewModel.h>
54 #include <SOCC_ViewWindow.h>
55
56 #include <SVTK_ViewWindow.h>
57 #include <SVTK_RenderWindowInteractor.h>
58 #include <SVTK_InteractorStyle.h>
59 #include <SVTK_ViewModel.h>
60
61 #include <SalomeApp_Application.h>
62 #include <SalomeApp_DataObject.h>
63 #include <SalomeApp_Study.h>
64
65 #include <LightApp_SelectionMgr.h>
66 #include <LightApp_VTKSelector.h>
67 #include <LightApp_DataObject.h>
68 #include <LightApp_Preferences.h>
69
70 #include <SALOME_LifeCycleCORBA.hxx>
71 #include <SALOME_ListIO.hxx>
72 #include <SALOME_ListIteratorOfListIO.hxx>
73
74 #include <SALOMEDSClient_ClientFactory.hxx>
75 #include <SALOMEDSClient_IParameters.hxx>
76
77 #include <Basics_OCCTVersion.hxx>
78
79 // External includes
80 #include <QMenu>
81 #include <QTime>
82 #include <QAction>
83 #include <QFileInfo>
84 #include <QString>
85 #include <QPainter>
86
87 #include <AIS_Drawer.hxx>
88 #include <AIS_ListOfInteractive.hxx>
89 #include <AIS_ListIteratorOfListOfInteractive.hxx>
90 #include <Prs3d_Drawer.hxx>
91 #include <Prs3d_IsoAspect.hxx>
92 #include <Aspect_TypeOfMarker.hxx>
93 #include <OSD_SharedLibrary.hxx>
94 #include <NCollection_DataMap.hxx>
95
96 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
97 #include <TColStd_HArray1OfByte.hxx>
98 #else
99 #include <Graphic3d_HArray1OfBytes.hxx>
100 #endif
101
102 #include <utilities.h>
103
104 #include <vtkCamera.h>
105 #include <vtkRenderer.h>
106
107 #include <GEOM_version.h>
108
109
110 #include "GEOMImpl_Types.hxx"
111
112 extern "C" {
113   Standard_EXPORT CAM_Module* createModule() {
114     return new GeometryGUI();
115   }
116
117   Standard_EXPORT char* getModuleVersion() {
118     return (char*)GEOM_VERSION_STR;
119   }
120 }
121
122 GeometryGUI::StudyTextureMap GeometryGUI::myTextureMap;
123
124 GEOM::GEOM_Gen_var GeometryGUI::myComponentGeom = GEOM::GEOM_Gen::_nil();
125
126 GEOM::GEOM_Gen_var GeometryGUI::GetGeomGen()
127 {
128   // Bug 12290: exception in Mesh GUI on GEOMBase::GetShape() if Geometry GUI hasn't been loaded
129   if (CORBA::is_nil(myComponentGeom))
130     InitGeomGen();
131   return GeometryGUI::myComponentGeom;
132 }
133
134 bool GeometryGUI::InitGeomGen()
135 {
136   GeometryGUI aGG;
137   if( CORBA::is_nil( myComponentGeom ) ) return false;
138   return true;
139 }
140
141 //=======================================================================
142 // function : ClientSObjectToObject
143 // purpose  :
144 //=======================================================================
145 CORBA::Object_var GeometryGUI::ClientSObjectToObject (_PTR(SObject) theSObject)
146 {
147   _PTR(GenericAttribute) anAttr;
148   CORBA::Object_var anObj;
149   try {
150     std::string aValue = theSObject->GetIOR();
151     if (strcmp(aValue.c_str(), "") != 0) {
152       CORBA::ORB_ptr anORB = SalomeApp_Application::orb();
153       anObj = anORB->string_to_object(aValue.c_str());
154     }
155   } catch(...) {
156     INFOS("ClientSObjectToObject - Unknown exception was occured!!!");
157   }
158   return anObj._retn();
159 }
160
161 //=======================================================================
162 // function : ClientStudyToStudy
163 // purpose  :
164 //=======================================================================
165 SALOMEDS::Study_var GeometryGUI::ClientStudyToStudy (_PTR(Study) theStudy)
166 {
167   SALOME_NamingService *aNamingService = SalomeApp_Application::namingService();
168   CORBA::Object_var aSMObject = aNamingService->Resolve("/myStudyManager");
169   SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow(aSMObject);
170   int aStudyID = theStudy->StudyId();
171   SALOMEDS::Study_var aDSStudy = aStudyManager->GetStudyByID(aStudyID);
172   return aDSStudy._retn();
173 }
174
175 void GeometryGUI::Modified( bool theIsUpdateActions )
176 {
177   if( SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() ) ) {
178     if( SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) ) {
179       appStudy->Modified();
180       if( theIsUpdateActions )
181         app->updateActions();
182     }
183   }
184 }
185
186 //=======================================================================
187 // function : GeometryGUI::GeometryGUI()
188 // purpose  : Constructor
189 //=======================================================================
190 GeometryGUI::GeometryGUI() :
191   SalomeApp_Module( "GEOM" ),
192   LightApp_Module( "GEOM" )
193 {
194   if ( CORBA::is_nil( myComponentGeom ) )
195   {
196     Engines::EngineComponent_var comp =
197       SalomeApp_Application::lcc()->FindOrLoad_Component( "FactoryServer", "GEOM" );
198     myComponentGeom = GEOM::GEOM_Gen::_narrow( comp );
199   }
200
201   myActiveDialogBox = 0;
202
203   gp_Pnt origin = gp_Pnt(0., 0., 0.);
204   gp_Dir direction = gp_Dir(0., 0., 1.);
205   myWorkingPlane = gp_Ax3(origin, direction);
206
207   myDisplayer = 0;
208   myLocalSelectionMode = GEOM_ALLOBJECTS;
209 }
210
211 //=======================================================================
212 // function : GeometryGUI::~GeometryGUI()
213 // purpose  : Destructor
214 //=======================================================================
215 GeometryGUI::~GeometryGUI()
216 {
217   while (!myOCCSelectors.isEmpty())
218     delete myOCCSelectors.takeFirst();
219
220   while (!myVTKSelectors.isEmpty())
221     delete myVTKSelectors.takeFirst();
222
223   qDeleteAll(myGUIMap);
224 }
225
226 //=======================================================================
227 // function : GeometryGUI::getLibrary()
228 // purpose  : get or load GUI library by name [ internal ]
229 //=======================================================================
230 typedef GEOMGUI* (*LibraryGUI)( GeometryGUI* );
231 GEOMGUI* GeometryGUI::getLibrary( const QString& libraryName )
232 {
233   if ( !myGUIMap.contains( libraryName ) ) {
234     // try to load library if it is not loaded yet
235 #ifndef WNT
236     QString dirs = getenv( "LD_LIBRARY_PATH" );
237     QString sep  = ":";
238 #else
239     QString dirs = getenv( "PATH" );
240     QString sep  = ";";
241 #endif
242     if ( !dirs.isEmpty() ) {
243       QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries
244       QListIterator<QString> it( dirList ); it.toBack();
245       while ( it.hasPrevious() ) {
246         QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName );
247         if ( fi.exists() ) {
248           OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() );
249           bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY );
250           if ( !res ) {
251             MESSAGE( "Can't open library : " << aSharedLibrary.DlError() );
252             continue; // continue search further
253           }
254           OSD_Function osdF = aSharedLibrary.DlSymb( "GetLibGUI" );
255           if ( osdF != NULL ) {
256             LibraryGUI func = (GEOMGUI* (*) (GeometryGUI*))osdF;
257             GEOMGUI* libGUI = (*func)( this );
258             if ( libGUI ) {
259               myGUIMap[ libraryName ] = libGUI;
260               break; // found and loaded!
261             }
262           }
263         }
264       }
265     }
266   }
267   return myGUIMap.contains( libraryName ) ? myGUIMap[ libraryName ] : 0;
268 }
269
270 //=======================================================================
271 // function : GeometryGUI::ActiveWorkingPlane()
272 // purpose  : Activate Working Plane View
273 //=======================================================================
274 void GeometryGUI::ActiveWorkingPlane()
275 {
276   gp_Dir DZ = myWorkingPlane.Direction();
277   gp_Dir DY = myWorkingPlane.YDirection();
278
279   SUIT_ViewWindow* window = application()->desktop()->activeWindow();
280   bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
281   bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
282
283   if( ViewOCC ) {
284     OCCViewer_ViewWindow* vw = dynamic_cast<OCCViewer_ViewWindow*>( window );
285     if ( vw ) {
286       Handle(V3d_View) view3d =  vw->getViewPort()->getView();
287
288       view3d->SetProj(DZ.X(), DZ.Y(), DZ.Z());
289       view3d->SetUp(DY.X(), DY.Y(), DY.Z());
290       vw->onViewFitAll(); 
291     }
292   }
293   else if( ViewVTK ) {
294     SVTK_ViewWindow* vw = dynamic_cast<SVTK_ViewWindow*>( window );
295     if ( vw ) {
296       vtkCamera* camera = vw->getRenderer()->GetActiveCamera();
297
298       camera->SetPosition(DZ.X(), DZ.Y(), DZ.Z());
299       camera->SetViewUp(DY.X(), DY.Y(), DY.Z());
300       camera->SetFocalPoint(0,0,0);
301
302       vw->onFitAll();
303     }
304   }
305 }
306
307 //=======================================================================
308 // function : GeometryGUI::SetActiveDialogBox()
309 // purpose  : Set active dialog box
310 //=======================================================================
311 void GeometryGUI::SetActiveDialogBox( QDialog* aDlg )
312 {
313   myActiveDialogBox = (QDialog*)aDlg;
314 }
315
316 //=======================================================================
317 // function : GeometryGUI::EmitSignalDeactivateDialog()
318 // purpose  : Emit a signal to deactivate the active dialog Box
319 //=======================================================================
320 void GeometryGUI::EmitSignalDeactivateDialog()
321 {
322   emit SignalDeactivateActiveDialog();
323 }
324
325 //=======================================================================
326 // function : GeometryGUI::EmitSignalCloseAllDialogs()
327 // purpose  : Emit a signal to close all non modal dialogs box
328 //=======================================================================
329 void GeometryGUI::EmitSignalCloseAllDialogs()
330 {
331   emit SignalCloseAllDialogs();
332 }
333
334 //=======================================================================
335 // function : GeometryGUI::EmitSignalDefaultStepValueChanged()
336 // purpose  : Emit a signal to inform that default real spin box step has
337 //            been changed
338 //=======================================================================
339 void GeometryGUI::EmitSignalDefaultStepValueChanged(double newVal)
340 {
341   emit SignalDefaultStepValueChanged(newVal);
342 }
343
344 //=======================================================================
345 // function : GeometryGUI::OnGUIEvent()
346 // purpose  : common slot for all menu/toolbar actions
347 //=======================================================================
348 void GeometryGUI::OnGUIEvent()
349 {
350   const QObject* obj = sender();
351   if ( !obj || !obj->inherits( "QAction" ) )
352     return;
353   int id = actionId((QAction*)obj);
354   if ( id != -1 )
355     OnGUIEvent( id );
356 }
357
358 //=======================================================================
359 // function : GeometryGUI::OnGUIEvent()
360 // purpose  : manage all events on GUI [static]
361 //=======================================================================
362 void GeometryGUI::OnGUIEvent( int id )
363 {
364   SUIT_Application* anApp = application();
365   if (!anApp) return;
366   SUIT_Desktop* desk = anApp->desktop();
367
368   // check type of the active viewframe
369   SUIT_ViewWindow* window = desk->activeWindow();
370   bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
371   bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
372   // if current viewframe is not of OCC and not of VTK type - return immediately
373   // fix for IPAL8958 - allow some commands to execute even when NO viewer is active (rename for example)
374   QList<int> NotViewerDependentCommands;
375   NotViewerDependentCommands << GEOMOp::OpDelete
376                              << GEOMOp::OpShow
377                              << GEOMOp::OpShowOnly
378                              << GEOMOp::OpShowChildren
379                              << GEOMOp::OpHideChildren
380                              << GEOMOp::OpUnpublishObject
381                              << GEOMOp::OpPublishObject
382                              << GEOMOp::OpPointMarker;
383   if ( !ViewOCC && !ViewVTK && !NotViewerDependentCommands.contains( id ) )
384       return;
385
386   // fix for IPAL9103, point 2
387   if ( CORBA::is_nil( GetGeomGen() ) ) {
388     SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_GET_ENGINE" ), tr( "GEOM_BUT_OK" ) );
389     return;
390   }
391
392   QString libName;
393   // find corresponding GUI library
394   switch ( id ) {
395   case GEOMOp::OpOriginAndVectors:   // MENU BASIC - ORIGIN AND BASE VECTORS
396     createOriginAndBaseVectors(); // internal operation
397     return;
398   case GEOMOp::OpImport:             // MENU FILE - IMPORT
399   case GEOMOp::OpExport:             // MENU FILE - EXPORT
400   case GEOMOp::OpSelectVertex:       // POPUP MENU - SELECT ONLY - VERTEX
401   case GEOMOp::OpSelectEdge:         // POPUP MENU - SELECT ONLY - EDGE
402   case GEOMOp::OpSelectWire:         // POPUP MENU - SELECT ONLY - WIRE
403   case GEOMOp::OpSelectFace:         // POPUP MENU - SELECT ONLY - FACE
404   case GEOMOp::OpSelectShell:        // POPUP MENU - SELECT ONLY - SHELL
405   case GEOMOp::OpSelectSolid:        // POPUP MENU - SELECT ONLY - SOLID
406   case GEOMOp::OpSelectCompound:     // POPUP MENU - SELECT ONLY - COMPOUND
407   case GEOMOp::OpSelectAll:          // POPUP MENU - SELECT ONLY - SELECT ALL
408   case GEOMOp::OpDelete:             // MENU EDIT - DELETE
409   case GEOMOp::OpCheckGeom:          // MENU TOOLS - CHECK GEOMETRY
410   case GEOMOp::OpDeflection:         // POPUP MENU - DEFLECTION COEFFICIENT
411   case GEOMOp::OpColor:              // POPUP MENU - COLOR
412   case GEOMOp::OpSetTexture:         // POPUP MENU - SETTEXTURE
413   case GEOMOp::OpTransparency:       // POPUP MENU - TRANSPARENCY
414   case GEOMOp::OpIncrTransparency:   // SHORTCUT   - INCREASE TRANSPARENCY
415   case GEOMOp::OpDecrTransparency:   // SHORTCUT   - DECREASE TRANSPARENCY
416   case GEOMOp::OpIsos:               // POPUP MENU - ISOS
417   case GEOMOp::OpIncrNbIsos:         // SHORTCUT   - INCREASE NB ISOS
418   case GEOMOp::OpDecrNbIsos:         // SHORTCUT   - DECREASE NB ISOS
419   case GEOMOp::OpAutoColor:          // POPUP MENU - AUTO COLOR
420   case GEOMOp::OpNoAutoColor:        // POPUP MENU - DISABLE AUTO COLOR
421   case GEOMOp::OpShowChildren:       // POPUP MENU - SHOW CHILDREN
422   case GEOMOp::OpHideChildren:       // POPUP MENU - HIDE CHILDREN
423   case GEOMOp::OpUnpublishObject:    // POPUP MENU - UNPUBLISH
424   case GEOMOp::OpPublishObject:      // ROOT GEOM OBJECT - POPUP MENU - PUBLISH
425   case GEOMOp::OpPointMarker:        // POPUP MENU - POINT MARKER
426   case GEOMOp::OpMaterialProperties: // POPUP MENU - MATERIAL PROPERTIES
427   case GEOMOp::OpEdgeWidth:          // POPUP MENU - LINE WIDTH - EDGE WIDTH
428   case GEOMOp::OpIsosWidth:          // POPUP MENU - LINE WIDTH - ISOS WIDTH
429   case GEOMOp::OpBringToFront:       // POPUP MENU - BRING TO FRONT
430   case GEOMOp::OpClsBringToFront:    //
431     libName = "GEOMToolsGUI";
432     break;
433   case GEOMOp::OpDisplayMode:        // MENU VIEW - WIREFRAME/SHADING
434   case GEOMOp::OpShowAll:            // MENU VIEW - SHOW ALL
435   case GEOMOp::OpShowOnly:           // MENU VIEW - DISPLAY ONLY
436   case GEOMOp::OpHideAll:            // MENU VIEW - ERASE ALL
437   case GEOMOp::OpHide:               // MENU VIEW - ERASE
438   case GEOMOp::OpShow:               // MENU VIEW - DISPLAY
439   case GEOMOp::OpSwitchVectors:      // MENU VIEW - VECTOR MODE
440   case GEOMOp::OpWireframe:          // POPUP MENU - WIREFRAME
441   case GEOMOp::OpShading:            // POPUP MENU - SHADING
442   case GEOMOp::OpShadingWithEdges:   // POPUP MENU - SHADING WITH EDGES
443   case GEOMOp::OpTexture:            // POPUP MENU - TEXTURE
444   case GEOMOp::OpVectors:            // POPUP MENU - VECTORS
445     libName = "DisplayGUI";
446     break;
447   case GEOMOp::OpPoint:              // MENU BASIC - POINT
448   case GEOMOp::OpLine:               // MENU BASIC - LINE
449   case GEOMOp::OpCircle:             // MENU BASIC - CIRCLE
450   case GEOMOp::OpEllipse:            // MENU BASIC - ELLIPSE
451   case GEOMOp::OpArc:                // MENU BASIC - ARC
452   case GEOMOp::OpVector:             // MENU BASIC - VECTOR
453   case GEOMOp::OpPlane:              // MENU BASIC - PLANE
454   case GEOMOp::OpCurve:              // MENU BASIC - CURVE
455   case GEOMOp::OpLCS:                // MENU BASIC - LOCAL COORDINATE SYSTEM
456     libName = "BasicGUI";
457     break;
458   case GEOMOp::OpBox:                // MENU PRIMITIVE - BOX
459   case GEOMOp::OpCylinder:           // MENU PRIMITIVE - CYLINDER
460   case GEOMOp::OpSphere:             // MENU PRIMITIVE - SPHERE
461   case GEOMOp::OpTorus:              // MENU PRIMITIVE - TORUS
462   case GEOMOp::OpCone:               // MENU PRIMITIVE - CONE
463   case GEOMOp::OpRectangle:          // MENU PRIMITIVE - FACE
464   case GEOMOp::OpDisk:               // MENU PRIMITIVE - DISK
465     libName = "PrimitiveGUI";
466     break;
467   case GEOMOp::OpPrism:              // MENU GENERATION - PRISM
468   case GEOMOp::OpRevolution:         // MENU GENERATION - REVOLUTION
469   case GEOMOp::OpFilling:            // MENU GENERATION - FILLING
470   case GEOMOp::OpPipe:               // MENU GENERATION - PIPE
471     libName = "GenerationGUI";
472     break;
473   case GEOMOp::Op2dSketcher:         // MENU ENTITY - SKETCHER
474   case GEOMOp::Op3dSketcher:         // MENU ENTITY - 3D SKETCHER
475   case GEOMOp::OpExplode:            // MENU ENTITY - EXPLODE
476 #ifdef WITH_OPENCV
477   case GEOMOp::OpFeatureDetect:      // MENU ENTITY - FEATURE DETECTION
478 #endif
479   case GEOMOp::OpPictureImport:      // MENU ENTITY - IMPORT PICTURE IN VIEWER
480     libName = "EntityGUI";
481     break;
482   case GEOMOp::OpEdge:               // MENU BUILD - EDGE
483   case GEOMOp::OpWire:               // MENU BUILD - WIRE
484   case GEOMOp::OpFace:               // MENU BUILD - FACE
485   case GEOMOp::OpShell:              // MENU BUILD - SHELL
486   case GEOMOp::OpSolid:              // MENU BUILD - SOLID
487   case GEOMOp::OpCompound:           // MENU BUILD - COMPUND
488     libName = "BuildGUI";
489     break;
490   case GEOMOp::OpFuse:               // MENU BOOLEAN - FUSE
491   case GEOMOp::OpCommon:             // MENU BOOLEAN - COMMON
492   case GEOMOp::OpCut:                // MENU BOOLEAN - CUT
493   case GEOMOp::OpSection:            // MENU BOOLEAN - SECTION
494     libName = "BooleanGUI";
495     break;
496   case GEOMOp::OpTranslate:          // MENU TRANSFORMATION - TRANSLATION
497   case GEOMOp::OpRotate:             // MENU TRANSFORMATION - ROTATION
498   case GEOMOp::OpChangeLoc:          // MENU TRANSFORMATION - LOCATION
499   case GEOMOp::OpMirror:             // MENU TRANSFORMATION - MIRROR
500   case GEOMOp::OpScale:              // MENU TRANSFORMATION - SCALE
501   case GEOMOp::OpOffset:             // MENU TRANSFORMATION - OFFSET
502   case GEOMOp::OpProjection:         // MENU TRANSFORMATION - PROJECTION
503   case GEOMOp::OpMultiTranslate:     // MENU TRANSFORMATION - MULTI-TRANSLATION
504   case GEOMOp::OpMultiRotate:        // MENU TRANSFORMATION - MULTI-ROTATION
505   case GEOMOp::OpReimport:           // CONTEXT(POPUP) MENU - RELOAD_IMPORTED
506     libName = "TransformationGUI";
507     break;
508   case GEOMOp::OpPartition:          // MENU OPERATION - PARTITION
509   case GEOMOp::OpArchimede:          // MENU OPERATION - ARCHIMEDE
510   case GEOMOp::OpFillet3d:           // MENU OPERATION - FILLET
511   case GEOMOp::OpChamfer:            // MENU OPERATION - CHAMFER
512   case GEOMOp::OpClipping:           // MENU OPERATION - CLIPPING RANGE
513   case GEOMOp::OpShapesOnShape:      // MENU OPERATION - GET SHAPES ON SHAPE
514   case GEOMOp::OpFillet2d:           // MENU OPERATION - FILLET 2D
515   case GEOMOp::OpFillet1d:           // MENU OPERATION - FILLET 1D
516   case GEOMOp::OpSharedShapes:       // MENU OPERATION - GET SHARED SHAPES
517   case GEOMOp::OpExtrudedBoss:       // MENU OPERATION - EXTRUDED BOSS
518   case GEOMOp::OpExtrudedCut:        // MENU OPERATION - EXTRUDED CUT
519     libName = "OperationGUI";
520     break;
521   case GEOMOp::OpSewing:             // MENU REPAIR - SEWING
522   case GEOMOp::OpSuppressFaces:      // MENU REPAIR - SUPPRESS FACES
523   case GEOMOp::OpSuppressHoles:      // MENU REPAIR - SUPPRESS HOLE
524   case GEOMOp::OpShapeProcess:       // MENU REPAIR - SHAPE PROCESSING
525   case GEOMOp::OpCloseContour:       // MENU REPAIR - CLOSE CONTOUR
526   case GEOMOp::OpRemoveIntWires:     // MENU REPAIR - REMOVE INTERNAL WIRES
527   case GEOMOp::OpAddPointOnEdge:     // MENU REPAIR - ADD POINT ON EDGE
528   case GEOMOp::OpFreeBoundaries:     // MENU MEASURE - FREE BOUNDARIES
529   case GEOMOp::OpFreeFaces:          // MENU MEASURE - FREE FACES
530   case GEOMOp::OpOrientation:        // MENU REPAIR - CHANGE ORIENTATION
531   case GEOMOp::OpGlueFaces:          // MENU REPAIR - GLUE FACES
532   case GEOMOp::OpGlueEdges:          // MENU REPAIR - GLUE EDGES
533   case GEOMOp::OpLimitTolerance:     // MENU REPAIR - LIMIT TOLERANCE
534   case GEOMOp::OpRemoveExtraEdges:   // MENU REPAIR - REMOVE EXTRA EDGES
535     libName = "RepairGUI";
536     break;
537   case GEOMOp::OpProperties:         // MENU MEASURE - PROPERTIES
538   case GEOMOp::OpCenterMass:         // MENU MEASURE - CDG
539   case GEOMOp::OpInertia:            // MENU MEASURE - INERTIA
540   case GEOMOp::OpNormale:            // MENU MEASURE - NORMALE
541   case GEOMOp::OpBoundingBox:        // MENU MEASURE - BOUNDING BOX
542   case GEOMOp::OpMinDistance:        // MENU MEASURE - MIN DISTANCE
543   case GEOMOp::OpAngle:              // MENU MEASURE - ANGLE
544   case GEOMOp::OpTolerance:          // MENU MEASURE - TOLERANCE
545   case GEOMOp::OpWhatIs:             // MENU MEASURE - WHATIS
546   case GEOMOp::OpCheckShape:         // MENU MEASURE - CHECK
547   case GEOMOp::OpCheckCompound:      // MENU MEASURE - CHECK COMPOUND OF BLOCKS
548   case GEOMOp::OpPointCoordinates:   // MENU MEASURE - POINT COORDINATES
549   case GEOMOp::OpCheckSelfInters:    // MENU MEASURE - CHECK SELF INTERSECTIONS
550     libName = "MeasureGUI";
551     break;
552   case GEOMOp::OpGroupCreate:        // MENU GROUP - CREATE
553   case GEOMOp::OpGroupCreatePopup:   // POPUP MENU - CREATE GROUP
554   case GEOMOp::OpGroupEdit:          // MENU GROUP - EDIT
555     libName = "GroupGUI";
556     break;
557   case GEOMOp::OpHexaSolid:          // MENU BLOCKS - HEXAHEDRAL SOLID
558   case GEOMOp::OpMultiTransform:     // MENU BLOCKS - MULTI-TRANSFORMATION
559   case GEOMOp::OpQuadFace:           // MENU BLOCKS - QUADRANGLE FACE
560   case GEOMOp::OpPropagate:          // MENU BLOCKS - PROPAGATE
561   case GEOMOp::OpExplodeBlock:       // MENU BLOCKS - EXPLODE ON BLOCKS
562     libName = "BlocksGUI";
563     break;
564   case GEOMOp::OpAdvancedNoOp:       // NO OPERATION (advanced operations base)
565   case GEOMOp::OpPipeTShape:         // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE
566 //   case GEOMOp::OpPipeTShapeGroups:     // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS
567     //@@ 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 @@//
568     libName = "AdvancedGUI";
569     break;
570   default:
571     break;
572   }
573
574   GEOMGUI* library = 0;
575   if ( !libName.isEmpty() ) {
576 #ifndef WNT
577     libName = QString( "lib" ) + libName + ".so";
578 #else
579     libName = libName + ".dll";
580 #endif
581     library = getLibrary( libName );
582   }
583
584   // call method of corresponding GUI library
585   if ( library ) {
586     library->OnGUIEvent( id, desk );
587     
588     // Update a list of materials for "Preferences" dialog
589     if ( id == GEOMOp::OpMaterialProperties ) {
590       LightApp_Preferences* pref = preferences();
591       if ( pref ) {
592         Material_ResourceMgr aMatResMgr;
593         QStringList aPerfMatNames = aMatResMgr.getPreferenceMaterialsNames();
594         setPreferenceProperty( pref->rootItem()->findItem( tr( "PREF_MATERIAL" ), true )->id(),
595                                "strings",
596                                aPerfMatNames );
597       }
598     }
599   }
600   else
601     SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) );
602 }
603
604 //=================================================================================
605 // function : GeometryGUI::OnKeyPress()
606 // purpose  : Called when any key is pressed by user [static]
607 //=================================================================================
608 void GeometryGUI::OnKeyPress( SUIT_ViewWindow* w, QKeyEvent* e )
609 {
610   if ( !application() )
611     return;
612   foreach ( GEOMGUI* lib, myGUIMap )
613     lib->OnKeyPress( e, application()->desktop(), w );
614 }
615
616 //=================================================================================
617 // function : GeometryGUI::OnMouseMove()
618 // purpose  : Manages mouse move events [static]
619 //=================================================================================
620 void GeometryGUI::OnMouseMove( SUIT_ViewWindow* w, QMouseEvent* e )
621 {
622   if ( !application() )
623     return;
624   foreach ( GEOMGUI* lib, myGUIMap )
625     lib->OnMouseMove( e, application()->desktop(), w );
626 }
627
628 //=================================================================================
629 // function : GeometryGUI::OnMouseRelease()
630 // purpose  : Manages mouse release events [static]
631 //=================================================================================
632 void GeometryGUI::OnMouseRelease( SUIT_ViewWindow* w, QMouseEvent* e )
633 {
634   if ( !application() )
635     return;
636   foreach ( GEOMGUI* lib, myGUIMap )
637     lib->OnMouseRelease( e, application()->desktop(), w );
638 }
639
640 //=================================================================================
641 // function : GeometryGUI::OnMousePress()
642 // purpose  : Manage mouse press events [static]
643 //=================================================================================
644 void GeometryGUI::OnMousePress( SUIT_ViewWindow* w, QMouseEvent* e )
645 {
646   if ( !application() )
647     return;
648   foreach ( GEOMGUI* lib, myGUIMap )
649     lib->OnMousePress( e, application()->desktop(), w );
650 }
651
652 //=======================================================================
653 // function : createGeomAction
654 // purpose  :
655 //=======================================================================
656 void GeometryGUI::createGeomAction( const int id, const QString& label, const QString& icolabel,
657                                     const int accel, const bool toggle, const QString& shortcutAction )
658 {
659   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
660   QPixmap icon = icolabel.isEmpty() ? resMgr->loadPixmap( "GEOM", tr( (QString( "ICO_" )+label).toLatin1().constData() ), false )
661                                     : resMgr->loadPixmap( "GEOM", tr( icolabel.toLatin1().constData() ) );
662   createAction( id,
663                 tr( QString( "TOP_%1" ).arg( label ).toLatin1().constData() ),
664                 icon,
665                 tr( QString( "MEN_%1" ).arg( label ).toLatin1().constData() ),
666                 tr( QString( "STB_%1" ).arg( label ).toLatin1().constData() ),
667                 accel,
668                 application()->desktop(),
669                 toggle,
670                 this, SLOT( OnGUIEvent() ),
671                 shortcutAction );
672 }
673
674 //=======================================================================
675 // function : createOriginAndBaseVectors
676 // purpose  :
677 //=======================================================================
678 void GeometryGUI::createOriginAndBaseVectors()
679 {
680   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
681   if( appStudy ) {
682     _PTR(Study) studyDS = appStudy->studyDS();
683     if( studyDS && !CORBA::is_nil( GetGeomGen() ) ) {
684       GEOM::GEOM_IBasicOperations_var aBasicOperations = GetGeomGen()->GetIBasicOperations( studyDS->StudyId() );
685       if( !aBasicOperations->_is_nil() ) {
686         SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
687         double aLength = aResourceMgr->doubleValue( "Geometry", "base_vectors_length", 1.0 );
688         GEOM::GEOM_Object_var anOrigin = aBasicOperations->MakePointXYZ( 0.0, 0.0, 0.0 );
689         GEOM::GEOM_Object_var anOX = aBasicOperations->MakeVectorDXDYDZ( aLength, 0.0, 0.0 );
690         GEOM::GEOM_Object_var anOY = aBasicOperations->MakeVectorDXDYDZ( 0.0, aLength, 0.0 );
691         GEOM::GEOM_Object_var anOZ = aBasicOperations->MakeVectorDXDYDZ( 0.0, 0.0, aLength );
692
693         SALOMEDS::Study_var aDSStudy = ClientStudyToStudy( studyDS );
694         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOrigin, "O" );
695         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOX, "OX" );
696         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOY, "OY" );
697         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOZ, "OZ" );
698
699         getApp()->updateObjectBrowser( false );
700       }
701     }
702   }
703 }
704
705 //=======================================================================
706 // function : GeometryGUI::initialize()
707 // purpose  : Called when GEOM module is created
708 //=======================================================================
709 void GeometryGUI::initialize( CAM_Application* app )
710 {
711   SalomeApp_Module::initialize( app );
712
713   // ----- create actions --------------
714
715   createGeomAction( GEOMOp::OpImport,     "IMPORT", "", Qt::ControlModifier + Qt::Key_I );
716   createGeomAction( GEOMOp::OpExport,     "EXPORT", "", Qt::ControlModifier + Qt::Key_E );
717
718   createGeomAction( GEOMOp::OpDelete,     "DELETE", "", Qt::Key_Delete );
719
720   createGeomAction( GEOMOp::OpPoint,      "POINT" );
721   createGeomAction( GEOMOp::OpLine,       "LINE" );
722   createGeomAction( GEOMOp::OpCircle,     "CIRCLE" );
723   createGeomAction( GEOMOp::OpEllipse,    "ELLIPSE" );
724   createGeomAction( GEOMOp::OpArc,        "ARC" );
725   createGeomAction( GEOMOp::OpCurve,      "CURVE" );
726   createGeomAction( GEOMOp::OpVector,     "VECTOR" );
727   createGeomAction( GEOMOp::OpPlane,      "PLANE" );
728   createGeomAction( GEOMOp::OpLCS,        "LOCAL_CS" );
729   createGeomAction( GEOMOp::OpOriginAndVectors, "ORIGIN_AND_VECTORS" );
730
731   createGeomAction( GEOMOp::OpBox,        "BOX" );
732   createGeomAction( GEOMOp::OpCylinder,   "CYLINDER" );
733   createGeomAction( GEOMOp::OpSphere,     "SPHERE" );
734   createGeomAction( GEOMOp::OpTorus,      "TORUS" );
735   createGeomAction( GEOMOp::OpCone,       "CONE" );
736   createGeomAction( GEOMOp::OpRectangle,  "RECTANGLE" );
737   createGeomAction( GEOMOp::OpDisk,       "DISK" );
738
739   createGeomAction( GEOMOp::OpPrism,       "EXTRUSION" );
740   createGeomAction( GEOMOp::OpRevolution,  "REVOLUTION" );
741   createGeomAction( GEOMOp::OpFilling,     "FILLING" );
742   createGeomAction( GEOMOp::OpPipe,        "PIPE" );
743
744   createGeomAction( GEOMOp::OpGroupCreate, "GROUP_CREATE" );
745   createGeomAction( GEOMOp::OpGroupEdit,   "GROUP_EDIT" );
746
747   createGeomAction( GEOMOp::OpReimport,    "RELOAD_IMPORTED" );
748
749   createGeomAction( GEOMOp::OpQuadFace,    "Q_FACE" );
750   createGeomAction( GEOMOp::OpHexaSolid,   "HEX_SOLID" );
751
752   createGeomAction( GEOMOp::Op2dSketcher,  "SKETCH" );
753   createGeomAction( GEOMOp::Op3dSketcher,  "3DSKETCH" );
754   createGeomAction( GEOMOp::OpExplode,     "EXPLODE" );
755 #ifdef WITH_OPENCV
756   createGeomAction( GEOMOp::OpFeatureDetect,"FEATURE_DETECTION" );
757 #endif
758   createGeomAction( GEOMOp::OpPictureImport,"PICTURE_IMPORT" );
759
760   createGeomAction( GEOMOp::OpEdge,        "EDGE" );
761   createGeomAction( GEOMOp::OpWire,        "WIRE" );
762   createGeomAction( GEOMOp::OpFace,        "FACE" );
763   createGeomAction( GEOMOp::OpShell,       "SHELL" );
764   createGeomAction( GEOMOp::OpSolid,       "SOLID" );
765   createGeomAction( GEOMOp::OpCompound,    "COMPOUND" );
766
767   createGeomAction( GEOMOp::OpFuse,        "FUSE" );
768   createGeomAction( GEOMOp::OpCommon,      "COMMON" );
769   createGeomAction( GEOMOp::OpCut,         "CUT" );
770   createGeomAction( GEOMOp::OpSection,     "SECTION" );
771
772   createGeomAction( GEOMOp::OpTranslate,      "TRANSLATION" );
773   createGeomAction( GEOMOp::OpRotate,         "ROTATION" );
774   createGeomAction( GEOMOp::OpChangeLoc,      "MODIFY_LOCATION" );
775   createGeomAction( GEOMOp::OpMirror,         "MIRROR" );
776   createGeomAction( GEOMOp::OpScale,          "SCALE" );
777   createGeomAction( GEOMOp::OpOffset,         "OFFSET" );
778   createGeomAction( GEOMOp::OpProjection,     "PROJECTION" );
779   createGeomAction( GEOMOp::OpMultiTranslate, "MUL_TRANSLATION" );
780   createGeomAction( GEOMOp::OpMultiRotate,    "MUL_ROTATION" );
781
782   createGeomAction( GEOMOp::OpPartition,      "PARTITION" );
783   createGeomAction( GEOMOp::OpArchimede,      "ARCHIMEDE" );
784   createGeomAction( GEOMOp::OpFillet3d,       "FILLET" );
785   createGeomAction( GEOMOp::OpChamfer,        "CHAMFER" );
786   //createGeomAction( GEOMOp::OpClipping,        "CLIPPING" );
787   createGeomAction( GEOMOp::OpShapesOnShape,  "GET_SHAPES_ON_SHAPE" );
788   createGeomAction( GEOMOp::OpSharedShapes,   "GET_SHARED_SHAPES" );
789   createGeomAction( GEOMOp::OpExtrudedCut,    "EXTRUDED_CUT" );
790   createGeomAction( GEOMOp::OpExtrudedBoss,   "EXTRUDED_BOSS" );
791   createGeomAction( GEOMOp::OpFillet1d,       "FILLET_1D" );
792   createGeomAction( GEOMOp::OpFillet2d,       "FILLET_2D" );
793
794   createGeomAction( GEOMOp::OpMultiTransform, "MUL_TRANSFORM" );
795   createGeomAction( GEOMOp::OpExplodeBlock,   "EXPLODE_BLOCKS" );
796   createGeomAction( GEOMOp::OpPropagate,      "PROPAGATE" );
797
798   createGeomAction( GEOMOp::OpSewing,           "SEWING" );
799   createGeomAction( GEOMOp::OpGlueFaces,        "GLUE_FACES" );
800   createGeomAction( GEOMOp::OpGlueEdges,        "GLUE_EDGES" );
801   createGeomAction( GEOMOp::OpLimitTolerance,   "LIMIT_TOLERANCE" );
802   createGeomAction( GEOMOp::OpSuppressFaces,    "SUPPRESS_FACES" );
803   createGeomAction( GEOMOp::OpSuppressHoles,    "SUPPERSS_HOLES" );
804   createGeomAction( GEOMOp::OpShapeProcess,     "SHAPE_PROCESS" );
805   createGeomAction( GEOMOp::OpCloseContour,     "CLOSE_CONTOUR" );
806   createGeomAction( GEOMOp::OpRemoveIntWires,   "SUPPRESS_INT_WIRES" );
807   createGeomAction( GEOMOp::OpAddPointOnEdge,   "POINT_ON_EDGE" );
808   createGeomAction( GEOMOp::OpFreeBoundaries,   "CHECK_FREE_BNDS" );
809   createGeomAction( GEOMOp::OpFreeFaces,        "CHECK_FREE_FACES" );
810   createGeomAction( GEOMOp::OpOrientation,      "CHANGE_ORIENTATION" );
811   createGeomAction( GEOMOp::OpRemoveExtraEdges, "REMOVE_EXTRA_EDGES" );
812
813   createGeomAction( GEOMOp::OpPointCoordinates, "POINT_COORDS" );
814   createGeomAction( GEOMOp::OpProperties,       "BASIC_PROPS" );
815   createGeomAction( GEOMOp::OpCenterMass,       "MASS_CENTER" );
816   createGeomAction( GEOMOp::OpInertia,          "INERTIA" );
817   createGeomAction( GEOMOp::OpNormale,          "NORMALE" );
818   createGeomAction( GEOMOp::OpBoundingBox,      "BND_BOX" );
819   createGeomAction( GEOMOp::OpMinDistance,      "MIN_DIST" );
820   createGeomAction( GEOMOp::OpAngle,            "MEASURE_ANGLE" );
821
822   createGeomAction( GEOMOp::OpTolerance,        "TOLERANCE" );
823   createGeomAction( GEOMOp::OpWhatIs,           "WHAT_IS" );
824   createGeomAction( GEOMOp::OpCheckShape,       "CHECK" );
825   createGeomAction( GEOMOp::OpCheckCompound,    "CHECK_COMPOUND" );
826   createGeomAction( GEOMOp::OpCheckSelfInters,  "CHECK_SELF_INTERSECTIONS" );
827
828 #ifdef _DEBUG_ // PAL16821
829   createGeomAction( GEOMOp::OpCheckGeom,        "CHECK_GEOMETRY" );
830 #endif
831
832   createGeomAction( GEOMOp::OpDisplayMode,      "SHADING" );
833   createGeomAction( GEOMOp::OpShowAll,          "DISPLAY_ALL" );
834   createGeomAction( GEOMOp::OpHideAll,          "ERASE_ALL" );
835   createGeomAction( GEOMOp::OpShow,             "DISPLAY" );
836   createGeomAction( GEOMOp::OpSwitchVectors,    "VECTOR_MODE");
837   createGeomAction( GEOMOp::OpSelectVertex,     "VERTEX_SEL_ONLY" ,"", 0, true );
838   createGeomAction( GEOMOp::OpSelectEdge,       "EDGE_SEL_ONLY", "", 0, true );
839   createGeomAction( GEOMOp::OpSelectWire,       "WIRE_SEL_ONLY", "",  0, true );
840   createGeomAction( GEOMOp::OpSelectFace,       "FACE_SEL_ONLY", "", 0, true );
841   createGeomAction( GEOMOp::OpSelectShell,      "SHELL_SEL_ONLY", "",  0, true );
842   createGeomAction( GEOMOp::OpSelectSolid,      "SOLID_SEL_ONLY", "", 0, true );
843   createGeomAction( GEOMOp::OpSelectCompound,   "COMPOUND_SEL_ONLY", "",  0, true );
844   createGeomAction( GEOMOp::OpSelectAll,        "ALL_SEL_ONLY", "",  0, true );
845   createGeomAction( GEOMOp::OpShowOnly,         "DISPLAY_ONLY" );
846   createGeomAction( GEOMOp::OpBringToFront,     "BRING_TO_FRONT", "", 0, true );
847   createGeomAction( GEOMOp::OpClsBringToFront,  "CLS_BRING_TO_FRONT" );
848   createGeomAction( GEOMOp::OpHide,             "ERASE" );
849
850   createGeomAction( GEOMOp::OpWireframe,        "POP_WIREFRAME", "", 0, true );
851   createGeomAction( GEOMOp::OpShading,          "POP_SHADING", "", 0, true );
852   createGeomAction( GEOMOp::OpShadingWithEdges, "POP_SHADING_WITH_EDGES", "", 0, true );
853   createGeomAction( GEOMOp::OpTexture,          "POP_TEXTURE", "", 0, true );
854   createGeomAction( GEOMOp::OpEdgeWidth,        "EDGE_WIDTH");
855   createGeomAction( GEOMOp::OpIsosWidth,        "ISOS_WIDTH");
856   createGeomAction( GEOMOp::OpVectors,          "POP_VECTORS", "", 0, true );
857   createGeomAction( GEOMOp::OpDeflection,       "POP_DEFLECTION" );
858   createGeomAction( GEOMOp::OpColor,            "POP_COLOR" );
859   createGeomAction( GEOMOp::OpSetTexture,       "POP_SETTEXTURE" );
860   createGeomAction( GEOMOp::OpTransparency,     "POP_TRANSPARENCY" );
861   createGeomAction( GEOMOp::OpIsos,             "POP_ISOS" );
862   createGeomAction( GEOMOp::OpAutoColor,        "POP_AUTO_COLOR" );
863   createGeomAction( GEOMOp::OpNoAutoColor,      "POP_DISABLE_AUTO_COLOR" );
864   createGeomAction( GEOMOp::OpGroupCreatePopup, "POP_CREATE_GROUP" );
865   createGeomAction( GEOMOp::OpShowChildren,     "POP_SHOW_CHILDREN" );
866   createGeomAction( GEOMOp::OpHideChildren,     "POP_HIDE_CHILDREN" );
867   createGeomAction( GEOMOp::OpUnpublishObject,  "POP_UNPUBLISH_OBJ" );
868   createGeomAction( GEOMOp::OpPublishObject,    "POP_PUBLISH_OBJ" );
869   createGeomAction( GEOMOp::OpPointMarker,      "POP_POINT_MARKER" );
870   createGeomAction( GEOMOp::OpMaterialProperties, "POP_MATERIAL_PROPERTIES" );
871
872   createGeomAction( GEOMOp::OpPipeTShape, "PIPETSHAPE" );
873
874   // Create actions for increase/decrease transparency shortcuts
875   createGeomAction( GEOMOp::OpIncrTransparency, "", "", 0, false,
876                     "Geometry:Increase transparency");
877   createGeomAction( GEOMOp::OpDecrTransparency, "", "", 0, false,
878                     "Geometry:Decrease transparency");
879
880   // Create actions for increase/decrease number of isolines
881   createGeomAction( GEOMOp::OpIncrNbIsos, "", "", 0, false,
882                     "Geometry:Increase number of isolines");
883   createGeomAction( GEOMOp::OpDecrNbIsos, "", "", 0, false,
884                     "Geometry:Decrease number of isolines");
885
886 //   createGeomAction( GEOMOp::OpPipeTShapeGroups, "PIPETSHAPEGROUPS" );
887   //@@ 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 @@//
888
889   // ---- create menus --------------------------
890
891   int fileId = createMenu( tr( "MEN_FILE" ), -1, -1 );
892   createMenu( separator(),      fileId, 10 );
893   createMenu( GEOMOp::OpImport, fileId, 10 );
894   createMenu( GEOMOp::OpExport, fileId, 10 );
895   createMenu( separator(),      fileId, -1 );
896
897   int editId = createMenu( tr( "MEN_EDIT" ), -1, -1 );
898   createMenu( GEOMOp::OpDelete, editId, -1 );
899
900   int newEntId = createMenu( tr( "MEN_NEW_ENTITY" ), -1, -1, 10 );
901
902   int basicId = createMenu( tr( "MEN_BASIC" ), newEntId, -1 );
903   createMenu( GEOMOp::OpPoint,   basicId, -1 );
904   createMenu( GEOMOp::OpLine,    basicId, -1 );
905   createMenu( GEOMOp::OpCircle,  basicId, -1 );
906   createMenu( GEOMOp::OpEllipse, basicId, -1 );
907   createMenu( GEOMOp::OpArc,     basicId, -1 );
908   createMenu( GEOMOp::OpCurve,   basicId, -1 );
909   createMenu( separator(),       basicId, -1 );
910   createMenu( GEOMOp::Op2dSketcher, basicId, -1 );
911   createMenu( GEOMOp::Op3dSketcher, basicId, -1 );
912   createMenu( GEOMOp::OpVector,  basicId, -1 );
913   createMenu( GEOMOp::OpPlane,   basicId, -1 );
914   createMenu( GEOMOp::OpLCS,     basicId, -1 );
915   createMenu( GEOMOp::OpOriginAndVectors, basicId, -1 );
916
917   int primId = createMenu( tr( "MEN_PRIMITIVES" ), newEntId, -1 );
918   createMenu( GEOMOp::OpBox,       primId, -1 );
919   createMenu( GEOMOp::OpCylinder,  primId, -1 );
920   createMenu( GEOMOp::OpSphere,    primId, -1 );
921   createMenu( GEOMOp::OpTorus,     primId, -1 );
922   createMenu( GEOMOp::OpCone,      primId, -1 );
923   createMenu( GEOMOp::OpRectangle, primId, -1 );
924   createMenu( GEOMOp::OpDisk,      primId, -1 );
925   createMenu( GEOMOp::OpPipeTShape,primId, -1 );
926
927   int genId = createMenu( tr( "MEN_GENERATION" ), newEntId, -1 );
928   createMenu( GEOMOp::OpPrism,      genId, -1 );
929   createMenu( GEOMOp::OpRevolution, genId, -1 );
930   createMenu( GEOMOp::OpFilling,    genId, -1 );
931   createMenu( GEOMOp::OpPipe,       genId, -1 );
932
933 //   int advId = createMenu( tr( "MEN_ADVANCED" ), newEntId, -1 );
934 //   createMenu( GEOMOp::OpPipeTShape, advId, -1 );
935 //   createMenu( GEOMOp::OpPipeTShapeGroups, advId, -1 );
936   //@@ 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 @@//
937
938   createMenu( separator(), newEntId, -1 );
939
940   int groupId = createMenu( tr( "MEN_GROUP" ), newEntId, -1 );
941   createMenu( GEOMOp::OpGroupCreate, groupId, -1 );
942   createMenu( GEOMOp::OpGroupEdit,   groupId, -1 );
943
944   createMenu( separator(), newEntId, -1 );
945
946   int blocksId = createMenu( tr( "MEN_BLOCKS" ), newEntId, -1 );
947   createMenu( GEOMOp::OpQuadFace,  blocksId, -1 );
948   createMenu( GEOMOp::OpHexaSolid, blocksId, -1 );
949
950   createMenu( separator(),          newEntId, -1 );
951
952   createMenu( GEOMOp::OpExplode,    newEntId, -1 );
953
954   int buildId = createMenu( tr( "MEN_BUILD" ), newEntId, -1 );
955   createMenu( GEOMOp::OpEdge,     buildId, -1 );
956   createMenu( GEOMOp::OpWire,     buildId, -1 );
957   createMenu( GEOMOp::OpFace,     buildId, -1 );
958   createMenu( GEOMOp::OpShell,    buildId, -1 );
959   createMenu( GEOMOp::OpSolid,    buildId, -1 );
960   createMenu( GEOMOp::OpCompound, buildId, -1 );
961   
962   createMenu( separator(),          newEntId, -1 );
963   
964   createMenu( GEOMOp::OpPictureImport, newEntId, -1 );
965 #ifdef WITH_OPENCV
966   createMenu( GEOMOp::OpFeatureDetect, newEntId, -1 );
967 #endif
968
969   int operId = createMenu( tr( "MEN_OPERATIONS" ), -1, -1, 10 );
970
971   int boolId = createMenu( tr( "MEN_BOOLEAN" ), operId, -1 );
972   createMenu( GEOMOp::OpFuse,    boolId, -1 );
973   createMenu( GEOMOp::OpCommon,  boolId, -1 );
974   createMenu( GEOMOp::OpCut,     boolId, -1 );
975   createMenu( GEOMOp::OpSection, boolId, -1 );
976
977   int transId = createMenu( tr( "MEN_TRANSFORMATION" ), operId, -1 );
978   createMenu( GEOMOp::OpTranslate,      transId, -1 );
979   createMenu( GEOMOp::OpRotate,         transId, -1 );
980   createMenu( GEOMOp::OpChangeLoc,      transId, -1 );
981   createMenu( GEOMOp::OpMirror,         transId, -1 );
982   createMenu( GEOMOp::OpScale,          transId, -1 );
983   createMenu( GEOMOp::OpOffset,         transId, -1 );
984   createMenu( GEOMOp::OpProjection,     transId, -1 );
985   createMenu( separator(),              transId, -1 );
986   createMenu( GEOMOp::OpMultiTranslate, transId, -1 );
987   createMenu( GEOMOp::OpMultiRotate,    transId, -1 );
988
989   int blockId = createMenu( tr( "MEN_BLOCKS" ), operId, -1 );
990   createMenu( GEOMOp::OpMultiTransform, blockId, -1 );
991   createMenu( GEOMOp::OpExplodeBlock,   blockId, -1 );
992   createMenu( GEOMOp::OpPropagate,      blockId, -1 );
993
994   createMenu( separator(), operId, -1 );
995
996   createMenu( GEOMOp::OpPartition,     operId, -1 );
997   createMenu( GEOMOp::OpArchimede,     operId, -1 );
998   createMenu( GEOMOp::OpShapesOnShape, operId, -1 );
999   createMenu( GEOMOp::OpSharedShapes,  operId, -1 );
1000
1001   createMenu( separator(), operId, -1 );
1002
1003   createMenu( GEOMOp::OpFillet1d,      operId, -1 );
1004   createMenu( GEOMOp::OpFillet2d,      operId, -1 );
1005   createMenu( GEOMOp::OpFillet3d,      operId, -1 );
1006   createMenu( GEOMOp::OpChamfer,       operId, -1 );
1007   createMenu( GEOMOp::OpExtrudedBoss,  operId, -1 );
1008   createMenu( GEOMOp::OpExtrudedCut,   operId, -1 );
1009   //createMenu( GEOMOp::OpClipping,      operId, -1 );
1010
1011   int repairId = createMenu( tr( "MEN_REPAIR" ), -1, -1, 10 );
1012   createMenu( GEOMOp::OpShapeProcess,    repairId, -1 );
1013   createMenu( GEOMOp::OpSuppressFaces,   repairId, -1 );
1014   createMenu( GEOMOp::OpCloseContour,    repairId, -1 );
1015   createMenu( GEOMOp::OpRemoveIntWires,  repairId, -1 );
1016   createMenu( GEOMOp::OpSuppressHoles,   repairId, -1 );
1017   createMenu( GEOMOp::OpSewing,          repairId, -1 );
1018   createMenu( GEOMOp::OpGlueFaces,       repairId, -1 );
1019   createMenu( GEOMOp::OpGlueEdges,       repairId, -1 );
1020   createMenu( GEOMOp::OpLimitTolerance,  repairId, -1 );
1021   createMenu( GEOMOp::OpAddPointOnEdge,  repairId, -1 );
1022   //createMenu( GEOMOp::OpFreeBoundaries,  repairId, -1 );
1023   //createMenu( GEOMOp::OpFreeFaces,       repairId, -1 );
1024   createMenu( GEOMOp::OpOrientation,      repairId, -1 );
1025   createMenu( GEOMOp::OpRemoveExtraEdges, repairId, -1 );
1026
1027   int measurId = createMenu( tr( "MEN_MEASURES" ), -1, -1, 10 );
1028   createMenu( GEOMOp::OpPointCoordinates, measurId, -1 );
1029   createMenu( GEOMOp::OpProperties,       measurId, -1 );
1030   createMenu( separator(),                measurId, -1 );
1031   createMenu( GEOMOp::OpCenterMass,       measurId, -1 );
1032   createMenu( GEOMOp::OpInertia,          measurId, -1 );
1033   createMenu( GEOMOp::OpNormale,          measurId, -1 );
1034   createMenu( separator(),                measurId, -1 );
1035   createMenu( GEOMOp::OpFreeBoundaries,   measurId, -1 );
1036   createMenu( GEOMOp::OpFreeFaces,        measurId, -1 );
1037   createMenu( separator(),                measurId, -1 );
1038
1039   int dimId = createMenu( tr( "MEN_DIMENSIONS" ), measurId, -1 );
1040   createMenu( GEOMOp::OpBoundingBox, dimId, -1 );
1041   createMenu( GEOMOp::OpMinDistance, dimId, -1 );
1042   createMenu( GEOMOp::OpAngle,       dimId, -1 );
1043
1044   createMenu( separator(),               measurId, -1 );
1045   createMenu( GEOMOp::OpTolerance,       measurId, -1 );
1046   createMenu( separator(),               measurId, -1 );
1047   createMenu( GEOMOp::OpWhatIs,          measurId, -1 );
1048   createMenu( GEOMOp::OpCheckShape,      measurId, -1 );
1049   createMenu( GEOMOp::OpCheckCompound,   measurId, -1 );
1050   createMenu( GEOMOp::OpCheckSelfInters, measurId, -1 );
1051
1052 #ifdef _DEBUG_ // PAL16821
1053   int toolsId = createMenu( tr( "MEN_TOOLS" ), -1, -1, 50 );
1054   createMenu( separator(),         toolsId, -1 );
1055   createMenu( GEOMOp::OpCheckGeom, toolsId, -1 );
1056 #endif
1057
1058   int viewId = createMenu( tr( "MEN_VIEW" ), -1, -1 );
1059   createMenu( separator(),       viewId, -1 );
1060
1061   int dispmodeId = createMenu( tr( "MEN_DISPLAY_MODE" ), viewId, -1 );
1062   createMenu( GEOMOp::OpDisplayMode,   dispmodeId, -1 );
1063   createMenu( separator(),             dispmodeId, -1 );
1064   createMenu( GEOMOp::OpSwitchVectors, dispmodeId, -1 );
1065
1066   createMenu( separator(),       viewId, -1 );
1067   createMenu( GEOMOp::OpShowAll, viewId, -1 );
1068   createMenu( GEOMOp::OpHideAll, viewId, -1 );
1069   createMenu( separator(),       viewId, -1 );
1070   createMenu( GEOMOp::OpPublishObject, viewId, -1 );
1071   createMenu( separator(),       viewId, -1 );
1072
1073 /*
1074   PAL9111:
1075   because of these items are accessible through object browser and viewers
1076   we have removed they from main menu
1077
1078   createMenu( GEOMOp::OpShow, viewId, -1 );
1079   createMenu( GEOMOp::OpShowOnly, viewId, -1 );
1080   createMenu( GEOMOp::OpHide, viewId, -1 );
1081 */
1082
1083   // ---- create toolbars --------------------------
1084   
1085   int basicTbId = createTool( tr( "TOOL_BASIC" ) );
1086   createTool( GEOMOp::OpPoint,      basicTbId );
1087   createTool( GEOMOp::OpLine,       basicTbId );
1088   createTool( GEOMOp::OpCircle,     basicTbId );
1089   createTool( GEOMOp::OpEllipse,    basicTbId );
1090   createTool( GEOMOp::OpArc,        basicTbId );
1091   createTool( GEOMOp::OpCurve,      basicTbId );
1092   createTool( GEOMOp::OpVector,     basicTbId );
1093   createTool( GEOMOp::Op2dSketcher, basicTbId ); //rnc
1094   createTool( GEOMOp::Op3dSketcher, basicTbId ); //rnc
1095   createTool( GEOMOp::OpPlane,      basicTbId );
1096   createTool( GEOMOp::OpLCS,        basicTbId );
1097   createTool( GEOMOp::OpOriginAndVectors, basicTbId );
1098   
1099 //   int sketchTbId = createTool( tr( "TOOL_SKETCH" ) );
1100 //   createTool( GEOMOp::Op2dSketcher,  sketchTbId );
1101 //   createTool( GEOMOp::Op3dSketcher,  sketchTbId );
1102   
1103   int primTbId = createTool( tr( "TOOL_PRIMITIVES" ) );
1104   createTool( GEOMOp::OpBox,        primTbId );
1105   createTool( GEOMOp::OpCylinder,   primTbId );
1106   createTool( GEOMOp::OpSphere,     primTbId );
1107   createTool( GEOMOp::OpTorus,      primTbId );
1108   createTool( GEOMOp::OpCone,       primTbId );
1109   createTool( GEOMOp::OpRectangle,  primTbId );
1110   createTool( GEOMOp::OpDisk,       primTbId );
1111   createTool( GEOMOp::OpPipeTShape, primTbId ); //rnc
1112   
1113 //   int advancedTbId = createTool( tr( "TOOL_ADVANCED" ) ); //rnc
1114 //   createTool( GEOMOp::OpPipeTShape, advancedTbId );
1115   
1116   int boolTbId = createTool( tr( "TOOL_BOOLEAN" ) );
1117   createTool( GEOMOp::OpFuse,       boolTbId );
1118   createTool( GEOMOp::OpCommon,     boolTbId );
1119   createTool( GEOMOp::OpCut,        boolTbId );
1120   createTool( GEOMOp::OpSection,    boolTbId );
1121   
1122    int genTbId = createTool( tr( "TOOL_GENERATION" ) );
1123   createTool( GEOMOp::OpPrism,      genTbId );
1124   createTool( GEOMOp::OpRevolution, genTbId );
1125   createTool( GEOMOp::OpFilling,    genTbId );
1126   createTool( GEOMOp::OpPipe,       genTbId );
1127   
1128   int transTbId = createTool( tr( "TOOL_TRANSFORMATION" ) );
1129   createTool( GEOMOp::OpTranslate,      transTbId );
1130   createTool( GEOMOp::OpRotate,         transTbId );
1131   createTool( GEOMOp::OpChangeLoc,      transTbId );
1132   createTool( GEOMOp::OpMirror,         transTbId );
1133   createTool( GEOMOp::OpScale,          transTbId );
1134   createTool( GEOMOp::OpOffset,         transTbId );
1135   createTool( GEOMOp::OpProjection,     transTbId );
1136   createTool( separator(),              transTbId );
1137   createTool( GEOMOp::OpMultiTranslate, transTbId );
1138   createTool( GEOMOp::OpMultiRotate,    transTbId );
1139   
1140   int operTbId = createTool( tr( "TOOL_OPERATIONS" ) );
1141   createTool( GEOMOp::OpExplode,         operTbId );
1142   createTool( GEOMOp::OpPartition,       operTbId );
1143   createTool( GEOMOp::OpArchimede,       operTbId );
1144   createTool( GEOMOp::OpShapesOnShape,   operTbId );
1145   createTool( GEOMOp::OpSharedShapes,    operTbId );
1146   
1147   int featTbId = createTool( tr( "TOOL_FEATURES" ) );
1148   createTool( GEOMOp::OpFillet1d,        featTbId );
1149   createTool( GEOMOp::OpFillet2d,        featTbId );
1150   createTool( GEOMOp::OpFillet3d,        featTbId );
1151   createTool( GEOMOp::OpChamfer,         featTbId );
1152   createTool( GEOMOp::OpExtrudedBoss,    featTbId );
1153   createTool( GEOMOp::OpExtrudedCut,     featTbId );
1154   
1155   int buildTbId = createTool( tr( "TOOL_BUILD" ) );
1156   createTool( GEOMOp::OpEdge,     buildTbId );
1157   createTool( GEOMOp::OpWire,     buildTbId );
1158   createTool( GEOMOp::OpFace,     buildTbId );
1159   createTool( GEOMOp::OpShell,    buildTbId );
1160   createTool( GEOMOp::OpSolid,    buildTbId );
1161   createTool( GEOMOp::OpCompound, buildTbId );
1162
1163   int measureTbId = createTool( tr( "TOOL_MEASURES" ) );
1164   createTool( GEOMOp::OpPointCoordinates, measureTbId );
1165   createTool( GEOMOp::OpProperties,       measureTbId );
1166   createTool( GEOMOp::OpCenterMass,       measureTbId );
1167   createTool( GEOMOp::OpInertia,          measureTbId );
1168   createTool( GEOMOp::OpNormale,          measureTbId );
1169   createTool( separator(),                measureTbId );
1170   createTool( GEOMOp::OpBoundingBox,      measureTbId );
1171   createTool( GEOMOp::OpMinDistance,      measureTbId );
1172   createTool( GEOMOp::OpAngle,            measureTbId );
1173   createTool( GEOMOp::OpTolerance  ,      measureTbId );
1174   createTool( separator(),                measureTbId );
1175   createTool( GEOMOp::OpFreeBoundaries,   measureTbId );
1176   createTool( GEOMOp::OpFreeFaces,        measureTbId );
1177   createTool( separator(),                measureTbId );
1178   createTool( GEOMOp::OpWhatIs,           measureTbId );
1179   createTool( GEOMOp::OpCheckShape,       measureTbId );
1180   createTool( GEOMOp::OpCheckCompound,    measureTbId );
1181   createTool( GEOMOp::OpCheckSelfInters,  measureTbId );
1182   
1183   int picturesTbId = createTool( tr( "TOOL_PICTURES" ) );
1184   createTool( GEOMOp::OpPictureImport,    picturesTbId );
1185   #ifdef WITH_OPENCV
1186     createTool( GEOMOp::OpFeatureDetect,  picturesTbId );
1187   #endif
1188
1189   //@@ 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 @@//
1190
1191   // ---- create popup menus --------------------------
1192
1193   QString clientOCCorVTK = "(client='OCCViewer' or client='VTKViewer')";
1194   QString clientOCC = "(client='OCCViewer')";
1195   QString clientOCCorVTK_AndSomeVisible = clientOCCorVTK + " and selcount>0 and isVisible";
1196   QString clientOCC_AndSomeVisible = clientOCC + " and selcount>0 and isVisible";
1197
1198   QString clientOCCorOB = "(client='ObjectBrowser' or client='OCCViewer')";
1199   QString clientOCCorVTKorOB = "(client='ObjectBrowser' or client='OCCViewer' or client='VTKViewer')";
1200   QString clientOCCorVTKorOB_AndSomeVisible = clientOCCorVTKorOB + " and selcount>0 and isVisible";
1201   QString clientOCCorOB_AndSomeVisible = clientOCCorOB + " and selcount>0 and isVisible";
1202
1203   QString autoColorPrefix =
1204     "(client='ObjectBrowser' or client='OCCViewer') and type='Shape' and selcount=1 and isOCC=true";
1205
1206   QtxPopupMgr* mgr = popupMgr();
1207
1208   mgr->insert( action(  GEOMOp::OpDelete ), -1, -1 );  // delete
1209   mgr->setRule( action( GEOMOp::OpDelete ), QString("$type in {'Shape' 'Group'} and selcount>0"), QtxPopupMgr::VisibleRule );
1210   mgr->insert( action(  GEOMOp::OpGroupCreatePopup ), -1, -1 ); // create group
1211   mgr->setRule( action( GEOMOp::OpGroupCreatePopup ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1212   mgr->insert( action(  GEOMOp::OpShowChildren ), -1, -1 ); // show children
1213   mgr->setRule( action( GEOMOp::OpShowChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasHiddenChildren=true"), QtxPopupMgr::VisibleRule );
1214
1215   mgr->insert( action(  GEOMOp::OpHideChildren ), -1, -1 ); // hide children
1216   mgr->setRule( action( GEOMOp::OpHideChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasShownChildren=true"), QtxPopupMgr::VisibleRule );
1217   mgr->insert( action(  GEOMOp::OpGroupEdit ), -1, -1 );  // edit group
1218   mgr->setRule( action( GEOMOp::OpGroupEdit ),  QString("client='ObjectBrowser' and type='Group' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1219   mgr->insert( separator(), -1, -1 );     // -----------
1220
1221 #if OCC_VERSION_LARGE > 0x06050200
1222   //QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and (selcount>0) and isOCC=true and topLevel=false";
1223   QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and (selcount>0) and isOCC=true";
1224   mgr->insert( action(GEOMOp::OpBringToFront ), -1, -1 ); // bring to front
1225   mgr->setRule(action(GEOMOp::OpBringToFront), bringRule, QtxPopupMgr::VisibleRule );
1226   mgr->setRule(action(GEOMOp::OpBringToFront), "topLevel=true", QtxPopupMgr::ToggleRule );
1227   mgr->insert( action(GEOMOp::OpClsBringToFront ), -1, -1 ); // clear bring to front
1228   mgr->setRule( action(GEOMOp::OpClsBringToFront ), clientOCC, QtxPopupMgr::VisibleRule );  
1229 #endif
1230   mgr->insert( separator(), -1, -1 );     // -----------
1231   dispmodeId = mgr->insert(  tr( "MEN_DISPLAY_MODE" ), -1, -1 ); // display mode menu
1232   mgr->insert( action(  GEOMOp::OpWireframe ), dispmodeId, -1 ); // wireframe
1233   mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1234   mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK + " and displaymode='Wireframe'", QtxPopupMgr::ToggleRule );
1235   mgr->insert( action(  GEOMOp::OpShading ), dispmodeId, -1 ); // shading
1236   mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1237   mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK + " and displaymode='Shading'", QtxPopupMgr::ToggleRule );
1238   mgr->insert( action(  GEOMOp::OpShadingWithEdges ), dispmodeId, -1 ); // shading with edges
1239   mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1240   mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK + " and displaymode='ShadingWithEdges'", QtxPopupMgr::ToggleRule );
1241   mgr->insert( action(  GEOMOp::OpTexture ), dispmodeId, -1 ); // wireframe
1242   mgr->setRule( action( GEOMOp::OpTexture ), clientOCC_AndSomeVisible, QtxPopupMgr::VisibleRule );
1243   mgr->setRule( action( GEOMOp::OpTexture), clientOCC + " and displaymode='Texture'", QtxPopupMgr::ToggleRule );
1244   mgr->insert( separator(), dispmodeId, -1 );
1245   mgr->insert( action(  GEOMOp::OpVectors ), dispmodeId, -1 ); // vectors
1246   mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1247   mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK + " and isVectorsMode", QtxPopupMgr::ToggleRule );
1248   mgr->insert( separator(), -1, -1 );     // -----------
1249   mgr->insert( action(  GEOMOp::OpColor ), -1, -1 ); // color
1250   mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})" + "and isPhysicalMaterial=false", QtxPopupMgr::VisibleRule );
1251   mgr->insert( action(  GEOMOp::OpTransparency ), -1, -1 ); // transparency
1252   mgr->setRule( action( GEOMOp::OpTransparency ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1253   mgr->insert( action(  GEOMOp::OpIsos ), -1, -1 ); // isos
1254   mgr->setRule( action( GEOMOp::OpIsos ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible", QtxPopupMgr::VisibleRule );
1255   mgr->insert( action(  GEOMOp::OpDeflection ), -1, -1 ); // deflection
1256   mgr->setRule( action( GEOMOp::OpDeflection ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible", QtxPopupMgr::VisibleRule );
1257   mgr->insert( action(  GEOMOp::OpPointMarker ), -1, -1 ); // point marker
1258   //mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and $typeid in {%1}" ).arg(GEOM_POINT ), QtxPopupMgr::VisibleRule );
1259   mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and ( $typeid in {%1} or compoundOfVertices=true ) " ).arg(GEOM::VERTEX).arg(GEOM::COMPOUND), QtxPopupMgr::VisibleRule );
1260   mgr->insert( action(  GEOMOp::OpMaterialProperties ), -1, -1 ); // material properties  
1261   mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'}) and selcount>0 and isVisible", QtxPopupMgr::VisibleRule );
1262   mgr->insert( action(  GEOMOp::OpSetTexture ), -1, -1 ); // texture
1263   mgr->setRule( action( GEOMOp::OpSetTexture ), clientOCCorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1264
1265   int lineW = mgr->insert(  tr( "MEN_LINE_WIDTH" ), -1, -1 ); // line width menu
1266   mgr->insert( action(  GEOMOp::OpEdgeWidth ), lineW, -1 ); // edge width
1267   mgr->setRule( action( GEOMOp::OpEdgeWidth ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1268
1269   mgr->insert( action(  GEOMOp::OpIsosWidth ), lineW, -1 ); // isos width
1270   mgr->setRule( action( GEOMOp::OpIsosWidth ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1271   
1272   mgr->insert( separator(), -1, -1 );     // -----------
1273   mgr->insert( action(  GEOMOp::OpAutoColor ), -1, -1 ); // auto color
1274   mgr->setRule( action( GEOMOp::OpAutoColor ), autoColorPrefix + " and isAutoColor=false", QtxPopupMgr::VisibleRule );
1275   mgr->insert( action(  GEOMOp::OpNoAutoColor ), -1, -1 ); // disable auto color
1276   mgr->setRule( action( GEOMOp::OpNoAutoColor ), autoColorPrefix + " and isAutoColor=true", QtxPopupMgr::VisibleRule );
1277   mgr->insert( separator(), -1, -1 );     // -----------
1278
1279   QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ",
1280           onlyComponent = "((type='Component') and selcount=1)",
1281           rule = canDisplay + "and ((($type in {%1}) and( %2 )) or " + onlyComponent + ")",
1282           types = "'Shape' 'Group'";
1283
1284   mgr->insert( action(  GEOMOp::OpShow ), -1, -1 ); // display
1285   mgr->setRule( action( GEOMOp::OpShow ), rule.arg( types ).arg( "not isVisible" ), QtxPopupMgr::VisibleRule );
1286
1287   mgr->insert( action(  GEOMOp::OpHide ), -1, -1 ); // erase
1288   mgr->setRule( action( GEOMOp::OpHide ), rule.arg( types ).arg( "isVisible" ), QtxPopupMgr::VisibleRule );
1289
1290   mgr->insert( action(  GEOMOp::OpHideAll ), -1, -1 ); // erase All
1291   mgr->setRule( action( GEOMOp::OpHideAll ), clientOCCorVTK, QtxPopupMgr::VisibleRule );
1292
1293   QString selectOnly = "(client='OCCViewer' or client='VTKViewer') and (selcount=0)";
1294
1295   int selectonlyId = mgr->insert( tr("MEN_SELECT_ONLY"), -1, -1);                //select only menu
1296   mgr->insert( action(GEOMOp::OpSelectVertex),   selectonlyId, -1);                                  //Vertex
1297   mgr->setRule(action(GEOMOp::OpSelectVertex),   selectOnly, QtxPopupMgr::VisibleRule);
1298   mgr->setRule(action(GEOMOp::OpSelectVertex),   selectOnly + " and selectionmode='VERTEX'", QtxPopupMgr::ToggleRule);
1299   mgr->insert( action(GEOMOp::OpSelectEdge),     selectonlyId, -1);                                  //Edge
1300   mgr->setRule(action(GEOMOp::OpSelectEdge),     selectOnly, QtxPopupMgr::VisibleRule);
1301   mgr->setRule(action(GEOMOp::OpSelectEdge),     selectOnly + " and selectionmode='EDGE'", QtxPopupMgr::ToggleRule);
1302   mgr->insert( action(GEOMOp::OpSelectWire),     selectonlyId, -1);                                  //Wire
1303   mgr->setRule(action(GEOMOp::OpSelectWire),     selectOnly, QtxPopupMgr::VisibleRule);
1304   mgr->setRule(action(GEOMOp::OpSelectWire),     selectOnly + " and selectionmode='WIRE'", QtxPopupMgr::ToggleRule);
1305   mgr->insert( action(GEOMOp::OpSelectFace),     selectonlyId, -1);                                  //Face
1306   mgr->setRule(action(GEOMOp::OpSelectFace),     selectOnly, QtxPopupMgr::VisibleRule);
1307   mgr->setRule(action(GEOMOp::OpSelectFace),     selectOnly + " and selectionmode='FACE'", QtxPopupMgr::ToggleRule);
1308   mgr->insert( action(GEOMOp::OpSelectShell),    selectonlyId, -1);                                  //Shell
1309   mgr->setRule(action(GEOMOp::OpSelectShell),    selectOnly, QtxPopupMgr::VisibleRule);
1310   mgr->setRule(action(GEOMOp::OpSelectShell),    selectOnly + " and selectionmode='SHELL'", QtxPopupMgr::ToggleRule);
1311   mgr->insert( action(GEOMOp::OpSelectSolid),    selectonlyId, -1);                                  //Solid
1312   mgr->setRule(action(GEOMOp::OpSelectSolid),    selectOnly, QtxPopupMgr::VisibleRule);
1313   mgr->setRule(action(GEOMOp::OpSelectSolid),    selectOnly + " and selectionmode='SOLID'", QtxPopupMgr::ToggleRule);
1314   mgr->insert( action(GEOMOp::OpSelectCompound), selectonlyId, -1);                                  //Compound
1315   mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly, QtxPopupMgr::VisibleRule);
1316   mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly + " and selectionmode='COMPOUND'", QtxPopupMgr::ToggleRule);
1317   mgr->insert( separator(), selectonlyId, -1);
1318   mgr->insert( action(GEOMOp::OpSelectAll),      selectonlyId, -1);                                  //Clear selection filter
1319   mgr->setRule(action(GEOMOp::OpSelectAll),      selectOnly, QtxPopupMgr::VisibleRule);
1320   mgr->setRule(action(GEOMOp::OpSelectAll),      selectOnly + " and selectionmode='ALL'", QtxPopupMgr::ToggleRule);
1321   mgr->insert( action(GEOMOp::OpShowOnly ), -1, -1 ); // display only
1322   mgr->setRule(action(GEOMOp::OpShowOnly ), rule.arg( types ).arg( "true" ), QtxPopupMgr::VisibleRule );
1323
1324   mgr->insert( separator(), -1, -1 );     // -----------
1325   mgr->insert( action(  GEOMOp::OpUnpublishObject ), -1, -1 ); // Unpublish object
1326   mgr->setRule( action( GEOMOp::OpUnpublishObject ), QString("client='ObjectBrowser' and $type in {'Shape' 'Group'} and selcount>0"), QtxPopupMgr::VisibleRule );
1327
1328
1329   mgr->insert( action(  GEOMOp::OpPublishObject ), -1, -1 ); // Publish object
1330   mgr->setRule( action( GEOMOp::OpPublishObject ), QString("client='ObjectBrowser' and isComponent=true"), QtxPopupMgr::VisibleRule );
1331
1332   mgr->insert( action(  GEOMOp::OpReimport ), -1, -1 );  // delete
1333   mgr->setRule( action( GEOMOp::OpReimport ), QString("$imported in {'true'} and selcount>0"), QtxPopupMgr::VisibleRule );
1334
1335   mgr->hide( mgr->actionId( action( myEraseAll ) ) );
1336 }
1337
1338 //=======================================================================
1339 // function : GeometryGUI::activateModule()
1340 // purpose  : Called when GEOM module is activated
1341 //=======================================================================
1342 bool GeometryGUI::activateModule( SUIT_Study* study )
1343 {
1344   if ( CORBA::is_nil( myComponentGeom ) )
1345     return false;
1346
1347   bool res = SalomeApp_Module::activateModule( study );
1348
1349   if ( !res )
1350     return false;
1351   setMenuShown( true );
1352   setToolShown( true );
1353
1354   // import Python module that manages GEOM plugins (need to be here because SalomePyQt API uses active module)
1355   PyGILState_STATE gstate = PyGILState_Ensure();
1356   PyObject* pluginsmanager=PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
1357   if(pluginsmanager==NULL)
1358     PyErr_Print();
1359   else
1360     {
1361       PyObject* result=PyObject_CallMethod( pluginsmanager, (char*)"initialize", (char*)"isss",1,"geom",tr("MEN_NEW_ENTITY").toStdString().c_str(),tr("GEOM_PLUGINS_OTHER").toStdString().c_str());
1362       if(result==NULL)
1363         PyErr_Print();
1364       Py_XDECREF(result);
1365     }
1366   PyGILState_Release(gstate);
1367   // end of GEOM plugins loading
1368
1369   connect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1370           this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1371
1372   // Reset actions accelerator keys
1373   action(GEOMOp::OpImport)->setEnabled( true ); // Import: CTRL + Key_I
1374   action(GEOMOp::OpExport)->setEnabled( true ); // Export: CTRL + Key_E
1375   action(GEOMOp::OpDelete)->setEnabled( true ); // Delete: Key_Delete
1376
1377   GUIMap::Iterator it;
1378   for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1379     it.value()->activate( application()->desktop() );
1380
1381   LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1382
1383   SUIT_ViewManager* vm;
1384   ViewManagerList OCCViewManagers, VTKViewManagers;
1385
1386   application()->viewManagers( OCCViewer_Viewer::Type(), OCCViewManagers );
1387   QListIterator<SUIT_ViewManager*> itOCC( OCCViewManagers );
1388   while ( itOCC.hasNext() && (vm = itOCC.next()) )
1389     myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
1390
1391   application()->viewManagers( SVTK_Viewer::Type(), VTKViewManagers );
1392   QListIterator<SUIT_ViewManager*> itVTK( VTKViewManagers );
1393   while ( itVTK.hasNext() && (vm = itVTK.next()) )
1394     myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
1395
1396   //NPAL 19674
1397   SALOME_ListIO selected;
1398   sm->selectedObjects( selected );
1399   sm->clearSelected();
1400
1401   // disable OCC selectors
1402   getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
1403   QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1404   while ( itOCCSel.hasNext() )
1405     if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1406       sr->setEnabled(true);
1407
1408   // disable VTK selectors
1409   getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
1410   QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1411   while ( itVTKSel.hasNext() )
1412     if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1413       sr->setEnabled(true);
1414
1415   sm->setSelectedObjects( selected, true );   //NPAL 19674
1416
1417   QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1418   if ( viewMenu )
1419     connect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1420
1421   // 0020836 (Basic vectors and origin)
1422   SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
1423   if( aResourceMgr->booleanValue( "Geometry", "auto_create_base_objects", false ) ) {
1424     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
1425     if( appStudy ) {
1426       _PTR(Study) studyDS = appStudy->studyDS();
1427       if( studyDS ) {
1428         _PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
1429         if( !aSComponent ) // create objects automatically only if there is no GEOM component
1430           createOriginAndBaseVectors();
1431       }
1432     }
1433   }
1434
1435   return true;
1436 }
1437
1438
1439 //=======================================================================
1440 // function : GeometryGUI::deactivateModule()
1441 // purpose  : Called when GEOM module is deactivated
1442 //=======================================================================
1443 bool GeometryGUI::deactivateModule( SUIT_Study* study )
1444 {
1445   QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1446   if ( viewMenu )
1447     disconnect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1448
1449   setMenuShown( false );
1450   setToolShown( false );
1451
1452   disconnect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1453              this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1454
1455   EmitSignalCloseAllDialogs();
1456
1457   GUIMap::Iterator it;
1458   for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1459     it.value()->deactivate();
1460
1461   // Unset actions accelerator keys
1462   action(GEOMOp::OpImport)->setEnabled( false ); // Import: CTRL + Key_I
1463   action(GEOMOp::OpExport)->setEnabled( false ); // Export: CTRL + Key_E
1464   action(GEOMOp::OpDelete)->setEnabled( false ); // Delete: Key_Delete
1465
1466   qDeleteAll(myOCCSelectors);
1467   myOCCSelectors.clear();
1468   getApp()->selectionMgr()->setEnabled( true, OCCViewer_Viewer::Type() );
1469
1470   qDeleteAll(myVTKSelectors);
1471   myVTKSelectors.clear();
1472   getApp()->selectionMgr()->setEnabled( true, SVTK_Viewer::Type() );
1473
1474   return SalomeApp_Module::deactivateModule( study );
1475 }
1476
1477 //=======================================================================
1478 // function : onWindowActivated()
1479 // purpose  : update menu items' status - disable non-OCC-viewer-compatible actions
1480 //=======================================================================
1481 void GeometryGUI::onWindowActivated( SUIT_ViewWindow* win )
1482 {
1483   if ( !win )
1484     return;
1485
1486   const bool ViewOCC = ( win->getViewManager()->getType() == OCCViewer_Viewer::Type() );
1487   //const bool ViewVTK = ( win->getViewManager()->getType() == SVTK_Viewer::Type() );
1488
1489   // disable non-OCC viewframe menu commands
1490 //  action( GEOMOp::Op2dSketcher )->setEnabled( ViewOCC ); // SKETCHER
1491   action( GEOMOp::OpSuppressFaces )->setEnabled( ViewOCC ); // SuppressFace
1492   action( GEOMOp::OpSuppressHoles )->setEnabled( ViewOCC ); // SuppressHole
1493   action( GEOMOp::OpCloseContour )->setEnabled( ViewOCC ); // CloseContour
1494   action( GEOMOp::OpRemoveIntWires )->setEnabled( ViewOCC ); // RemoveInternalWires
1495   action( GEOMOp::OpAddPointOnEdge )->setEnabled( ViewOCC ); // AddPointOnEdge
1496 //  action( GEOMOp::OpFreeBoundaries )->setEnabled( ViewOCC ); // Free boundaries
1497
1498   action( GEOMOp::OpGroupCreate )->setEnabled( ViewOCC ); // Create Group
1499   action( GEOMOp::OpGroupEdit )->setEnabled( ViewOCC ); // Edit Group
1500
1501   action( GEOMOp::OpMultiTransform )->setEnabled( ViewOCC ); // MENU BLOCKS - MULTI-TRANSFORMATION
1502 }
1503
1504 void GeometryGUI::windows( QMap<int, int>& mappa ) const
1505 {
1506   mappa.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
1507   mappa.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
1508 }
1509
1510 void GeometryGUI::viewManagers( QStringList& lst ) const
1511 {
1512   lst.append( OCCViewer_Viewer::Type() );
1513 }
1514
1515 void GeometryGUI::onViewManagerAdded( SUIT_ViewManager* vm )
1516 {
1517   if ( vm && vm->getType() == OCCViewer_Viewer::Type() )
1518   {
1519     qDebug( "connect" );
1520     connect( vm, SIGNAL( keyPress  ( SUIT_ViewWindow*, QKeyEvent* ) ),
1521              this, SLOT( OnKeyPress( SUIT_ViewWindow*, QKeyEvent* ) ) );
1522     connect( vm, SIGNAL( mousePress( SUIT_ViewWindow*, QMouseEvent* ) ),
1523              this, SLOT( OnMousePress( SUIT_ViewWindow*, QMouseEvent* ) ) );
1524     connect( vm, SIGNAL( mouseMove ( SUIT_ViewWindow*, QMouseEvent* ) ),
1525              this, SLOT( OnMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) );
1526     connect( vm, SIGNAL( mouseRelease ( SUIT_ViewWindow*, QMouseEvent* ) ),
1527              this, SLOT( OnMouseRelease( SUIT_ViewWindow*, QMouseEvent* ) ) );
1528     
1529     LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1530     myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
1531
1532     // disable OCC selectors
1533     getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
1534     QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1535     while ( itOCCSel.hasNext() )
1536       if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1537         sr->setEnabled(true);
1538   }
1539   else if ( vm->getType() == SVTK_Viewer::Type() )
1540   {
1541     LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1542     myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
1543
1544     // disable VTK selectors
1545     getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
1546     QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1547     while ( itVTKSel.hasNext() )
1548       if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1549         sr->setEnabled(true);
1550   }
1551 }
1552
1553 void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm )
1554 {
1555   SUIT_ViewModel* viewer = vm->getViewModel();
1556   if ( vm->getType() == OCCViewer_Viewer::Type() )
1557   {
1558     QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1559     while ( itOCCSel.hasNext() )
1560       if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1561         if ( sr->viewer() == viewer )
1562         {
1563           delete myOCCSelectors.takeAt( myOCCSelectors.indexOf( sr ) );
1564           break;
1565         }
1566   }
1567   if ( vm->getType() == SVTK_Viewer::Type() )
1568   {
1569     QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1570     while ( itVTKSel.hasNext() )
1571       if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1572         if ( sr->viewer() == viewer )
1573         {
1574           delete myVTKSelectors.takeAt( myVTKSelectors.indexOf( sr ) );
1575           break;
1576         }
1577   }
1578 }
1579
1580 QString GeometryGUI::engineIOR() const
1581 {
1582   if ( !CORBA::is_nil( GetGeomGen() ) )
1583     return QString( getApp()->orb()->object_to_string( GetGeomGen() ) );
1584   return "";
1585 }
1586
1587 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
1588 Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture
1589 #else
1590 Handle(Graphic3d_HArray1OfBytes) GeometryGUI::getTexture
1591 #endif
1592       (SalomeApp_Study* theStudy, int theId, int& theWidth, int& theHeight)
1593 {
1594   theWidth = theHeight = 0;
1595
1596 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
1597   Handle(TColStd_HArray1OfByte) aTexture;
1598 #else
1599   Handle(Graphic3d_HArray1OfBytes) aTexture;
1600 #endif
1601
1602   if (theStudy) {
1603     TextureMap aTextureMap = myTextureMap[ theStudy->studyDS()->StudyId() ];
1604     aTexture = aTextureMap[ theId ];
1605     if ( aTexture.IsNull() ) {
1606       GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGen()->GetIInsertOperations( theStudy->studyDS()->StudyId() );
1607       if ( !aInsOp->_is_nil() ) {
1608         CORBA::Long aWidth, aHeight;
1609         SALOMEDS::TMPFile_var aStream = aInsOp->GetTexture( theId, aWidth, aHeight );
1610         if ( aWidth > 0 && aHeight > 0 && aStream->length() > 0 ) {
1611           theWidth  = aWidth;
1612           theHeight = aHeight;
1613
1614 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
1615           aTexture  = new TColStd_HArray1OfByte (1, aStream->length());
1616 #else
1617           aTexture  = new Graphic3d_HArray1OfBytes (1, aStream->length());
1618 #endif
1619
1620           for (int i = 0; i < aStream->length(); i++)
1621             aTexture->SetValue( i+1, (Standard_Byte)aStream[i] );
1622           aTextureMap[ theId ] = aTexture;
1623         }
1624       }
1625     }
1626   }
1627   return aTexture;
1628 }
1629
1630 LightApp_Selection* GeometryGUI::createSelection() const
1631 {
1632   return new GEOMGUI_Selection();
1633 }
1634
1635 void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
1636 {
1637   SalomeApp_Module::contextMenuPopup( client, menu, title );
1638
1639   /*
1640   SALOME_ListIO lst;
1641   getApp()->selectionMgr()->selectedObjects(lst);
1642   if (lst.Extent() < 1)
1643     return;
1644
1645   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
1646   _PTR(Study) study = appStudy->studyDS();
1647
1648   bool isImported = true;
1649   SALOME_ListIteratorOfListIO anIt (lst);
1650   for (; anIt.More() && isImported; anIt.Next()) {
1651     Handle(SALOME_InteractiveObject) io = anIt.Value();
1652     _PTR(SObject) aSObj = study->FindObjectID(io->getEntry());
1653     if (aSObj) {
1654       if (lst.Extent() == 1) {
1655         // Set context menu title
1656         if (client == "OCCViewer" || client == "VTKViewer")
1657           title = QString(aSObj->GetName().c_str());
1658       }
1659
1660       CORBA::Object_var anObj = GeometryGUI::ClientSObjectToObject(aSObj);
1661       GEOM::GEOM_Object_var aGeomObj = GEOM::GEOM_Object::_narrow(anObj);
1662       if (CORBA::is_nil(aGeomObj) || aGeomObj->GetType() != GEOM_IMPORT)
1663         isImported = false;
1664     } else {
1665       isImported = false;
1666     }
1667   }
1668
1669   if (isImported) {
1670     menu->addAction(action(GEOMOp::OpReimport)); // Reload imported shape
1671   }
1672   */
1673 }
1674
1675 void GeometryGUI::createPreferences()
1676 {
1677   int tabId = addPreference( tr( "PREF_TAB_SETTINGS" ) );
1678
1679   int genGroup = addPreference( tr( "PREF_GROUP_GENERAL" ), tabId );
1680   setPreferenceProperty( genGroup, "columns", 2 );
1681
1682   int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), genGroup,
1683                                 LightApp_Preferences::Selector,
1684                                 "Geometry", "display_mode" );
1685
1686   addPreference( tr( "PREF_SHADING_COLOR" ), genGroup,
1687                  LightApp_Preferences::Color, "Geometry", "shading_color" );
1688
1689   addPreference( tr( "PREF_EDGES_IN_SHADING" ), genGroup,
1690                  LightApp_Preferences::Color, "Geometry", "edges_in_shading_color" );
1691
1692   addPreference( tr( "PREF_WIREFRAME_COLOR" ), genGroup,
1693                  LightApp_Preferences::Color, "Geometry", "wireframe_color" );
1694
1695   addPreference( tr( "PREF_FREE_BOUND_COLOR" ), genGroup,
1696                  LightApp_Preferences::Color, "Geometry", "free_bound_color" );
1697
1698   addPreference( tr( "PREF_LINE_COLOR"), genGroup,
1699                  LightApp_Preferences::Color, "Geometry", "line_color" );
1700
1701   addPreference( tr( "PREF_POINT_COLOR"), genGroup,
1702                  LightApp_Preferences::Color, "Geometry", "point_color" );
1703
1704   addPreference( tr( "PREF_ISOS_COLOR" ), genGroup,
1705                  LightApp_Preferences::Color, "Geometry", "isos_color" );
1706
1707   addPreference( tr( "PREF_TOPLEVEL_COLOR" ), genGroup,
1708                  LightApp_Preferences::Color, "Geometry", "toplevel_color" );
1709
1710   addPreference( "", genGroup, LightApp_Preferences::Space );
1711
1712
1713   int step = addPreference( tr( "PREF_STEP_VALUE" ), genGroup,
1714                             LightApp_Preferences::IntSpin, "Geometry", "SettingsGeomStep" );
1715
1716   int defl = addPreference( tr( "PREF_DEFLECTION" ), genGroup,
1717                             LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" );
1718
1719   int material = addPreference( tr( "PREF_MATERIAL" ), genGroup,
1720                                       LightApp_Preferences::Selector,
1721                                       "Geometry", "material" );
1722   
1723   const int nb = 4;
1724   int wd[nb];
1725   int iter=0;
1726
1727   wd[iter++] = addPreference( tr( "PREF_EDGE_WIDTH" ), genGroup,
1728                               LightApp_Preferences::IntSpin, "Geometry", "edge_width" );
1729
1730   wd[iter++] = addPreference( tr( "PREF_ISOLINES_WIDTH" ), genGroup,
1731                               LightApp_Preferences::IntSpin, "Geometry", "isolines_width" );
1732
1733   wd[iter++] = addPreference( tr( "PREF_PREVIEW_EDGE_WIDTH" ), genGroup,
1734                                      LightApp_Preferences::IntSpin, "Geometry", "preview_edge_width" );
1735   
1736   wd[iter++] = addPreference( tr( "PREF_MEASURES_LINE_WIDTH" ), genGroup,
1737                               LightApp_Preferences::IntSpin, "Geometry", "measures_line_width" );
1738
1739   for(int i = 0; i < nb; i++) {
1740     setPreferenceProperty( wd[i], "min", 1 );    
1741     setPreferenceProperty( wd[i], "max", 5 );
1742   }
1743
1744
1745   // Quantities with individual precision settings
1746   int precGroup = addPreference( tr( "GEOM_PREF_GROUP_PRECISION" ), tabId );
1747   setPreferenceProperty( precGroup, "columns", 2 );
1748
1749   const int nbQuantities = 8;
1750   int prec[nbQuantities], ii = 0;
1751   prec[ii++] = addPreference( tr( "GEOM_PREF_length_precision" ), precGroup,
1752                               LightApp_Preferences::IntSpin, "Geometry", "length_precision" );
1753   prec[ii++] = addPreference( tr( "GEOM_PREF_angle_precision" ), precGroup,
1754                               LightApp_Preferences::IntSpin, "Geometry", "angle_precision" );
1755   prec[ii++] = addPreference( tr( "GEOM_PREF_len_tol_precision" ), precGroup,
1756                               LightApp_Preferences::IntSpin, "Geometry", "len_tol_precision" );
1757   prec[ii++] = addPreference( tr( "GEOM_PREF_ang_tol_precision" ), precGroup,
1758                               LightApp_Preferences::IntSpin, "Geometry", "ang_tol_precision" );
1759   prec[ii++] = addPreference( tr( "GEOM_PREF_weight_precision" ), precGroup,
1760                               LightApp_Preferences::IntSpin, "Geometry", "weight_precision" );
1761   prec[ii++] = addPreference( tr( "GEOM_PREF_density_precision" ), precGroup,
1762                               LightApp_Preferences::IntSpin, "Geometry", "density_precision" );
1763   prec[ii++] = addPreference( tr( "GEOM_PREF_parametric_precision" ), precGroup,
1764                               LightApp_Preferences::IntSpin, "Geometry", "parametric_precision" );
1765   prec[ii  ] = addPreference( tr( "GEOM_PREF_param_tol_precision" ), precGroup,
1766                               LightApp_Preferences::IntSpin, "Geometry", "param_tol_precision" );
1767
1768   // Set property for precision value for spinboxes
1769   for ( ii = 0; ii < nbQuantities; ii++ ){
1770     setPreferenceProperty( prec[ii], "min", -14 );
1771     setPreferenceProperty( prec[ii], "max", 14 );
1772     setPreferenceProperty( prec[ii], "precision", 2 );
1773   }
1774
1775   int VertexGroup = addPreference( tr( "PREF_GROUP_VERTEX" ), tabId );
1776   setPreferenceProperty( VertexGroup, "columns", 2 );
1777
1778   int typeOfMarker = addPreference( tr( "PREF_TYPE_OF_MARKER" ), VertexGroup,
1779                                     LightApp_Preferences::Selector, "Geometry", "type_of_marker" );
1780
1781   int markerScale = addPreference( tr( "PREF_MARKER_SCALE" ), VertexGroup,
1782                                    LightApp_Preferences::Selector, "Geometry", "marker_scale" );
1783
1784   // Set property for default display mode
1785   QStringList aModesList;
1786   aModesList.append( tr("MEN_WIREFRAME") );
1787   aModesList.append( tr("MEN_SHADING") );
1788   aModesList.append( tr("MEN_SHADING_WITH_EDGES") );
1789
1790   QList<QVariant> anIndexesList;
1791   anIndexesList.append(0);
1792   anIndexesList.append(1);
1793   anIndexesList.append(2);
1794
1795   setPreferenceProperty( dispmode, "strings", aModesList );
1796   setPreferenceProperty( dispmode, "indexes", anIndexesList );
1797
1798   // Set property for step value for spinboxes
1799   setPreferenceProperty( step, "min", 1 );
1800   setPreferenceProperty( step, "max", 10000 );
1801   setPreferenceProperty( step, "precision", 3 );
1802
1803   // Set property for deflection value for spinboxes
1804   setPreferenceProperty( defl, "min", DEFLECTION_MIN );
1805   setPreferenceProperty( defl, "max", 1.0 );
1806   setPreferenceProperty( defl, "step", 1.0e-04 );
1807   setPreferenceProperty( defl, "precision", 6 );
1808
1809   // Set property for default material
1810   Material_ResourceMgr aMatResMgr;
1811   QStringList aPrefMatNames = aMatResMgr.getPreferenceMaterialsNames();
1812   setPreferenceProperty( material, "strings", aPrefMatNames );
1813
1814   // Set property vertex marker type
1815   QList<QVariant> aMarkerTypeIndicesList;
1816   QList<QVariant> aMarkerTypeIconsList;
1817
1818   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1819   for ( int i = GEOM::MT_POINT; i < GEOM::MT_USER; i++ ) {
1820     QString icoFile = QString( "ICON_VERTEX_MARKER_%1" ).arg( i );
1821     QPixmap pixmap = resMgr->loadPixmap( "GEOM", tr( qPrintable( icoFile ) ) );
1822     aMarkerTypeIndicesList << (i-1);
1823     aMarkerTypeIconsList << pixmap;
1824   }
1825
1826   setPreferenceProperty( typeOfMarker, "indexes", aMarkerTypeIndicesList );
1827   setPreferenceProperty( typeOfMarker, "icons",   aMarkerTypeIconsList );
1828
1829   // Set property for vertex marker scale
1830   QList<QVariant> aMarkerScaleIndicesList;
1831   QStringList     aMarkerScaleValuesList;
1832
1833   for ( int iii = GEOM::MS_10; iii <= GEOM::MS_70; iii++ ) {
1834     aMarkerScaleIndicesList << iii;
1835     aMarkerScaleValuesList  << QString::number( (iii-(int)GEOM::MS_10)*0.5 + 1.0 );
1836   }
1837
1838   setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList );
1839   setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
1840
1841   int originGroup = addPreference( tr( "PREF_GROUP_ORIGIN_AND_BASE_VECTORS" ), tabId );
1842   setPreferenceProperty( originGroup, "columns", 2 );
1843
1844   int baseVectorsLength = addPreference( tr( "PREF_BASE_VECTORS_LENGTH" ), originGroup,
1845                                          LightApp_Preferences::DblSpin, "Geometry", "base_vectors_length" );
1846   setPreferenceProperty( baseVectorsLength, "min", 0.01 );
1847   setPreferenceProperty( baseVectorsLength, "max", 1000 );
1848
1849   addPreference( tr( "PREF_AUTO_CREATE" ), originGroup,
1850                  LightApp_Preferences::Bool, "Geometry", "auto_create_base_objects" );
1851
1852
1853   int operationsGroup = addPreference( tr( "PREF_GROUP_OPERATIONS" ), tabId );
1854   setPreferenceProperty( operationsGroup, "columns", 2 );
1855
1856   addPreference( tr( "GEOM_PREVIEW" ), operationsGroup,
1857                  LightApp_Preferences::Bool, "Geometry", "geom_preview" );
1858 }
1859
1860 void GeometryGUI::preferencesChanged( const QString& section, const QString& param )
1861 {
1862   if (section == "Geometry") {
1863     SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
1864     if (param == QString("SettingsGeomStep")) {
1865       double spin_step = aResourceMgr->doubleValue(section, param, 100.);
1866       EmitSignalDefaultStepValueChanged(spin_step);
1867     }
1868   }
1869 }
1870
1871 LightApp_Displayer* GeometryGUI::displayer()
1872 {
1873   if( !myDisplayer )
1874     myDisplayer = new GEOM_Displayer( dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) );
1875   return myDisplayer;
1876 }
1877
1878 void GeometryGUI::setLocalSelectionMode(const int mode)
1879 {
1880   myLocalSelectionMode = mode;
1881 }
1882 int GeometryGUI::getLocalSelectionMode() const
1883 {
1884   return myLocalSelectionMode;
1885 }
1886
1887 const char gSeparator = '_'; // character used to separate parameter names
1888 const char gDigitsSep = ':'; // character used to separate numeric parameter values (color = r:g:b)
1889
1890 /*!
1891  * \brief Store visual parameters
1892  *
1893  * This method is called just before the study document is saved.
1894  * Store visual parameters in AttributeParameter attribute(s)
1895  */
1896 void GeometryGUI::storeVisualParameters (int savePoint)
1897 {
1898   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
1899   if ( !appStudy || !appStudy->studyDS() )
1900     return;
1901   _PTR(Study) studyDS = appStudy->studyDS();
1902
1903   // componentName is used for encoding of entries when storing them in IParameters
1904   std::string componentName = myComponentGeom->ComponentDataType();
1905   //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
1906   //if (!aSComponent) return;
1907
1908   // IParameters
1909   _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
1910                                                              componentName.c_str(),
1911                                                              savePoint);
1912   _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
1913
1914   QList<SUIT_ViewManager*> lst;
1915   QList<SUIT_ViewManager*>::Iterator it;
1916
1917   // main cycle to store parameters of displayed objects
1918   lst.clear();
1919   getApp()->viewManagers(lst);
1920   for (it = lst.begin(); it != lst.end(); it++) {
1921     SUIT_ViewManager* vman = *it;
1922     QString vType = vman->getType();
1923     int aMgrId = vman->getGlobalId();
1924     // saving VTK actors properties
1925     QVector<SUIT_ViewWindow*> views = vman->getViews();
1926     for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++) {
1927       const ObjMap anObjects = appStudy->getObjectMap(aMgrId);
1928       ObjMap::ConstIterator o_it = anObjects.begin();
1929       for (; o_it != anObjects.end(); o_it++) {
1930         const PropMap aProps = o_it.value();
1931
1932         //Check that object exists in the study
1933         _PTR(SObject) obj( studyDS->FindObjectID( o_it.key().toLatin1().data() ) );
1934         if ( !obj || !(aProps.count() > 0))
1935           continue;
1936         // entry is "encoded" = it does NOT contain component adress, since it is a
1937         // subject to change on next component loading
1938
1939         std::string entry = ip->encodeEntry(o_it.key().toLatin1().data(), componentName);
1940
1941         _PTR(GenericAttribute) anAttr;
1942         if( !obj->FindAttribute(anAttr, "AttributeIOR"))
1943           continue;
1944
1945         std::string param,occParam = vType.toLatin1().data();
1946         occParam += NAME_SEPARATOR;
1947         occParam += QString::number(aMgrId).toLatin1().data();
1948         occParam += NAME_SEPARATOR;
1949
1950         if(aProps.contains(VISIBILITY_PROP)) {
1951           param = occParam + VISIBILITY_PROP;
1952           ip->setParameter(entry, param, aProps.value(VISIBILITY_PROP).toInt() == 1 ? "On" : "Off");
1953         }
1954
1955         if(aProps.contains(DISPLAY_MODE_PROP)) {
1956           param = occParam + DISPLAY_MODE_PROP;
1957           ip->setParameter(entry, param, QString::number(aProps.value(DISPLAY_MODE_PROP).toInt()).toLatin1().data());
1958         }
1959
1960         if(aProps.contains(COLOR_PROP)) {
1961           QColor c = aProps.value(COLOR_PROP).value<QColor>();
1962           QString colorStr = QString::number(c.red()/255.);
1963           colorStr += DIGIT_SEPARATOR; colorStr += QString::number(c.green()/255.);
1964           colorStr += DIGIT_SEPARATOR; colorStr += QString::number(c.blue()/255.);
1965           param = occParam + COLOR_PROP;
1966           ip->setParameter(entry, param, colorStr.toLatin1().data());
1967         }
1968
1969         if(vType == SVTK_Viewer::Type()) {
1970           if(aProps.contains(OPACITY_PROP)) {
1971             param = occParam + OPACITY_PROP;
1972             ip->setParameter(entry, param, QString::number(1. - aProps.value(TRANSPARENCY_PROP).toDouble()).toLatin1().data());
1973           }
1974         } else if (vType == SOCC_Viewer::Type()) {
1975           if(aProps.contains(TRANSPARENCY_PROP)) {
1976             param = occParam + TRANSPARENCY_PROP;
1977             ip->setParameter(entry, param, QString::number(aProps.value(TRANSPARENCY_PROP).toDouble()).toLatin1().data());
1978           }
1979
1980           if(aProps.contains(TOP_LEVEL_PROP)) {
1981             param = occParam + TOP_LEVEL_PROP;
1982             Standard_Boolean val = aProps.value(TOP_LEVEL_PROP).value<Standard_Boolean>();
1983             if (val == Standard_True) 
1984               ip->setParameter(entry, param, "1");
1985           }       
1986         }
1987
1988         if(aProps.contains(ISOS_PROP)) {
1989           param = occParam + ISOS_PROP;
1990           ip->setParameter(entry, param, aProps.value(ISOS_PROP).toString().toLatin1().data());
1991         }
1992
1993         if(aProps.contains(VECTOR_MODE_PROP)) {
1994           param = occParam + VECTOR_MODE_PROP;
1995           ip->setParameter(entry, param, QString::number(aProps.value(VECTOR_MODE_PROP).toInt()).toLatin1().data());
1996         }
1997
1998         if(aProps.contains(DEFLECTION_COEFF_PROP)) {
1999           param = occParam + DEFLECTION_COEFF_PROP;
2000           ip->setParameter(entry, param, QString::number(aProps.value(DEFLECTION_COEFF_PROP).toDouble()).toLatin1().data());
2001         }
2002
2003         //Marker type of the vertex - ONLY for the "Vertex" and "Compound of the Vertex"
2004         if(aProps.contains(MARKER_TYPE_PROP)) {
2005           param = occParam + MARKER_TYPE_PROP;
2006           ip->setParameter(entry, param, aProps.value(MARKER_TYPE_PROP).toString().toLatin1().data());
2007         }
2008
2009         if(aProps.contains(MATERIAL_PROP)) {
2010           param = occParam + MATERIAL_PROP;
2011           ip->setParameter(entry, param, aProps.value(MATERIAL_PROP).toString().toLatin1().data());
2012         }
2013
2014         if(aProps.contains( EDGE_WIDTH_PROP )) {
2015              param = occParam + EDGE_WIDTH_PROP;
2016            ip->setParameter(entry, param, aProps.value(EDGE_WIDTH_PROP).toString().toLatin1().data());                               
2017         }
2018         
2019         if(aProps.contains( ISOS_WIDTH_PROP )) {
2020           param = occParam + ISOS_WIDTH_PROP;
2021           ip->setParameter(entry, param, aProps.value(ISOS_WIDTH_PROP).toString().toLatin1().data());
2022         }
2023       } // object iterator
2024     } // for (views)
2025   } // for (viewManagers)
2026 }
2027
2028 /*!
2029  * \brief Restore visual parameters
2030  *
2031  * This method is called after the study document is opened.
2032  * Restore visual parameters from AttributeParameter attribute(s)
2033  */
2034 void GeometryGUI::restoreVisualParameters (int savePoint)
2035 {
2036   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
2037   if (!appStudy || !appStudy->studyDS())
2038     return;
2039   _PTR(Study) studyDS = appStudy->studyDS();
2040
2041   // componentName is used for encoding of entries when storing them in IParameters
2042   std::string componentName = myComponentGeom->ComponentDataType();
2043   //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
2044   //if (!aSComponent) return;
2045
2046   // IParameters
2047   _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
2048                                                              componentName.c_str(),
2049                                                              savePoint);
2050   _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
2051
2052   std::vector<std::string> entries = ip->getEntries();
2053
2054   for (std::vector<std::string>::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt)
2055   {
2056     // entry is a normal entry - it should be "decoded" (setting base adress of component)
2057     QString entry (ip->decodeEntry(*entIt).c_str());
2058
2059     // Check that the entry corresponds to a real object in the Study
2060     // as the object may be deleted or modified after the visual state is saved.
2061     _PTR(SObject) so = studyDS->FindObjectID(entry.toLatin1().data());
2062     if (!so) continue; //Skip the not existent entry
2063
2064     std::vector<std::string> paramNames = ip->getAllParameterNames( *entIt );
2065     std::vector<std::string> paramValues = ip->getAllParameterValues( *entIt );
2066
2067     std::vector<std::string>::iterator namesIt = paramNames.begin();
2068     std::vector<std::string>::iterator valuesIt = paramValues.begin();
2069
2070     // actors are stored in a map after displaying of them for
2071     // quicker access in the future: map < viewID to actor >
2072     NCollection_DataMap<int, GEOM_Actor*          > vtkActors;
2073     NCollection_DataMap<int, Handle(GEOM_AISShape)> occActors;
2074
2075     QString viewerTypStr;
2076     QString viewIndexStr;
2077     int viewIndex;
2078     QVector<PropMap> aListOfMap;
2079
2080     for (; namesIt != paramNames.end(); ++namesIt, ++valuesIt)
2081     {
2082       // visual parameters are stored in strings as follows: ViewerType_ViewIndex_ParamName.
2083       // '_' is used as separator and should not be used in viewer type or parameter names.
2084       QStringList lst = QString((*namesIt).c_str()).split(NAME_SEPARATOR, QString::SkipEmptyParts);
2085       if (lst.size() != 3)
2086         continue;
2087
2088       viewerTypStr = lst[0];
2089       viewIndexStr = lst[1];
2090       QString paramNameStr = lst[2];
2091
2092       bool ok;
2093       viewIndex = viewIndexStr.toUInt(&ok);
2094       if (!ok) // bad conversion of view index to integer
2095         continue;
2096
2097       if((viewIndex + 1) > aListOfMap.count()) {
2098         aListOfMap.resize(viewIndex + 1);
2099       }
2100
2101       QString val((*valuesIt).c_str());
2102       if(paramNameStr == VISIBILITY_PROP){
2103         aListOfMap[viewIndex].insert(VISIBILITY_PROP, val == "On" ? 1 : 0);
2104
2105       } else if(paramNameStr == OPACITY_PROP) {
2106         aListOfMap[viewIndex].insert(TRANSPARENCY_PROP, 1. - val.toDouble());
2107
2108       } else if(paramNameStr == TRANSPARENCY_PROP) {
2109         aListOfMap[viewIndex].insert( TRANSPARENCY_PROP, val.toDouble() );
2110
2111       } else if(paramNameStr == TOP_LEVEL_PROP) {
2112           aListOfMap[viewIndex].insert( TRANSPARENCY_PROP, val == "1" ? Standard_True : Standard_False );
2113           
2114       } else if(paramNameStr == DISPLAY_MODE_PROP) {
2115         aListOfMap[viewIndex].insert( DISPLAY_MODE_PROP, val.toInt());
2116
2117       } else if(paramNameStr == ISOS_PROP) {
2118         aListOfMap[viewIndex].insert( ISOS_PROP, val);
2119
2120       } else if(paramNameStr == COLOR_PROP) {
2121         QStringList rgb = val.split(DIGIT_SEPARATOR);
2122         if(rgb.count() == 3) {
2123           QColor c(int(rgb[0].toDouble()*255), int(rgb[1].toDouble()*255), int(rgb[2].toDouble()*255));
2124           aListOfMap[viewIndex].insert( COLOR_PROP, c);
2125         }
2126       } else if(paramNameStr == VECTOR_MODE_PROP) {
2127         aListOfMap[viewIndex].insert( VECTOR_MODE_PROP, val.toInt());
2128
2129       }  else if(paramNameStr == DEFLECTION_COEFF_PROP) {
2130         aListOfMap[viewIndex].insert( DEFLECTION_COEFF_PROP, val.toDouble());
2131       }  else if(paramNameStr == MARKER_TYPE_PROP) {
2132         aListOfMap[viewIndex].insert( MARKER_TYPE_PROP, val);
2133       } else if(paramNameStr == MATERIAL_PROP) {
2134         aListOfMap[viewIndex].insert( MATERIAL_PROP, val);
2135       }  else if(paramNameStr == EDGE_WIDTH_PROP) {
2136         aListOfMap[viewIndex].insert( EDGE_WIDTH_PROP , val);
2137       }  else if(paramNameStr == ISOS_WIDTH_PROP) {
2138         aListOfMap[viewIndex].insert( ISOS_WIDTH_PROP , val);
2139       }
2140
2141                     
2142
2143     } // for names/parameters iterator
2144
2145     QList<SUIT_ViewManager*> lst = getApp()->viewManagers();
2146
2147     for (int index = 0; index < aListOfMap.count(); index++) {
2148
2149       appStudy->setObjectPropMap(index, entry, aListOfMap[index]);
2150
2151       //Get Visibility property of the current PropMap
2152       if (aListOfMap[index].value(VISIBILITY_PROP) == 1) {
2153         SUIT_ViewManager* vman = lst.at(index);
2154         SUIT_ViewModel* vmodel = vman->getViewModel();
2155         displayer()->Display(entry, true, dynamic_cast<SALOME_View*>(vmodel));
2156       }
2157     }
2158
2159   } // for entries iterator
2160
2161   // update all VTK and OCC views
2162   QList<SUIT_ViewManager*> lst;
2163   getApp()->viewManagers(lst);
2164   for (QList<SUIT_ViewManager*>::Iterator it = lst.begin(); it != lst.end(); it++) {
2165     SUIT_ViewModel* vmodel = (*it)->getViewModel();
2166     if (!vmodel)
2167       continue;
2168     if (vmodel->getType() == SVTK_Viewer::Type()) {
2169       SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) (*it)->getActiveView();
2170       vtkView->getRenderer()->ResetCameraClippingRange();
2171       vtkView->Repaint();
2172     }
2173     else if (vmodel->getType() == SOCC_Viewer::Type()) {
2174       //SOCC_ViewWindow* occView = (SOCC_ViewWindow*) (*it)->getActiveView();
2175       SALOME_View* occVMod = dynamic_cast<SALOME_View*>(vmodel);
2176       if (occVMod)
2177         occVMod->Repaint();
2178     }
2179   }
2180 }
2181
2182 void GeometryGUI::onViewAboutToShow()
2183 {
2184   SUIT_ViewWindow* window = application()->desktop()->activeWindow();
2185   QAction* a = action( GEOMOp::OpSwitchVectors );
2186   if ( window ) {
2187     a->setEnabled(true);
2188     bool vmode = window->property("VectorsMode").toBool();
2189     a->setText ( vmode == 1 ? tr( "MEN_VECTOR_MODE_OFF" ) : tr("MEN_VECTOR_MODE_ON") );
2190   } else {
2191     a->setText ( tr("MEN_VECTOR_MODE_ON") );
2192     a->setEnabled(false);
2193   }
2194 }
2195
2196 /*!
2197   \brief Return action by id
2198   \param id identifier of the action
2199   \return action 
2200 */
2201 QAction* GeometryGUI::getAction(const int id) {
2202   return action(id);
2203 }
2204
2205 /*!
2206   \brief Check if this object is can't be renamed in place
2207
2208   This method can be re-implemented in the subclasses.
2209   Return true in case if object isn't reference or component (module root).
2210
2211   \param entry column id
2212   \return \c true if the item can be renamed by the user in place (e.g. in the Object browser)
2213 */
2214 bool GeometryGUI::renameAllowed( const QString& entry) const {
2215
2216   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
2217   SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0; 
2218   SalomeApp_DataObject* obj = appStudy ? dynamic_cast<SalomeApp_DataObject*>(appStudy->findObjectByEntry(entry)) : 0;
2219   
2220   return (app && appStudy && obj && !appStudy->isComponent(entry) && !obj->isReference());
2221 }
2222
2223
2224 /*!
2225   Rename object by entry.
2226   \param entry entry of the object
2227   \param name new name of the object
2228   \brief Return \c true if rename operation finished successfully, \c false otherwise.
2229 */
2230 bool GeometryGUI::renameObject( const QString& entry, const QString& name) {
2231   
2232   bool result = false;
2233   
2234   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication());
2235   SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
2236   
2237   if(!appStudy)
2238     return result;
2239   
2240   _PTR(Study) aStudy = appStudy->studyDS();
2241   
2242   if(!aStudy)
2243     return result;
2244
2245   bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
2246   if ( aLocked ) {
2247     SUIT_MessageBox::warning ( app->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
2248     return result;
2249   }
2250
2251   _PTR(SObject) obj ( aStudy->FindObjectID(qPrintable(entry)) );
2252   _PTR(GenericAttribute) anAttr;
2253   if ( obj ) {
2254     if ( obj->FindAttribute(anAttr, "AttributeName") ) {
2255       _PTR(AttributeName) aName (anAttr);
2256
2257       GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(obj));
2258       if (!CORBA::is_nil(anObj)) {
2259         aName->SetValue( name.toLatin1().data() ); // rename the SObject
2260         anObj->SetName( name.toLatin1().data() );  // Rename the corresponding GEOM_Object
2261         result = true;
2262       }
2263     }
2264   }
2265   return result;
2266 }
2267