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