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