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