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