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