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