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