Salome HOME
Forbid renaming of the objects "in place" by default.
[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     libName = "GEOMToolsGUI";
430     break;
431   case GEOMOp::OpDisplayMode:        // MENU VIEW - WIREFRAME/SHADING
432   case GEOMOp::OpShowAll:            // MENU VIEW - SHOW ALL
433   case GEOMOp::OpShowOnly:           // MENU VIEW - DISPLAY ONLY
434   case GEOMOp::OpHideAll:            // MENU VIEW - ERASE ALL
435   case GEOMOp::OpHide:               // MENU VIEW - ERASE
436   case GEOMOp::OpShow:               // MENU VIEW - DISPLAY
437   case GEOMOp::OpSwitchVectors:      // MENU VIEW - VECTOR MODE
438   case GEOMOp::OpWireframe:          // POPUP MENU - WIREFRAME
439   case GEOMOp::OpShading:            // POPUP MENU - SHADING
440   case GEOMOp::OpShadingWithEdges:   // POPUP MENU - SHADING WITH EDGES
441   case GEOMOp::OpTexture:            // POPUP MENU - TEXTURE
442   case GEOMOp::OpVectors:            // POPUP MENU - VECTORS
443     libName = "DisplayGUI";
444     break;
445   case GEOMOp::OpPoint:              // MENU BASIC - POINT
446   case GEOMOp::OpLine:               // MENU BASIC - LINE
447   case GEOMOp::OpCircle:             // MENU BASIC - CIRCLE
448   case GEOMOp::OpEllipse:            // MENU BASIC - ELLIPSE
449   case GEOMOp::OpArc:                // MENU BASIC - ARC
450   case GEOMOp::OpVector:             // MENU BASIC - VECTOR
451   case GEOMOp::OpPlane:              // MENU BASIC - PLANE
452   case GEOMOp::OpCurve:              // MENU BASIC - CURVE
453   case GEOMOp::OpLCS:                // MENU BASIC - LOCAL COORDINATE SYSTEM
454     libName = "BasicGUI";
455     break;
456   case GEOMOp::OpBox:                // MENU PRIMITIVE - BOX
457   case GEOMOp::OpCylinder:           // MENU PRIMITIVE - CYLINDER
458   case GEOMOp::OpSphere:             // MENU PRIMITIVE - SPHERE
459   case GEOMOp::OpTorus:              // MENU PRIMITIVE - TORUS
460   case GEOMOp::OpCone:               // MENU PRIMITIVE - CONE
461   case GEOMOp::OpRectangle:          // MENU PRIMITIVE - FACE
462   case GEOMOp::OpDisk:               // MENU PRIMITIVE - DISK
463     libName = "PrimitiveGUI";
464     break;
465   case GEOMOp::OpPrism:              // MENU GENERATION - PRISM
466   case GEOMOp::OpRevolution:         // MENU GENERATION - REVOLUTION
467   case GEOMOp::OpFilling:            // MENU GENERATION - FILLING
468   case GEOMOp::OpPipe:               // MENU GENERATION - PIPE
469     libName = "GenerationGUI";
470     break;
471   case GEOMOp::Op2dSketcher:         // MENU ENTITY - SKETCHER
472   case GEOMOp::Op3dSketcher:         // MENU ENTITY - 3D SKETCHER
473   case GEOMOp::OpExplode:            // MENU ENTITY - EXPLODE
474 #ifdef WITH_OPENCV
475   case GEOMOp::OpFeatureDetect:      // MENU ENTITY - FEATURE DETECTION
476 #endif
477   case GEOMOp::OpPictureImport:      // MENU ENTITY - IMPORT PICTURE IN VIEWER
478     libName = "EntityGUI";
479     break;
480   case GEOMOp::OpEdge:               // MENU BUILD - EDGE
481   case GEOMOp::OpWire:               // MENU BUILD - WIRE
482   case GEOMOp::OpFace:               // MENU BUILD - FACE
483   case GEOMOp::OpShell:              // MENU BUILD - SHELL
484   case GEOMOp::OpSolid:              // MENU BUILD - SOLID
485   case GEOMOp::OpCompound:           // MENU BUILD - COMPUND
486     libName = "BuildGUI";
487     break;
488   case GEOMOp::OpFuse:               // MENU BOOLEAN - FUSE
489   case GEOMOp::OpCommon:             // MENU BOOLEAN - COMMON
490   case GEOMOp::OpCut:                // MENU BOOLEAN - CUT
491   case GEOMOp::OpSection:            // MENU BOOLEAN - SECTION
492     libName = "BooleanGUI";
493     break;
494   case GEOMOp::OpTranslate:          // MENU TRANSFORMATION - TRANSLATION
495   case GEOMOp::OpRotate:             // MENU TRANSFORMATION - ROTATION
496   case GEOMOp::OpChangeLoc:          // MENU TRANSFORMATION - LOCATION
497   case GEOMOp::OpMirror:             // MENU TRANSFORMATION - MIRROR
498   case GEOMOp::OpScale:              // MENU TRANSFORMATION - SCALE
499   case GEOMOp::OpOffset:             // MENU TRANSFORMATION - OFFSET
500   case GEOMOp::OpProjection:         // MENU TRANSFORMATION - PROJECTION
501   case GEOMOp::OpMultiTranslate:     // MENU TRANSFORMATION - MULTI-TRANSLATION
502   case GEOMOp::OpMultiRotate:        // MENU TRANSFORMATION - MULTI-ROTATION
503   case GEOMOp::OpReimport:           // CONTEXT(POPUP) MENU - RELOAD_IMPORTED
504     libName = "TransformationGUI";
505     break;
506   case GEOMOp::OpPartition:          // MENU OPERATION - PARTITION
507   case GEOMOp::OpArchimede:          // MENU OPERATION - ARCHIMEDE
508   case GEOMOp::OpFillet3d:           // MENU OPERATION - FILLET
509   case GEOMOp::OpChamfer:            // MENU OPERATION - CHAMFER
510   case GEOMOp::OpClipping:           // MENU OPERATION - CLIPPING RANGE
511   case GEOMOp::OpShapesOnShape:      // MENU OPERATION - GET SHAPES ON SHAPE
512   case GEOMOp::OpFillet2d:           // MENU OPERATION - FILLET 2D
513   case GEOMOp::OpFillet1d:           // MENU OPERATION - FILLET 1D
514   case GEOMOp::OpSharedShapes:       // MENU OPERATION - GET SHARED SHAPES
515   case GEOMOp::OpExtrudedBoss:       // MENU OPERATION - EXTRUDED BOSS
516   case GEOMOp::OpExtrudedCut:        // MENU OPERATION - EXTRUDED CUT
517     libName = "OperationGUI";
518     break;
519   case GEOMOp::OpSewing:             // MENU REPAIR - SEWING
520   case GEOMOp::OpSuppressFaces:      // MENU REPAIR - SUPPRESS FACES
521   case GEOMOp::OpSuppressHoles:      // MENU REPAIR - SUPPRESS HOLE
522   case GEOMOp::OpShapeProcess:       // MENU REPAIR - SHAPE PROCESSING
523   case GEOMOp::OpCloseContour:       // MENU REPAIR - CLOSE CONTOUR
524   case GEOMOp::OpRemoveIntWires:     // MENU REPAIR - REMOVE INTERNAL WIRES
525   case GEOMOp::OpAddPointOnEdge:     // MENU REPAIR - ADD POINT ON EDGE
526   case GEOMOp::OpFreeBoundaries:     // MENU MEASURE - FREE BOUNDARIES
527   case GEOMOp::OpFreeFaces:          // MENU MEASURE - FREE FACES
528   case GEOMOp::OpOrientation:        // MENU REPAIR - CHANGE ORIENTATION
529   case GEOMOp::OpGlueFaces:          // MENU REPAIR - GLUE FACES
530   case GEOMOp::OpGlueEdges:          // MENU REPAIR - GLUE EDGES
531   case GEOMOp::OpLimitTolerance:     // MENU REPAIR - LIMIT TOLERANCE
532   case GEOMOp::OpRemoveExtraEdges:   // MENU REPAIR - REMOVE EXTRA EDGES
533     libName = "RepairGUI";
534     break;
535   case GEOMOp::OpProperties:         // MENU MEASURE - PROPERTIES
536   case GEOMOp::OpCenterMass:         // MENU MEASURE - CDG
537   case GEOMOp::OpInertia:            // MENU MEASURE - INERTIA
538   case GEOMOp::OpNormale:            // MENU MEASURE - NORMALE
539   case GEOMOp::OpBoundingBox:        // MENU MEASURE - BOUNDING BOX
540   case GEOMOp::OpMinDistance:        // MENU MEASURE - MIN DISTANCE
541   case GEOMOp::OpAngle:              // MENU MEASURE - ANGLE
542   case GEOMOp::OpTolerance:          // MENU MEASURE - TOLERANCE
543   case GEOMOp::OpWhatIs:             // MENU MEASURE - WHATIS
544   case GEOMOp::OpCheckShape:         // MENU MEASURE - CHECK
545   case GEOMOp::OpCheckCompound:      // MENU MEASURE - CHECK COMPOUND OF BLOCKS
546   case GEOMOp::OpPointCoordinates:   // MENU MEASURE - POINT COORDINATES
547   case GEOMOp::OpCheckSelfInters:    // MENU MEASURE - CHECK SELF INTERSECTIONS
548     libName = "MeasureGUI";
549     break;
550   case GEOMOp::OpGroupCreate:        // MENU GROUP - CREATE
551   case GEOMOp::OpGroupCreatePopup:   // POPUP MENU - CREATE GROUP
552   case GEOMOp::OpGroupEdit:          // MENU GROUP - EDIT
553     libName = "GroupGUI";
554     break;
555   case GEOMOp::OpHexaSolid:          // MENU BLOCKS - HEXAHEDRAL SOLID
556   case GEOMOp::OpMultiTransform:     // MENU BLOCKS - MULTI-TRANSFORMATION
557   case GEOMOp::OpQuadFace:           // MENU BLOCKS - QUADRANGLE FACE
558   case GEOMOp::OpPropagate:          // MENU BLOCKS - PROPAGATE
559   case GEOMOp::OpExplodeBlock:       // MENU BLOCKS - EXPLODE ON BLOCKS
560     libName = "BlocksGUI";
561     break;
562   case GEOMOp::OpAdvancedNoOp:       // NO OPERATION (advanced operations base)
563   case GEOMOp::OpPipeTShape:         // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE
564 //   case GEOMOp::OpPipeTShapeGroups:     // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS
565     //@@ 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 @@//
566     libName = "AdvancedGUI";
567     break;
568   default:
569     break;
570   }
571
572   GEOMGUI* library = 0;
573   if ( !libName.isEmpty() ) {
574 #ifndef WNT
575     libName = QString( "lib" ) + libName + ".so";
576 #else
577     libName = libName + ".dll";
578 #endif
579     library = getLibrary( libName );
580   }
581
582   // call method of corresponding GUI library
583   if ( library ) {
584     library->OnGUIEvent( id, desk );
585     
586     // Update a list of materials for "Preferences" dialog
587     if ( id == GEOMOp::OpMaterialProperties ) {
588       LightApp_Preferences* pref = preferences();
589       if ( pref ) {
590         Material_ResourceMgr aMatResMgr;
591         QStringList aPerfMatNames = aMatResMgr.getPreferenceMaterialsNames();
592         setPreferenceProperty( pref->rootItem()->findItem( tr( "PREF_FRONT_MATERIAL" ), true )->id(),
593                                "strings",
594                                aPerfMatNames );
595         setPreferenceProperty( pref->rootItem()->findItem( tr( "PREF_BACK_MATERIAL" ), true )->id(),
596                                "strings",
597                                aPerfMatNames );
598       }
599     }
600   }
601   else
602     SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) );
603 }
604
605 //=================================================================================
606 // function : GeometryGUI::OnKeyPress()
607 // purpose  : Called when any key is pressed by user [static]
608 //=================================================================================
609 void GeometryGUI::OnKeyPress( SUIT_ViewWindow* w, QKeyEvent* e )
610 {
611   if ( !application() )
612     return;
613   foreach ( GEOMGUI* lib, myGUIMap )
614     lib->OnKeyPress( e, application()->desktop(), w );
615 }
616
617 //=================================================================================
618 // function : GeometryGUI::OnMouseMove()
619 // purpose  : Manages mouse move events [static]
620 //=================================================================================
621 void GeometryGUI::OnMouseMove( SUIT_ViewWindow* w, QMouseEvent* e )
622 {
623   if ( !application() )
624     return;
625   foreach ( GEOMGUI* lib, myGUIMap )
626     lib->OnMouseMove( e, application()->desktop(), w );
627 }
628
629 //=================================================================================
630 // function : GeometryGUI::OnMouseRelease()
631 // purpose  : Manages mouse release events [static]
632 //=================================================================================
633 void GeometryGUI::OnMouseRelease( SUIT_ViewWindow* w, QMouseEvent* e )
634 {
635   if ( !application() )
636     return;
637   foreach ( GEOMGUI* lib, myGUIMap )
638     lib->OnMouseRelease( e, application()->desktop(), w );
639 }
640
641 //=================================================================================
642 // function : GeometryGUI::OnMousePress()
643 // purpose  : Manage mouse press events [static]
644 //=================================================================================
645 void GeometryGUI::OnMousePress( SUIT_ViewWindow* w, QMouseEvent* e )
646 {
647   if ( !application() )
648     return;
649   foreach ( GEOMGUI* lib, myGUIMap )
650     lib->OnMousePress( e, application()->desktop(), w );
651 }
652
653 //=======================================================================
654 // function : createGeomAction
655 // purpose  :
656 //=======================================================================
657 void GeometryGUI::createGeomAction( const int id, const QString& label, const QString& icolabel,
658                                     const int accel, const bool toggle, const QString& shortcutAction )
659 {
660   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
661   QPixmap icon = icolabel.isEmpty() ? resMgr->loadPixmap( "GEOM", tr( (QString( "ICO_" )+label).toLatin1().constData() ), false )
662                                     : resMgr->loadPixmap( "GEOM", tr( icolabel.toLatin1().constData() ) );
663   createAction( id,
664                 tr( QString( "TOP_%1" ).arg( label ).toLatin1().constData() ),
665                 icon,
666                 tr( QString( "MEN_%1" ).arg( label ).toLatin1().constData() ),
667                 tr( QString( "STB_%1" ).arg( label ).toLatin1().constData() ),
668                 accel,
669                 application()->desktop(),
670                 toggle,
671                 this, SLOT( OnGUIEvent() ),
672                 shortcutAction );
673 }
674
675 //=======================================================================
676 // function : createOriginAndBaseVectors
677 // purpose  :
678 //=======================================================================
679 void GeometryGUI::createOriginAndBaseVectors()
680 {
681   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
682   if( appStudy ) {
683     _PTR(Study) studyDS = appStudy->studyDS();
684     if( studyDS && !CORBA::is_nil( GetGeomGen() ) ) {
685       GEOM::GEOM_IBasicOperations_var aBasicOperations = GetGeomGen()->GetIBasicOperations( studyDS->StudyId() );
686       if( !aBasicOperations->_is_nil() ) {
687         SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
688         double aLength = aResourceMgr->doubleValue( "Geometry", "base_vectors_length", 1.0 );
689         GEOM::GEOM_Object_var anOrigin = aBasicOperations->MakePointXYZ( 0.0, 0.0, 0.0 );
690         GEOM::GEOM_Object_var anOX = aBasicOperations->MakeVectorDXDYDZ( aLength, 0.0, 0.0 );
691         GEOM::GEOM_Object_var anOY = aBasicOperations->MakeVectorDXDYDZ( 0.0, aLength, 0.0 );
692         GEOM::GEOM_Object_var anOZ = aBasicOperations->MakeVectorDXDYDZ( 0.0, 0.0, aLength );
693
694         SALOMEDS::Study_var aDSStudy = ClientStudyToStudy( studyDS );
695         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOrigin, "O" );
696         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOX, "OX" );
697         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOY, "OY" );
698         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOZ, "OZ" );
699
700         getApp()->updateObjectBrowser( false );
701       }
702     }
703   }
704 }
705
706 //=======================================================================
707 // function : GeometryGUI::initialize()
708 // purpose  : Called when GEOM module is created
709 //=======================================================================
710 void GeometryGUI::initialize( CAM_Application* app )
711 {
712   SalomeApp_Module::initialize( app );
713
714   // ----- create actions --------------
715
716   createGeomAction( GEOMOp::OpImport,     "IMPORT", "", Qt::ControlModifier + Qt::Key_I );
717   createGeomAction( GEOMOp::OpExport,     "EXPORT", "", Qt::ControlModifier + Qt::Key_E );
718
719   createGeomAction( GEOMOp::OpDelete,     "DELETE", "", Qt::Key_Delete );
720
721   createGeomAction( GEOMOp::OpPoint,      "POINT" );
722   createGeomAction( GEOMOp::OpLine,       "LINE" );
723   createGeomAction( GEOMOp::OpCircle,     "CIRCLE" );
724   createGeomAction( GEOMOp::OpEllipse,    "ELLIPSE" );
725   createGeomAction( GEOMOp::OpArc,        "ARC" );
726   createGeomAction( GEOMOp::OpCurve,      "CURVE" );
727   createGeomAction( GEOMOp::OpVector,     "VECTOR" );
728   createGeomAction( GEOMOp::OpPlane,      "PLANE" );
729   createGeomAction( GEOMOp::OpLCS,        "LOCAL_CS" );
730   createGeomAction( GEOMOp::OpOriginAndVectors, "ORIGIN_AND_VECTORS" );
731
732   createGeomAction( GEOMOp::OpBox,        "BOX" );
733   createGeomAction( GEOMOp::OpCylinder,   "CYLINDER" );
734   createGeomAction( GEOMOp::OpSphere,     "SPHERE" );
735   createGeomAction( GEOMOp::OpTorus,      "TORUS" );
736   createGeomAction( GEOMOp::OpCone,       "CONE" );
737   createGeomAction( GEOMOp::OpRectangle,  "RECTANGLE" );
738   createGeomAction( GEOMOp::OpDisk,       "DISK" );
739
740   createGeomAction( GEOMOp::OpPrism,       "EXTRUSION" );
741   createGeomAction( GEOMOp::OpRevolution,  "REVOLUTION" );
742   createGeomAction( GEOMOp::OpFilling,     "FILLING" );
743   createGeomAction( GEOMOp::OpPipe,        "PIPE" );
744
745   createGeomAction( GEOMOp::OpGroupCreate, "GROUP_CREATE" );
746   createGeomAction( GEOMOp::OpGroupEdit,   "GROUP_EDIT" );
747
748   createGeomAction( GEOMOp::OpReimport,    "RELOAD_IMPORTED" );
749
750   createGeomAction( GEOMOp::OpQuadFace,    "Q_FACE" );
751   createGeomAction( GEOMOp::OpHexaSolid,   "HEX_SOLID" );
752
753   createGeomAction( GEOMOp::Op2dSketcher,  "SKETCH" );
754   createGeomAction( GEOMOp::Op3dSketcher,  "3DSKETCH" );
755   createGeomAction( GEOMOp::OpExplode,     "EXPLODE" );
756 #ifdef WITH_OPENCV
757   createGeomAction( GEOMOp::OpFeatureDetect,"FEATURE_DETECTION" );
758 #endif
759   createGeomAction( GEOMOp::OpPictureImport,"PICTURE_IMPORT" );
760
761   createGeomAction( GEOMOp::OpEdge,        "EDGE" );
762   createGeomAction( GEOMOp::OpWire,        "WIRE" );
763   createGeomAction( GEOMOp::OpFace,        "FACE" );
764   createGeomAction( GEOMOp::OpShell,       "SHELL" );
765   createGeomAction( GEOMOp::OpSolid,       "SOLID" );
766   createGeomAction( GEOMOp::OpCompound,    "COMPOUND" );
767
768   createGeomAction( GEOMOp::OpFuse,        "FUSE" );
769   createGeomAction( GEOMOp::OpCommon,      "COMMON" );
770   createGeomAction( GEOMOp::OpCut,         "CUT" );
771   createGeomAction( GEOMOp::OpSection,     "SECTION" );
772
773   createGeomAction( GEOMOp::OpTranslate,      "TRANSLATION" );
774   createGeomAction( GEOMOp::OpRotate,         "ROTATION" );
775   createGeomAction( GEOMOp::OpChangeLoc,      "MODIFY_LOCATION" );
776   createGeomAction( GEOMOp::OpMirror,         "MIRROR" );
777   createGeomAction( GEOMOp::OpScale,          "SCALE" );
778   createGeomAction( GEOMOp::OpOffset,         "OFFSET" );
779   createGeomAction( GEOMOp::OpProjection,     "PROJECTION" );
780   createGeomAction( GEOMOp::OpMultiTranslate, "MUL_TRANSLATION" );
781   createGeomAction( GEOMOp::OpMultiRotate,    "MUL_ROTATION" );
782
783   createGeomAction( GEOMOp::OpPartition,      "PARTITION" );
784   createGeomAction( GEOMOp::OpArchimede,      "ARCHIMEDE" );
785   createGeomAction( GEOMOp::OpFillet3d,       "FILLET" );
786   createGeomAction( GEOMOp::OpChamfer,        "CHAMFER" );
787   //createGeomAction( GEOMOp::OpClipping,        "CLIPPING" );
788   createGeomAction( GEOMOp::OpShapesOnShape,  "GET_SHAPES_ON_SHAPE" );
789   createGeomAction( GEOMOp::OpSharedShapes,   "GET_SHARED_SHAPES" );
790   createGeomAction( GEOMOp::OpExtrudedCut,    "EXTRUDED_CUT" );
791   createGeomAction( GEOMOp::OpExtrudedBoss,   "EXTRUDED_BOSS" );
792   createGeomAction( GEOMOp::OpFillet1d,       "FILLET_1D" );
793   createGeomAction( GEOMOp::OpFillet2d,       "FILLET_2D" );
794
795   createGeomAction( GEOMOp::OpMultiTransform, "MUL_TRANSFORM" );
796   createGeomAction( GEOMOp::OpExplodeBlock,   "EXPLODE_BLOCKS" );
797   createGeomAction( GEOMOp::OpPropagate,      "PROPAGATE" );
798
799   createGeomAction( GEOMOp::OpSewing,           "SEWING" );
800   createGeomAction( GEOMOp::OpGlueFaces,        "GLUE_FACES" );
801   createGeomAction( GEOMOp::OpGlueEdges,        "GLUE_EDGES" );
802   createGeomAction( GEOMOp::OpLimitTolerance,   "LIMIT_TOLERANCE" );
803   createGeomAction( GEOMOp::OpSuppressFaces,    "SUPPRESS_FACES" );
804   createGeomAction( GEOMOp::OpSuppressHoles,    "SUPPERSS_HOLES" );
805   createGeomAction( GEOMOp::OpShapeProcess,     "SHAPE_PROCESS" );
806   createGeomAction( GEOMOp::OpCloseContour,     "CLOSE_CONTOUR" );
807   createGeomAction( GEOMOp::OpRemoveIntWires,   "SUPPRESS_INT_WIRES" );
808   createGeomAction( GEOMOp::OpAddPointOnEdge,   "POINT_ON_EDGE" );
809   createGeomAction( GEOMOp::OpFreeBoundaries,   "CHECK_FREE_BNDS" );
810   createGeomAction( GEOMOp::OpFreeFaces,        "CHECK_FREE_FACES" );
811   createGeomAction( GEOMOp::OpOrientation,      "CHANGE_ORIENTATION" );
812   createGeomAction( GEOMOp::OpRemoveExtraEdges, "REMOVE_EXTRA_EDGES" );
813
814   createGeomAction( GEOMOp::OpPointCoordinates, "POINT_COORDS" );
815   createGeomAction( GEOMOp::OpProperties,       "BASIC_PROPS" );
816   createGeomAction( GEOMOp::OpCenterMass,       "MASS_CENTER" );
817   createGeomAction( GEOMOp::OpInertia,          "INERTIA" );
818   createGeomAction( GEOMOp::OpNormale,          "NORMALE" );
819   createGeomAction( GEOMOp::OpBoundingBox,      "BND_BOX" );
820   createGeomAction( GEOMOp::OpMinDistance,      "MIN_DIST" );
821   createGeomAction( GEOMOp::OpAngle,            "MEASURE_ANGLE" );
822
823   createGeomAction( GEOMOp::OpTolerance,        "TOLERANCE" );
824   createGeomAction( GEOMOp::OpWhatIs,           "WHAT_IS" );
825   createGeomAction( GEOMOp::OpCheckShape,       "CHECK" );
826   createGeomAction( GEOMOp::OpCheckCompound,    "CHECK_COMPOUND" );
827   createGeomAction( GEOMOp::OpCheckSelfInters,  "CHECK_SELF_INTERSECTIONS" );
828
829 #ifdef _DEBUG_ // PAL16821
830   createGeomAction( GEOMOp::OpCheckGeom,        "CHECK_GEOMETRY" );
831 #endif
832
833   createGeomAction( GEOMOp::OpDisplayMode,      "SHADING" );
834   createGeomAction( GEOMOp::OpShowAll,          "DISPLAY_ALL" );
835   createGeomAction( GEOMOp::OpHideAll,          "ERASE_ALL" );
836   createGeomAction( GEOMOp::OpShow,             "DISPLAY" );
837   createGeomAction( GEOMOp::OpSwitchVectors,    "VECTOR_MODE");
838   createGeomAction( GEOMOp::OpSelectVertex,     "VERTEX_SEL_ONLY" ,"", 0, true );
839   createGeomAction( GEOMOp::OpSelectEdge,       "EDGE_SEL_ONLY", "", 0, true );
840   createGeomAction( GEOMOp::OpSelectWire,       "WIRE_SEL_ONLY", "",  0, true );
841   createGeomAction( GEOMOp::OpSelectFace,       "FACE_SEL_ONLY", "", 0, true );
842   createGeomAction( GEOMOp::OpSelectShell,      "SHELL_SEL_ONLY", "",  0, true );
843   createGeomAction( GEOMOp::OpSelectSolid,      "SOLID_SEL_ONLY", "", 0, true );
844   createGeomAction( GEOMOp::OpSelectCompound,   "COMPOUND_SEL_ONLY", "",  0, true );
845   createGeomAction( GEOMOp::OpSelectAll,        "ALL_SEL_ONLY", "",  0, true );
846   createGeomAction( GEOMOp::OpShowOnly,         "DISPLAY_ONLY" );
847   createGeomAction( GEOMOp::OpHide,             "ERASE" );
848
849   createGeomAction( GEOMOp::OpWireframe,        "POP_WIREFRAME", "", 0, true );
850   createGeomAction( GEOMOp::OpShading,          "POP_SHADING", "", 0, true );
851   createGeomAction( GEOMOp::OpShadingWithEdges, "POP_SHADING_WITH_EDGES", "", 0, true );
852   createGeomAction( GEOMOp::OpTexture,          "POP_TEXTURE", "", 0, true );
853   createGeomAction( GEOMOp::OpEdgeWidth,        "EDGE_WIDTH");
854   createGeomAction( GEOMOp::OpIsosWidth,        "ISOS_WIDTH");
855   createGeomAction( GEOMOp::OpVectors,          "POP_VECTORS", "", 0, true );
856   createGeomAction( GEOMOp::OpDeflection,       "POP_DEFLECTION" );
857   createGeomAction( GEOMOp::OpColor,            "POP_COLOR" );
858   createGeomAction( GEOMOp::OpSetTexture,       "POP_SETTEXTURE" );
859   createGeomAction( GEOMOp::OpTransparency,     "POP_TRANSPARENCY" );
860   createGeomAction( GEOMOp::OpIsos,             "POP_ISOS" );
861   createGeomAction( GEOMOp::OpAutoColor,        "POP_AUTO_COLOR" );
862   createGeomAction( GEOMOp::OpNoAutoColor,      "POP_DISABLE_AUTO_COLOR" );
863   createGeomAction( GEOMOp::OpGroupCreatePopup, "POP_CREATE_GROUP" );
864   createGeomAction( GEOMOp::OpShowChildren,     "POP_SHOW_CHILDREN" );
865   createGeomAction( GEOMOp::OpHideChildren,     "POP_HIDE_CHILDREN" );
866   createGeomAction( GEOMOp::OpUnpublishObject,  "POP_UNPUBLISH_OBJ" );
867   createGeomAction( GEOMOp::OpPublishObject,    "POP_PUBLISH_OBJ" );
868   createGeomAction( GEOMOp::OpPointMarker,      "POP_POINT_MARKER" );
869   createGeomAction( GEOMOp::OpMaterialProperties, "POP_MATERIAL_PROPERTIES" );
870
871   createGeomAction( GEOMOp::OpPipeTShape, "PIPETSHAPE" );
872
873   // Create actions for increase/decrease transparency shortcuts
874   createGeomAction( GEOMOp::OpIncrTransparency, "", "", 0, false,
875                     "Geometry:Increase transparency");
876   createGeomAction( GEOMOp::OpDecrTransparency, "", "", 0, false,
877                     "Geometry:Decrease transparency");
878
879   // Create actions for increase/decrease number of isolines
880   createGeomAction( GEOMOp::OpIncrNbIsos, "", "", 0, false,
881                     "Geometry:Increase number of isolines");
882   createGeomAction( GEOMOp::OpDecrNbIsos, "", "", 0, false,
883                     "Geometry:Decrease number of isolines");
884
885 //   createGeomAction( GEOMOp::OpPipeTShapeGroups, "PIPETSHAPEGROUPS" );
886   //@@ 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 @@//
887
888   // ---- create menus --------------------------
889
890   int fileId = createMenu( tr( "MEN_FILE" ), -1, -1 );
891   createMenu( separator(),      fileId, 10 );
892   createMenu( GEOMOp::OpImport, fileId, 10 );
893   createMenu( GEOMOp::OpExport, fileId, 10 );
894   createMenu( separator(),      fileId, -1 );
895
896   int editId = createMenu( tr( "MEN_EDIT" ), -1, -1 );
897   createMenu( GEOMOp::OpDelete, editId, -1 );
898
899   int newEntId = createMenu( tr( "MEN_NEW_ENTITY" ), -1, -1, 10 );
900
901   int basicId = createMenu( tr( "MEN_BASIC" ), newEntId, -1 );
902   createMenu( GEOMOp::OpPoint,   basicId, -1 );
903   createMenu( GEOMOp::OpLine,    basicId, -1 );
904   createMenu( GEOMOp::OpCircle,  basicId, -1 );
905   createMenu( GEOMOp::OpEllipse, basicId, -1 );
906   createMenu( GEOMOp::OpArc,     basicId, -1 );
907   createMenu( GEOMOp::OpCurve,   basicId, -1 );
908   createMenu( separator(),       basicId, -1 );
909   createMenu( GEOMOp::Op2dSketcher, basicId, -1 );
910   createMenu( GEOMOp::Op3dSketcher, basicId, -1 );
911   createMenu( GEOMOp::OpVector,  basicId, -1 );
912   createMenu( GEOMOp::OpPlane,   basicId, -1 );
913   createMenu( GEOMOp::OpLCS,     basicId, -1 );
914   createMenu( GEOMOp::OpOriginAndVectors, basicId, -1 );
915
916   int primId = createMenu( tr( "MEN_PRIMITIVES" ), newEntId, -1 );
917   createMenu( GEOMOp::OpBox,       primId, -1 );
918   createMenu( GEOMOp::OpCylinder,  primId, -1 );
919   createMenu( GEOMOp::OpSphere,    primId, -1 );
920   createMenu( GEOMOp::OpTorus,     primId, -1 );
921   createMenu( GEOMOp::OpCone,      primId, -1 );
922   createMenu( GEOMOp::OpRectangle, primId, -1 );
923   createMenu( GEOMOp::OpDisk,      primId, -1 );
924   createMenu( GEOMOp::OpPipeTShape,primId, -1 );
925
926   int genId = createMenu( tr( "MEN_GENERATION" ), newEntId, -1 );
927   createMenu( GEOMOp::OpPrism,      genId, -1 );
928   createMenu( GEOMOp::OpRevolution, genId, -1 );
929   createMenu( GEOMOp::OpFilling,    genId, -1 );
930   createMenu( GEOMOp::OpPipe,       genId, -1 );
931
932 //   int advId = createMenu( tr( "MEN_ADVANCED" ), newEntId, -1 );
933 //   createMenu( GEOMOp::OpPipeTShape, advId, -1 );
934 //   createMenu( GEOMOp::OpPipeTShapeGroups, advId, -1 );
935   //@@ 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 @@//
936
937   createMenu( separator(), newEntId, -1 );
938
939   int groupId = createMenu( tr( "MEN_GROUP" ), newEntId, -1 );
940   createMenu( GEOMOp::OpGroupCreate, groupId, -1 );
941   createMenu( GEOMOp::OpGroupEdit,   groupId, -1 );
942
943   createMenu( separator(), newEntId, -1 );
944
945   int blocksId = createMenu( tr( "MEN_BLOCKS" ), newEntId, -1 );
946   createMenu( GEOMOp::OpQuadFace,  blocksId, -1 );
947   createMenu( GEOMOp::OpHexaSolid, blocksId, -1 );
948
949   createMenu( separator(),          newEntId, -1 );
950
951   createMenu( GEOMOp::OpExplode,    newEntId, -1 );
952
953   int buildId = createMenu( tr( "MEN_BUILD" ), newEntId, -1 );
954   createMenu( GEOMOp::OpEdge,     buildId, -1 );
955   createMenu( GEOMOp::OpWire,     buildId, -1 );
956   createMenu( GEOMOp::OpFace,     buildId, -1 );
957   createMenu( GEOMOp::OpShell,    buildId, -1 );
958   createMenu( GEOMOp::OpSolid,    buildId, -1 );
959   createMenu( GEOMOp::OpCompound, buildId, -1 );
960   
961   createMenu( separator(),          newEntId, -1 );
962   
963   createMenu( GEOMOp::OpPictureImport, newEntId, -1 );
964 #ifdef WITH_OPENCV
965   createMenu( GEOMOp::OpFeatureDetect, newEntId, -1 );
966 #endif
967
968   int operId = createMenu( tr( "MEN_OPERATIONS" ), -1, -1, 10 );
969
970   int boolId = createMenu( tr( "MEN_BOOLEAN" ), operId, -1 );
971   createMenu( GEOMOp::OpFuse,    boolId, -1 );
972   createMenu( GEOMOp::OpCommon,  boolId, -1 );
973   createMenu( GEOMOp::OpCut,     boolId, -1 );
974   createMenu( GEOMOp::OpSection, boolId, -1 );
975
976   int transId = createMenu( tr( "MEN_TRANSFORMATION" ), operId, -1 );
977   createMenu( GEOMOp::OpTranslate,      transId, -1 );
978   createMenu( GEOMOp::OpRotate,         transId, -1 );
979   createMenu( GEOMOp::OpChangeLoc,      transId, -1 );
980   createMenu( GEOMOp::OpMirror,         transId, -1 );
981   createMenu( GEOMOp::OpScale,          transId, -1 );
982   createMenu( GEOMOp::OpOffset,         transId, -1 );
983   createMenu( GEOMOp::OpProjection,     transId, -1 );
984   createMenu( separator(),              transId, -1 );
985   createMenu( GEOMOp::OpMultiTranslate, transId, -1 );
986   createMenu( GEOMOp::OpMultiRotate,    transId, -1 );
987
988   int blockId = createMenu( tr( "MEN_BLOCKS" ), operId, -1 );
989   createMenu( GEOMOp::OpMultiTransform, blockId, -1 );
990   createMenu( GEOMOp::OpExplodeBlock,   blockId, -1 );
991   createMenu( GEOMOp::OpPropagate,      blockId, -1 );
992
993   createMenu( separator(), operId, -1 );
994
995   createMenu( GEOMOp::OpPartition,     operId, -1 );
996   createMenu( GEOMOp::OpArchimede,     operId, -1 );
997   createMenu( GEOMOp::OpShapesOnShape, operId, -1 );
998   createMenu( GEOMOp::OpSharedShapes,  operId, -1 );
999
1000   createMenu( separator(), operId, -1 );
1001
1002   createMenu( GEOMOp::OpFillet1d,      operId, -1 );
1003   createMenu( GEOMOp::OpFillet2d,      operId, -1 );
1004   createMenu( GEOMOp::OpFillet3d,      operId, -1 );
1005   createMenu( GEOMOp::OpChamfer,       operId, -1 );
1006   createMenu( GEOMOp::OpExtrudedBoss,  operId, -1 );
1007   createMenu( GEOMOp::OpExtrudedCut,   operId, -1 );
1008   //createMenu( GEOMOp::OpClipping,      operId, -1 );
1009
1010   int repairId = createMenu( tr( "MEN_REPAIR" ), -1, -1, 10 );
1011   createMenu( GEOMOp::OpShapeProcess,    repairId, -1 );
1012   createMenu( GEOMOp::OpSuppressFaces,   repairId, -1 );
1013   createMenu( GEOMOp::OpCloseContour,    repairId, -1 );
1014   createMenu( GEOMOp::OpRemoveIntWires,  repairId, -1 );
1015   createMenu( GEOMOp::OpSuppressHoles,   repairId, -1 );
1016   createMenu( GEOMOp::OpSewing,          repairId, -1 );
1017   createMenu( GEOMOp::OpGlueFaces,       repairId, -1 );
1018   createMenu( GEOMOp::OpGlueEdges,       repairId, -1 );
1019   createMenu( GEOMOp::OpLimitTolerance,  repairId, -1 );
1020   createMenu( GEOMOp::OpAddPointOnEdge,  repairId, -1 );
1021   //createMenu( GEOMOp::OpFreeBoundaries,  repairId, -1 );
1022   //createMenu( GEOMOp::OpFreeFaces,       repairId, -1 );
1023   createMenu( GEOMOp::OpOrientation,      repairId, -1 );
1024   createMenu( GEOMOp::OpRemoveExtraEdges, repairId, -1 );
1025
1026   int measurId = createMenu( tr( "MEN_MEASURES" ), -1, -1, 10 );
1027   createMenu( GEOMOp::OpPointCoordinates, measurId, -1 );
1028   createMenu( GEOMOp::OpProperties,       measurId, -1 );
1029   createMenu( separator(),                measurId, -1 );
1030   createMenu( GEOMOp::OpCenterMass,       measurId, -1 );
1031   createMenu( GEOMOp::OpInertia,          measurId, -1 );
1032   createMenu( GEOMOp::OpNormale,          measurId, -1 );
1033   createMenu( separator(),                measurId, -1 );
1034   createMenu( GEOMOp::OpFreeBoundaries,   measurId, -1 );
1035   createMenu( GEOMOp::OpFreeFaces,        measurId, -1 );
1036   createMenu( separator(),                measurId, -1 );
1037
1038   int dimId = createMenu( tr( "MEN_DIMENSIONS" ), measurId, -1 );
1039   createMenu( GEOMOp::OpBoundingBox, dimId, -1 );
1040   createMenu( GEOMOp::OpMinDistance, dimId, -1 );
1041   createMenu( GEOMOp::OpAngle,       dimId, -1 );
1042
1043   createMenu( separator(),               measurId, -1 );
1044   createMenu( GEOMOp::OpTolerance,       measurId, -1 );
1045   createMenu( separator(),               measurId, -1 );
1046   createMenu( GEOMOp::OpWhatIs,          measurId, -1 );
1047   createMenu( GEOMOp::OpCheckShape,      measurId, -1 );
1048   createMenu( GEOMOp::OpCheckCompound,   measurId, -1 );
1049   createMenu( GEOMOp::OpCheckSelfInters, measurId, -1 );
1050
1051 #ifdef _DEBUG_ // PAL16821
1052   int toolsId = createMenu( tr( "MEN_TOOLS" ), -1, -1, 50 );
1053   createMenu( separator(),         toolsId, -1 );
1054   createMenu( GEOMOp::OpCheckGeom, toolsId, -1 );
1055 #endif
1056
1057   int viewId = createMenu( tr( "MEN_VIEW" ), -1, -1 );
1058   createMenu( separator(),       viewId, -1 );
1059
1060   int dispmodeId = createMenu( tr( "MEN_DISPLAY_MODE" ), viewId, -1 );
1061   createMenu( GEOMOp::OpDisplayMode,   dispmodeId, -1 );
1062   createMenu( separator(),             dispmodeId, -1 );
1063   createMenu( GEOMOp::OpSwitchVectors, dispmodeId, -1 );
1064
1065   createMenu( separator(),       viewId, -1 );
1066   createMenu( GEOMOp::OpShowAll, viewId, -1 );
1067   createMenu( GEOMOp::OpHideAll, viewId, -1 );
1068   createMenu( separator(),       viewId, -1 );
1069   createMenu( GEOMOp::OpPublishObject, viewId, -1 );
1070   createMenu( separator(),       viewId, -1 );
1071
1072 /*
1073   PAL9111:
1074   because of these items are accessible through object browser and viewers
1075   we have removed they from main menu
1076
1077   createMenu( GEOMOp::OpShow, viewId, -1 );
1078   createMenu( GEOMOp::OpShowOnly, viewId, -1 );
1079   createMenu( GEOMOp::OpHide, viewId, -1 );
1080 */
1081
1082   // ---- create toolbars --------------------------
1083   
1084   int basicTbId = createTool( tr( "TOOL_BASIC" ) );
1085   createTool( GEOMOp::OpPoint,      basicTbId );
1086   createTool( GEOMOp::OpLine,       basicTbId );
1087   createTool( GEOMOp::OpCircle,     basicTbId );
1088   createTool( GEOMOp::OpEllipse,    basicTbId );
1089   createTool( GEOMOp::OpArc,        basicTbId );
1090   createTool( GEOMOp::OpCurve,      basicTbId );
1091   createTool( GEOMOp::OpVector,     basicTbId );
1092   createTool( GEOMOp::Op2dSketcher, basicTbId ); //rnc
1093   createTool( GEOMOp::Op3dSketcher, basicTbId ); //rnc
1094   createTool( GEOMOp::OpPlane,      basicTbId );
1095   createTool( GEOMOp::OpLCS,        basicTbId );
1096   createTool( GEOMOp::OpOriginAndVectors, basicTbId );
1097   
1098 //   int sketchTbId = createTool( tr( "TOOL_SKETCH" ) );
1099 //   createTool( GEOMOp::Op2dSketcher,  sketchTbId );
1100 //   createTool( GEOMOp::Op3dSketcher,  sketchTbId );
1101   
1102   int primTbId = createTool( tr( "TOOL_PRIMITIVES" ) );
1103   createTool( GEOMOp::OpBox,        primTbId );
1104   createTool( GEOMOp::OpCylinder,   primTbId );
1105   createTool( GEOMOp::OpSphere,     primTbId );
1106   createTool( GEOMOp::OpTorus,      primTbId );
1107   createTool( GEOMOp::OpCone,       primTbId );
1108   createTool( GEOMOp::OpRectangle,  primTbId );
1109   createTool( GEOMOp::OpDisk,       primTbId );
1110   createTool( GEOMOp::OpPipeTShape, primTbId ); //rnc
1111   
1112 //   int advancedTbId = createTool( tr( "TOOL_ADVANCED" ) ); //rnc
1113 //   createTool( GEOMOp::OpPipeTShape, advancedTbId );
1114   
1115   int boolTbId = createTool( tr( "TOOL_BOOLEAN" ) );
1116   createTool( GEOMOp::OpFuse,       boolTbId );
1117   createTool( GEOMOp::OpCommon,     boolTbId );
1118   createTool( GEOMOp::OpCut,        boolTbId );
1119   createTool( GEOMOp::OpSection,    boolTbId );
1120   
1121    int genTbId = createTool( tr( "TOOL_GENERATION" ) );
1122   createTool( GEOMOp::OpPrism,      genTbId );
1123   createTool( GEOMOp::OpRevolution, genTbId );
1124   createTool( GEOMOp::OpFilling,    genTbId );
1125   createTool( GEOMOp::OpPipe,       genTbId );
1126   
1127   int transTbId = createTool( tr( "TOOL_TRANSFORMATION" ) );
1128   createTool( GEOMOp::OpTranslate,      transTbId );
1129   createTool( GEOMOp::OpRotate,         transTbId );
1130   createTool( GEOMOp::OpChangeLoc,      transTbId );
1131   createTool( GEOMOp::OpMirror,         transTbId );
1132   createTool( GEOMOp::OpScale,          transTbId );
1133   createTool( GEOMOp::OpOffset,         transTbId );
1134   createTool( GEOMOp::OpProjection,     transTbId );
1135   createTool( separator(),              transTbId );
1136   createTool( GEOMOp::OpMultiTranslate, transTbId );
1137   createTool( GEOMOp::OpMultiRotate,    transTbId );
1138   
1139   int operTbId = createTool( tr( "TOOL_OPERATIONS" ) );
1140   createTool( GEOMOp::OpExplode,         operTbId );
1141   createTool( GEOMOp::OpPartition,       operTbId );
1142   createTool( GEOMOp::OpArchimede,       operTbId );
1143   createTool( GEOMOp::OpShapesOnShape,   operTbId );
1144   createTool( GEOMOp::OpSharedShapes,    operTbId );
1145   
1146   int featTbId = createTool( tr( "TOOL_FEATURES" ) );
1147   createTool( GEOMOp::OpFillet1d,        featTbId );
1148   createTool( GEOMOp::OpFillet2d,        featTbId );
1149   createTool( GEOMOp::OpFillet3d,        featTbId );
1150   createTool( GEOMOp::OpChamfer,         featTbId );
1151   createTool( GEOMOp::OpExtrudedBoss,    featTbId );
1152   createTool( GEOMOp::OpExtrudedCut,     featTbId );
1153   
1154   int buildTbId = createTool( tr( "TOOL_BUILD" ) );
1155   createTool( GEOMOp::OpEdge,     buildTbId );
1156   createTool( GEOMOp::OpWire,     buildTbId );
1157   createTool( GEOMOp::OpFace,     buildTbId );
1158   createTool( GEOMOp::OpShell,    buildTbId );
1159   createTool( GEOMOp::OpSolid,    buildTbId );
1160   createTool( GEOMOp::OpCompound, buildTbId );
1161
1162   int measureTbId = createTool( tr( "TOOL_MEASURES" ) );
1163   createTool( GEOMOp::OpPointCoordinates, measureTbId );
1164   createTool( GEOMOp::OpProperties,       measureTbId );
1165   createTool( GEOMOp::OpCenterMass,       measureTbId );
1166   createTool( GEOMOp::OpInertia,          measureTbId );
1167   createTool( GEOMOp::OpNormale,          measureTbId );
1168   createTool( separator(),                measureTbId );
1169   createTool( GEOMOp::OpBoundingBox,      measureTbId );
1170   createTool( GEOMOp::OpMinDistance,      measureTbId );
1171   createTool( GEOMOp::OpAngle,            measureTbId );
1172   createTool( GEOMOp::OpTolerance  ,      measureTbId );
1173   createTool( separator(),                measureTbId );
1174   createTool( GEOMOp::OpFreeBoundaries,   measureTbId );
1175   createTool( GEOMOp::OpFreeFaces,        measureTbId );
1176   createTool( separator(),                measureTbId );
1177   createTool( GEOMOp::OpWhatIs,           measureTbId );
1178   createTool( GEOMOp::OpCheckShape,       measureTbId );
1179   createTool( GEOMOp::OpCheckCompound,    measureTbId );
1180   createTool( GEOMOp::OpCheckSelfInters,  measureTbId );
1181   
1182   int picturesTbId = createTool( tr( "TOOL_PICTURES" ) );
1183   createTool( GEOMOp::OpPictureImport,    picturesTbId );
1184   #ifdef WITH_OPENCV
1185     createTool( GEOMOp::OpFeatureDetect,  picturesTbId );
1186   #endif
1187
1188   //@@ 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 @@//
1189
1190   // ---- create popup menus --------------------------
1191
1192   QString clientOCCorVTK = "(client='OCCViewer' or client='VTKViewer')";
1193   QString clientOCC = "(client='OCCViewer')";
1194   QString clientOCCorVTK_AndSomeVisible = clientOCCorVTK + " and selcount>0 and isVisible";
1195   QString clientOCC_AndSomeVisible = clientOCC + " and selcount>0 and isVisible";
1196
1197   QString clientOCCorOB = "(client='ObjectBrowser' or client='OCCViewer')";
1198   QString clientOCCorVTKorOB = "(client='ObjectBrowser' or client='OCCViewer' or client='VTKViewer')";
1199   QString clientOCCorVTKorOB_AndSomeVisible = clientOCCorVTKorOB + " and selcount>0 and isVisible";
1200   QString clientOCCorOB_AndSomeVisible = clientOCCorOB + " and selcount>0 and isVisible";
1201
1202   QString autoColorPrefix =
1203     "(client='ObjectBrowser' or client='OCCViewer') and type='Shape' and selcount=1 and isOCC=true";
1204
1205   QtxPopupMgr* mgr = popupMgr();
1206
1207   mgr->insert( action(  GEOMOp::OpDelete ), -1, -1 );  // delete
1208   mgr->setRule( action( GEOMOp::OpDelete ), QString("$type in {'Shape' 'Group'} and selcount>0"), QtxPopupMgr::VisibleRule );
1209   mgr->insert( action(  GEOMOp::OpGroupCreatePopup ), -1, -1 ); // create group
1210   mgr->setRule( action( GEOMOp::OpGroupCreatePopup ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1211   mgr->insert( action(  GEOMOp::OpShowChildren ), -1, -1 ); // show children
1212   mgr->setRule( action( GEOMOp::OpShowChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasHiddenChildren=true"), QtxPopupMgr::VisibleRule );
1213
1214   mgr->insert( action(  GEOMOp::OpHideChildren ), -1, -1 ); // hide children
1215   mgr->setRule( action( GEOMOp::OpHideChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasShownChildren=true"), QtxPopupMgr::VisibleRule );
1216   mgr->insert( action(  GEOMOp::OpGroupEdit ), -1, -1 );  // edit group
1217   mgr->setRule( action( GEOMOp::OpGroupEdit ),  QString("client='ObjectBrowser' and type='Group' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1218   mgr->insert( separator(), -1, -1 );     // -----------
1219   dispmodeId = mgr->insert(  tr( "MEN_DISPLAY_MODE" ), -1, -1 ); // display mode menu
1220   mgr->insert( action(  GEOMOp::OpWireframe ), dispmodeId, -1 ); // wireframe
1221   mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1222   mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK + " and displaymode='Wireframe'", QtxPopupMgr::ToggleRule );
1223   mgr->insert( action(  GEOMOp::OpShading ), dispmodeId, -1 ); // shading
1224   mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1225   mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK + " and displaymode='Shading'", QtxPopupMgr::ToggleRule );
1226   mgr->insert( action(  GEOMOp::OpShadingWithEdges ), dispmodeId, -1 ); // shading with edges
1227   mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1228   mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK + " and displaymode='ShadingWithEdges'", QtxPopupMgr::ToggleRule );
1229   mgr->insert( action(  GEOMOp::OpTexture ), dispmodeId, -1 ); // wireframe
1230   mgr->setRule( action( GEOMOp::OpTexture ), clientOCC_AndSomeVisible, QtxPopupMgr::VisibleRule );
1231   mgr->setRule( action( GEOMOp::OpTexture), clientOCC + " and displaymode='Texture'", QtxPopupMgr::ToggleRule );
1232   mgr->insert( separator(), dispmodeId, -1 );
1233   mgr->insert( action(  GEOMOp::OpVectors ), dispmodeId, -1 ); // vectors
1234   mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1235   mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK + " and isVectorsMode", QtxPopupMgr::ToggleRule );
1236   mgr->insert( separator(), -1, -1 );     // -----------
1237   mgr->insert( action(  GEOMOp::OpColor ), -1, -1 ); // color
1238   mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1239   mgr->insert( action(  GEOMOp::OpTransparency ), -1, -1 ); // transparency
1240   mgr->setRule( action( GEOMOp::OpTransparency ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1241   mgr->insert( action(  GEOMOp::OpIsos ), -1, -1 ); // isos
1242   mgr->setRule( action( GEOMOp::OpIsos ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible", QtxPopupMgr::VisibleRule );
1243   mgr->insert( action(  GEOMOp::OpDeflection ), -1, -1 ); // deflection
1244   mgr->setRule( action( GEOMOp::OpDeflection ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible", QtxPopupMgr::VisibleRule );
1245   mgr->insert( action(  GEOMOp::OpPointMarker ), -1, -1 ); // point marker
1246   //mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and $typeid in {%1}" ).arg(GEOM_POINT ), QtxPopupMgr::VisibleRule );
1247   mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and ( $typeid in {%1} or compoundOfVertices=true ) " ).arg(GEOM::VERTEX).arg(GEOM::COMPOUND), QtxPopupMgr::VisibleRule );
1248   mgr->insert( action(  GEOMOp::OpMaterialProperties ), -1, -1 ); // material properties  
1249   mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'}) and selcount>0 and isVisible", QtxPopupMgr::VisibleRule );
1250   mgr->insert( action(  GEOMOp::OpSetTexture ), -1, -1 ); // texture
1251   mgr->setRule( action( GEOMOp::OpSetTexture ), clientOCCorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1252
1253   int lineW = mgr->insert(  tr( "MEN_LINE_WIDTH" ), -1, -1 ); // line width menu
1254   mgr->insert( action(  GEOMOp::OpEdgeWidth ), lineW, -1 ); // edge width
1255   mgr->setRule( action( GEOMOp::OpEdgeWidth ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1256
1257   mgr->insert( action(  GEOMOp::OpIsosWidth ), lineW, -1 ); // isos width
1258   mgr->setRule( action( GEOMOp::OpIsosWidth ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1259   
1260   mgr->insert( separator(), -1, -1 );     // -----------
1261   mgr->insert( action(  GEOMOp::OpAutoColor ), -1, -1 ); // auto color
1262   mgr->setRule( action( GEOMOp::OpAutoColor ), autoColorPrefix + " and isAutoColor=false", QtxPopupMgr::VisibleRule );
1263   mgr->insert( action(  GEOMOp::OpNoAutoColor ), -1, -1 ); // disable auto color
1264   mgr->setRule( action( GEOMOp::OpNoAutoColor ), autoColorPrefix + " and isAutoColor=true", QtxPopupMgr::VisibleRule );
1265   mgr->insert( separator(), -1, -1 );     // -----------
1266
1267   QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ",
1268           onlyComponent = "((type='Component') and selcount=1)",
1269           rule = canDisplay + "and ((($type in {%1}) and( %2 )) or " + onlyComponent + ")",
1270           types = "'Shape' 'Group'";
1271
1272   mgr->insert( action(  GEOMOp::OpShow ), -1, -1 ); // display
1273   mgr->setRule( action( GEOMOp::OpShow ), rule.arg( types ).arg( "not isVisible" ), QtxPopupMgr::VisibleRule );
1274
1275   mgr->insert( action(  GEOMOp::OpHide ), -1, -1 ); // erase
1276   mgr->setRule( action( GEOMOp::OpHide ), rule.arg( types ).arg( "isVisible" ), QtxPopupMgr::VisibleRule );
1277
1278   mgr->insert( action(  GEOMOp::OpHideAll ), -1, -1 ); // erase All
1279   mgr->setRule( action( GEOMOp::OpHideAll ), clientOCCorVTK, QtxPopupMgr::VisibleRule );
1280
1281   QString selectOnly = "(client='OCCViewer' or client='VTKViewer') and (selcount=0)";
1282
1283   int selectonlyId = mgr->insert( tr("MEN_SELECT_ONLY"), -1, -1);                //select only menu
1284   mgr->insert( action(GEOMOp::OpSelectVertex),   selectonlyId, -1);                                  //Vertex
1285   mgr->setRule(action(GEOMOp::OpSelectVertex),   selectOnly, QtxPopupMgr::VisibleRule);
1286   mgr->setRule(action(GEOMOp::OpSelectVertex),   selectOnly + " and selectionmode='VERTEX'", QtxPopupMgr::ToggleRule);
1287   mgr->insert( action(GEOMOp::OpSelectEdge),     selectonlyId, -1);                                  //Edge
1288   mgr->setRule(action(GEOMOp::OpSelectEdge),     selectOnly, QtxPopupMgr::VisibleRule);
1289   mgr->setRule(action(GEOMOp::OpSelectEdge),     selectOnly + " and selectionmode='EDGE'", QtxPopupMgr::ToggleRule);
1290   mgr->insert( action(GEOMOp::OpSelectWire),     selectonlyId, -1);                                  //Wire
1291   mgr->setRule(action(GEOMOp::OpSelectWire),     selectOnly, QtxPopupMgr::VisibleRule);
1292   mgr->setRule(action(GEOMOp::OpSelectWire),     selectOnly + " and selectionmode='WIRE'", QtxPopupMgr::ToggleRule);
1293   mgr->insert( action(GEOMOp::OpSelectFace),     selectonlyId, -1);                                  //Face
1294   mgr->setRule(action(GEOMOp::OpSelectFace),     selectOnly, QtxPopupMgr::VisibleRule);
1295   mgr->setRule(action(GEOMOp::OpSelectFace),     selectOnly + " and selectionmode='FACE'", QtxPopupMgr::ToggleRule);
1296   mgr->insert( action(GEOMOp::OpSelectShell),    selectonlyId, -1);                                  //Shell
1297   mgr->setRule(action(GEOMOp::OpSelectShell),    selectOnly, QtxPopupMgr::VisibleRule);
1298   mgr->setRule(action(GEOMOp::OpSelectShell),    selectOnly + " and selectionmode='SHELL'", QtxPopupMgr::ToggleRule);
1299   mgr->insert( action(GEOMOp::OpSelectSolid),    selectonlyId, -1);                                  //Solid
1300   mgr->setRule(action(GEOMOp::OpSelectSolid),    selectOnly, QtxPopupMgr::VisibleRule);
1301   mgr->setRule(action(GEOMOp::OpSelectSolid),    selectOnly + " and selectionmode='SOLID'", QtxPopupMgr::ToggleRule);
1302   mgr->insert( action(GEOMOp::OpSelectCompound), selectonlyId, -1);                                  //Compound
1303   mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly, QtxPopupMgr::VisibleRule);
1304   mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly + " and selectionmode='COMPOUND'", QtxPopupMgr::ToggleRule);
1305   mgr->insert( separator(), selectonlyId, -1);
1306   mgr->insert( action(GEOMOp::OpSelectAll),      selectonlyId, -1);                                  //Clear selection filter
1307   mgr->setRule(action(GEOMOp::OpSelectAll),      selectOnly, QtxPopupMgr::VisibleRule);
1308   mgr->setRule(action(GEOMOp::OpSelectAll),      selectOnly + " and selectionmode='ALL'", QtxPopupMgr::ToggleRule);
1309   mgr->insert( action(GEOMOp::OpShowOnly ), -1, -1 ); // display only
1310   mgr->setRule(action(GEOMOp::OpShowOnly ), rule.arg( types ).arg( "true" ), QtxPopupMgr::VisibleRule );
1311   mgr->insert( separator(), -1, -1 );
1312
1313   mgr->insert( separator(), -1, -1 );     // -----------
1314   mgr->insert( action(  GEOMOp::OpUnpublishObject ), -1, -1 ); // Unpublish object
1315   mgr->setRule( action( GEOMOp::OpUnpublishObject ), QString("client='ObjectBrowser' and $type in {'Shape' 'Group'} and selcount>0"), QtxPopupMgr::VisibleRule );
1316
1317
1318   mgr->insert( action(  GEOMOp::OpPublishObject ), -1, -1 ); // Publish object
1319   mgr->setRule( action( GEOMOp::OpPublishObject ), QString("client='ObjectBrowser' and isComponent=true"), QtxPopupMgr::VisibleRule );
1320
1321   mgr->insert( action(  GEOMOp::OpReimport ), -1, -1 );  // delete
1322   mgr->setRule( action( GEOMOp::OpReimport ), QString("$imported in {'true'} and selcount>0"), QtxPopupMgr::VisibleRule );
1323
1324   mgr->hide( mgr->actionId( action( myEraseAll ) ) );
1325 }
1326
1327 //=======================================================================
1328 // function : GeometryGUI::activateModule()
1329 // purpose  : Called when GEOM module is activated
1330 //=======================================================================
1331 bool GeometryGUI::activateModule( SUIT_Study* study )
1332 {
1333   if ( CORBA::is_nil( myComponentGeom ) )
1334     return false;
1335
1336   bool res = SalomeApp_Module::activateModule( study );
1337
1338   if ( !res )
1339     return false;
1340   setMenuShown( true );
1341   setToolShown( true );
1342
1343   // import Python module that manages GEOM plugins (need to be here because SalomePyQt API uses active module)
1344   PyGILState_STATE gstate = PyGILState_Ensure();
1345   PyObject* pluginsmanager=PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
1346   if(pluginsmanager==NULL)
1347     PyErr_Print();
1348   else
1349     {
1350       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());
1351       if(result==NULL)
1352         PyErr_Print();
1353       Py_XDECREF(result);
1354     }
1355   PyGILState_Release(gstate);
1356   // end of GEOM plugins loading
1357
1358   connect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1359           this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1360
1361   // Reset actions accelerator keys
1362   action(GEOMOp::OpImport)->setEnabled( true ); // Import: CTRL + Key_I
1363   action(GEOMOp::OpExport)->setEnabled( true ); // Export: CTRL + Key_E
1364   action(GEOMOp::OpDelete)->setEnabled( true ); // Delete: Key_Delete
1365
1366   GUIMap::Iterator it;
1367   for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1368     it.value()->activate( application()->desktop() );
1369
1370   LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1371
1372   SUIT_ViewManager* vm;
1373   ViewManagerList OCCViewManagers, VTKViewManagers;
1374
1375   application()->viewManagers( OCCViewer_Viewer::Type(), OCCViewManagers );
1376   QListIterator<SUIT_ViewManager*> itOCC( OCCViewManagers );
1377   while ( itOCC.hasNext() && (vm = itOCC.next()) )
1378     myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
1379
1380   application()->viewManagers( SVTK_Viewer::Type(), VTKViewManagers );
1381   QListIterator<SUIT_ViewManager*> itVTK( VTKViewManagers );
1382   while ( itVTK.hasNext() && (vm = itVTK.next()) )
1383     myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
1384
1385   //NPAL 19674
1386   SALOME_ListIO selected;
1387   sm->selectedObjects( selected );
1388   sm->clearSelected();
1389
1390   // disable OCC selectors
1391   getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
1392   QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1393   while ( itOCCSel.hasNext() )
1394     if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1395       sr->setEnabled(true);
1396
1397   // disable VTK selectors
1398   getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
1399   QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1400   while ( itVTKSel.hasNext() )
1401     if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1402       sr->setEnabled(true);
1403
1404   sm->setSelectedObjects( selected, true );   //NPAL 19674
1405
1406   QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1407   if ( viewMenu )
1408     connect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1409
1410   // 0020836 (Basic vectors and origin)
1411   SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
1412   if( aResourceMgr->booleanValue( "Geometry", "auto_create_base_objects", false ) ) {
1413     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
1414     if( appStudy ) {
1415       _PTR(Study) studyDS = appStudy->studyDS();
1416       if( studyDS ) {
1417         _PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
1418         if( !aSComponent ) // create objects automatically only if there is no GEOM component
1419           createOriginAndBaseVectors();
1420       }
1421     }
1422   }
1423
1424   return true;
1425 }
1426
1427
1428 //=======================================================================
1429 // function : GeometryGUI::deactivateModule()
1430 // purpose  : Called when GEOM module is deactivated
1431 //=======================================================================
1432 bool GeometryGUI::deactivateModule( SUIT_Study* study )
1433 {
1434   QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1435   if ( viewMenu )
1436     disconnect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1437
1438   setMenuShown( false );
1439   setToolShown( false );
1440
1441   disconnect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1442              this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1443
1444   EmitSignalCloseAllDialogs();
1445
1446   GUIMap::Iterator it;
1447   for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1448     it.value()->deactivate();
1449
1450   // Unset actions accelerator keys
1451   action(GEOMOp::OpImport)->setEnabled( false ); // Import: CTRL + Key_I
1452   action(GEOMOp::OpExport)->setEnabled( false ); // Export: CTRL + Key_E
1453   action(GEOMOp::OpDelete)->setEnabled( false ); // Delete: Key_Delete
1454
1455   qDeleteAll(myOCCSelectors);
1456   myOCCSelectors.clear();
1457   getApp()->selectionMgr()->setEnabled( true, OCCViewer_Viewer::Type() );
1458
1459   qDeleteAll(myVTKSelectors);
1460   myVTKSelectors.clear();
1461   getApp()->selectionMgr()->setEnabled( true, SVTK_Viewer::Type() );
1462
1463   return SalomeApp_Module::deactivateModule( study );
1464 }
1465
1466 //=======================================================================
1467 // function : onWindowActivated()
1468 // purpose  : update menu items' status - disable non-OCC-viewer-compatible actions
1469 //=======================================================================
1470 void GeometryGUI::onWindowActivated( SUIT_ViewWindow* win )
1471 {
1472   if ( !win )
1473     return;
1474
1475   const bool ViewOCC = ( win->getViewManager()->getType() == OCCViewer_Viewer::Type() );
1476   //const bool ViewVTK = ( win->getViewManager()->getType() == SVTK_Viewer::Type() );
1477
1478   // disable non-OCC viewframe menu commands
1479 //  action( GEOMOp::Op2dSketcher )->setEnabled( ViewOCC ); // SKETCHER
1480   action( GEOMOp::OpSuppressFaces )->setEnabled( ViewOCC ); // SuppressFace
1481   action( GEOMOp::OpSuppressHoles )->setEnabled( ViewOCC ); // SuppressHole
1482   action( GEOMOp::OpCloseContour )->setEnabled( ViewOCC ); // CloseContour
1483   action( GEOMOp::OpRemoveIntWires )->setEnabled( ViewOCC ); // RemoveInternalWires
1484   action( GEOMOp::OpAddPointOnEdge )->setEnabled( ViewOCC ); // AddPointOnEdge
1485 //  action( GEOMOp::OpFreeBoundaries )->setEnabled( ViewOCC ); // Free boundaries
1486
1487   action( GEOMOp::OpGroupCreate )->setEnabled( ViewOCC ); // Create Group
1488   action( GEOMOp::OpGroupEdit )->setEnabled( ViewOCC ); // Edit Group
1489
1490   action( GEOMOp::OpMultiTransform )->setEnabled( ViewOCC ); // MENU BLOCKS - MULTI-TRANSFORMATION
1491 }
1492
1493 void GeometryGUI::windows( QMap<int, int>& mappa ) const
1494 {
1495   mappa.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
1496   mappa.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
1497 }
1498
1499 void GeometryGUI::viewManagers( QStringList& lst ) const
1500 {
1501   lst.append( OCCViewer_Viewer::Type() );
1502 }
1503
1504 void GeometryGUI::onViewManagerAdded( SUIT_ViewManager* vm )
1505 {
1506   if ( vm && vm->getType() == OCCViewer_Viewer::Type() )
1507   {
1508     qDebug( "connect" );
1509     connect( vm, SIGNAL( keyPress  ( SUIT_ViewWindow*, QKeyEvent* ) ),
1510              this, SLOT( OnKeyPress( SUIT_ViewWindow*, QKeyEvent* ) ) );
1511     connect( vm, SIGNAL( mousePress( SUIT_ViewWindow*, QMouseEvent* ) ),
1512              this, SLOT( OnMousePress( SUIT_ViewWindow*, QMouseEvent* ) ) );
1513     connect( vm, SIGNAL( mouseMove ( SUIT_ViewWindow*, QMouseEvent* ) ),
1514              this, SLOT( OnMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) );
1515     connect( vm, SIGNAL( mouseRelease ( SUIT_ViewWindow*, QMouseEvent* ) ),
1516              this, SLOT( OnMouseRelease( SUIT_ViewWindow*, QMouseEvent* ) ) );
1517     
1518     LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1519     myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
1520
1521     // disable OCC selectors
1522     getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
1523     QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1524     while ( itOCCSel.hasNext() )
1525       if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1526         sr->setEnabled(true);
1527   }
1528   else if ( vm->getType() == SVTK_Viewer::Type() )
1529   {
1530     LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1531     myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
1532
1533     // disable VTK selectors
1534     getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
1535     QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1536     while ( itVTKSel.hasNext() )
1537       if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1538         sr->setEnabled(true);
1539   }
1540 }
1541
1542 void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm )
1543 {
1544   SUIT_ViewModel* viewer = vm->getViewModel();
1545   if ( vm->getType() == OCCViewer_Viewer::Type() )
1546   {
1547     QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1548     while ( itOCCSel.hasNext() )
1549       if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1550         if ( sr->viewer() == viewer )
1551         {
1552           delete myOCCSelectors.takeAt( myOCCSelectors.indexOf( sr ) );
1553           break;
1554         }
1555   }
1556   if ( vm->getType() == SVTK_Viewer::Type() )
1557   {
1558     QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1559     while ( itVTKSel.hasNext() )
1560       if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1561         if ( sr->viewer() == viewer )
1562         {
1563           delete myVTKSelectors.takeAt( myVTKSelectors.indexOf( sr ) );
1564           break;
1565         }
1566   }
1567 }
1568
1569 QString GeometryGUI::engineIOR() const
1570 {
1571   if ( !CORBA::is_nil( GetGeomGen() ) )
1572     return QString( getApp()->orb()->object_to_string( GetGeomGen() ) );
1573   return "";
1574 }
1575
1576 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
1577 Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture
1578 #else
1579 Handle(Graphic3d_HArray1OfBytes) GeometryGUI::getTexture
1580 #endif
1581       (SalomeApp_Study* theStudy, int theId, int& theWidth, int& theHeight)
1582 {
1583   theWidth = theHeight = 0;
1584
1585 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
1586   Handle(TColStd_HArray1OfByte) aTexture;
1587 #else
1588   Handle(Graphic3d_HArray1OfBytes) aTexture;
1589 #endif
1590
1591   if (theStudy) {
1592     TextureMap aTextureMap = myTextureMap[ theStudy->studyDS()->StudyId() ];
1593     aTexture = aTextureMap[ theId ];
1594     if ( aTexture.IsNull() ) {
1595       GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGen()->GetIInsertOperations( theStudy->studyDS()->StudyId() );
1596       if ( !aInsOp->_is_nil() ) {
1597         CORBA::Long aWidth, aHeight;
1598         SALOMEDS::TMPFile_var aStream = aInsOp->GetTexture( theId, aWidth, aHeight );
1599         if ( aWidth > 0 && aHeight > 0 && aStream->length() > 0 ) {
1600           theWidth  = aWidth;
1601           theHeight = aHeight;
1602
1603 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
1604           aTexture  = new TColStd_HArray1OfByte (1, aStream->length());
1605 #else
1606           aTexture  = new Graphic3d_HArray1OfBytes (1, aStream->length());
1607 #endif
1608
1609           for (int i = 0; i < aStream->length(); i++)
1610             aTexture->SetValue( i+1, (Standard_Byte)aStream[i] );
1611           aTextureMap[ theId ] = aTexture;
1612         }
1613       }
1614     }
1615   }
1616   return aTexture;
1617 }
1618
1619 LightApp_Selection* GeometryGUI::createSelection() const
1620 {
1621   return new GEOMGUI_Selection();
1622 }
1623
1624 void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
1625 {
1626   SalomeApp_Module::contextMenuPopup( client, menu, title );
1627
1628   /*
1629   SALOME_ListIO lst;
1630   getApp()->selectionMgr()->selectedObjects(lst);
1631   if (lst.Extent() < 1)
1632     return;
1633
1634   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
1635   _PTR(Study) study = appStudy->studyDS();
1636
1637   bool isImported = true;
1638   SALOME_ListIteratorOfListIO anIt (lst);
1639   for (; anIt.More() && isImported; anIt.Next()) {
1640     Handle(SALOME_InteractiveObject) io = anIt.Value();
1641     _PTR(SObject) aSObj = study->FindObjectID(io->getEntry());
1642     if (aSObj) {
1643       if (lst.Extent() == 1) {
1644         // Set context menu title
1645         if (client == "OCCViewer" || client == "VTKViewer")
1646           title = QString(aSObj->GetName().c_str());
1647       }
1648
1649       CORBA::Object_var anObj = GeometryGUI::ClientSObjectToObject(aSObj);
1650       GEOM::GEOM_Object_var aGeomObj = GEOM::GEOM_Object::_narrow(anObj);
1651       if (CORBA::is_nil(aGeomObj) || aGeomObj->GetType() != GEOM_IMPORT)
1652         isImported = false;
1653     } else {
1654       isImported = false;
1655     }
1656   }
1657
1658   if (isImported) {
1659     menu->addAction(action(GEOMOp::OpReimport)); // Reload imported shape
1660   }
1661   */
1662 }
1663
1664 void GeometryGUI::createPreferences()
1665 {
1666   int tabId = addPreference( tr( "PREF_TAB_SETTINGS" ) );
1667
1668   int genGroup = addPreference( tr( "PREF_GROUP_GENERAL" ), tabId );
1669   setPreferenceProperty( genGroup, "columns", 2 );
1670
1671   int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), genGroup,
1672                                 LightApp_Preferences::Selector,
1673                                 "Geometry", "display_mode" );
1674
1675   addPreference( tr( "PREF_SHADING_COLOR" ), genGroup,
1676                  LightApp_Preferences::Color, "Geometry", "shading_color" );
1677
1678   addPreference( tr( "PREF_EDGES_IN_SHADING" ), genGroup,
1679                  LightApp_Preferences::Color, "Geometry", "edges_in_shading_color" );
1680
1681   addPreference( tr( "PREF_WIREFRAME_COLOR" ), genGroup,
1682                  LightApp_Preferences::Color, "Geometry", "wireframe_color" );
1683
1684   addPreference( tr( "PREF_FREE_BOUND_COLOR" ), genGroup,
1685                  LightApp_Preferences::Color, "Geometry", "free_bound_color" );
1686
1687   addPreference( tr( "PREF_LINE_COLOR"), genGroup,
1688                  LightApp_Preferences::Color, "Geometry", "line_color" );
1689
1690   addPreference( tr( "PREF_POINT_COLOR"), genGroup,
1691                  LightApp_Preferences::Color, "Geometry", "point_color" );
1692
1693   addPreference( tr( "PREF_ISOS_COLOR" ), genGroup,
1694                  LightApp_Preferences::Color, "Geometry", "isos_color" );
1695
1696   int step = addPreference( tr( "PREF_STEP_VALUE" ), genGroup,
1697                             LightApp_Preferences::IntSpin, "Geometry", "SettingsGeomStep" );
1698
1699   int defl = addPreference( tr( "PREF_DEFLECTION" ), genGroup,
1700                             LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" );
1701
1702   int front_material = addPreference( tr( "PREF_FRONT_MATERIAL" ), genGroup,
1703                                       LightApp_Preferences::Selector,
1704                                       "Geometry", "front_material" );
1705   
1706   int back_material = addPreference( tr( "PREF_BACK_MATERIAL" ), genGroup,
1707                                      LightApp_Preferences::Selector,
1708                                      "Geometry", "back_material" );
1709
1710   const int nb = 4;
1711   int wd[nb];
1712   int iter=0;
1713
1714   wd[iter++] = addPreference( tr( "PREF_EDGE_WIDTH" ), genGroup,
1715                               LightApp_Preferences::IntSpin, "Geometry", "edge_width" );
1716
1717   wd[iter++] = addPreference( tr( "PREF_ISOLINES_WIDTH" ), genGroup,
1718                               LightApp_Preferences::IntSpin, "Geometry", "isolines_width" );
1719
1720   wd[iter++] = addPreference( tr( "PREF_PREVIEW_EDGE_WIDTH" ), genGroup,
1721                                      LightApp_Preferences::IntSpin, "Geometry", "preview_edge_width" );
1722   
1723   wd[iter++] = addPreference( tr( "PREF_MEASURES_LINE_WIDTH" ), genGroup,
1724                               LightApp_Preferences::IntSpin, "Geometry", "measures_line_width" );
1725
1726   for(int i = 0; i < nb; i++) {
1727     setPreferenceProperty( wd[i], "min", 1 );    
1728     setPreferenceProperty( wd[i], "max", 5 );
1729   }
1730
1731
1732   // Quantities with individual precision settings
1733   int precGroup = addPreference( tr( "GEOM_PREF_GROUP_PRECISION" ), tabId );
1734   setPreferenceProperty( precGroup, "columns", 2 );
1735
1736   const int nbQuantities = 8;
1737   int prec[nbQuantities], ii = 0;
1738   prec[ii++] = addPreference( tr( "GEOM_PREF_length_precision" ), precGroup,
1739                               LightApp_Preferences::IntSpin, "Geometry", "length_precision" );
1740   prec[ii++] = addPreference( tr( "GEOM_PREF_angle_precision" ), precGroup,
1741                               LightApp_Preferences::IntSpin, "Geometry", "angle_precision" );
1742   prec[ii++] = addPreference( tr( "GEOM_PREF_len_tol_precision" ), precGroup,
1743                               LightApp_Preferences::IntSpin, "Geometry", "len_tol_precision" );
1744   prec[ii++] = addPreference( tr( "GEOM_PREF_ang_tol_precision" ), precGroup,
1745                               LightApp_Preferences::IntSpin, "Geometry", "ang_tol_precision" );
1746   prec[ii++] = addPreference( tr( "GEOM_PREF_weight_precision" ), precGroup,
1747                               LightApp_Preferences::IntSpin, "Geometry", "weight_precision" );
1748   prec[ii++] = addPreference( tr( "GEOM_PREF_density_precision" ), precGroup,
1749                               LightApp_Preferences::IntSpin, "Geometry", "density_precision" );
1750   prec[ii++] = addPreference( tr( "GEOM_PREF_parametric_precision" ), precGroup,
1751                               LightApp_Preferences::IntSpin, "Geometry", "parametric_precision" );
1752   prec[ii  ] = addPreference( tr( "GEOM_PREF_param_tol_precision" ), precGroup,
1753                               LightApp_Preferences::IntSpin, "Geometry", "param_tol_precision" );
1754
1755   // Set property for precision value for spinboxes
1756   for ( ii = 0; ii < nbQuantities; ii++ ){
1757     setPreferenceProperty( prec[ii], "min", -14 );
1758     setPreferenceProperty( prec[ii], "max", 14 );
1759     setPreferenceProperty( prec[ii], "precision", 2 );
1760   }
1761
1762   int VertexGroup = addPreference( tr( "PREF_GROUP_VERTEX" ), tabId );
1763   setPreferenceProperty( VertexGroup, "columns", 2 );
1764
1765   int typeOfMarker = addPreference( tr( "PREF_TYPE_OF_MARKER" ), VertexGroup,
1766                                     LightApp_Preferences::Selector, "Geometry", "type_of_marker" );
1767
1768   int markerScale = addPreference( tr( "PREF_MARKER_SCALE" ), VertexGroup,
1769                                    LightApp_Preferences::Selector, "Geometry", "marker_scale" );
1770
1771   // Set property for default display mode
1772   QStringList aModesList;
1773   aModesList.append( tr("MEN_WIREFRAME") );
1774   aModesList.append( tr("MEN_SHADING") );
1775   aModesList.append( tr("MEN_SHADING_WITH_EDGES") );
1776
1777   QList<QVariant> anIndexesList;
1778   anIndexesList.append(0);
1779   anIndexesList.append(1);
1780   anIndexesList.append(2);
1781
1782   setPreferenceProperty( dispmode, "strings", aModesList );
1783   setPreferenceProperty( dispmode, "indexes", anIndexesList );
1784
1785   // Set property for step value for spinboxes
1786   setPreferenceProperty( step, "min", 1 );
1787   setPreferenceProperty( step, "max", 10000 );
1788   setPreferenceProperty( step, "precision", 3 );
1789
1790   // Set property for deflection value for spinboxes
1791   setPreferenceProperty( defl, "min", DEFLECTION_MIN );
1792   setPreferenceProperty( defl, "max", 1.0 );
1793   setPreferenceProperty( defl, "step", 1.0e-04 );
1794   setPreferenceProperty( defl, "precision", 6 );
1795
1796   // Set property for default material
1797   Material_ResourceMgr aMatResMgr;
1798   QStringList aPrefMatNames = aMatResMgr.getPreferenceMaterialsNames();
1799   setPreferenceProperty( front_material, "strings", aPrefMatNames );
1800   setPreferenceProperty( back_material, "strings", aPrefMatNames );
1801
1802   // Set property vertex marker type
1803   QList<QVariant> aMarkerTypeIndicesList;
1804   QList<QVariant> aMarkerTypeIconsList;
1805
1806   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1807   for ( int i = GEOM::MT_POINT; i < GEOM::MT_USER; i++ ) {
1808     QString icoFile = QString( "ICON_VERTEX_MARKER_%1" ).arg( i );
1809     QPixmap pixmap = resMgr->loadPixmap( "GEOM", tr( qPrintable( icoFile ) ) );
1810     aMarkerTypeIndicesList << (i-1);
1811     aMarkerTypeIconsList << pixmap;
1812   }
1813
1814   setPreferenceProperty( typeOfMarker, "indexes", aMarkerTypeIndicesList );
1815   setPreferenceProperty( typeOfMarker, "icons",   aMarkerTypeIconsList );
1816
1817   // Set property for vertex marker scale
1818   QList<QVariant> aMarkerScaleIndicesList;
1819   QStringList     aMarkerScaleValuesList;
1820
1821   for ( int iii = GEOM::MS_10; iii <= GEOM::MS_70; iii++ ) {
1822     aMarkerScaleIndicesList << iii;
1823     aMarkerScaleValuesList  << QString::number( (iii-(int)GEOM::MS_10)*0.5 + 1.0 );
1824   }
1825
1826   setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList );
1827   setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
1828
1829   int originGroup = addPreference( tr( "PREF_GROUP_ORIGIN_AND_BASE_VECTORS" ), tabId );
1830   setPreferenceProperty( originGroup, "columns", 2 );
1831
1832   int baseVectorsLength = addPreference( tr( "PREF_BASE_VECTORS_LENGTH" ), originGroup,
1833                                          LightApp_Preferences::DblSpin, "Geometry", "base_vectors_length" );
1834   setPreferenceProperty( baseVectorsLength, "min", 0.01 );
1835   setPreferenceProperty( baseVectorsLength, "max", 1000 );
1836
1837   addPreference( tr( "PREF_AUTO_CREATE" ), originGroup,
1838                  LightApp_Preferences::Bool, "Geometry", "auto_create_base_objects" );
1839
1840
1841   int operationsGroup = addPreference( tr( "PREF_GROUP_OPERATIONS" ), tabId );
1842   setPreferenceProperty( operationsGroup, "columns", 2 );
1843
1844   addPreference( tr( "GEOM_PREVIEW" ), operationsGroup,
1845                  LightApp_Preferences::Bool, "Geometry", "geom_preview" );
1846 }
1847
1848 void GeometryGUI::preferencesChanged( const QString& section, const QString& param )
1849 {
1850   if (section == "Geometry") {
1851     SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
1852     if (param == QString("SettingsGeomStep")) {
1853       double spin_step = aResourceMgr->doubleValue(section, param, 100.);
1854       EmitSignalDefaultStepValueChanged(spin_step);
1855     }
1856   }
1857 }
1858
1859 LightApp_Displayer* GeometryGUI::displayer()
1860 {
1861   if( !myDisplayer )
1862     myDisplayer = new GEOM_Displayer( dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) );
1863   return myDisplayer;
1864 }
1865
1866 void GeometryGUI::setLocalSelectionMode(const int mode)
1867 {
1868   myLocalSelectionMode = mode;
1869 }
1870 int GeometryGUI::getLocalSelectionMode() const
1871 {
1872   return myLocalSelectionMode;
1873 }
1874
1875 const char gSeparator = '_'; // character used to separate parameter names
1876 const char gDigitsSep = ':'; // character used to separate numeric parameter values (color = r:g:b)
1877
1878 /*!
1879  * \brief Store visual parameters
1880  *
1881  * This method is called just before the study document is saved.
1882  * Store visual parameters in AttributeParameter attribute(s)
1883  */
1884 void GeometryGUI::storeVisualParameters (int savePoint)
1885 {
1886   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
1887   if ( !appStudy || !appStudy->studyDS() )
1888     return;
1889   _PTR(Study) studyDS = appStudy->studyDS();
1890
1891   // componentName is used for encoding of entries when storing them in IParameters
1892   std::string componentName = myComponentGeom->ComponentDataType();
1893   //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
1894   //if (!aSComponent) return;
1895
1896   // IParameters
1897   _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
1898                                                              componentName.c_str(),
1899                                                              savePoint);
1900   _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
1901
1902   QList<SUIT_ViewManager*> lst;
1903   QList<SUIT_ViewManager*>::Iterator it;
1904
1905   // main cycle to store parameters of displayed objects
1906   lst.clear();
1907   getApp()->viewManagers(lst);
1908   for (it = lst.begin(); it != lst.end(); it++) {
1909     SUIT_ViewManager* vman = *it;
1910     QString vType = vman->getType();
1911     int aMgrId = vman->getGlobalId();
1912     // saving VTK actors properties
1913     QVector<SUIT_ViewWindow*> views = vman->getViews();
1914     for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++) {
1915       const ObjMap anObjects = appStudy->getObjectMap(aMgrId);
1916       ObjMap::ConstIterator o_it = anObjects.begin();
1917       for (; o_it != anObjects.end(); o_it++) {
1918         const PropMap aProps = o_it.value();
1919
1920         //Check that object exists in the study
1921         _PTR(SObject) obj( studyDS->FindObjectID( o_it.key().toLatin1().data() ) );
1922         if ( !obj || !(aProps.count() > 0))
1923           continue;
1924         // entry is "encoded" = it does NOT contain component adress, since it is a
1925         // subject to change on next component loading
1926
1927         std::string entry = ip->encodeEntry(o_it.key().toLatin1().data(), componentName);
1928
1929         _PTR(GenericAttribute) anAttr;
1930         if( !obj->FindAttribute(anAttr, "AttributeIOR"))
1931           continue;
1932
1933         std::string param,occParam = vType.toLatin1().data();
1934         occParam += NAME_SEPARATOR;
1935         occParam += QString::number(aMgrId).toLatin1().data();
1936         occParam += NAME_SEPARATOR;
1937
1938         if(aProps.contains(VISIBILITY_PROP)) {
1939           param = occParam + VISIBILITY_PROP;
1940           ip->setParameter(entry, param, aProps.value(VISIBILITY_PROP).toInt() == 1 ? "On" : "Off");
1941         }
1942
1943         if(aProps.contains(DISPLAY_MODE_PROP)) {
1944           param = occParam + DISPLAY_MODE_PROP;
1945           ip->setParameter(entry, param, QString::number(aProps.value(DISPLAY_MODE_PROP).toInt()).toLatin1().data());
1946         }
1947
1948         if(aProps.contains(COLOR_PROP)) {
1949           QColor c = aProps.value(COLOR_PROP).value<QColor>();
1950           QString colorStr = QString::number(c.red()/255.);
1951           colorStr += DIGIT_SEPARATOR; colorStr += QString::number(c.green()/255.);
1952           colorStr += DIGIT_SEPARATOR; colorStr += QString::number(c.blue()/255.);
1953           param = occParam + COLOR_PROP;
1954           ip->setParameter(entry, param, colorStr.toLatin1().data());
1955         }
1956
1957         if(vType == SVTK_Viewer::Type()) {
1958           if(aProps.contains(OPACITY_PROP)) {
1959             param = occParam + OPACITY_PROP;
1960             ip->setParameter(entry, param, QString::number(1. - aProps.value(TRANSPARENCY_PROP).toDouble()).toLatin1().data());
1961           }
1962         } else if (vType == SOCC_Viewer::Type()) {
1963           if(aProps.contains(TRANSPARENCY_PROP)) {
1964             param = occParam + TRANSPARENCY_PROP;
1965             ip->setParameter(entry, param, QString::number(aProps.value(TRANSPARENCY_PROP).toDouble()).toLatin1().data());
1966           }
1967         }
1968
1969         if(aProps.contains(ISOS_PROP)) {
1970           param = occParam + ISOS_PROP;
1971           ip->setParameter(entry, param, aProps.value(ISOS_PROP).toString().toLatin1().data());
1972         }
1973
1974         if(aProps.contains(VECTOR_MODE_PROP)) {
1975           param = occParam + VECTOR_MODE_PROP;
1976           ip->setParameter(entry, param, QString::number(aProps.value(VECTOR_MODE_PROP).toInt()).toLatin1().data());
1977         }
1978
1979         if(aProps.contains(DEFLECTION_COEFF_PROP)) {
1980           param = occParam + DEFLECTION_COEFF_PROP;
1981           ip->setParameter(entry, param, QString::number(aProps.value(DEFLECTION_COEFF_PROP).toDouble()).toLatin1().data());
1982         }
1983
1984         //Marker type of the vertex - ONLY for the "Vertex" and "Compound of the Vertex"
1985         if(aProps.contains(MARKER_TYPE_PROP)) {
1986           param = occParam + MARKER_TYPE_PROP;
1987           ip->setParameter(entry, param, aProps.value(MARKER_TYPE_PROP).toString().toLatin1().data());
1988         }
1989
1990         if(aProps.contains(FRONT_MATERIAL_PROP)) {
1991           param = occParam + FRONT_MATERIAL_PROP;
1992           ip->setParameter(entry, param, aProps.value(FRONT_MATERIAL_PROP).toString().toLatin1().data());
1993         }
1994
1995         if(aProps.contains(BACK_MATERIAL_PROP)) {
1996           param = occParam + BACK_MATERIAL_PROP;
1997           ip->setParameter(entry, param, aProps.value(BACK_MATERIAL_PROP).toString().toLatin1().data());
1998           
1999         }
2000
2001         if(aProps.contains( EDGE_WIDTH_PROP )) {
2002              param = occParam + EDGE_WIDTH_PROP;
2003            ip->setParameter(entry, param, aProps.value(EDGE_WIDTH_PROP).toString().toLatin1().data());                               
2004         }
2005         
2006         if(aProps.contains( ISOS_WIDTH_PROP )) {
2007           param = occParam + ISOS_WIDTH_PROP;
2008           ip->setParameter(entry, param, aProps.value(ISOS_WIDTH_PROP).toString().toLatin1().data());
2009         }
2010       } // object iterator
2011     } // for (views)
2012   } // for (viewManagers)
2013 }
2014
2015 /*!
2016  * \brief Restore visual parameters
2017  *
2018  * This method is called after the study document is opened.
2019  * Restore visual parameters from AttributeParameter attribute(s)
2020  */
2021 void GeometryGUI::restoreVisualParameters (int savePoint)
2022 {
2023   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
2024   if (!appStudy || !appStudy->studyDS())
2025     return;
2026   _PTR(Study) studyDS = appStudy->studyDS();
2027
2028   // componentName is used for encoding of entries when storing them in IParameters
2029   std::string componentName = myComponentGeom->ComponentDataType();
2030   //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
2031   //if (!aSComponent) return;
2032
2033   // IParameters
2034   _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
2035                                                              componentName.c_str(),
2036                                                              savePoint);
2037   _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
2038
2039   std::vector<std::string> entries = ip->getEntries();
2040
2041   for (std::vector<std::string>::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt)
2042   {
2043     // entry is a normal entry - it should be "decoded" (setting base adress of component)
2044     QString entry (ip->decodeEntry(*entIt).c_str());
2045
2046     // Check that the entry corresponds to a real object in the Study
2047     // as the object may be deleted or modified after the visual state is saved.
2048     _PTR(SObject) so = studyDS->FindObjectID(entry.toLatin1().data());
2049     if (!so) continue; //Skip the not existent entry
2050
2051     std::vector<std::string> paramNames = ip->getAllParameterNames( *entIt );
2052     std::vector<std::string> paramValues = ip->getAllParameterValues( *entIt );
2053
2054     std::vector<std::string>::iterator namesIt = paramNames.begin();
2055     std::vector<std::string>::iterator valuesIt = paramValues.begin();
2056
2057     // actors are stored in a map after displaying of them for
2058     // quicker access in the future: map < viewID to actor >
2059     NCollection_DataMap<int, GEOM_Actor*          > vtkActors;
2060     NCollection_DataMap<int, Handle(GEOM_AISShape)> occActors;
2061
2062     QString viewerTypStr;
2063     QString viewIndexStr;
2064     int viewIndex;
2065     QVector<PropMap> aListOfMap;
2066
2067     for (; namesIt != paramNames.end(); ++namesIt, ++valuesIt)
2068     {
2069       // visual parameters are stored in strings as follows: ViewerType_ViewIndex_ParamName.
2070       // '_' is used as separator and should not be used in viewer type or parameter names.
2071       QStringList lst = QString((*namesIt).c_str()).split(NAME_SEPARATOR, QString::SkipEmptyParts);
2072       if (lst.size() != 3)
2073         continue;
2074
2075       viewerTypStr = lst[0];
2076       viewIndexStr = lst[1];
2077       QString paramNameStr = lst[2];
2078
2079       bool ok;
2080       viewIndex = viewIndexStr.toUInt(&ok);
2081       if (!ok) // bad conversion of view index to integer
2082         continue;
2083
2084       if((viewIndex + 1) > aListOfMap.count()) {
2085         aListOfMap.resize(viewIndex + 1);
2086       }
2087
2088       QString val((*valuesIt).c_str());
2089       if(paramNameStr == VISIBILITY_PROP){
2090         aListOfMap[viewIndex].insert(VISIBILITY_PROP, val == "On" ? 1 : 0);
2091
2092       } else if(paramNameStr == OPACITY_PROP) {
2093         aListOfMap[viewIndex].insert(TRANSPARENCY_PROP, 1. - val.toDouble());
2094
2095       }        else if(paramNameStr == TRANSPARENCY_PROP) {
2096         aListOfMap[viewIndex].insert(TRANSPARENCY_PROP, val.toDouble());
2097
2098       } else if(paramNameStr == DISPLAY_MODE_PROP) {
2099         aListOfMap[viewIndex].insert( DISPLAY_MODE_PROP, val.toInt());
2100
2101       } else if(paramNameStr == ISOS_PROP) {
2102         aListOfMap[viewIndex].insert( ISOS_PROP, val);
2103
2104       } else if(paramNameStr == COLOR_PROP) {
2105         QStringList rgb = val.split(DIGIT_SEPARATOR);
2106         if(rgb.count() == 3) {
2107           QColor c(int(rgb[0].toDouble()*255), int(rgb[1].toDouble()*255), int(rgb[2].toDouble()*255));
2108           aListOfMap[viewIndex].insert( COLOR_PROP, c);
2109         }
2110       } else if(paramNameStr == VECTOR_MODE_PROP) {
2111         aListOfMap[viewIndex].insert( VECTOR_MODE_PROP, val.toInt());
2112
2113       }  else if(paramNameStr == DEFLECTION_COEFF_PROP) {
2114         aListOfMap[viewIndex].insert( DEFLECTION_COEFF_PROP, val.toDouble());
2115       }  else if(paramNameStr == MARKER_TYPE_PROP) {
2116         aListOfMap[viewIndex].insert( MARKER_TYPE_PROP, val);
2117       } else if(paramNameStr == FRONT_MATERIAL_PROP) {
2118         aListOfMap[viewIndex].insert( FRONT_MATERIAL_PROP, val);
2119       } else if(paramNameStr == BACK_MATERIAL_PROP) {
2120         aListOfMap[viewIndex].insert( BACK_MATERIAL_PROP, val);
2121       }  else if(paramNameStr == EDGE_WIDTH_PROP) {
2122         aListOfMap[viewIndex].insert( EDGE_WIDTH_PROP , val);
2123       }  else if(paramNameStr == ISOS_WIDTH_PROP) {
2124         aListOfMap[viewIndex].insert( ISOS_WIDTH_PROP , val);
2125       }
2126
2127                     
2128
2129     } // for names/parameters iterator
2130
2131     QList<SUIT_ViewManager*> lst = getApp()->viewManagers();
2132
2133     for (int index = 0; index < aListOfMap.count(); index++) {
2134
2135       appStudy->setObjectPropMap(index, entry, aListOfMap[index]);
2136
2137       //Get Visibility property of the current PropMap
2138       if (aListOfMap[index].value(VISIBILITY_PROP) == 1) {
2139         SUIT_ViewManager* vman = lst.at(index);
2140         SUIT_ViewModel* vmodel = vman->getViewModel();
2141         displayer()->Display(entry, true, dynamic_cast<SALOME_View*>(vmodel));
2142       }
2143     }
2144
2145   } // for entries iterator
2146
2147   // update all VTK and OCC views
2148   QList<SUIT_ViewManager*> lst;
2149   getApp()->viewManagers(lst);
2150   for (QList<SUIT_ViewManager*>::Iterator it = lst.begin(); it != lst.end(); it++) {
2151     SUIT_ViewModel* vmodel = (*it)->getViewModel();
2152     if (!vmodel)
2153       continue;
2154     if (vmodel->getType() == SVTK_Viewer::Type()) {
2155       SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) (*it)->getActiveView();
2156       vtkView->getRenderer()->ResetCameraClippingRange();
2157       vtkView->Repaint();
2158     }
2159     else if (vmodel->getType() == SOCC_Viewer::Type()) {
2160       //SOCC_ViewWindow* occView = (SOCC_ViewWindow*) (*it)->getActiveView();
2161       SALOME_View* occVMod = dynamic_cast<SALOME_View*>(vmodel);
2162       if (occVMod)
2163         occVMod->Repaint();
2164     }
2165   }
2166 }
2167
2168 void GeometryGUI::onViewAboutToShow()
2169 {
2170   SUIT_ViewWindow* window = application()->desktop()->activeWindow();
2171   QAction* a = action( GEOMOp::OpSwitchVectors );
2172   if ( window ) {
2173     a->setEnabled(true);
2174     bool vmode = window->property("VectorsMode").toBool();
2175     a->setText ( vmode == 1 ? tr( "MEN_VECTOR_MODE_OFF" ) : tr("MEN_VECTOR_MODE_ON") );
2176   } else {
2177     a->setText ( tr("MEN_VECTOR_MODE_ON") );
2178     a->setEnabled(false);
2179   }
2180 }
2181
2182 /*!
2183   \brief Check if this object is can't be renamed in place
2184
2185   This method can be re-implemented in the subclasses.
2186   Return true in case if object isn't reference or component (module root).
2187
2188   \param id column id
2189   \return \c true if the item can be renamed by the user in place (e.g. in the Object browser)
2190 */
2191 bool GeometryGUI::renameAllowed( const QString& entry) const {
2192
2193   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
2194   SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0; 
2195   SalomeApp_DataObject* obj = appStudy ? dynamic_cast<SalomeApp_DataObject*>(appStudy->findObjectByEntry(entry)) : 0;
2196   
2197   return (app && appStudy && obj && !appStudy->isComponent(entry) && !obj->isReference());
2198 }
2199
2200
2201 /*!
2202   Rename object by entry.
2203   \param entry entry of the object
2204   \param name new name of the object
2205   \brief Return \c true if rename operation finished successfully, \c false otherwise.
2206 */
2207 bool GeometryGUI::renameObject( const QString& entry, const QString& name) {
2208   
2209   bool result = false;
2210   
2211   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication());
2212   SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
2213   
2214   if(!appStudy)
2215     return result;
2216   
2217   _PTR(Study) aStudy = appStudy->studyDS();
2218   
2219   if(!aStudy)
2220     return result;
2221
2222   bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
2223   if ( aLocked ) {
2224     SUIT_MessageBox::warning ( app->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
2225     return result;
2226   }
2227
2228   _PTR(SObject) obj ( aStudy->FindObjectID(qPrintable(entry)) );
2229   _PTR(GenericAttribute) anAttr;
2230   if ( obj ) {
2231     if ( obj->FindAttribute(anAttr, "AttributeName") ) {
2232       _PTR(AttributeName) aName (anAttr);
2233
2234       GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(obj));
2235       if (!CORBA::is_nil(anObj)) {
2236         aName->SetValue( name.toLatin1().data() ); // rename the SObject
2237         anObj->SetName( name.toLatin1().data() );  // Rename the corresponding GEOM_Object
2238         result = true;
2239       }
2240     }
2241   }
2242   return result;
2243 }
2244