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