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