]> SALOME platform Git repositories - modules/geom.git/blob - src/GEOMGUI/GeometryGUI.cxx
Salome HOME
0022616: [CEA 1038] Improve the quality of stl and vtk exports
[modules/geom.git] / src / GEOMGUI / GeometryGUI.cxx
1 // Copyright (C) 2007-2014  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, or (at your option) any later version.
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 "GEOMPluginGUI.h"
33 #include "GEOMGUI_OCCSelector.h"
34 #include "GEOMGUI_Selection.h"
35 #include "GEOMGUI_CreationInfoWdg.h"
36 #include "GEOMGUI_DimensionProperty.h"
37 #include "GEOM_Constants.h"
38 #include "GEOM_Displayer.h"
39 #include "GEOM_AISShape.hxx"
40 #include "GEOMUtils_XmlHandler.hxx"
41
42 #include "GEOM_Actor.h"
43
44 #include <Material_ResourceMgr.h>
45 #include <Material_Model.h>
46
47 #include <SUIT_Desktop.h>
48 #include <SUIT_MessageBox.h>
49 #include <SUIT_ResourceMgr.h>
50 #include <SUIT_Session.h>
51 #include <SUIT_ViewManager.h>
52
53 #include <PyInterp_Interp.h>
54
55 #include <OCCViewer_ViewWindow.h>
56 #include <OCCViewer_ViewPort3d.h>
57 #include <OCCViewer_ViewModel.h>
58 #include <OCCViewer_ViewManager.h>
59
60 #include <SOCC_ViewModel.h>
61 #include <SOCC_ViewWindow.h>
62
63 #include <SVTK_ViewWindow.h>
64 #include <SVTK_RenderWindowInteractor.h>
65 #include <SVTK_InteractorStyle.h>
66 #include <SVTK_ViewModel.h>
67
68 #include <GraphicsView_Viewer.h>
69
70 #include <SalomeApp_Application.h>
71 #include <SalomeApp_DataObject.h>
72 #include <SalomeApp_Study.h>
73 #include <SalomeApp_Tools.h>
74
75 #include <LightApp_SelectionMgr.h>
76 #include <LightApp_VTKSelector.h>
77 #include <LightApp_DataObject.h>
78 #include <LightApp_Preferences.h>
79
80 #include <SALOME_LifeCycleCORBA.hxx>
81 // #include <SALOME_ListIO.hxx>
82 #include <SALOME_ListIteratorOfListIO.hxx>
83
84 #include <SALOMEDSClient_ClientFactory.hxx>
85 #include <SALOMEDSClient_IParameters.hxx>
86
87 #include <SALOMEDS_SObject.hxx>
88
89 #include <Basics_OCCTVersion.hxx>
90
91 // External includes
92 #include <QDir>
93 #include <QSet>
94 #include <QMenu>
95 #include <QTime>
96 #include <QAction>
97 #include <QFileInfo>
98 #include <QString>
99 #include <QPainter>
100 #include <QSignalMapper>
101
102 #include <AIS_Drawer.hxx>
103 #include <AIS_ListOfInteractive.hxx>
104 #include <AIS_ListIteratorOfListOfInteractive.hxx>
105 #include <Prs3d_Drawer.hxx>
106 #include <Prs3d_IsoAspect.hxx>
107 #include <Aspect_TypeOfMarker.hxx>
108 #include <OSD_SharedLibrary.hxx>
109 #include <NCollection_DataMap.hxx>
110
111 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
112 #include <TColStd_HArray1OfByte.hxx>
113 #else
114 #include <Graphic3d_HArray1OfBytes.hxx>
115 #endif
116
117 #include <utilities.h>
118
119 #include <vtkCamera.h>
120 #include <vtkRenderer.h>
121
122 #include <Standard_Failure.hxx>
123 #include <Standard_ErrorHandler.hxx>
124
125 #include "GEOM_version.h"
126 #include "GEOMImpl_Types.hxx" // dangerous hxx (defines short-name macros) - include after all
127
128 extern "C" {
129   Standard_EXPORT CAM_Module* createModule() {
130     return new GeometryGUI();
131   }
132
133   Standard_EXPORT char* getModuleVersion() {
134     return (char*)GEOM_VERSION_STR;
135   }
136 }
137
138 GeometryGUI::StudyTextureMap GeometryGUI::myTextureMap;
139
140 GEOM::GEOM_Gen_var GeometryGUI::myComponentGeom = GEOM::GEOM_Gen::_nil();
141
142 GEOM::GEOM_Gen_var GeometryGUI::GetGeomGen()
143 {
144   // Bug 12290: exception in Mesh GUI on GEOMBase::GetShape() if Geometry GUI hasn't been loaded
145   if (CORBA::is_nil(myComponentGeom))
146     InitGeomGen();
147   return GeometryGUI::myComponentGeom;
148 }
149
150 bool GeometryGUI::InitGeomGen()
151 {
152   GeometryGUI aGG;
153   if ( CORBA::is_nil( myComponentGeom ) ) return false;
154   return true;
155 }
156
157 //=======================================================================
158 // function : ClientSObjectToObject
159 // purpose  :
160 //=======================================================================
161 CORBA::Object_var GeometryGUI::ClientSObjectToObject (_PTR(SObject) theSObject)
162 {
163   _PTR(GenericAttribute) anAttr;
164   CORBA::Object_var anObj;
165   try {
166     std::string aValue = theSObject->GetIOR();
167     if (strcmp(aValue.c_str(), "") != 0) {
168       CORBA::ORB_ptr anORB = SalomeApp_Application::orb();
169       anObj = anORB->string_to_object(aValue.c_str());
170     }
171   } catch(...) {
172     INFOS("ClientSObjectToObject - Unknown exception was occured!!!");
173   }
174   return anObj._retn();
175 }
176
177 //=======================================================================
178 // function : ClientStudyToStudy
179 // purpose  :
180 //=======================================================================
181 SALOMEDS::Study_var GeometryGUI::ClientStudyToStudy (_PTR(Study) theStudy)
182 {
183   SALOME_NamingService *aNamingService = SalomeApp_Application::namingService();
184   CORBA::Object_var aSMObject = aNamingService->Resolve("/myStudyManager");
185   SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow(aSMObject);
186   int aStudyID = theStudy->StudyId();
187   SALOMEDS::Study_var aDSStudy = aStudyManager->GetStudyByID(aStudyID);
188   return aDSStudy._retn();
189 }
190
191 void GeometryGUI::Modified (bool theIsUpdateActions)
192 {
193   if ( SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() ) ) {
194     if ( SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) ) {
195       appStudy->Modified();
196       if ( theIsUpdateActions )
197         app->updateActions();
198     }
199   }
200 }
201
202 //=======================================================================
203 // function : GeometryGUI::GeometryGUI()
204 // purpose  : Constructor
205 //=======================================================================
206 GeometryGUI::GeometryGUI() :
207   SalomeApp_Module( "GEOM" ),
208   myTopLevelIOList()
209 {
210   if ( CORBA::is_nil( myComponentGeom ) )
211   {
212     Engines::EngineComponent_var comp =
213       SalomeApp_Application::lcc()->FindOrLoad_Component( "FactoryServer", "GEOM" );
214     myComponentGeom = GEOM::GEOM_Gen::_narrow( comp );
215   }
216
217   myActiveDialogBox = 0;
218
219   gp_Pnt origin = gp_Pnt(0., 0., 0.);
220   gp_Dir direction = gp_Dir(0., 0., 1.);
221   myWorkingPlane = gp_Ax3(origin, direction);
222
223   myDisplayer = 0;
224   myLocalSelectionMode = GEOM_ALLOBJECTS;
225
226   myCreationInfoWdg = 0;
227
228   connect( Material_ResourceMgr::resourceMgr(), SIGNAL( changed() ), this, SLOT( updateMaterials() ) );
229
230   Q_INIT_RESOURCE( GEOMGUI );
231 }
232
233 //=======================================================================
234 // function : GeometryGUI::~GeometryGUI()
235 // purpose  : Destructor
236 //=======================================================================
237 GeometryGUI::~GeometryGUI()
238 {
239   while (!myOCCSelectors.isEmpty())
240     delete myOCCSelectors.takeFirst();
241
242   while (!myVTKSelectors.isEmpty())
243     delete myVTKSelectors.takeFirst();
244
245   qDeleteAll(myGUIMap);
246 }
247
248 //=======================================================================
249 // function : GeometryGUI::getLibrary()
250 // purpose  : get or load GUI library by name [ internal ]
251 //=======================================================================
252 typedef GEOMGUI* (*LibraryGUI)( GeometryGUI* );
253 GEOMGUI* GeometryGUI::getLibrary( const QString& libraryName )
254 {
255   if ( !myGUIMap.contains( libraryName ) ) {
256     // try to load library if it is not loaded yet
257 #ifndef WIN32
258     QString dirs = getenv( "LD_LIBRARY_PATH" );
259     QString sep  = ":";
260 #else
261     QString dirs = getenv( "PATH" );
262     QString sep  = ";";
263 #endif
264     if ( !dirs.isEmpty() ) {
265       QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries
266       QListIterator<QString> it( dirList ); it.toBack();
267       while ( it.hasPrevious() ) {
268         QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName );
269         if ( fi.exists() ) {
270           OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() );
271           bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY );
272           if ( !res ) {
273             MESSAGE( "Can't open library : " << aSharedLibrary.DlError() );
274             continue; // continue search further
275           }
276           OSD_Function osdF = aSharedLibrary.DlSymb( "GetLibGUI" );
277           if ( osdF != NULL ) {
278             LibraryGUI func = (GEOMGUI* (*) (GeometryGUI*))osdF;
279             GEOMGUI* libGUI = (*func)( this );
280             if ( libGUI ) {
281               myGUIMap[ libraryName ] = libGUI;
282               break; // found and loaded!
283             }
284           }
285         }
286       }
287     }
288   }
289   return myGUIMap.contains( libraryName ) ? myGUIMap[ libraryName ] : 0;
290 }
291
292 //=======================================================================
293 // function : GeometryGUI::getPluginLibrary()
294 // purpose  : get or load GUI Plugin library by name [ internal ]
295 //=======================================================================
296 typedef GEOMPluginGUI* (*PluginLibraryGUI)( GeometryGUI* );
297 GEOMPluginGUI* GeometryGUI::getPluginLibrary( const QString& libraryName )
298 {
299   if ( !myGUIMap.contains( libraryName ) ) {
300     // try to load library if it is not loaded yet
301 #ifndef WIN32
302     QString dirs = getenv( "LD_LIBRARY_PATH" );
303     QString sep  = ":";
304 #else
305     QString dirs = getenv( "PATH" );
306     QString sep  = ";";
307 #endif
308     if ( !dirs.isEmpty() ) {
309       QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries
310       QListIterator<QString> it( dirList ); it.toBack();
311       while ( it.hasPrevious() ) {
312         QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName );
313         if ( fi.exists() ) {
314           OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() );
315           bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY );
316           if ( !res ) {
317             MESSAGE( "Can't open library : " << aSharedLibrary.DlError() );
318             continue; // continue search further
319           }
320           OSD_Function osdF = aSharedLibrary.DlSymb( "GetLibGUI" );
321           if ( osdF != NULL ) {
322             PluginLibraryGUI func = (GEOMPluginGUI* (*) (GeometryGUI*))osdF;
323             GEOMPluginGUI* libGUI = (*func)( this );
324             if ( libGUI ) {
325               myGUIMap[ libraryName ] = libGUI;
326               break; // found and loaded!
327             }
328           }
329         }
330       }
331     }
332   }
333   return myGUIMap.contains( libraryName ) ? (GEOMPluginGUI*)myGUIMap[ libraryName ] : 0;
334 }
335
336 //=======================================================================
337 // function : GeometryGUI::ActiveWorkingPlane()
338 // purpose  : Activate Working Plane View
339 //=======================================================================
340 void GeometryGUI::ActiveWorkingPlane()
341 {
342   gp_Dir DZ = myWorkingPlane.Direction();
343   gp_Dir DY = myWorkingPlane.YDirection();
344
345   SUIT_ViewWindow* window = application()->desktop()->activeWindow();
346   bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
347   bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
348
349   if ( ViewOCC ) {
350     OCCViewer_ViewWindow* vw = dynamic_cast<OCCViewer_ViewWindow*>( window );
351     if ( vw ) {
352       Handle(V3d_View) view3d =  vw->getViewPort()->getView();
353
354       view3d->SetProj(DZ.X(), DZ.Y(), DZ.Z());
355       view3d->SetUp(DY.X(), DY.Y(), DY.Z());
356       vw->onViewFitAll();
357     }
358   }
359   else if ( ViewVTK ) {
360     SVTK_ViewWindow* vw = dynamic_cast<SVTK_ViewWindow*>( window );
361     if ( vw ) {
362       vtkCamera* camera = vw->getRenderer()->GetActiveCamera();
363
364       camera->SetPosition(DZ.X(), DZ.Y(), DZ.Z());
365       camera->SetViewUp(DY.X(), DY.Y(), DY.Z());
366       camera->SetFocalPoint(0,0,0);
367
368       vw->onFitAll();
369     }
370   }
371 }
372
373 //=======================================================================
374 // function : GeometryGUI::SetActiveDialogBox()
375 // purpose  : Set active dialog box
376 //=======================================================================
377 void GeometryGUI::SetActiveDialogBox( QDialog* aDlg )
378 {
379   myActiveDialogBox = (QDialog*)aDlg;
380 }
381
382 //=======================================================================
383 // function : GeometryGUI::EmitSignalDeactivateDialog()
384 // purpose  : Emit a signal to deactivate the active dialog Box
385 //=======================================================================
386 void GeometryGUI::EmitSignalDeactivateDialog()
387 {
388   emit SignalDeactivateActiveDialog();
389 }
390
391 //=======================================================================
392 // function : GeometryGUI::EmitSignalCloseAllDialogs()
393 // purpose  : Emit a signal to close all non modal dialogs box
394 //=======================================================================
395 void GeometryGUI::EmitSignalCloseAllDialogs()
396 {
397   emit SignalCloseAllDialogs();
398 }
399
400 //=======================================================================
401 // function : GeometryGUI::EmitSignalDefaultStepValueChanged()
402 // purpose  : Emit a signal to inform that default real spin box step has
403 //            been changed
404 //=======================================================================
405 void GeometryGUI::EmitSignalDefaultStepValueChanged(double newVal)
406 {
407   emit SignalDefaultStepValueChanged(newVal);
408 }
409
410 //=======================================================================
411 // function : GeometryGUI::OnGUIEvent()
412 // purpose  : common slot for all menu/toolbar actions
413 //=======================================================================
414 void GeometryGUI::OnGUIEvent()
415 {
416   const QObject* obj = sender();
417   if ( !obj || !obj->inherits( "QAction" ) )
418     return;
419   int id = actionId((QAction*)obj);
420   if ( id != -1 )
421     OnGUIEvent( id );
422 }
423
424 //=======================================================================
425 // function : GeometryGUI::OnGUIEvent()
426 // purpose  : manage all events on GUI [static]
427 //=======================================================================
428 void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
429 {
430   SUIT_Application* anApp = application();
431   if (!anApp) return;
432   SUIT_Desktop* desk = anApp->desktop();
433
434   // check type of the active viewframe
435   SUIT_ViewWindow* window = desk->activeWindow();
436   bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
437   bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
438   bool ViewDep = ( window && window->getViewManager()->getType() == GraphicsView_Viewer::Type() );
439   // if current viewframe is not of OCC and not of VTK type - return immediately
440   // fix for IPAL8958 - allow some commands to execute even when NO viewer is active (rename for example)
441   QList<int> NotViewerDependentCommands;
442   NotViewerDependentCommands << GEOMOp::OpDelete
443                              << GEOMOp::OpShow
444                              << GEOMOp::OpShowOnly
445                              << GEOMOp::OpShowOnlyChildren
446                              << GEOMOp::OpDiscloseChildren
447                              << GEOMOp::OpConcealChildren
448                              << GEOMOp::OpUnpublishObject
449                              << GEOMOp::OpPublishObject
450                              << GEOMOp::OpPointMarker
451                              << GEOMOp::OpCreateFolder
452                              << GEOMOp::OpSortChildren;
453   if ( !ViewOCC && !ViewVTK && !ViewDep && !NotViewerDependentCommands.contains( id ) ) {
454     // activate OCC viewer
455     getApp()->getViewManager(OCCViewer_Viewer::Type(), /*create=*/true);
456   }
457
458   // fix for IPAL9103, point 2
459   if ( CORBA::is_nil( GetGeomGen() ) ) {
460     SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_GET_ENGINE" ), tr( "GEOM_BUT_OK" ) );
461     return;
462   }
463
464   QString libName;
465   // find corresponding GUI library
466   switch ( id ) {
467   case GEOMOp::OpOriginAndVectors:   // MENU BASIC - ORIGIN AND BASE VECTORS
468     createOriginAndBaseVectors(); // internal operation
469     return;
470   case GEOMOp::OpSelectVertex:       // POPUP MENU - SELECT ONLY - VERTEX
471   case GEOMOp::OpSelectEdge:         // POPUP MENU - SELECT ONLY - EDGE
472   case GEOMOp::OpSelectWire:         // POPUP MENU - SELECT ONLY - WIRE
473   case GEOMOp::OpSelectFace:         // POPUP MENU - SELECT ONLY - FACE
474   case GEOMOp::OpSelectShell:        // POPUP MENU - SELECT ONLY - SHELL
475   case GEOMOp::OpSelectSolid:        // POPUP MENU - SELECT ONLY - SOLID
476   case GEOMOp::OpSelectCompound:     // POPUP MENU - SELECT ONLY - COMPOUND
477   case GEOMOp::OpSelectAll:          // POPUP MENU - SELECT ONLY - SELECT ALL
478   case GEOMOp::OpDelete:             // MENU EDIT - DELETE
479   case GEOMOp::OpCheckGeom:          // MENU TOOLS - CHECK GEOMETRY
480   case GEOMOp::OpMaterialsLibrary:   // MENU TOOLS - MATERIALS LIBRARY
481   case GEOMOp::OpDeflection:         // POPUP MENU - DEFLECTION COEFFICIENT
482   case GEOMOp::OpColor:              // POPUP MENU - COLOR
483   case GEOMOp::OpSetTexture:         // POPUP MENU - SETTEXTURE
484   case GEOMOp::OpTransparency:       // POPUP MENU - TRANSPARENCY
485   case GEOMOp::OpIncrTransparency:   // SHORTCUT   - INCREASE TRANSPARENCY
486   case GEOMOp::OpDecrTransparency:   // SHORTCUT   - DECREASE TRANSPARENCY
487   case GEOMOp::OpIsos:               // POPUP MENU - ISOS
488   case GEOMOp::OpIncrNbIsos:         // SHORTCUT   - INCREASE NB ISOS
489   case GEOMOp::OpDecrNbIsos:         // SHORTCUT   - DECREASE NB ISOS
490   case GEOMOp::OpAutoColor:          // POPUP MENU - AUTO COLOR
491   case GEOMOp::OpNoAutoColor:        // POPUP MENU - DISABLE AUTO COLOR
492   case GEOMOp::OpDiscloseChildren:   // POPUP MENU - DISCLOSE CHILD ITEMS
493   case GEOMOp::OpConcealChildren:    // POPUP MENU - CONCEAL CHILD ITEMS
494   case GEOMOp::OpUnpublishObject:    // POPUP MENU - UNPUBLISH
495   case GEOMOp::OpPublishObject:      // ROOT GEOM OBJECT - POPUP MENU - PUBLISH
496   case GEOMOp::OpPointMarker:        // POPUP MENU - POINT MARKER
497   case GEOMOp::OpMaterialProperties: // POPUP MENU - MATERIAL PROPERTIES
498   case GEOMOp::OpPredefMaterial:     // POPUP MENU - <SOME MATERIAL>
499   case GEOMOp::OpPredefMaterCustom:  // POPUP MENU - MATERIAL PROPERTIES - CUSTOM...
500   case GEOMOp::OpEdgeWidth:          // POPUP MENU - LINE WIDTH - EDGE WIDTH
501   case GEOMOp::OpIsosWidth:          // POPUP MENU - LINE WIDTH - ISOS WIDTH
502   case GEOMOp::OpBringToFront:       // POPUP MENU - BRING TO FRONT
503   case GEOMOp::OpClsBringToFront:    //
504   case GEOMOp::OpCreateFolder:       // POPUP MENU - CREATE FOLDER
505   case GEOMOp::OpSortChildren:       // POPUP MENU - SORT CHILD ITEMS
506   case GEOMOp::OpShowDependencyTree: // POPUP MENU - SHOW DEPENDENCY TREE
507   case GEOMOp::OpReduceStudy:        // POPUP MENU - REDUCE STUDY
508     libName = "GEOMToolsGUI";
509     break;
510   case GEOMOp::OpDMWireframe:        // MENU VIEW - WIREFRAME
511   case GEOMOp::OpDMShading:          // MENU VIEW - SHADING
512   case GEOMOp::OpDMShadingWithEdges: // MENU VIEW - SHADING
513   case GEOMOp::OpDMTexture:          // MENU VIEW - TEXTURE
514   case GEOMOp::OpShowAll:            // MENU VIEW - SHOW ALL
515   case GEOMOp::OpShowOnly:           // MENU VIEW - DISPLAY ONLY
516   case GEOMOp::OpShowOnlyChildren:   // MENU VIEW - SHOW ONLY CHILDREN
517   case GEOMOp::OpHideAll:            // MENU VIEW - ERASE ALL
518   case GEOMOp::OpHide:               // MENU VIEW - ERASE
519   case GEOMOp::OpShow:               // MENU VIEW - DISPLAY
520   case GEOMOp::OpSwitchVectors:      // MENU VIEW - VECTOR MODE
521   case GEOMOp::OpSwitchVertices:     // MENU VIEW - VERTICES MODE
522   case GEOMOp::OpWireframe:          // POPUP MENU - WIREFRAME
523   case GEOMOp::OpShading:            // POPUP MENU - SHADING
524   case GEOMOp::OpShadingWithEdges:   // POPUP MENU - SHADING WITH EDGES
525   case GEOMOp::OpTexture:            // POPUP MENU - TEXTURE
526   case GEOMOp::OpVectors:            // POPUP MENU - VECTORS
527   case GEOMOp::OpVertices:           // POPUP MENU - VERTICES
528     libName = "DisplayGUI";
529     break;
530   case GEOMOp::OpPoint:              // MENU BASIC - POINT
531   case GEOMOp::OpLine:               // MENU BASIC - LINE
532   case GEOMOp::OpCircle:             // MENU BASIC - CIRCLE
533   case GEOMOp::OpEllipse:            // MENU BASIC - ELLIPSE
534   case GEOMOp::OpArc:                // MENU BASIC - ARC
535   case GEOMOp::OpVector:             // MENU BASIC - VECTOR
536   case GEOMOp::OpPlane:              // MENU BASIC - PLANE
537   case GEOMOp::OpCurve:              // MENU BASIC - CURVE
538   case GEOMOp::OpLCS:                // MENU BASIC - LOCAL COORDINATE SYSTEM
539     libName = "BasicGUI";
540     break;
541   case GEOMOp::OpBox:                // MENU PRIMITIVE - BOX
542   case GEOMOp::OpCylinder:           // MENU PRIMITIVE - CYLINDER
543   case GEOMOp::OpSphere:             // MENU PRIMITIVE - SPHERE
544   case GEOMOp::OpTorus:              // MENU PRIMITIVE - TORUS
545   case GEOMOp::OpCone:               // MENU PRIMITIVE - CONE
546   case GEOMOp::OpRectangle:          // MENU PRIMITIVE - FACE
547   case GEOMOp::OpDisk:               // MENU PRIMITIVE - DISK
548     libName = "PrimitiveGUI";
549     break;
550   case GEOMOp::OpPrism:              // MENU GENERATION - PRISM
551   case GEOMOp::OpRevolution:         // MENU GENERATION - REVOLUTION
552   case GEOMOp::OpFilling:            // MENU GENERATION - FILLING
553   case GEOMOp::OpPipe:               // MENU GENERATION - PIPE
554   case GEOMOp::OpPipePath:           // MENU GENERATION - RESTORE PATH
555     libName = "GenerationGUI";
556     break;
557   case GEOMOp::Op2dSketcher:         // MENU ENTITY - SKETCHER
558   case GEOMOp::Op3dSketcher:         // MENU ENTITY - 3D SKETCHER
559   case GEOMOp::OpIsoline:            // MENU BASIC  - ISOLINE
560   case GEOMOp::OpExplode:            // MENU ENTITY - EXPLODE
561 #ifdef WITH_OPENCV
562   case GEOMOp::OpFeatureDetect:      // MENU ENTITY - FEATURE DETECTION
563 #endif
564   case GEOMOp::OpPictureImport:      // MENU ENTITY - IMPORT PICTURE IN VIEWER
565   case GEOMOp::OpCreateField:        // MENU FIELD - CREATE FIELD
566   case GEOMOp::OpEditField:          // MENU FIELD - EDIT FIELD
567   case GEOMOp::OpEditFieldPopup:     // POPUP MENU - EDIT FIELD
568     libName = "EntityGUI";
569     break;
570   case GEOMOp::OpEdge:               // MENU BUILD - EDGE
571   case GEOMOp::OpWire:               // MENU BUILD - WIRE
572   case GEOMOp::OpFace:               // MENU BUILD - FACE
573   case GEOMOp::OpShell:              // MENU BUILD - SHELL
574   case GEOMOp::OpSolid:              // MENU BUILD - SOLID
575   case GEOMOp::OpCompound:           // MENU BUILD - COMPUND
576     libName = "BuildGUI";
577     break;
578   case GEOMOp::OpFuse:               // MENU BOOLEAN - FUSE
579   case GEOMOp::OpCommon:             // MENU BOOLEAN - COMMON
580   case GEOMOp::OpCut:                // MENU BOOLEAN - CUT
581   case GEOMOp::OpSection:            // MENU BOOLEAN - SECTION
582     libName = "BooleanGUI";
583     break;
584   case GEOMOp::OpTranslate:          // MENU TRANSFORMATION - TRANSLATION
585   case GEOMOp::OpRotate:             // MENU TRANSFORMATION - ROTATION
586   case GEOMOp::OpChangeLoc:          // MENU TRANSFORMATION - LOCATION
587   case GEOMOp::OpMirror:             // MENU TRANSFORMATION - MIRROR
588   case GEOMOp::OpScale:              // MENU TRANSFORMATION - SCALE
589   case GEOMOp::OpOffset:             // MENU TRANSFORMATION - OFFSET
590   case GEOMOp::OpProjection:         // MENU TRANSFORMATION - PROJECTION
591   case GEOMOp::OpMultiTranslate:     // MENU TRANSFORMATION - MULTI-TRANSLATION
592   case GEOMOp::OpMultiRotate:        // MENU TRANSFORMATION - MULTI-ROTATION
593   case GEOMOp::OpReimport:           // CONTEXT(POPUP) MENU - RELOAD_IMPORTED
594     libName = "TransformationGUI";
595     break;
596   case GEOMOp::OpPartition:          // MENU OPERATION - PARTITION
597   case GEOMOp::OpArchimede:          // MENU OPERATION - ARCHIMEDE
598   case GEOMOp::OpFillet3d:           // MENU OPERATION - FILLET
599   case GEOMOp::OpChamfer:            // MENU OPERATION - CHAMFER
600   case GEOMOp::OpClipping:           // MENU OPERATION - CLIPPING RANGE
601   case GEOMOp::OpShapesOnShape:      // MENU OPERATION - GET SHAPES ON SHAPE
602   case GEOMOp::OpFillet2d:           // MENU OPERATION - FILLET 2D
603   case GEOMOp::OpFillet1d:           // MENU OPERATION - FILLET 1D
604   case GEOMOp::OpSharedShapes:       // MENU OPERATION - GET SHARED SHAPES
605   case GEOMOp::OpExtrudedBoss:       // MENU OPERATION - EXTRUDED BOSS
606   case GEOMOp::OpExtrudedCut:        // MENU OPERATION - EXTRUDED CUT
607 #ifdef DEBUG_CURVE_CREATOR  
608   // for debug purposes, to be removed
609   case GEOMOp::OpCurveCreator:       // MENU OPERATION - CURVE CREATOR
610 #endif
611     libName = "OperationGUI";
612     break;
613   case GEOMOp::OpSewing:             // MENU REPAIR - SEWING
614   case GEOMOp::OpSuppressFaces:      // MENU REPAIR - SUPPRESS FACES
615   case GEOMOp::OpSuppressHoles:      // MENU REPAIR - SUPPRESS HOLE
616   case GEOMOp::OpShapeProcess:       // MENU REPAIR - SHAPE PROCESSING
617   case GEOMOp::OpCloseContour:       // MENU REPAIR - CLOSE CONTOUR
618   case GEOMOp::OpRemoveIntWires:     // MENU REPAIR - REMOVE INTERNAL WIRES
619   case GEOMOp::OpAddPointOnEdge:     // MENU REPAIR - ADD POINT ON EDGE
620   case GEOMOp::OpFreeBoundaries:     // MENU MEASURE - FREE BOUNDARIES
621   case GEOMOp::OpFreeFaces:          // MENU MEASURE - FREE FACES
622   case GEOMOp::OpOrientation:        // MENU REPAIR - CHANGE ORIENTATION
623   case GEOMOp::OpGlueFaces:          // MENU REPAIR - GLUE FACES
624   case GEOMOp::OpGlueEdges:          // MENU REPAIR - GLUE EDGES
625   case GEOMOp::OpLimitTolerance:     // MENU REPAIR - LIMIT TOLERANCE
626   case GEOMOp::OpRemoveWebs:         // MENU REPAIR - REMOVE INTERNAL FACES
627   case GEOMOp::OpRemoveExtraEdges:   // MENU REPAIR - REMOVE EXTRA EDGES
628   case GEOMOp::OpFuseEdges:          // MENU REPAIR - FUSE COLLINEAR EDGES
629   case GEOMOp::OpUnionFaces:         // MENU REPAIR - UNION FACES
630     libName = "RepairGUI";
631     break;
632   case GEOMOp::OpProperties:         // MENU MEASURE - PROPERTIES
633   case GEOMOp::OpCenterMass:         // MENU MEASURE - CDG
634   case GEOMOp::OpInertia:            // MENU MEASURE - INERTIA
635   case GEOMOp::OpNormale:            // MENU MEASURE - NORMALE
636   case GEOMOp::OpBoundingBox:        // MENU MEASURE - BOUNDING BOX
637   case GEOMOp::OpMinDistance:        // MENU MEASURE - MIN DISTANCE
638   case GEOMOp::OpAngle:              // MENU MEASURE - ANGLE
639   case GEOMOp::OpTolerance:          // MENU MEASURE - TOLERANCE
640   case GEOMOp::OpWhatIs:             // MENU MEASURE - WHATIS
641   case GEOMOp::OpCheckShape:         // MENU MEASURE - CHECK
642   case GEOMOp::OpCheckCompound:      // MENU MEASURE - CHECK COMPOUND OF BLOCKS
643   case GEOMOp::OpGetNonBlocks:       // MENU MEASURE - Get NON BLOCKS
644   case GEOMOp::OpPointCoordinates:   // MENU MEASURE - POINT COORDINATES
645   case GEOMOp::OpCheckSelfInters:    // MENU MEASURE - CHECK SELF INTERSECTIONS
646   case GEOMOp::OpManageDimensions:   // MENU MEASURE - MANAGE DIMENSIONS
647   case GEOMOp::OpShowAllDimensions:  // POPUP MENU - SHOW ALL DIMENSIONS
648   case GEOMOp::OpHideAllDimensions:  // POPUP MENU - HIDE ALL DIMENSIONS
649     libName = "MeasureGUI";
650     break;
651   case GEOMOp::OpGroupCreate:        // MENU GROUP - CREATE
652   case GEOMOp::OpGroupCreatePopup:   // POPUP MENU - CREATE GROUP
653   case GEOMOp::OpGroupEdit:          // MENU GROUP - EDIT
654   case GEOMOp::OpGroupUnion:         // MENU GROUP - UNION
655   case GEOMOp::OpGroupIntersect:     // MENU GROUP - INTERSECT
656   case GEOMOp::OpGroupCut:           // MENU GROUP - CUT
657     libName = "GroupGUI";
658     break;
659   case GEOMOp::OpHexaSolid:          // MENU BLOCKS - HEXAHEDRAL SOLID
660   case GEOMOp::OpMultiTransform:     // MENU BLOCKS - MULTI-TRANSFORMATION
661   case GEOMOp::OpQuadFace:           // MENU BLOCKS - QUADRANGLE FACE
662   case GEOMOp::OpPropagate:          // MENU BLOCKS - PROPAGATE
663   case GEOMOp::OpExplodeBlock:       // MENU BLOCKS - EXPLODE ON BLOCKS
664     libName = "BlocksGUI";
665     break;
666   //case GEOMOp::OpAdvancedNoOp:       // NO OPERATION (advanced operations base)
667   //case GEOMOp::OpPipeTShape:         // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE
668   //case GEOMOp::OpPipeTShapeGroups:     // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS
669   //case GEOMOp::OpDividedDisk:           // MENU NEW ENTITY - ADVANCED - DIVIDEDDISK
670   //case GEOMOp::OpDividedCylinder:           // MENU NEW ENTITY - ADVANCED - DIVIDEDCYLINDER
671   //case GEOMOp::OpSmoothingSurface:           // MENU NEW ENTITY - ADVANCED - SMOOTHINGSURFACE
672     //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@//
673     //libName = "AdvancedGUI";
674     //break;
675   default:
676     if (myPluginActions.contains(id)) {
677       libName = myPluginActions[id].first;
678
679       GEOMPluginGUI* library = 0;
680       if ( !libName.isEmpty() ) {
681 #ifndef WIN32
682         libName = QString( "lib" ) + libName + ".so";
683 #else
684         libName = libName + ".dll";
685 #endif
686         library = getPluginLibrary( libName );
687       }
688
689       // call method of corresponding GUI library
690       if ( library ) {
691         //QString action ("%1");
692         //action = action.arg(id);
693
694         //if( !theParam.isValid() )
695           library->OnGUIEvent( myPluginActions[id].second, desk );
696         //else
697         //  library->OnGUIEvent( id, desk, theParam);
698       }
699       else
700         SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) );
701
702       updateCreationInfo();
703       return;
704     }
705     break;
706   }
707
708   GEOMGUI* library = 0;
709   if ( !libName.isEmpty() ) {
710 #ifndef WIN32
711     libName = QString( "lib" ) + libName + ".so";
712 #else
713     libName = libName + ".dll";
714 #endif
715     library = getLibrary( libName );
716   }
717
718   // call method of corresponding GUI library
719   if ( library ) {
720     if( !theParam.isValid() )
721       library->OnGUIEvent( id, desk );
722     else
723       library->OnGUIEvent( id, desk, theParam);
724   }
725   else
726     SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) );
727
728   updateCreationInfo();
729 }
730
731 //=================================================================================
732 // function : GeometryGUI::activateOperation()
733 // purpose  :
734 //=================================================================================
735 bool GeometryGUI::activateOperation( int actionId )
736 {
737   OnGUIEvent(actionId);
738   return true;
739 }
740
741 //=================================================================================
742 // function : GeometryGUI::activateOperation()
743 // purpose  :
744 //=================================================================================
745 bool GeometryGUI::activateOperation( const QString& actionId )
746 {
747   bool isOk = false;
748
749   int id = actionId.toInt(&isOk);
750   if (isOk)
751     OnGUIEvent(id);
752
753   return isOk;
754 }
755
756 //=================================================================================
757 // function : GeometryGUI::activateOperation()
758 // purpose  :
759 //=================================================================================
760 bool GeometryGUI::activateOperation( const QString& actionId, const QString& plugin )
761 {
762   bool isOk = false;
763
764   QString pluginLib = plugin;
765   // TODO: if <plugin> is a plugin name, find plugin library name
766   if (myPluginLibs.contains(plugin))
767     pluginLib = myPluginLibs[plugin];
768
769   QMap<int, PluginAction>::iterator actionsIter = myPluginActions.begin();
770   for (; actionsIter != myPluginActions.end(); ++actionsIter) {
771     const PluginAction& anAction = actionsIter.value();
772     if (anAction.first == pluginLib && anAction.second == actionId) {
773       // activate operation
774       OnGUIEvent(actionsIter.key());
775       isOk = true;
776     }
777   }
778
779   return isOk;
780 }
781
782 //=================================================================================
783 // function : GeometryGUI::OnKeyPress()
784 // purpose  : Called when any key is pressed by user [static]
785 //=================================================================================
786 void GeometryGUI::OnKeyPress( SUIT_ViewWindow* w, QKeyEvent* e )
787 {
788   if ( !application() )
789     return;
790   foreach ( GEOMGUI* lib, myGUIMap )
791     lib->OnKeyPress( e, application()->desktop(), w );
792 }
793
794 //=================================================================================
795 // function : GeometryGUI::OnMouseMove()
796 // purpose  : Manages mouse move events [static]
797 //=================================================================================
798 void GeometryGUI::OnMouseMove( SUIT_ViewWindow* w, QMouseEvent* e )
799 {
800   if ( !application() )
801     return;
802   foreach ( GEOMGUI* lib, myGUIMap )
803     lib->OnMouseMove( e, application()->desktop(), w );
804 }
805
806 //=================================================================================
807 // function : GeometryGUI::OnMouseRelease()
808 // purpose  : Manages mouse release events [static]
809 //=================================================================================
810 void GeometryGUI::OnMouseRelease( SUIT_ViewWindow* w, QMouseEvent* e )
811 {
812   if ( !application() )
813     return;
814   foreach ( GEOMGUI* lib, myGUIMap )
815     lib->OnMouseRelease( e, application()->desktop(), w );
816 }
817
818 //=================================================================================
819 // function : GeometryGUI::OnMousePress()
820 // purpose  : Manage mouse press events [static]
821 //=================================================================================
822 void GeometryGUI::OnMousePress( SUIT_ViewWindow* w, QMouseEvent* e )
823 {
824   if ( !application() )
825     return;
826   foreach ( GEOMGUI* lib, myGUIMap )
827     lib->OnMousePress( e, application()->desktop(), w );
828 }
829
830 //=======================================================================
831 // function : createGeomAction
832 // purpose  :
833 //=======================================================================
834 void GeometryGUI::createGeomAction( const int id, const QString& label, const QString& icolabel,
835                                     const int accel, const bool toggle, const QString& shortcutAction )
836 {
837   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
838   QPixmap icon = icolabel.isEmpty() ? resMgr->loadPixmap( "GEOM", tr( (QString( "ICO_" )+label).toLatin1().constData() ), false )
839                                     : resMgr->loadPixmap( "GEOM", tr( icolabel.toLatin1().constData() ) );
840   createAction( id,
841                 tr( QString( "TOP_%1" ).arg( label ).toLatin1().constData() ),
842                 icon,
843                 tr( QString( "MEN_%1" ).arg( label ).toLatin1().constData() ),
844                 tr( QString( "STB_%1" ).arg( label ).toLatin1().constData() ),
845                 accel,
846                 application()->desktop(),
847                 toggle,
848                 this, SLOT( OnGUIEvent() ),
849                 shortcutAction );
850 }
851
852 //=======================================================================
853 // function : createOriginAndBaseVectors
854 // purpose  :
855 //=======================================================================
856 void GeometryGUI::createOriginAndBaseVectors()
857 {
858   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
859   bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
860   if ( aLocked ) {
861     SUIT_MessageBox::warning ( application()->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
862     return;
863   }
864   if ( appStudy ) {
865     _PTR(Study) studyDS = appStudy->studyDS();
866     if ( studyDS && !CORBA::is_nil( GetGeomGen() ) ) {
867       GEOM::GEOM_IBasicOperations_var aBasicOperations = GetGeomGen()->GetIBasicOperations( studyDS->StudyId() );
868       if ( !aBasicOperations->_is_nil() ) {
869         SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
870         double aLength = aResourceMgr->doubleValue( "Geometry", "base_vectors_length", 1.0 );
871         GEOM::GEOM_Object_var anOrigin = aBasicOperations->MakePointXYZ( 0.0, 0.0, 0.0 );
872         GEOM::GEOM_Object_var anOX = aBasicOperations->MakeVectorDXDYDZ( aLength, 0.0, 0.0 );
873         GEOM::GEOM_Object_var anOY = aBasicOperations->MakeVectorDXDYDZ( 0.0, aLength, 0.0 );
874         GEOM::GEOM_Object_var anOZ = aBasicOperations->MakeVectorDXDYDZ( 0.0, 0.0, aLength );
875
876         SALOMEDS::Study_var aDSStudy = ClientStudyToStudy( studyDS );
877         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOrigin, "O" );
878         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOX, "OX" );
879         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOY, "OY" );
880         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOZ, "OZ" );
881
882         getApp()->updateObjectBrowser( true );
883       }
884     }
885   }
886 }
887
888 //=======================================================================
889 // function : GeometryGUI::initialize()
890 // purpose  : Called when GEOM module is created
891 //=======================================================================
892 void GeometryGUI::initialize( CAM_Application* app )
893 {
894   SalomeApp_Module::initialize( app );
895
896   // ----- create actions --------------
897
898   createGeomAction( GEOMOp::OpDelete,     "DELETE", "", Qt::Key_Delete );
899
900   createGeomAction( GEOMOp::OpPoint,      "POINT" );
901   createGeomAction( GEOMOp::OpLine,       "LINE" );
902   createGeomAction( GEOMOp::OpCircle,     "CIRCLE" );
903   createGeomAction( GEOMOp::OpEllipse,    "ELLIPSE" );
904   createGeomAction( GEOMOp::OpArc,        "ARC" );
905   createGeomAction( GEOMOp::OpCurve,      "CURVE" );
906   createGeomAction( GEOMOp::OpIsoline,    "ISOLINE" );
907   createGeomAction( GEOMOp::OpVector,     "VECTOR" );
908   createGeomAction( GEOMOp::OpPlane,      "PLANE" );
909   createGeomAction( GEOMOp::OpLCS,        "LOCAL_CS" );
910   createGeomAction( GEOMOp::OpOriginAndVectors, "ORIGIN_AND_VECTORS" );
911
912   createGeomAction( GEOMOp::OpBox,        "BOX" );
913   createGeomAction( GEOMOp::OpCylinder,   "CYLINDER" );
914   createGeomAction( GEOMOp::OpSphere,     "SPHERE" );
915   createGeomAction( GEOMOp::OpTorus,      "TORUS" );
916   createGeomAction( GEOMOp::OpCone,       "CONE" );
917   createGeomAction( GEOMOp::OpRectangle,  "RECTANGLE" );
918   createGeomAction( GEOMOp::OpDisk,       "DISK" );
919
920   createGeomAction( GEOMOp::OpPrism,       "EXTRUSION" );
921   createGeomAction( GEOMOp::OpRevolution,  "REVOLUTION" );
922   createGeomAction( GEOMOp::OpFilling,     "FILLING" );
923   createGeomAction( GEOMOp::OpPipe,        "PIPE" );
924   createGeomAction( GEOMOp::OpPipePath,    "PIPE_PATH" );
925
926   createGeomAction( GEOMOp::OpGroupCreate, "GROUP_CREATE" );
927   createGeomAction( GEOMOp::OpGroupEdit,   "GROUP_EDIT" );
928   createGeomAction( GEOMOp::OpGroupUnion,  "GROUP_UNION" );
929   createGeomAction( GEOMOp::OpGroupIntersect, "GROUP_INTERSECT" );
930   createGeomAction( GEOMOp::OpGroupCut,    "GROUP_CUT" );
931
932   createGeomAction( GEOMOp::OpCreateField, "FIELD_CREATE" );
933   createGeomAction( GEOMOp::OpEditField,   "FIELD_EDIT" );
934
935   createGeomAction( GEOMOp::OpReimport,    "RELOAD_IMPORTED" );
936
937   createGeomAction( GEOMOp::OpQuadFace,    "Q_FACE" );
938   createGeomAction( GEOMOp::OpHexaSolid,   "HEX_SOLID" );
939
940   createGeomAction( GEOMOp::Op2dSketcher,  "SKETCH" );
941   createGeomAction( GEOMOp::Op3dSketcher,  "3DSKETCH" );
942   createGeomAction( GEOMOp::OpIsoline,     "ISOLINE" );
943   createGeomAction( GEOMOp::OpExplode,     "EXPLODE" );
944 #ifdef WITH_OPENCV
945   createGeomAction( GEOMOp::OpFeatureDetect,"FEATURE_DETECTION" );
946 #endif
947   createGeomAction( GEOMOp::OpPictureImport,"PICTURE_IMPORT" );
948
949   createGeomAction( GEOMOp::OpEdge,        "EDGE" );
950   createGeomAction( GEOMOp::OpWire,        "WIRE" );
951   createGeomAction( GEOMOp::OpFace,        "FACE" );
952   createGeomAction( GEOMOp::OpShell,       "SHELL" );
953   createGeomAction( GEOMOp::OpSolid,       "SOLID" );
954   createGeomAction( GEOMOp::OpCompound,    "COMPOUND" );
955
956   createGeomAction( GEOMOp::OpFuse,        "FUSE" );
957   createGeomAction( GEOMOp::OpCommon,      "COMMON" );
958   createGeomAction( GEOMOp::OpCut,         "CUT" );
959   createGeomAction( GEOMOp::OpSection,     "SECTION" );
960
961   createGeomAction( GEOMOp::OpTranslate,      "TRANSLATION" );
962   createGeomAction( GEOMOp::OpRotate,         "ROTATION" );
963   createGeomAction( GEOMOp::OpChangeLoc,      "MODIFY_LOCATION" );
964   createGeomAction( GEOMOp::OpMirror,         "MIRROR" );
965   createGeomAction( GEOMOp::OpScale,          "SCALE" );
966   createGeomAction( GEOMOp::OpOffset,         "OFFSET" );
967   createGeomAction( GEOMOp::OpProjection,     "PROJECTION" );
968   createGeomAction( GEOMOp::OpMultiTranslate, "MUL_TRANSLATION" );
969   createGeomAction( GEOMOp::OpMultiRotate,    "MUL_ROTATION" );
970
971   createGeomAction( GEOMOp::OpPartition,      "PARTITION" );
972   createGeomAction( GEOMOp::OpArchimede,      "ARCHIMEDE" );
973   createGeomAction( GEOMOp::OpFillet3d,       "FILLET" );
974   createGeomAction( GEOMOp::OpChamfer,        "CHAMFER" );
975   //createGeomAction( GEOMOp::OpClipping,        "CLIPPING" );
976   createGeomAction( GEOMOp::OpShapesOnShape,  "GET_SHAPES_ON_SHAPE" );
977   createGeomAction( GEOMOp::OpSharedShapes,   "GET_SHARED_SHAPES" );
978   createGeomAction( GEOMOp::OpExtrudedCut,    "EXTRUDED_CUT" );
979   createGeomAction( GEOMOp::OpExtrudedBoss,   "EXTRUDED_BOSS" );
980 #ifdef DEBUG_CURVE_CREATOR
981   // for debug purposes, to be removed
982   createGeomAction( GEOMOp::OpCurveCreator,   "CURVE_CREATOR" );
983 #endif
984   createGeomAction( GEOMOp::OpFillet1d,       "FILLET_1D" );
985   createGeomAction( GEOMOp::OpFillet2d,       "FILLET_2D" );
986
987   createGeomAction( GEOMOp::OpMultiTransform, "MUL_TRANSFORM" );
988   createGeomAction( GEOMOp::OpExplodeBlock,   "EXPLODE_BLOCKS" );
989   createGeomAction( GEOMOp::OpPropagate,      "PROPAGATE" );
990
991   createGeomAction( GEOMOp::OpSewing,           "SEWING" );
992   createGeomAction( GEOMOp::OpGlueFaces,        "GLUE_FACES" );
993   createGeomAction( GEOMOp::OpGlueEdges,        "GLUE_EDGES" );
994   createGeomAction( GEOMOp::OpLimitTolerance,   "LIMIT_TOLERANCE" );
995   createGeomAction( GEOMOp::OpSuppressFaces,    "SUPPRESS_FACES" );
996   createGeomAction( GEOMOp::OpSuppressHoles,    "SUPPERSS_HOLES" );
997   createGeomAction( GEOMOp::OpShapeProcess,     "SHAPE_PROCESS" );
998   createGeomAction( GEOMOp::OpCloseContour,     "CLOSE_CONTOUR" );
999   createGeomAction( GEOMOp::OpRemoveIntWires,   "SUPPRESS_INT_WIRES" );
1000   createGeomAction( GEOMOp::OpAddPointOnEdge,   "POINT_ON_EDGE" );
1001   createGeomAction( GEOMOp::OpFreeBoundaries,   "CHECK_FREE_BNDS" );
1002   createGeomAction( GEOMOp::OpFreeFaces,        "CHECK_FREE_FACES" );
1003   createGeomAction( GEOMOp::OpOrientation,      "CHANGE_ORIENTATION" );
1004   createGeomAction( GEOMOp::OpRemoveWebs,       "REMOVE_WEBS" );
1005   createGeomAction( GEOMOp::OpRemoveExtraEdges, "REMOVE_EXTRA_EDGES" );
1006   createGeomAction( GEOMOp::OpFuseEdges,        "FUSE_EDGES" );
1007   createGeomAction( GEOMOp::OpUnionFaces,       "UNION_FACES" );
1008
1009   createGeomAction( GEOMOp::OpPointCoordinates, "POINT_COORDS" );
1010   createGeomAction( GEOMOp::OpProperties,       "BASIC_PROPS" );
1011   createGeomAction( GEOMOp::OpCenterMass,       "MASS_CENTER" );
1012   createGeomAction( GEOMOp::OpInertia,          "INERTIA" );
1013   createGeomAction( GEOMOp::OpNormale,          "NORMALE" );
1014   createGeomAction( GEOMOp::OpBoundingBox,      "BND_BOX" );
1015   createGeomAction( GEOMOp::OpMinDistance,      "MIN_DIST" );
1016   createGeomAction( GEOMOp::OpAngle,            "MEASURE_ANGLE" );
1017   createGeomAction( GEOMOp::OpManageDimensions, "MANAGE_DIMENSIONS" );
1018
1019   createGeomAction( GEOMOp::OpTolerance,        "TOLERANCE" );
1020   createGeomAction( GEOMOp::OpWhatIs,           "WHAT_IS" );
1021   createGeomAction( GEOMOp::OpCheckShape,       "CHECK" );
1022   createGeomAction( GEOMOp::OpCheckCompound,    "CHECK_COMPOUND" );
1023   createGeomAction( GEOMOp::OpGetNonBlocks,     "GET_NON_BLOCKS" );
1024   createGeomAction( GEOMOp::OpCheckSelfInters,  "CHECK_SELF_INTERSECTIONS" );
1025
1026 #ifdef _DEBUG_ // PAL16821
1027   createGeomAction( GEOMOp::OpCheckGeom,        "CHECK_GEOMETRY" );
1028 #endif
1029
1030   createGeomAction( GEOMOp::OpMaterialsLibrary,   "MATERIALS_LIBRARY" );
1031   createGeomAction( GEOMOp::OpDMWireframe,        "WIREFRAME" );
1032   createGeomAction( GEOMOp::OpDMShading,          "SHADING" );
1033   createGeomAction( GEOMOp::OpDMShadingWithEdges, "SHADING_WITH_EDGES" );
1034   createGeomAction( GEOMOp::OpDMTexture,          "TEXTURE" );
1035   createGeomAction( GEOMOp::OpShowAll,          "DISPLAY_ALL" );
1036   createGeomAction( GEOMOp::OpHideAll,          "ERASE_ALL" );
1037   createGeomAction( GEOMOp::OpShow,             "DISPLAY" );
1038   createGeomAction( GEOMOp::OpSwitchVectors,    "VECTOR_MODE");
1039   createGeomAction( GEOMOp::OpSwitchVertices,   "VERTICES_MODE");
1040   createGeomAction( GEOMOp::OpSelectVertex,     "VERTEX_SEL_ONLY" ,"", 0, true );
1041   createGeomAction( GEOMOp::OpSelectEdge,       "EDGE_SEL_ONLY", "", 0, true );
1042   createGeomAction( GEOMOp::OpSelectWire,       "WIRE_SEL_ONLY", "",  0, true );
1043   createGeomAction( GEOMOp::OpSelectFace,       "FACE_SEL_ONLY", "", 0, true );
1044   createGeomAction( GEOMOp::OpSelectShell,      "SHELL_SEL_ONLY", "",  0, true );
1045   createGeomAction( GEOMOp::OpSelectSolid,      "SOLID_SEL_ONLY", "", 0, true );
1046   createGeomAction( GEOMOp::OpSelectCompound,   "COMPOUND_SEL_ONLY", "",  0, true );
1047   createGeomAction( GEOMOp::OpSelectAll,        "ALL_SEL_ONLY", "",  0, true );
1048   createGeomAction( GEOMOp::OpShowOnly,         "DISPLAY_ONLY" );
1049   createGeomAction( GEOMOp::OpShowOnlyChildren, "SHOW_ONLY_CHILDREN" );
1050   createGeomAction( GEOMOp::OpBringToFront,     "BRING_TO_FRONT", "", 0, true );
1051   createGeomAction( GEOMOp::OpClsBringToFront,  "CLS_BRING_TO_FRONT" );
1052   createGeomAction( GEOMOp::OpHide,             "ERASE" );
1053
1054   createGeomAction( GEOMOp::OpWireframe,        "POP_WIREFRAME", "", 0, true );
1055   createGeomAction( GEOMOp::OpShading,          "POP_SHADING", "", 0, true );
1056   createGeomAction( GEOMOp::OpShadingWithEdges, "POP_SHADING_WITH_EDGES", "", 0, true );
1057   createGeomAction( GEOMOp::OpTexture,          "POP_TEXTURE", "", 0, true );
1058   createGeomAction( GEOMOp::OpEdgeWidth,        "EDGE_WIDTH");
1059   createGeomAction( GEOMOp::OpIsosWidth,        "ISOS_WIDTH");
1060   createGeomAction( GEOMOp::OpVectors,          "POP_VECTORS", "", 0, true );
1061   createGeomAction( GEOMOp::OpVertices,         "POP_VERTICES", "", 0, true );
1062   createGeomAction( GEOMOp::OpDeflection,       "POP_DEFLECTION" );
1063   createGeomAction( GEOMOp::OpColor,            "POP_COLOR" );
1064   createGeomAction( GEOMOp::OpSetTexture,       "POP_SETTEXTURE" );
1065   createGeomAction( GEOMOp::OpTransparency,     "POP_TRANSPARENCY" );
1066   createGeomAction( GEOMOp::OpIsos,             "POP_ISOS" );
1067   createGeomAction( GEOMOp::OpAutoColor,        "POP_AUTO_COLOR" );
1068   createGeomAction( GEOMOp::OpNoAutoColor,      "POP_DISABLE_AUTO_COLOR" );
1069   createGeomAction( GEOMOp::OpGroupCreatePopup, "POP_CREATE_GROUP" );
1070   createGeomAction( GEOMOp::OpEditFieldPopup,   "POP_EDIT_FIELD" );
1071   createGeomAction( GEOMOp::OpDiscloseChildren, "POP_DISCLOSE_CHILDREN" );
1072   createGeomAction( GEOMOp::OpConcealChildren,  "POP_CONCEAL_CHILDREN" );
1073   createGeomAction( GEOMOp::OpUnpublishObject,  "POP_UNPUBLISH_OBJ" );
1074   createGeomAction( GEOMOp::OpPublishObject,    "POP_PUBLISH_OBJ" );
1075   createGeomAction( GEOMOp::OpPointMarker,      "POP_POINT_MARKER" );
1076   createGeomAction( GEOMOp::OpMaterialProperties,   "POP_MATERIAL_PROPERTIES" );
1077   createGeomAction( GEOMOp::OpPredefMaterCustom,    "POP_PREDEF_MATER_CUSTOM" );
1078   createGeomAction( GEOMOp::OpCreateFolder, "POP_CREATE_FOLDER" );
1079   createGeomAction( GEOMOp::OpSortChildren, "POP_SORT_CHILD_ITEMS" );
1080   createGeomAction( GEOMOp::OpShowDependencyTree, "POP_SHOW_DEPENDENCY_TREE" );
1081   createGeomAction( GEOMOp::OpReduceStudy,       "POP_REDUCE_STUDY" );
1082   createGeomAction( GEOMOp::OpShowAllDimensions, "POP_SHOW_ALL_DIMENSIONS" );
1083   createGeomAction( GEOMOp::OpHideAllDimensions, "POP_HIDE_ALL_DIMENSIONS" );
1084
1085   // Create actions for increase/decrease transparency shortcuts
1086   createGeomAction( GEOMOp::OpIncrTransparency, "", "", 0, false,
1087                     "Geometry:Increase transparency");
1088   createGeomAction( GEOMOp::OpDecrTransparency, "", "", 0, false,
1089                     "Geometry:Decrease transparency");
1090
1091   // Create actions for increase/decrease number of isolines
1092   createGeomAction( GEOMOp::OpIncrNbIsos, "", "", 0, false,
1093                     "Geometry:Increase number of isolines");
1094   createGeomAction( GEOMOp::OpDecrNbIsos, "", "", 0, false,
1095                     "Geometry:Decrease number of isolines");
1096
1097   //createGeomAction( GEOMOp::OpPipeTShape, "PIPETSHAPE" );
1098   //createGeomAction( GEOMOp::OpDividedDisk, "DIVIDEDDISK" );
1099   //createGeomAction( GEOMOp::OpDividedCylinder, "DIVIDEDCYLINDER" );
1100   //createGeomAction( GEOMOp::OpSmoothingSurface, "SMOOTHINGSURFACE" );
1101   //@@ 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 @@//
1102
1103   // ---- create menus --------------------------
1104
1105   int fileId = createMenu( tr( "MEN_FILE" ), -1, -1 );
1106
1107   int editId = createMenu( tr( "MEN_EDIT" ), -1, -1 );
1108   createMenu( GEOMOp::OpDelete, editId, -1 );
1109
1110   int newEntId = createMenu( tr( "MEN_NEW_ENTITY" ), -1, -1, 10 );
1111
1112   int basicId = createMenu( tr( "MEN_BASIC" ), newEntId, -1 );
1113   createMenu( GEOMOp::OpPoint,   basicId, -1 );
1114   createMenu( GEOMOp::OpLine,    basicId, -1 );
1115   createMenu( GEOMOp::OpCircle,  basicId, -1 );
1116   createMenu( GEOMOp::OpEllipse, basicId, -1 );
1117   createMenu( GEOMOp::OpArc,     basicId, -1 );
1118   createMenu( GEOMOp::OpCurve,   basicId, -1 );
1119   createMenu( GEOMOp::Op2dSketcher, basicId, -1 );
1120   createMenu( GEOMOp::Op3dSketcher, basicId, -1 );
1121   createMenu( GEOMOp::OpIsoline, basicId, -1 );
1122   createMenu( separator(),       basicId, -1 );
1123   createMenu( GEOMOp::OpVector,  basicId, -1 );
1124   createMenu( GEOMOp::OpPlane,   basicId, -1 );
1125   createMenu( GEOMOp::OpLCS,     basicId, -1 );
1126   createMenu( GEOMOp::OpOriginAndVectors, basicId, -1 );
1127
1128   int primId = createMenu( tr( "MEN_PRIMITIVES" ), newEntId, -1 );
1129   createMenu( GEOMOp::OpBox,       primId, -1 );
1130   createMenu( GEOMOp::OpCylinder,  primId, -1 );
1131   createMenu( GEOMOp::OpSphere,    primId, -1 );
1132   createMenu( GEOMOp::OpTorus,     primId, -1 );
1133   createMenu( GEOMOp::OpCone,      primId, -1 );
1134   createMenu( GEOMOp::OpRectangle, primId, -1 );
1135   createMenu( GEOMOp::OpDisk,      primId, -1 );
1136   //createMenu( GEOMOp::OpPipeTShape,primId, -1 );
1137
1138   int genId = createMenu( tr( "MEN_GENERATION" ), newEntId, -1 );
1139   createMenu( GEOMOp::OpPrism,      genId, -1 );
1140   createMenu( GEOMOp::OpRevolution, genId, -1 );
1141   createMenu( GEOMOp::OpFilling,    genId, -1 );
1142   createMenu( GEOMOp::OpPipe,       genId, -1 );
1143 #if OCC_VERSION_LARGE > 0x06050300
1144   createMenu( GEOMOp::OpPipePath,   genId, -1 );
1145 #endif
1146
1147   //int advId = createMenu( tr( "MEN_ADVANCED" ), newEntId, -1 );
1148   //createMenu( GEOMOp::OpSmoothingSurface, advId, -1 );
1149   //@@ 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 @@//
1150
1151   createMenu( separator(), newEntId, -1 );
1152
1153   int groupId = createMenu( tr( "MEN_GROUP" ), newEntId, -1 );
1154   createMenu( GEOMOp::OpGroupCreate,    groupId, -1 );
1155   createMenu( GEOMOp::OpGroupEdit,      groupId, -1 );
1156   createMenu( GEOMOp::OpGroupUnion,     groupId, -1 );
1157   createMenu( GEOMOp::OpGroupIntersect, groupId, -1 );
1158   createMenu( GEOMOp::OpGroupCut,       groupId, -1 );
1159
1160   createMenu( separator(), newEntId, -1 );
1161
1162   int fieldId = createMenu( tr( "MEN_FIELD" ), newEntId, -1 );
1163   createMenu( GEOMOp::OpCreateField,    fieldId, -1 );
1164   createMenu( GEOMOp::OpEditField,      fieldId, -1 );
1165
1166   createMenu( separator(), newEntId, -1 );
1167
1168   int blocksId = createMenu( tr( "MEN_BLOCKS" ), newEntId, -1 );
1169   createMenu( GEOMOp::OpQuadFace,        blocksId, -1 );
1170   createMenu( GEOMOp::OpHexaSolid,       blocksId, -1 );
1171   //createMenu( GEOMOp::OpDividedDisk,     blocksId, -1 );
1172   //createMenu( GEOMOp::OpDividedCylinder, blocksId, -1 );
1173
1174   createMenu( separator(),          newEntId, -1 );
1175
1176   createMenu( GEOMOp::OpExplode,    newEntId, -1 );
1177
1178   int buildId = createMenu( tr( "MEN_BUILD" ), newEntId, -1 );
1179   createMenu( GEOMOp::OpEdge,     buildId, -1 );
1180   createMenu( GEOMOp::OpWire,     buildId, -1 );
1181   createMenu( GEOMOp::OpFace,     buildId, -1 );
1182   createMenu( GEOMOp::OpShell,    buildId, -1 );
1183   createMenu( GEOMOp::OpSolid,    buildId, -1 );
1184   createMenu( GEOMOp::OpCompound, buildId, -1 );
1185
1186   createMenu( separator(),          newEntId, -1 );
1187
1188   createMenu( GEOMOp::OpPictureImport, newEntId, -1 );
1189 #ifdef WITH_OPENCV
1190   createMenu( GEOMOp::OpFeatureDetect, newEntId, -1 );
1191 #endif
1192
1193   int operId = createMenu( tr( "MEN_OPERATIONS" ), -1, -1, 10 );
1194
1195   int boolId = createMenu( tr( "MEN_BOOLEAN" ), operId, -1 );
1196   createMenu( GEOMOp::OpFuse,    boolId, -1 );
1197   createMenu( GEOMOp::OpCommon,  boolId, -1 );
1198   createMenu( GEOMOp::OpCut,     boolId, -1 );
1199   createMenu( GEOMOp::OpSection, boolId, -1 );
1200
1201   int transId = createMenu( tr( "MEN_TRANSFORMATION" ), operId, -1 );
1202   createMenu( GEOMOp::OpTranslate,      transId, -1 );
1203   createMenu( GEOMOp::OpRotate,         transId, -1 );
1204   createMenu( GEOMOp::OpChangeLoc,      transId, -1 );
1205   createMenu( GEOMOp::OpMirror,         transId, -1 );
1206   createMenu( GEOMOp::OpScale,          transId, -1 );
1207   createMenu( GEOMOp::OpOffset,         transId, -1 );
1208   createMenu( GEOMOp::OpProjection,     transId, -1 );
1209   createMenu( separator(),              transId, -1 );
1210   createMenu( GEOMOp::OpMultiTranslate, transId, -1 );
1211   createMenu( GEOMOp::OpMultiRotate,    transId, -1 );
1212
1213   int blockId = createMenu( tr( "MEN_BLOCKS" ), operId, -1 );
1214   createMenu( GEOMOp::OpMultiTransform, blockId, -1 );
1215   createMenu( GEOMOp::OpExplodeBlock,   blockId, -1 );
1216   createMenu( GEOMOp::OpPropagate,      blockId, -1 );
1217
1218   createMenu( separator(), operId, -1 );
1219
1220   createMenu( GEOMOp::OpPartition,     operId, -1 );
1221   createMenu( GEOMOp::OpArchimede,     operId, -1 );
1222   createMenu( GEOMOp::OpShapesOnShape, operId, -1 );
1223   createMenu( GEOMOp::OpSharedShapes,  operId, -1 );
1224
1225   createMenu( separator(), operId, -1 );
1226
1227   createMenu( GEOMOp::OpFillet1d,      operId, -1 );
1228   createMenu( GEOMOp::OpFillet2d,      operId, -1 );
1229   createMenu( GEOMOp::OpFillet3d,      operId, -1 );
1230   createMenu( GEOMOp::OpChamfer,       operId, -1 );
1231   createMenu( GEOMOp::OpExtrudedBoss,  operId, -1 );
1232   createMenu( GEOMOp::OpExtrudedCut,   operId, -1 );
1233 #ifdef DEBUG_CURVE_CREATOR
1234   // for debug purposes, to be removed
1235   createMenu( separator(), operId, -1 );
1236   createMenu( GEOMOp::OpCurveCreator,   operId, -1 );
1237 #endif
1238   //createMenu( GEOMOp::OpClipping,      operId, -1 );
1239
1240   int repairId = createMenu( tr( "MEN_REPAIR" ), -1, -1, 10 );
1241   createMenu( GEOMOp::OpShapeProcess,    repairId, -1 );
1242   createMenu( GEOMOp::OpSuppressFaces,   repairId, -1 );
1243   createMenu( GEOMOp::OpCloseContour,    repairId, -1 );
1244   createMenu( GEOMOp::OpRemoveIntWires,  repairId, -1 );
1245   createMenu( GEOMOp::OpSuppressHoles,   repairId, -1 );
1246   createMenu( GEOMOp::OpSewing,          repairId, -1 );
1247   createMenu( GEOMOp::OpGlueFaces,       repairId, -1 );
1248   createMenu( GEOMOp::OpGlueEdges,       repairId, -1 );
1249   createMenu( GEOMOp::OpLimitTolerance,  repairId, -1 );
1250   createMenu( GEOMOp::OpAddPointOnEdge,  repairId, -1 );
1251   //createMenu( GEOMOp::OpFreeBoundaries,  repairId, -1 );
1252   //createMenu( GEOMOp::OpFreeFaces,       repairId, -1 );
1253   createMenu( GEOMOp::OpOrientation,      repairId, -1 );
1254   createMenu( GEOMOp::OpRemoveWebs,       repairId, -1 );
1255   createMenu( GEOMOp::OpRemoveExtraEdges, repairId, -1 );
1256   createMenu( GEOMOp::OpFuseEdges,        repairId, -1 );
1257   createMenu( GEOMOp::OpUnionFaces,       repairId, -1 );
1258
1259   int measurId = createMenu( tr( "MEN_MEASURES" ), -1, -1, 10 );
1260   createMenu( GEOMOp::OpPointCoordinates, measurId, -1 );
1261   createMenu( GEOMOp::OpProperties,       measurId, -1 );
1262   createMenu( separator(),                measurId, -1 );
1263   createMenu( GEOMOp::OpCenterMass,       measurId, -1 );
1264   createMenu( GEOMOp::OpInertia,          measurId, -1 );
1265   createMenu( GEOMOp::OpNormale,          measurId, -1 );
1266   createMenu( separator(),                measurId, -1 );
1267   createMenu( GEOMOp::OpFreeBoundaries,   measurId, -1 );
1268   createMenu( GEOMOp::OpFreeFaces,        measurId, -1 );
1269   createMenu( separator(),                measurId, -1 );
1270
1271   int dimId = createMenu( tr( "MEN_DIMENSIONS" ), measurId, -1 );
1272   createMenu( GEOMOp::OpBoundingBox,      dimId, -1 );
1273   createMenu( GEOMOp::OpMinDistance,      dimId, -1 );
1274   createMenu( GEOMOp::OpAngle,            dimId, -1 );
1275   createMenu( GEOMOp::OpManageDimensions, dimId, -1 );
1276
1277   createMenu( separator(),               measurId, -1 );
1278   createMenu( GEOMOp::OpTolerance,       measurId, -1 );
1279   createMenu( separator(),               measurId, -1 );
1280   createMenu( GEOMOp::OpWhatIs,          measurId, -1 );
1281   createMenu( GEOMOp::OpCheckShape,      measurId, -1 );
1282   createMenu( GEOMOp::OpCheckCompound,   measurId, -1 );
1283   createMenu( GEOMOp::OpGetNonBlocks,    measurId, -1 );
1284   createMenu( GEOMOp::OpCheckSelfInters, measurId, -1 );
1285
1286   int toolsId = createMenu( tr( "MEN_TOOLS" ), -1, -1, 50 );
1287 #if defined(_DEBUG_) || defined(_DEBUG) // PAL16821
1288   createMenu( separator(),         toolsId, -1 );
1289   createMenu( GEOMOp::OpCheckGeom, toolsId, -1 );
1290 #endif
1291
1292   createMenu( separator(),         toolsId, -1 );
1293   createMenu( GEOMOp::OpMaterialsLibrary, toolsId, -1 );
1294   createMenu( separator(),         toolsId, -1 );
1295
1296   int viewId = createMenu( tr( "MEN_VIEW" ), -1, -1 );
1297   createMenu( separator(),       viewId, -1 );
1298
1299   int dispmodeId = createMenu( tr( "MEN_DISPLAY_MODE" ), viewId, -1 );
1300   createMenu( GEOMOp::OpDMWireframe,        dispmodeId, -1 );
1301   createMenu( GEOMOp::OpDMShading,          dispmodeId, -1 );
1302   createMenu( GEOMOp::OpDMShadingWithEdges, dispmodeId, -1 );
1303   createMenu( GEOMOp::OpDMTexture,          dispmodeId, -1 );
1304   createMenu( separator(),                  dispmodeId, -1 );
1305   createMenu( GEOMOp::OpSwitchVectors,      dispmodeId, -1 );
1306   createMenu( GEOMOp::OpSwitchVertices,     dispmodeId, -1 );
1307
1308   createMenu( separator(),       viewId, -1 );
1309   createMenu( GEOMOp::OpShowAll, viewId, -1 );
1310   createMenu( GEOMOp::OpHideAll, viewId, -1 );
1311   createMenu( separator(),       viewId, -1 );
1312   createMenu( GEOMOp::OpPublishObject, viewId, -1 );
1313   createMenu( separator(),       viewId, -1 );
1314
1315 /*
1316   PAL9111:
1317   because of these items are accessible through object browser and viewers
1318   we have removed they from main menu
1319
1320   createMenu( GEOMOp::OpShow, viewId, -1 );
1321   createMenu( GEOMOp::OpShowOnly, viewId, -1 );
1322   createMenu( GEOMOp::OpHide, viewId, -1 );
1323 */
1324
1325   // ---- create toolbars --------------------------
1326
1327   int basicTbId = createTool( tr( "TOOL_BASIC" ), QString( "GEOMBasic" ) );
1328   createTool( GEOMOp::OpPoint,      basicTbId );
1329   createTool( GEOMOp::OpLine,       basicTbId );
1330   createTool( GEOMOp::OpCircle,     basicTbId );
1331   createTool( GEOMOp::OpEllipse,    basicTbId );
1332   createTool( GEOMOp::OpArc,        basicTbId );
1333   createTool( GEOMOp::OpCurve,      basicTbId );
1334   createTool( GEOMOp::OpVector,     basicTbId );
1335   createTool( GEOMOp::Op2dSketcher, basicTbId ); //rnc
1336   createTool( GEOMOp::Op3dSketcher, basicTbId ); //rnc
1337   createTool( GEOMOp::OpIsoline,    basicTbId );
1338   createTool( GEOMOp::OpPlane,      basicTbId );
1339   createTool( GEOMOp::OpLCS,        basicTbId );
1340   createTool( GEOMOp::OpOriginAndVectors, basicTbId );
1341
1342 //   int sketchTbId = createTool( tr( "TOOL_SKETCH" ), QString( "GEOMSketch" ) );
1343 //   createTool( GEOMOp::Op2dSketcher,  sketchTbId );
1344 //   createTool( GEOMOp::Op3dSketcher,  sketchTbId );
1345
1346   int primTbId = createTool( tr( "TOOL_PRIMITIVES" ), QString( "GEOMPrimitives" ) );
1347   createTool( GEOMOp::OpBox,        primTbId );
1348   createTool( GEOMOp::OpCylinder,   primTbId );
1349   createTool( GEOMOp::OpSphere,     primTbId );
1350   createTool( GEOMOp::OpTorus,      primTbId );
1351   createTool( GEOMOp::OpCone,       primTbId );
1352   createTool( GEOMOp::OpRectangle,  primTbId );
1353   createTool( GEOMOp::OpDisk,       primTbId );
1354   //createTool( GEOMOp::OpPipeTShape, primTbId ); //rnc
1355
1356   //int blocksTbId = createTool( tr( "TOOL_BLOCKS" ), QString( "GEOMBlocks" ) );
1357   //createTool( GEOMOp::OpDividedDisk, blocksTbId );
1358   //createTool( GEOMOp::OpDividedCylinder, blocksTbId );
1359
1360   int boolTbId = createTool( tr( "TOOL_BOOLEAN" ), QString( "GEOMBooleanOperations" ) );
1361   createTool( GEOMOp::OpFuse,       boolTbId );
1362   createTool( GEOMOp::OpCommon,     boolTbId );
1363   createTool( GEOMOp::OpCut,        boolTbId );
1364   createTool( GEOMOp::OpSection,    boolTbId );
1365
1366   int genTbId = createTool( tr( "TOOL_GENERATION" ), QString( "GEOMGeneration" ) );
1367   createTool( GEOMOp::OpPrism,      genTbId );
1368   createTool( GEOMOp::OpRevolution, genTbId );
1369   createTool( GEOMOp::OpFilling,    genTbId );
1370   createTool( GEOMOp::OpPipe,       genTbId );
1371 #if OCC_VERSION_LARGE > 0x06050300
1372   createTool( GEOMOp::OpPipePath,   genTbId );
1373 #endif
1374
1375   int transTbId = createTool( tr( "TOOL_TRANSFORMATION" ), QString( "GEOMTransformation" ) );
1376   createTool( GEOMOp::OpTranslate,      transTbId );
1377   createTool( GEOMOp::OpRotate,         transTbId );
1378   createTool( GEOMOp::OpChangeLoc,      transTbId );
1379   createTool( GEOMOp::OpMirror,         transTbId );
1380   createTool( GEOMOp::OpScale,          transTbId );
1381   createTool( GEOMOp::OpOffset,         transTbId );
1382   createTool( GEOMOp::OpProjection,     transTbId );
1383   createTool( separator(),              transTbId );
1384   createTool( GEOMOp::OpMultiTranslate, transTbId );
1385   createTool( GEOMOp::OpMultiRotate,    transTbId );
1386
1387   int operTbId = createTool( tr( "TOOL_OPERATIONS" ), QString( "GEOMOperations" ) );
1388   createTool( GEOMOp::OpExplode,         operTbId );
1389   createTool( GEOMOp::OpPartition,       operTbId );
1390   createTool( GEOMOp::OpArchimede,       operTbId );
1391   createTool( GEOMOp::OpShapesOnShape,   operTbId );
1392   createTool( GEOMOp::OpSharedShapes,    operTbId );
1393
1394   int featTbId = createTool( tr( "TOOL_FEATURES" ), QString( "GEOMModification" ) );
1395   createTool( GEOMOp::OpFillet1d,        featTbId );
1396   createTool( GEOMOp::OpFillet2d,        featTbId );
1397   createTool( GEOMOp::OpFillet3d,        featTbId );
1398   createTool( GEOMOp::OpChamfer,         featTbId );
1399   createTool( GEOMOp::OpExtrudedBoss,    featTbId );
1400   createTool( GEOMOp::OpExtrudedCut,     featTbId );
1401 #ifdef DEBUG_CURVE_CREATOR
1402   // for debug purposes, to be removed
1403   createTool( GEOMOp::OpCurveCreator,    featTbId ); 
1404 #endif
1405
1406   int buildTbId = createTool( tr( "TOOL_BUILD" ), QString( "GEOMBuild" ) );
1407   createTool( GEOMOp::OpEdge,     buildTbId );
1408   createTool( GEOMOp::OpWire,     buildTbId );
1409   createTool( GEOMOp::OpFace,     buildTbId );
1410   createTool( GEOMOp::OpShell,    buildTbId );
1411   createTool( GEOMOp::OpSolid,    buildTbId );
1412   createTool( GEOMOp::OpCompound, buildTbId );
1413
1414   int measureTbId = createTool( tr( "TOOL_MEASURES" ), QString( "GEOMMeasures" ) );
1415   createTool( GEOMOp::OpPointCoordinates, measureTbId );
1416   createTool( GEOMOp::OpProperties,       measureTbId );
1417   createTool( GEOMOp::OpCenterMass,       measureTbId );
1418   createTool( GEOMOp::OpInertia,          measureTbId );
1419   createTool( GEOMOp::OpNormale,          measureTbId );
1420   createTool( separator(),                measureTbId );
1421   createTool( GEOMOp::OpBoundingBox,      measureTbId );
1422   createTool( GEOMOp::OpMinDistance,      measureTbId );
1423   createTool( GEOMOp::OpAngle,            measureTbId );
1424   createTool( GEOMOp::OpTolerance  ,      measureTbId );
1425   createTool( separator(),                measureTbId );
1426   createTool( GEOMOp::OpFreeBoundaries,   measureTbId );
1427   createTool( GEOMOp::OpFreeFaces,        measureTbId );
1428   createTool( separator(),                measureTbId );
1429   createTool( GEOMOp::OpWhatIs,           measureTbId );
1430   createTool( GEOMOp::OpCheckShape,       measureTbId );
1431   createTool( GEOMOp::OpCheckCompound,    measureTbId );
1432   createTool( GEOMOp::OpGetNonBlocks,     measureTbId );
1433   createTool( GEOMOp::OpCheckSelfInters,  measureTbId );
1434
1435   int picturesTbId = createTool( tr( "TOOL_PICTURES" ), QString( "GEOMPictures" ) );
1436   createTool( GEOMOp::OpPictureImport,    picturesTbId );
1437 #ifdef WITH_OPENCV
1438   createTool( GEOMOp::OpFeatureDetect,  picturesTbId );
1439 #endif
1440
1441   //int advancedTbId = createTool( tr( "TOOL_ADVANCED" ) );
1442   //createTool( GEOMOp::OpSmoothingSurface, advancedTbId );
1443   //@@ 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 @@//
1444
1445   // ---- create popup menus --------------------------
1446
1447   QString clientOCCorVTK = "(client='OCCViewer' or client='VTKViewer')";
1448   QString clientOCC = "(client='OCCViewer')";
1449   QString clientOCCorVTK_AndSomeVisible = clientOCCorVTK + " and selcount>0 and isVisible";
1450   QString clientOCC_AndSomeVisible = clientOCC + " and selcount>0 and isVisible";
1451
1452   QString clientOCCorOB = "(client='ObjectBrowser' or client='OCCViewer')";
1453   QString clientOCCorVTKorOB = "(client='ObjectBrowser' or client='OCCViewer' or client='VTKViewer')";
1454   QString clientOCCorVTKorOB_AndSomeVisible = clientOCCorVTKorOB + " and selcount>0 and isVisible";
1455   QString clientOCCorOB_AndSomeVisible = clientOCCorOB + " and selcount>0 and isVisible";
1456
1457   QString autoColorPrefix =
1458     "(client='ObjectBrowser' or client='OCCViewer') and type='Shape' and selcount=1 and isOCC=true";
1459
1460   QtxPopupMgr* mgr = popupMgr();
1461
1462   mgr->insert( action(  GEOMOp::OpDelete ), -1, -1 );  // delete
1463   mgr->setRule( action( GEOMOp::OpDelete ), QString("$type in {'Shape' 'Group' 'Folder' 'Field' 'FieldStep'} and selcount>0"), QtxPopupMgr::VisibleRule );
1464   mgr->insert( action(  GEOMOp::OpGroupCreatePopup ), -1, -1 ); // create group
1465   mgr->setRule( action( GEOMOp::OpGroupCreatePopup ), QString("type='Shape' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1466   mgr->insert( action(  GEOMOp::OpEditFieldPopup ), -1, -1 ); // edit field
1467   mgr->setRule( action( GEOMOp::OpEditFieldPopup ), QString("(type='Field' or type='FieldStep') and isOCC=true"), QtxPopupMgr::VisibleRule );
1468   mgr->insert( action(  GEOMOp::OpDiscloseChildren ), -1, -1 ); // disclose child items
1469   mgr->setRule( action( GEOMOp::OpDiscloseChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasConcealedChildren=true"), QtxPopupMgr::VisibleRule );
1470
1471   mgr->insert( action(  GEOMOp::OpConcealChildren ), -1, -1 ); // conceal child items
1472   mgr->setRule( action( GEOMOp::OpConcealChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasDisclosedChildren=true"), QtxPopupMgr::VisibleRule );
1473   mgr->insert( action(  GEOMOp::OpGroupEdit ), -1, -1 );  // edit group
1474   mgr->setRule( action( GEOMOp::OpGroupEdit ),  QString("client='ObjectBrowser' and type='Group' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1475   mgr->insert( separator(), -1, -1 );     // -----------
1476
1477 #if OCC_VERSION_LARGE > 0x06050200
1478   //QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and (selcount>0) and isOCC=true and topLevel=false";
1479   QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and isFolder=false and (selcount>0) and isOCC=true";
1480   mgr->insert( action(GEOMOp::OpBringToFront ), -1, -1 ); // bring to front
1481   mgr->setRule(action(GEOMOp::OpBringToFront), bringRule + " and autoBringToFront = false", QtxPopupMgr::VisibleRule );
1482   mgr->setRule(action(GEOMOp::OpBringToFront), "topLevel=true", QtxPopupMgr::ToggleRule );
1483   mgr->insert( action(GEOMOp::OpClsBringToFront ), -1, -1 ); // clear bring to front
1484   mgr->setRule( action(GEOMOp::OpClsBringToFront ), clientOCC + " and autoBringToFront = false", QtxPopupMgr::VisibleRule );
1485 #endif
1486   mgr->insert( separator(), -1, -1 );     // -----------
1487   dispmodeId = mgr->insert(  tr( "MEN_DISPLAY_MODE" ), -1, -1 ); // display mode menu
1488   mgr->insert( action(  GEOMOp::OpWireframe ), dispmodeId, -1 ); // wireframe
1489   mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1490   mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK + " and displaymode='Wireframe'", QtxPopupMgr::ToggleRule );
1491   mgr->insert( action(  GEOMOp::OpShading ), dispmodeId, -1 ); // shading
1492   mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1493   mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK + " and displaymode='Shading'", QtxPopupMgr::ToggleRule );
1494   mgr->insert( action(  GEOMOp::OpShadingWithEdges ), dispmodeId, -1 ); // shading with edges
1495   mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1496   mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK + " and displaymode='ShadingWithEdges'", QtxPopupMgr::ToggleRule );
1497   mgr->insert( action(  GEOMOp::OpTexture ), dispmodeId, -1 ); // wireframe
1498   mgr->setRule( action( GEOMOp::OpTexture ), clientOCC_AndSomeVisible, QtxPopupMgr::VisibleRule );
1499   mgr->setRule( action( GEOMOp::OpTexture), clientOCC + " and displaymode='Texture'", QtxPopupMgr::ToggleRule );
1500   mgr->insert( separator(), dispmodeId, -1 );
1501   mgr->insert( action(  GEOMOp::OpVectors ), dispmodeId, -1 ); // vectors
1502   mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK_AndSomeVisible  + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1503   mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK + " and isVectorsMode", QtxPopupMgr::ToggleRule );
1504   mgr->insert( action(  GEOMOp::OpVertices ), dispmodeId, -1 ); // vertices
1505   mgr->setRule( action( GEOMOp::OpVertices ), clientOCCorVTK_AndSomeVisible  + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1506   mgr->setRule( action( GEOMOp::OpVertices ), clientOCCorVTK + " and isVerticesMode", QtxPopupMgr::ToggleRule );
1507   mgr->insert( separator(), -1, -1 );     // -----------
1508
1509   mgr->insert( action(  GEOMOp::OpColor ), -1, -1 ); // color
1510   mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})" + "and isPhysicalMaterial=false", QtxPopupMgr::VisibleRule );
1511   mgr->insert( action(  GEOMOp::OpTransparency ), -1, -1 ); // transparency
1512   mgr->setRule( action( GEOMOp::OpTransparency ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1513   mgr->insert( action(  GEOMOp::OpIsos ), -1, -1 ); // isos
1514   mgr->setRule( action( GEOMOp::OpIsos ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1515   mgr->insert( action(  GEOMOp::OpDeflection ), -1, -1 ); // deflection
1516   mgr->setRule( action( GEOMOp::OpDeflection ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1517   mgr->insert( action(  GEOMOp::OpPointMarker ), -1, -1 ); // point marker
1518   mgr->setRule( action( GEOMOp::OpPointMarker ), clientOCCorOB + " and $type in {'Shape' 'Group' 'Field' 'FieldStep'} and selcount>0 and isOCC=true", QtxPopupMgr::VisibleRule );
1519
1520   // material properties
1521   mgr->insert( action(  GEOMOp::OpMaterialProperties ), -1, -1 );
1522   mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1523
1524  // texture
1525   mgr->insert( action(  GEOMOp::OpSetTexture ), -1, -1 );
1526   mgr->setRule( action( GEOMOp::OpSetTexture ), clientOCCorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1527
1528   int lineW = mgr->insert(  tr( "MEN_LINE_WIDTH" ), -1, -1 ); // line width menu
1529   mgr->insert( action(  GEOMOp::OpEdgeWidth ), lineW, -1 ); // edge width
1530   mgr->setRule( action( GEOMOp::OpEdgeWidth ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1531
1532   mgr->insert( action(  GEOMOp::OpIsosWidth ), lineW, -1 ); // isos width
1533   mgr->setRule( action( GEOMOp::OpIsosWidth ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1534
1535   mgr->insert( separator(), -1, -1 );     // -----------
1536   mgr->insert( action(  GEOMOp::OpAutoColor ), -1, -1 ); // auto color
1537   mgr->setRule( action( GEOMOp::OpAutoColor ), autoColorPrefix + " and isAutoColor=false", QtxPopupMgr::VisibleRule );
1538   mgr->insert( action(  GEOMOp::OpNoAutoColor ), -1, -1 ); // disable auto color
1539   mgr->setRule( action( GEOMOp::OpNoAutoColor ), autoColorPrefix + " and isAutoColor=true", QtxPopupMgr::VisibleRule );
1540   mgr->insert( separator(), -1, -1 );     // -----------
1541
1542   QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ",
1543           onlyComponent = "((type='Component') and selcount=1)",
1544           rule = canDisplay + "and ((($type in {%1}) and( %2 )) or " + onlyComponent + ")",
1545           types = "'Shape' 'Group' 'FieldStep'";
1546
1547   mgr->insert( action(  GEOMOp::OpShow ), -1, -1 ); // display
1548   mgr->setRule( action( GEOMOp::OpShow ), rule.arg( types ).arg( "not isVisible" ), QtxPopupMgr::VisibleRule );
1549
1550   mgr->insert( action(  GEOMOp::OpHide ), -1, -1 ); // erase
1551   mgr->setRule( action( GEOMOp::OpHide ), rule.arg( types ).arg( "isVisible" ), QtxPopupMgr::VisibleRule );
1552
1553   mgr->insert( action(  GEOMOp::OpHideAll ), -1, -1 ); // erase All
1554   mgr->setRule( action( GEOMOp::OpHideAll ), clientOCCorVTK, QtxPopupMgr::VisibleRule );
1555
1556   QString selectOnly = "(client='OCCViewer' or client='VTKViewer') and (selcount=0)";
1557
1558   int selectonlyId = mgr->insert( tr("MEN_SELECT_ONLY"), -1, -1);                //select only menu
1559   mgr->insert( action(GEOMOp::OpSelectVertex),   selectonlyId, -1);                                  //Vertex
1560   mgr->setRule(action(GEOMOp::OpSelectVertex),   selectOnly, QtxPopupMgr::VisibleRule);
1561   mgr->setRule(action(GEOMOp::OpSelectVertex),   selectOnly + " and selectionmode='VERTEX'", QtxPopupMgr::ToggleRule);
1562   mgr->insert( action(GEOMOp::OpSelectEdge),     selectonlyId, -1);                                  //Edge
1563   mgr->setRule(action(GEOMOp::OpSelectEdge),     selectOnly, QtxPopupMgr::VisibleRule);
1564   mgr->setRule(action(GEOMOp::OpSelectEdge),     selectOnly + " and selectionmode='EDGE'", QtxPopupMgr::ToggleRule);
1565   mgr->insert( action(GEOMOp::OpSelectWire),     selectonlyId, -1);                                  //Wire
1566   mgr->setRule(action(GEOMOp::OpSelectWire),     selectOnly, QtxPopupMgr::VisibleRule);
1567   mgr->setRule(action(GEOMOp::OpSelectWire),     selectOnly + " and selectionmode='WIRE'", QtxPopupMgr::ToggleRule);
1568   mgr->insert( action(GEOMOp::OpSelectFace),     selectonlyId, -1);                                  //Face
1569   mgr->setRule(action(GEOMOp::OpSelectFace),     selectOnly, QtxPopupMgr::VisibleRule);
1570   mgr->setRule(action(GEOMOp::OpSelectFace),     selectOnly + " and selectionmode='FACE'", QtxPopupMgr::ToggleRule);
1571   mgr->insert( action(GEOMOp::OpSelectShell),    selectonlyId, -1);                                  //Shell
1572   mgr->setRule(action(GEOMOp::OpSelectShell),    selectOnly, QtxPopupMgr::VisibleRule);
1573   mgr->setRule(action(GEOMOp::OpSelectShell),    selectOnly + " and selectionmode='SHELL'", QtxPopupMgr::ToggleRule);
1574   mgr->insert( action(GEOMOp::OpSelectSolid),    selectonlyId, -1);                                  //Solid
1575   mgr->setRule(action(GEOMOp::OpSelectSolid),    selectOnly, QtxPopupMgr::VisibleRule);
1576   mgr->setRule(action(GEOMOp::OpSelectSolid),    selectOnly + " and selectionmode='SOLID'", QtxPopupMgr::ToggleRule);
1577   mgr->insert( action(GEOMOp::OpSelectCompound), selectonlyId, -1);                                  //Compound
1578   mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly, QtxPopupMgr::VisibleRule);
1579   mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly + " and selectionmode='COMPOUND'", QtxPopupMgr::ToggleRule);
1580   mgr->insert( separator(), selectonlyId, -1);
1581   mgr->insert( action(GEOMOp::OpSelectAll),      selectonlyId, -1);                                  //Clear selection filter
1582   mgr->setRule(action(GEOMOp::OpSelectAll),      selectOnly, QtxPopupMgr::VisibleRule);
1583   mgr->setRule(action(GEOMOp::OpSelectAll),      selectOnly + " and selectionmode='ALL'", QtxPopupMgr::ToggleRule);
1584   mgr->insert( action(GEOMOp::OpShowOnly ), -1, -1 ); // display only
1585   mgr->setRule(action(GEOMOp::OpShowOnly ), rule.arg( types ).arg( "true" ), QtxPopupMgr::VisibleRule );
1586   mgr->insert( action(GEOMOp::OpShowOnlyChildren ), -1, -1 ); // display only children
1587   mgr->setRule(action(GEOMOp::OpShowOnlyChildren ), (canDisplay + "and ($type in {%1}) and client='ObjectBrowser' and hasChildren=true").arg( types ), QtxPopupMgr::VisibleRule );
1588
1589   QString aDimensionRule = "($component={'GEOM'}) and selcount=1 and isVisible and type='Shape' and %1";
1590
1591   mgr->insert( separator(), -1, -1 ); // -----------
1592   mgr->insert( action( GEOMOp::OpShowAllDimensions ), -1, -1 ); // show all dimensions
1593   mgr->setRule( action( GEOMOp::OpShowAllDimensions ), aDimensionRule.arg( "hasHiddenDimensions" ), QtxPopupMgr::VisibleRule );
1594   mgr->insert( action( GEOMOp::OpHideAllDimensions ), -1, -1 ); // hide all dimensions
1595   mgr->setRule( action( GEOMOp::OpHideAllDimensions ), aDimensionRule.arg( "hasVisibleDimensions" ), QtxPopupMgr::VisibleRule );
1596
1597   mgr->insert( separator(), -1, -1 );     // -----------
1598   mgr->insert( action(  GEOMOp::OpUnpublishObject ), -1, -1 ); // Unpublish object
1599   mgr->setRule( action( GEOMOp::OpUnpublishObject ), QString("client='ObjectBrowser' and $type in {'Shape' 'Group' 'Field' 'FieldStep'} and selcount>0"), QtxPopupMgr::VisibleRule );
1600
1601   mgr->insert( action(  GEOMOp::OpPublishObject ), -1, -1 ); // Publish object
1602   mgr->setRule( action( GEOMOp::OpPublishObject ), QString("client='ObjectBrowser' and isComponent=true"), QtxPopupMgr::VisibleRule );
1603
1604   mgr->insert( action(  GEOMOp::OpReimport ), -1, -1 );  // delete
1605   mgr->setRule( action( GEOMOp::OpReimport ), QString("$imported in {'true'} and selcount>0"), QtxPopupMgr::VisibleRule );
1606
1607   mgr->insert( separator(), -1, -1 );     // -----------
1608   mgr->insert( action(  GEOMOp::OpCreateFolder ), -1, -1 ); // Create Folder
1609   mgr->setRule( action( GEOMOp::OpCreateFolder ), QString("client='ObjectBrowser' and $component={'GEOM'} and (isComponent=true or isFolder=true)"), QtxPopupMgr::VisibleRule );
1610
1611   mgr->insert( separator(), -1, -1 );     // -----------
1612   mgr->insert( action(  GEOMOp::OpSortChildren ), -1, -1 ); // Sort child items
1613   mgr->setRule( action( GEOMOp::OpSortChildren ), QString("client='ObjectBrowser' and $component={'GEOM'} and nbChildren>1"), QtxPopupMgr::VisibleRule );
1614
1615   mgr->insert( separator(), -1, -1 );     // -----------
1616   mgr->insert( action(  GEOMOp::OpShowDependencyTree ), -1, -1 ); // Show dependency tree
1617   mgr->setRule( action( GEOMOp::OpShowDependencyTree ), clientOCCorVTKorOB + " and selcount>0 and ($component={'GEOM'}) and type='Shape'", QtxPopupMgr::VisibleRule );
1618
1619   mgr->insert( separator(), -1, -1 );     // -----------
1620   mgr->insert( action(  GEOMOp::OpReduceStudy ), -1, -1 ); // Reduce Study
1621   mgr->setRule( action( GEOMOp::OpReduceStudy ), clientOCCorVTKorOB + " and selcount>0 and ($component={'GEOM'}) and type='Shape'", QtxPopupMgr::VisibleRule );
1622
1623   mgr->hide( mgr->actionId( action( myEraseAll ) ) );
1624
1625   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1626   if (resMgr) {
1627     GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)resMgr->integerValue("Geometry", "toplevel_dm", 0));
1628     QColor c = resMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) );
1629     GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c));
1630   }
1631
1632   // create plugin actions and menus
1633   addPluginActions();
1634 }
1635
1636 //=======================================================================
1637 // function : GeometryGUI::addPluginActions()
1638 // purpose  :
1639 //=======================================================================
1640 void GeometryGUI::addPluginActions()
1641 {
1642   // Resource manager
1643   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1644   if (!resMgr) return;
1645
1646   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
1647   if (!appStudy) return;
1648
1649   // Find names of a resource XML files ("AdvancedGEOM.xml" and others);
1650
1651   GEOMUtils::PluginInfo plugins = GEOMUtils::ReadPluginInfo();
1652
1653   int id = GEOMOp::OpLastOperationID; // TODO?
1654
1655   // loop on plugins
1656   GEOMUtils::PluginInfo::const_iterator it;
1657   for ( it = plugins.begin(); it != plugins.end(); ++it ) {
1658     // bind action lib and label to its ID for activateOperation() method proper work
1659     GEOMUtils::PluginData pdata = (*it);
1660     myPluginLibs[pdata.name.c_str()] = pdata.clientLib.c_str();
1661     std::list<GEOMUtils::ActionData> actions = (*it).actions;
1662     std::list<GEOMUtils::ActionData>::const_iterator ait;
1663     for ( ait = actions.begin(); ait != actions.end(); ++ait ) {
1664       GEOMUtils::ActionData adata = (*ait);
1665       // icon
1666       QPixmap icon;
1667       if ( !adata.icon.empty() )
1668         icon = resMgr->loadPixmap( pdata.name.c_str(), adata.icon.c_str() );
1669       // menu text (path)
1670       QStringList smenus = QString( adata.menuText.c_str() ).split( "/" );
1671       QString actionName = smenus.last();
1672       actionName = actionName.toUpper().prepend( "MEN_" );
1673       smenus.removeLast();
1674
1675       // path to action in toolbar
1676       QStringList stools = QString( adata.toolTip.c_str() ).split( "/" );
1677       QString actionTool = stools.last();
1678       actionTool = actionTool.toUpper().prepend( "TOP_" );
1679       stools.removeLast();
1680       
1681       QString actionStat = adata.statusText.c_str();
1682       actionStat = actionStat.toUpper().prepend( "STB_" );
1683
1684       createAction( id, // ~ adata.label
1685                     tr( actionTool.toLatin1().constData() ),
1686                     icon,
1687                     tr( actionName.toLatin1().constData() ),
1688                     tr( actionStat.toLatin1().constData() ),
1689                     QKeySequence( tr( adata.accel.c_str() ) ),
1690                     application()->desktop(),
1691                     false /*toggle*/,
1692                     this, SLOT( OnGUIEvent() ),
1693                     QString() /*shortcutAction*/ );
1694       
1695       int menuId = -1;
1696       foreach ( QString subMenu, smenus ) {
1697         QStringList subMenuList = subMenu.split( ":" );
1698         QString subMenuName = subMenuList[0].toUpper().prepend( "MEN_" );
1699         int subMenuGroup = subMenuList.size() > 1 ? subMenuList[1].toInt() : -1;
1700         menuId = createMenu( tr( subMenuName.toLatin1().constData() ), menuId, -1, subMenuGroup );
1701       }
1702       createMenu( id, menuId, -1 );
1703       
1704       if ( !stools.isEmpty() ) {
1705         QString subTool = stools[0];
1706         subTool = subTool.toUpper().prepend( "TOOL_" );
1707         int toolId = createTool( tr( subTool.toLatin1().constData() ) );
1708         createTool(id, toolId);
1709       }
1710
1711       // add action id to map
1712       PluginAction anAction( pdata.clientLib.c_str(), adata.label.c_str() );
1713       myPluginActions[id] = anAction;
1714       
1715       id++;
1716     }
1717   }
1718 }
1719
1720 //=======================================================================
1721 // function : GeometryGUI::activateModule()
1722 // purpose  : Called when GEOM module is activated
1723 //=======================================================================
1724 bool GeometryGUI::activateModule( SUIT_Study* study )
1725 {
1726   if ( CORBA::is_nil( myComponentGeom ) )
1727     return false;
1728
1729   bool res = SalomeApp_Module::activateModule( study );
1730
1731   if ( !res )
1732     return false;
1733   setMenuShown( true );
1734   setToolShown( true );
1735
1736   // import Python module that manages GEOM plugins (need to be here because SalomePyQt API uses active module)
1737   PyGILState_STATE gstate = PyGILState_Ensure();
1738   PyObjWrapper pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
1739   if ( !pluginsmanager ) {
1740     PyErr_Print();
1741   }
1742   else {
1743     PyObjWrapper result =
1744       PyObject_CallMethod(pluginsmanager, (char*)"initialize", (char*)"isss", 1, "geom",
1745                           tr("MEN_NEW_ENTITY").toStdString().c_str(),
1746                           tr("GEOM_PLUGINS_OTHER").toStdString().c_str());
1747     if ( !result )
1748       PyErr_Print();
1749   }
1750   PyGILState_Release(gstate);
1751   // end of GEOM plugins loading
1752
1753   connect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1754           this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1755
1756   // Reset actions accelerator keys
1757   action(GEOMOp::OpDelete)->setEnabled( true ); // Delete: Key_Delete
1758
1759   GUIMap::Iterator it;
1760   for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1761     it.value()->activate( application()->desktop() );
1762
1763   LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1764
1765   connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
1766   connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( onAutoBringToFront() ));
1767   connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
1768
1769   if ( !myCreationInfoWdg )
1770     myCreationInfoWdg = new GEOMGUI_CreationInfoWdg( getApp() );
1771   getApp()->insertDockWindow( myCreationInfoWdg->getWinID(), myCreationInfoWdg );
1772   getApp()->placeDockWindow( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
1773
1774   //NPAL 19674
1775   SALOME_ListIO selected;
1776   sm->selectedObjects( selected );
1777   sm->clearSelected();
1778
1779   SUIT_ViewManager* vm;
1780   ViewManagerList OCCViewManagers, VTKViewManagers;
1781
1782   application()->viewManagers( OCCViewer_Viewer::Type(), OCCViewManagers );
1783   QListIterator<SUIT_ViewManager*> itOCC( OCCViewManagers );
1784   while ( itOCC.hasNext() && (vm = itOCC.next()) )
1785     onViewManagerAdded(vm);
1786
1787   application()->viewManagers( SVTK_Viewer::Type(), VTKViewManagers );
1788   QListIterator<SUIT_ViewManager*> itVTK( VTKViewManagers );
1789   while ( itVTK.hasNext() && (vm = itVTK.next()) )
1790     onViewManagerAdded(vm);
1791
1792   sm->setSelectedObjects( selected, true );   //NPAL 19674
1793
1794   QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1795   if ( viewMenu )
1796     connect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1797
1798   // 0020836 (Basic vectors and origin)
1799   SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
1800   if ( aResourceMgr->booleanValue( "Geometry", "auto_create_base_objects", false ) ) {
1801     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
1802     if ( appStudy ) {
1803       _PTR(Study) studyDS = appStudy->studyDS();
1804       if ( studyDS ) {
1805         _PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
1806         if ( !aSComponent ) // create objects automatically only if there is no GEOM component
1807           createOriginAndBaseVectors();
1808       }
1809     }
1810   }
1811
1812   return true;
1813 }
1814
1815 //=======================================================================
1816 // function : GeometryGUI::deactivateModule()
1817 // purpose  : Called when GEOM module is deactivated
1818 //=======================================================================
1819 bool GeometryGUI::deactivateModule( SUIT_Study* study )
1820 {
1821   QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1822   if ( viewMenu )
1823     disconnect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1824
1825   setMenuShown( false );
1826   setToolShown( false );
1827
1828   disconnect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1829              this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1830
1831   LightApp_SelectionMgr* selMrg = getApp()->selectionMgr();
1832
1833   disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
1834   disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
1835   getApp()->removeDockWindow( myCreationInfoWdg->getWinID() );
1836   myCreationInfoWdg = 0;
1837
1838   EmitSignalCloseAllDialogs();
1839
1840   GUIMap::Iterator it;
1841   for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1842     it.value()->deactivate();
1843
1844   // Unset actions accelerator keys
1845   action(GEOMOp::OpDelete)->setEnabled( false ); // Delete: Key_Delete
1846
1847   qDeleteAll(myOCCSelectors);
1848   myOCCSelectors.clear();
1849   selMrg->setEnabled( true, OCCViewer_Viewer::Type() );
1850
1851   qDeleteAll(myVTKSelectors);
1852   myVTKSelectors.clear();
1853   selMrg->setEnabled( true, SVTK_Viewer::Type() );
1854
1855   return SalomeApp_Module::deactivateModule( study );
1856 }
1857
1858 //=======================================================================
1859 // function : onWindowActivated()
1860 // purpose  : update menu items' status - disable non-OCC-viewer-compatible actions
1861 //=======================================================================
1862 void GeometryGUI::onWindowActivated( SUIT_ViewWindow* win )
1863 {
1864   if ( !win )
1865     return;
1866
1867   const bool ViewOCC = ( win->getViewManager()->getType() == OCCViewer_Viewer::Type() );
1868   //const bool ViewVTK = ( win->getViewManager()->getType() == SVTK_Viewer::Type() );
1869
1870   // disable non-OCC viewframe menu commands
1871 //  action( GEOMOp::Op2dSketcher )->setEnabled( ViewOCC ); // SKETCHER
1872   action( GEOMOp::OpSuppressFaces )->setEnabled( ViewOCC ); // SuppressFace
1873   action( GEOMOp::OpSuppressHoles )->setEnabled( ViewOCC ); // SuppressHole
1874   action( GEOMOp::OpCloseContour )->setEnabled( ViewOCC ); // CloseContour
1875   action( GEOMOp::OpRemoveIntWires )->setEnabled( ViewOCC ); // RemoveInternalWires
1876   action( GEOMOp::OpAddPointOnEdge )->setEnabled( ViewOCC ); // AddPointOnEdge
1877 //  action( GEOMOp::OpFreeBoundaries )->setEnabled( ViewOCC ); // Free boundaries
1878
1879   action( GEOMOp::OpGroupCreate )->setEnabled( ViewOCC ); // Create Group
1880   action( GEOMOp::OpGroupEdit )->setEnabled( ViewOCC ); // Edit Group
1881   action( GEOMOp::OpCreateField )->setEnabled( ViewOCC ); // Create Field
1882   action( GEOMOp::OpEditField )->setEnabled( ViewOCC ); // Edit Field
1883
1884   action( GEOMOp::OpMultiTransform )->setEnabled( ViewOCC ); // MENU BLOCKS - MULTI-TRANSFORMATION
1885 }
1886
1887 void GeometryGUI::windows( QMap<int, int>& mappa ) const
1888 {
1889   mappa.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
1890   mappa.insert( SalomeApp_Application::WT_NoteBook, Qt::LeftDockWidgetArea );
1891   mappa.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
1892   if ( myCreationInfoWdg )
1893     mappa.insert( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
1894 }
1895
1896 void GeometryGUI::viewManagers( QStringList& lst ) const
1897 {
1898   lst.append( OCCViewer_Viewer::Type() );
1899 }
1900
1901 void GeometryGUI::onViewManagerAdded( SUIT_ViewManager* vm )
1902 {
1903   if ( vm && vm->getType() == OCCViewer_Viewer::Type() )
1904   {
1905     qDebug( "connect" );
1906     connect( vm, SIGNAL( keyPress  ( SUIT_ViewWindow*, QKeyEvent* ) ),
1907              this, SLOT( OnKeyPress( SUIT_ViewWindow*, QKeyEvent* ) ) );
1908     connect( vm, SIGNAL( mousePress( SUIT_ViewWindow*, QMouseEvent* ) ),
1909              this, SLOT( OnMousePress( SUIT_ViewWindow*, QMouseEvent* ) ) );
1910     connect( vm, SIGNAL( mouseMove ( SUIT_ViewWindow*, QMouseEvent* ) ),
1911              this, SLOT( OnMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) );
1912     connect( vm, SIGNAL( mouseRelease ( SUIT_ViewWindow*, QMouseEvent* ) ),
1913              this, SLOT( OnMouseRelease( SUIT_ViewWindow*, QMouseEvent* ) ) );
1914
1915     LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1916     myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
1917
1918     // disable OCC selectors
1919     getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
1920     QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1921     while ( itOCCSel.hasNext() )
1922       if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1923         sr->setEnabled(true);
1924   }
1925   else if ( vm->getType() == SVTK_Viewer::Type() )
1926   {
1927     LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1928     myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
1929
1930     // disable VTK selectors
1931     getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
1932     QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1933     while ( itVTKSel.hasNext() )
1934       if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1935         sr->setEnabled(true);
1936   }
1937 }
1938
1939 void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm )
1940 {
1941   SUIT_ViewModel* viewer = vm->getViewModel();
1942   if ( vm->getType() == OCCViewer_Viewer::Type() )
1943   {
1944     QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1945     while ( itOCCSel.hasNext() )
1946       if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1947         if ( sr->viewer() == viewer )
1948         {
1949           /*delete*/ myOCCSelectors.takeAt( myOCCSelectors.indexOf( sr ) );
1950           break;
1951         }
1952   }
1953   if ( vm->getType() == SVTK_Viewer::Type() )
1954   {
1955     QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1956     while ( itVTKSel.hasNext() )
1957       if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1958         if ( sr->viewer() == viewer )
1959         {
1960           /*delete*/ myVTKSelectors.takeAt( myVTKSelectors.indexOf( sr ) );
1961           break;
1962         }
1963   }
1964 }
1965
1966 //================================================================================
1967 /*!
1968  * \brief Slot called when selection changed. Shows creation info of a selected object
1969  */
1970 //================================================================================
1971
1972 void GeometryGUI::updateCreationInfo()
1973 {
1974   if ( myCreationInfoWdg )
1975     myCreationInfoWdg->clear();
1976
1977   // Code below is commented to have myCreationInfoWdg filled as soon as it is shown again
1978   // if ( !myCreationInfoWdg->isVisible() )
1979   //   return;
1980
1981   // look for a sole selected GEOM_Object
1982   GEOM::GEOM_BaseObject_var geomObj;
1983
1984   SALOME_ListIO selected;
1985   getApp()->selectionMgr()->selectedObjects( selected );
1986
1987   _PTR(Study) study = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() )->studyDS();
1988   SALOME_ListIteratorOfListIO selIt( selected );
1989   for ( ; selIt.More(); selIt.Next() )
1990   {
1991     Handle(SALOME_InteractiveObject) io = selIt.Value();
1992     if ( !io->hasEntry() ) continue;
1993     _PTR(SObject) sobj = study->FindObjectID( io->getEntry() );
1994     if ( !sobj ) continue;
1995     CORBA::Object_var          obj = GeometryGUI::ClientSObjectToObject( sobj );
1996     GEOM::GEOM_BaseObject_var gobj = GEOM::GEOM_BaseObject::_narrow( obj );
1997     if ( !gobj->_is_nil() )
1998     {
1999       if ( !geomObj->_is_nil() )
2000         return; // several GEOM objects selected
2001       geomObj = gobj;
2002     }
2003   }
2004   if ( geomObj->_is_nil() ) return;
2005
2006   // pass creation info of geomObj to myCreationInfoWdg
2007
2008   if ( myCreationInfoWdg ) {
2009     QPixmap icon;
2010     QString operationName;
2011     myCreationInfoWdg->setOperation( icon, operationName );
2012
2013     try {
2014       OCC_CATCH_SIGNALS;
2015       GEOM::CreationInformation_var info = geomObj->GetCreationInformation();
2016       if ( &info.in() ) {
2017         SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
2018         QString name = info->operationName.in();
2019         if ( !name.isEmpty() ) {
2020           
2021           QString plugin_name;
2022           for ( size_t i = 0; i < info->params.length(); ++i ) {
2023             myCreationInfoWdg->addParam( info->params[i].name.in(),
2024                                          info->params[i].value.in() );
2025             QString value = info->params[i].name.in();
2026             if( value == PLUGIN_NAME ) {
2027               plugin_name = info->params[i].value.in();
2028             }
2029           }
2030           QString prefix = plugin_name.isEmpty() ? "GEOM" : plugin_name;
2031           icon = resMgr->loadPixmap( prefix, tr( ("ICO_"+name).toLatin1().constData() ), false );
2032           operationName = tr( ("MEN_"+name).toLatin1().constData() );
2033           if ( operationName.startsWith( "MEN_" ))
2034             operationName = name; // no translation
2035           myCreationInfoWdg->setOperation( icon, operationName );
2036         }
2037       }
2038     }
2039     catch (...) {
2040     }
2041   }
2042 }
2043
2044 void GeometryGUI::onAutoBringToFront()
2045 {
2046   bool isAutoBringToFront = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "auto_bring_to_front" );
2047   if( !isAutoBringToFront )
2048     return;
2049   
2050   SUIT_ViewWindow* SUIT_window = application()->desktop()->activeWindow();
2051   if ( !SUIT_window || SUIT_window->getViewManager()->getType() != OCCViewer_Viewer::Type() )
2052         return;
2053
2054   SalomeApp_Study* appStudy = dynamic_cast< SalomeApp_Study* >( getApp()->activeStudy() );
2055   if (!appStudy) return;
2056
2057   GEOM_Displayer displayer( appStudy );
2058   
2059   SALOME_View* window = displayer.GetActiveView();
2060   if ( !window ) return;
2061   
2062   int aMgrId = dynamic_cast< SUIT_ViewModel* >( window )->getViewManager()->getGlobalId();
2063   
2064   SALOME_ListIO selected;
2065   getApp()->selectionMgr()->selectedObjects( selected );
2066   if (!myTopLevelIOList.IsEmpty())
2067   {
2068     for( SALOME_ListIteratorOfListIO It( myTopLevelIOList ); It.More(); It.Next() )
2069     {
2070       Handle( SALOME_InteractiveObject ) io = It.Value();
2071       bool isSelected = false;
2072       for( SALOME_ListIteratorOfListIO It_sel( selected ); It_sel.More(); It_sel.Next() )
2073       {
2074         Handle( SALOME_InteractiveObject ) sel_io = It_sel.Value();
2075         if( io->isSame( sel_io ) )
2076           isSelected = true;
2077       }
2078       if (!isSelected && appStudy->findObjectByEntry(io->getEntry()))
2079       {
2080         appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), false );
2081         if ( window->isVisible( io ) ) displayer.Redisplay( io, false );     
2082       }
2083     }
2084   }
2085   
2086   myTopLevelIOList.Assign(selected);
2087   for( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() )
2088   {
2089     Handle( SALOME_InteractiveObject ) io = It.Value();
2090     appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), true );
2091     if ( window->isVisible( io ) ) displayer.Redisplay( io, false );     
2092   }
2093     
2094   displayer.UpdateViewer();
2095   GeometryGUI::Modified();
2096 }
2097
2098 void GeometryGUI::updateFieldColorScale()
2099 {
2100   if( SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) )
2101   {
2102     GEOM_Displayer aDisplayer( aStudy );
2103     aDisplayer.UpdateColorScale();
2104   }
2105 }
2106
2107 QString GeometryGUI::engineIOR() const
2108 {
2109   if ( !CORBA::is_nil( GetGeomGen() ) )
2110     return QString( getApp()->orb()->object_to_string( GetGeomGen() ) );
2111   return "";
2112 }
2113
2114 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
2115 Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture
2116 #else
2117 Handle(Graphic3d_HArray1OfBytes) GeometryGUI::getTexture
2118 #endif
2119       (SalomeApp_Study* theStudy, int theId, int& theWidth, int& theHeight)
2120 {
2121   theWidth = theHeight = 0;
2122
2123 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
2124   Handle(TColStd_HArray1OfByte) aTexture;
2125 #else
2126   Handle(Graphic3d_HArray1OfBytes) aTexture;
2127 #endif
2128
2129   if (theStudy) {
2130     TextureMap aTextureMap = myTextureMap[ theStudy->studyDS()->StudyId() ];
2131     aTexture = aTextureMap[ theId ];
2132     if ( aTexture.IsNull() ) {
2133       GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGen()->GetIInsertOperations( theStudy->studyDS()->StudyId() );
2134       if ( !aInsOp->_is_nil() ) {
2135         CORBA::Long aWidth, aHeight;
2136         SALOMEDS::TMPFile_var aStream = aInsOp->GetTexture( theId, aWidth, aHeight );
2137         if ( aWidth > 0 && aHeight > 0 && aStream->length() > 0 ) {
2138           theWidth  = aWidth;
2139           theHeight = aHeight;
2140
2141 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
2142           aTexture  = new TColStd_HArray1OfByte (1, aStream->length());
2143 #else
2144           aTexture  = new Graphic3d_HArray1OfBytes (1, aStream->length());
2145 #endif
2146
2147           for (int i = 0; i < aStream->length(); i++)
2148             aTexture->SetValue( i+1, (Standard_Byte)aStream[i] );
2149           aTextureMap[ theId ] = aTexture;
2150         }
2151       }
2152     }
2153   }
2154   return aTexture;
2155 }
2156
2157 LightApp_Selection* GeometryGUI::createSelection() const
2158 {
2159   return new GEOMGUI_Selection();
2160 }
2161
2162 void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
2163 {
2164   SalomeApp_Module::contextMenuPopup( client, menu, title );
2165   SALOME_ListIO lst;
2166   getApp()->selectionMgr()->selectedObjects( lst );
2167
2168   //Add submenu for predefined materials
2169   bool isPredefMat = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "predef_materials" );
2170   if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() > 0 ) {
2171     QtxPopupMgr* mgr = popupMgr();
2172     //get parrent for submenu
2173     QAction* act = mgr->action( mgr->actionId( action(  GEOMOp::OpMaterialProperties ) ) );
2174     //Clear old  menu
2175     QMenu* oldMenu = act->menu() ;
2176     if( oldMenu ) {
2177       delete oldMenu;
2178     }
2179     if( isPredefMat ){
2180       QMenu* matMenu = new QMenu();
2181       QSignalMapper* signalMapper = new QSignalMapper( matMenu );
2182
2183       //Get current material model for the object
2184       QVariant v;
2185       LightApp_Application* anApp = dynamic_cast<LightApp_Application*>( getApp() );
2186       if ( anApp && anApp->activeViewManager() ) {
2187         LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( anApp->activeStudy() );
2188         if( aStudy ) {
2189           v = aStudy->getObjectProperty( anApp->activeViewManager()->getGlobalId(), lst.Last()->getEntry(), GEOM::propertyName( GEOM::Material ), QVariant() );
2190         }
2191       }
2192       QString curModel = "";
2193       if ( v.canConvert<QString>() ) curModel = v.toString();
2194       // get list of all predefined materials
2195       QStringList materials = Material_ResourceMgr::resourceMgr()->materials();
2196       bool found = false;
2197       foreach ( QString material, materials )
2198       {
2199         QAction* menAct = matMenu->addAction( material );
2200         connect(menAct, SIGNAL( toggled( bool ) ), signalMapper, SLOT( map() ) );
2201         signalMapper->setMapping( menAct, material );
2202         menAct->setCheckable( true );
2203         // Set checked if this material is current
2204         Material_Model aModel;
2205         aModel.fromResources( material );
2206         if ( !found && aModel.toProperties() == curModel ) {
2207           menAct->setChecked( true );
2208           found = true;
2209         }
2210       }
2211       matMenu->insertAction( matMenu->addSeparator(), action(  GEOMOp::OpPredefMaterCustom ) );
2212       matMenu->insertSeparator( action(  GEOMOp::OpPredefMaterCustom ) );
2213       connect( signalMapper, SIGNAL( mapped( const QString & ) ),
2214                  this, SLOT( OnSetMaterial( const QString & ) ) );
2215       act->setMenu( matMenu );
2216     }
2217   }
2218   //Set name
2219   if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() == 1 ) {
2220     Handle(SALOME_InteractiveObject) io = lst.First();
2221     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
2222     _PTR(Study) study = appStudy->studyDS();
2223     _PTR(SObject) obj = study->FindObjectID( io->getEntry() );
2224     if ( obj ) {
2225       QString aName = QString( obj->GetName().c_str() );
2226       aName.remove( QRegExp("\\s+$") );
2227       title = aName;
2228     }
2229   }
2230 }
2231
2232 void GeometryGUI::OnSetMaterial(const QString& theName)
2233 {
2234   OnGUIEvent( GEOMOp::OpPredefMaterial, QVariant( theName ) );
2235 }
2236
2237
2238 void GeometryGUI::createPreferences()
2239 {
2240   int tabId = addPreference( tr( "PREF_TAB_SETTINGS" ) );
2241
2242   int genGroup = addPreference( tr( "PREF_GROUP_GENERAL" ), tabId );
2243   setPreferenceProperty( genGroup, "columns", 2 );
2244
2245   int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), genGroup,
2246                                 LightApp_Preferences::Selector,
2247                                 "Geometry", "display_mode" );
2248
2249   addPreference( tr( "PREF_SHADING_COLOR" ), genGroup,
2250                  LightApp_Preferences::Color, "Geometry", "shading_color" );
2251
2252   addPreference( tr( "PREF_EDGES_IN_SHADING" ), genGroup,
2253                  LightApp_Preferences::Color, "Geometry", "edges_in_shading_color" );
2254
2255   addPreference( tr( "PREF_WIREFRAME_COLOR" ), genGroup,
2256                  LightApp_Preferences::Color, "Geometry", "wireframe_color" );
2257
2258   addPreference( tr( "PREF_FREE_BOUND_COLOR" ), genGroup,
2259                  LightApp_Preferences::Color, "Geometry", "free_bound_color" );
2260
2261   addPreference( tr( "PREF_LINE_COLOR"), genGroup,
2262                  LightApp_Preferences::Color, "Geometry", "line_color" );
2263
2264   addPreference( tr( "PREF_POINT_COLOR"), genGroup,
2265                  LightApp_Preferences::Color, "Geometry", "point_color" );
2266
2267   addPreference( tr( "PREF_ISOS_COLOR" ), genGroup,
2268                  LightApp_Preferences::Color, "Geometry", "isos_color" );
2269
2270   addPreference( tr( "PREF_TOPLEVEL_COLOR" ), genGroup,
2271                  LightApp_Preferences::Color, "Geometry", "toplevel_color" );
2272
2273   int top_lev_dm = addPreference( tr( "PREF_TOPLEVEL_DM" ), genGroup,
2274                       LightApp_Preferences::Selector, "Geometry", "toplevel_dm" );
2275
2276   int transparency = addPreference( tr( "PREF_TRANSPARENCY" ), genGroup,
2277                                     LightApp_Preferences::IntSpin, "Geometry", "transparency" );
2278
2279   int defl = addPreference( tr( "PREF_DEFLECTION" ), genGroup,
2280                             LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" );
2281
2282   addPreference( tr( "PREF_PREDEF_MATERIALS" ), genGroup,
2283                  LightApp_Preferences::Bool, "Geometry", "predef_materials" );
2284
2285   int material = addPreference( tr( "PREF_MATERIAL" ), genGroup,
2286                                 LightApp_Preferences::Selector,
2287                                 "Geometry", "material" );
2288
2289   addPreference( tr( "PREF_EDITGROUP_COLOR" ), genGroup,
2290                  LightApp_Preferences::Color, "Geometry", "editgroup_color" );
2291
2292   const int nb = 4;
2293   int wd[nb];
2294   int iter=0;
2295
2296   wd[iter++] = addPreference( tr( "PREF_EDGE_WIDTH" ), genGroup,
2297                               LightApp_Preferences::IntSpin, "Geometry", "edge_width" );
2298
2299   wd[iter++] = addPreference( tr( "PREF_ISOLINES_WIDTH" ), genGroup,
2300                               LightApp_Preferences::IntSpin, "Geometry", "isolines_width" );
2301
2302   wd[iter++] = addPreference( tr( "PREF_PREVIEW_EDGE_WIDTH" ), genGroup,
2303                                      LightApp_Preferences::IntSpin, "Geometry", "preview_edge_width" );
2304
2305   wd[iter++] = addPreference( tr( "PREF_MEASURES_LINE_WIDTH" ), genGroup,
2306                               LightApp_Preferences::IntSpin, "Geometry", "measures_line_width" );
2307
2308   for (int i = 0; i < nb; i++) {
2309     setPreferenceProperty( wd[i], "min", 1 );
2310     setPreferenceProperty( wd[i], "max", 5 );
2311   }
2312
2313   int step = addPreference( tr( "PREF_STEP_VALUE" ), genGroup,
2314                             LightApp_Preferences::IntSpin, "Geometry", "SettingsGeomStep" );
2315
2316   addPreference( tr( "PREF_AUTO_BRING_TO_FRONT" ), genGroup,
2317                  LightApp_Preferences::Bool, "Geometry", "auto_bring_to_front" );
2318
2319   int aDimGroupId = addPreference( tr( "PREF_DIMENSIONS" ), tabId );
2320   setPreferenceProperty( aDimGroupId, "columns", 2 );
2321
2322   addPreference( tr( "PREF_DIMENSIONS_COLOR" ), aDimGroupId,
2323                  LightApp_Preferences::Color, "Geometry", "dimensions_color" );
2324
2325   int aDimLineWidthId = addPreference( tr( "PREF_DIMENSIONS_LINE_WIDTH" ), aDimGroupId, 
2326                                        LightApp_Preferences::IntSpin, "Geometry", "dimensions_line_width" );
2327
2328   setPreferenceProperty( aDimLineWidthId, "min", 1 );
2329   setPreferenceProperty( aDimLineWidthId, "max", 5 );
2330
2331   int aDimFontHeightId = addPreference( tr( "PREF_DIMENSIONS_FONT_HEIGHT" ), aDimGroupId,
2332                                         LightApp_Preferences::DblSpin, "Geometry", "dimensions_font_height" );
2333
2334   setPreferenceProperty( aDimFontHeightId, "min", 1e-9 );
2335   setPreferenceProperty( aDimFontHeightId, "max", 1e+9 );
2336   setPreferenceProperty( aDimFontHeightId, "precision", 9 );
2337
2338   int aDimArrLengthId = addPreference( tr( "PREF_DIMENSIONS_ARROW_LENGTH" ), aDimGroupId,
2339                                        LightApp_Preferences::DblSpin, "Geometry", "dimensions_arrow_length" );
2340
2341   setPreferenceProperty( aDimArrLengthId, "min", 1e-9 );
2342   setPreferenceProperty( aDimArrLengthId, "max", 1e+9 );
2343   setPreferenceProperty( aDimArrLengthId, "precision", 9 );
2344
2345   int aLengthUnitsId = addPreference( tr( "PREF_DIMENSIONS_LENGTH_UNITS" ), aDimGroupId,
2346                                       LightApp_Preferences::Selector, "Geometry", "dimensions_length_units" );
2347
2348   int anAngUnitsId = addPreference( tr( "PREF_DIMENSIONS_ANGLE_UNITS" ), aDimGroupId,
2349                                    LightApp_Preferences::Selector, "Geometry", "dimensions_angle_units" );
2350
2351   addPreference( tr( "PREF_DIMENSIONS_SHOW_UNITS" ), aDimGroupId,
2352                  LightApp_Preferences::Bool, "Geometry", "dimensions_show_units" );
2353
2354   QStringList aListOfLengthUnits;
2355   aListOfLengthUnits << "m";
2356   aListOfLengthUnits << "cm";
2357   aListOfLengthUnits << "mm";
2358   aListOfLengthUnits << "in.";
2359   aListOfLengthUnits << "ft.";
2360
2361   QStringList aListOfAngUnits;
2362   aListOfAngUnits << "rad";
2363   aListOfAngUnits << "deg";
2364
2365   setPreferenceProperty( aLengthUnitsId, "strings", aListOfLengthUnits );
2366   setPreferenceProperty( anAngUnitsId,   "strings", aListOfAngUnits );
2367
2368   int aDimDefFlyout = addPreference( tr( "PREF_DIMENSIONS_DEFAULT_FLYOUT" ), aDimGroupId,
2369                                      LightApp_Preferences::DblSpin, "Geometry", "dimensions_default_flyout" );
2370
2371   setPreferenceProperty( aDimDefFlyout, "min", 1e-9 );
2372   setPreferenceProperty( aDimDefFlyout, "max", 1e+9 );
2373   setPreferenceProperty( aDimDefFlyout, "precision", 9 );
2374
2375   int isoGroup = addPreference( tr( "PREF_ISOS" ), tabId );
2376   setPreferenceProperty( isoGroup, "columns", 2 );
2377   int isoU = addPreference( tr( "PREF_ISOS_U" ), isoGroup,
2378                             LightApp_Preferences::IntSpin, "Geometry", "iso_number_u" );
2379   setPreferenceProperty( isoU, "min", 0 );
2380   setPreferenceProperty( isoU, "max", 100000 );
2381   int isoV = addPreference( tr( "PREF_ISOS_V" ), isoGroup,
2382                             LightApp_Preferences::IntSpin, "Geometry", "iso_number_v" );
2383   setPreferenceProperty( isoV, "min", 0 );
2384   setPreferenceProperty( isoV, "max", 100000 );
2385
2386   // Quantities with individual precision settings
2387   int precGroup = addPreference( tr( "GEOM_PREF_GROUP_PRECISION" ), tabId );
2388   setPreferenceProperty( precGroup, "columns", 2 );
2389
2390   const int nbQuantities = 8;
2391   int prec[nbQuantities], ii = 0;
2392   prec[ii++] = addPreference( tr( "GEOM_PREF_length_precision" ), precGroup,
2393                               LightApp_Preferences::IntSpin, "Geometry", "length_precision" );
2394   prec[ii++] = addPreference( tr( "GEOM_PREF_angle_precision" ), precGroup,
2395                               LightApp_Preferences::IntSpin, "Geometry", "angle_precision" );
2396   prec[ii++] = addPreference( tr( "GEOM_PREF_len_tol_precision" ), precGroup,
2397                               LightApp_Preferences::IntSpin, "Geometry", "len_tol_precision" );
2398   prec[ii++] = addPreference( tr( "GEOM_PREF_ang_tol_precision" ), precGroup,
2399                               LightApp_Preferences::IntSpin, "Geometry", "ang_tol_precision" );
2400   prec[ii++] = addPreference( tr( "GEOM_PREF_weight_precision" ), precGroup,
2401                               LightApp_Preferences::IntSpin, "Geometry", "weight_precision" );
2402   prec[ii++] = addPreference( tr( "GEOM_PREF_density_precision" ), precGroup,
2403                               LightApp_Preferences::IntSpin, "Geometry", "density_precision" );
2404   prec[ii++] = addPreference( tr( "GEOM_PREF_parametric_precision" ), precGroup,
2405                               LightApp_Preferences::IntSpin, "Geometry", "parametric_precision" );
2406   prec[ii  ] = addPreference( tr( "GEOM_PREF_param_tol_precision" ), precGroup,
2407                               LightApp_Preferences::IntSpin, "Geometry", "param_tol_precision" );
2408
2409   // Set property for precision value for spinboxes
2410   for ( ii = 0; ii < nbQuantities; ii++ ){
2411     setPreferenceProperty( prec[ii], "min", -14 );
2412     setPreferenceProperty( prec[ii], "max", 14 );
2413     setPreferenceProperty( prec[ii], "precision", 2 );
2414   }
2415
2416   int VertexGroup = addPreference( tr( "PREF_GROUP_VERTEX" ), tabId );
2417   setPreferenceProperty( VertexGroup, "columns", 2 );
2418
2419   int typeOfMarker = addPreference( tr( "PREF_TYPE_OF_MARKER" ), VertexGroup,
2420                                     LightApp_Preferences::Selector, "Geometry", "type_of_marker" );
2421
2422   int markerScale = addPreference( tr( "PREF_MARKER_SCALE" ), VertexGroup,
2423                                    LightApp_Preferences::Selector, "Geometry", "marker_scale" );
2424
2425   // Set property for default display mode
2426   QStringList aModesList;
2427   aModesList.append( tr("MEN_WIREFRAME") );
2428   aModesList.append( tr("MEN_SHADING") );
2429   aModesList.append( tr("MEN_SHADING_WITH_EDGES") );
2430   aModesList.append( tr("MEN_TEXTURE") );
2431
2432   QList<QVariant> anIndexesList;
2433   anIndexesList.append(0);
2434   anIndexesList.append(1);
2435   anIndexesList.append(2);
2436   anIndexesList.append(3);
2437
2438   setPreferenceProperty( dispmode, "strings", aModesList );
2439   setPreferenceProperty( dispmode, "indexes", anIndexesList );
2440
2441   // Set property for top level display mode
2442   QStringList aTopModesList;
2443   aTopModesList.append( tr("MEN_SHOW_ADD_WACTOR") );
2444   aTopModesList.append( tr("MEN_KEEP_CURRENT_DM") );
2445   aTopModesList.append( tr("MEN_WIREFRAME") );
2446   aTopModesList.append( tr("MEN_SHADING") );
2447   aTopModesList.append( tr("MEN_SHADING_WITH_EDGES") );
2448
2449   QList<QVariant> aTopIndexesList;
2450   aTopIndexesList.append(0);
2451   aTopIndexesList.append(1);
2452   aTopIndexesList.append(2);
2453   aTopIndexesList.append(3);
2454   aTopIndexesList.append(4);
2455
2456   setPreferenceProperty( top_lev_dm, "strings", aTopModesList );
2457   setPreferenceProperty( top_lev_dm, "indexes", aTopIndexesList );
2458
2459   // Set property for step value for spinboxes
2460   setPreferenceProperty( step, "min", 1 );
2461   setPreferenceProperty( step, "max", 10000 );
2462   setPreferenceProperty( step, "precision", 3 );
2463
2464   // Set property for trandparency value for spinboxes
2465   setPreferenceProperty( transparency, "min", 0 );
2466   setPreferenceProperty( transparency, "max", 100 );
2467
2468   // Set property for deflection value for spinboxes
2469   setPreferenceProperty( defl, "min", GEOM::minDeflection() );
2470   setPreferenceProperty( defl, "max", 1.0 );
2471   setPreferenceProperty( defl, "step", 1.0e-04 );
2472   setPreferenceProperty( defl, "precision", 6 );
2473
2474   // Set property for default material
2475   setPreferenceProperty( material, "strings", Material_ResourceMgr::resourceMgr()->materials() );
2476
2477   // Set property vertex marker type
2478   QList<QVariant> aMarkerTypeIndicesList;
2479   QList<QVariant> aMarkerTypeIconsList;
2480
2481   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
2482   for ( int i = GEOM::MT_POINT; i < GEOM::MT_USER; i++ ) {
2483     QString icoFile = QString( "ICON_VERTEX_MARKER_%1" ).arg( i );
2484     QPixmap pixmap = resMgr->loadPixmap( "GEOM", tr( qPrintable( icoFile ) ) );
2485     aMarkerTypeIndicesList << (i-1);
2486     aMarkerTypeIconsList << pixmap;
2487   }
2488
2489   setPreferenceProperty( typeOfMarker, "indexes", aMarkerTypeIndicesList );
2490   setPreferenceProperty( typeOfMarker, "icons",   aMarkerTypeIconsList );
2491
2492   // Set property for vertex marker scale
2493   QList<QVariant> aMarkerScaleIndicesList;
2494   QStringList     aMarkerScaleValuesList;
2495
2496   for ( int iii = GEOM::MS_10; iii <= GEOM::MS_70; iii++ ) {
2497     aMarkerScaleIndicesList << iii;
2498     aMarkerScaleValuesList  << QString::number( (iii-(int)GEOM::MS_10)*0.5 + 1.0 );
2499   }
2500
2501   setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList );
2502   setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
2503
2504   // Scalar bar for field step presentation
2505   int scalarBarGroup = addPreference( tr( "PREF_GROUP_SCALAR_BAR" ), tabId );
2506   setPreferenceProperty( scalarBarGroup, "columns", 2 );
2507
2508   int sbXPosition = addPreference( tr( "PREF_SCALAR_BAR_X_POSITION" ), scalarBarGroup,
2509                                    LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_x_position" );
2510   setPreferenceProperty( sbXPosition, "min", 0 );
2511   setPreferenceProperty( sbXPosition, "max", 1 );
2512   setPreferenceProperty( sbXPosition, "step", 0.05 );
2513
2514   int sbYPosition = addPreference( tr( "PREF_SCALAR_BAR_Y_POSITION" ), scalarBarGroup,
2515                                    LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_y_position" );
2516   setPreferenceProperty( sbYPosition, "min", 0 );
2517   setPreferenceProperty( sbYPosition, "max", 1 );
2518   setPreferenceProperty( sbYPosition, "step", 0.05 );
2519
2520   int sbWidth = addPreference( tr( "PREF_SCALAR_BAR_WIDTH" ), scalarBarGroup,
2521                                LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_width" );
2522   setPreferenceProperty( sbWidth, "min", 0 );
2523   setPreferenceProperty( sbWidth, "max", 1 );
2524   setPreferenceProperty( sbWidth, "step", 0.05 );
2525
2526   int sbHeight = addPreference( tr( "PREF_SCALAR_BAR_HEIGHT" ), scalarBarGroup,
2527                                 LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_height" );
2528   setPreferenceProperty( sbHeight, "min", 0 );
2529   setPreferenceProperty( sbHeight, "max", 1 );
2530   setPreferenceProperty( sbHeight, "step", 0.05 );
2531
2532   int sbTextHeight = addPreference( tr( "PREF_SCALAR_BAR_TEXT_HEIGHT" ), scalarBarGroup,
2533                                     LightApp_Preferences::IntSpin, "Geometry", "scalar_bar_text_height" );
2534   setPreferenceProperty( sbTextHeight, "min", 6 );
2535   setPreferenceProperty( sbTextHeight, "max", 24 );
2536   setPreferenceProperty( sbTextHeight, "step", 1 );
2537
2538   int sbNbIntervals = addPreference( tr( "PREF_SCALAR_BAR_NUMBER_OF_INTERVALS" ), scalarBarGroup,
2539                                      LightApp_Preferences::IntSpin, "Geometry", "scalar_bar_nb_intervals" );
2540   setPreferenceProperty( sbNbIntervals, "min", 2 );
2541   setPreferenceProperty( sbNbIntervals, "max", 64 );
2542   setPreferenceProperty( sbNbIntervals, "step", 1 );
2543
2544   int originGroup = addPreference( tr( "PREF_GROUP_ORIGIN_AND_BASE_VECTORS" ), tabId );
2545   setPreferenceProperty( originGroup, "columns", 2 );
2546
2547   int baseVectorsLength = addPreference( tr( "PREF_BASE_VECTORS_LENGTH" ), originGroup,
2548                                          LightApp_Preferences::DblSpin, "Geometry", "base_vectors_length" );
2549   setPreferenceProperty( baseVectorsLength, "min", 0.01 );
2550   setPreferenceProperty( baseVectorsLength, "max", 1000 );
2551
2552   addPreference( tr( "PREF_AUTO_CREATE" ), originGroup,
2553                  LightApp_Preferences::Bool, "Geometry", "auto_create_base_objects" );
2554
2555   int operationsGroup = addPreference( tr( "PREF_GROUP_OPERATIONS" ), tabId );
2556   setPreferenceProperty( operationsGroup, "columns", 2 );
2557
2558   addPreference( tr( "GEOM_PREVIEW" ), operationsGroup,
2559                  LightApp_Preferences::Bool, "Geometry", "geom_preview" );
2560
2561   int DependencyViewId = addPreference( tr( "PREF_TAB_DEPENDENCY_VIEW" ) );
2562
2563   int treeGeneralGroup = addPreference( tr( "PREF_GROUP_GENERAL" ), DependencyViewId );
2564
2565   int hierarchy_type = addPreference( tr( "PREF_HIERARCHY_TYPE" ), treeGeneralGroup,
2566                       LightApp_Preferences::Selector, "Geometry", "dependency_tree_hierarchy_type" );
2567
2568   QStringList aHierarchyTypeList;
2569   aHierarchyTypeList.append( tr("MEN_BOTH_ASCENDANTS_DESCENDANTS") );
2570   aHierarchyTypeList.append( tr("MEN_ONLY_ASCENDANTS") );
2571   aHierarchyTypeList.append( tr("MEN_ONLY_DESCENDANTS") );
2572
2573   QList<QVariant> aHierarchyTypeIndexesList;
2574   aHierarchyTypeIndexesList.append(0);
2575   aHierarchyTypeIndexesList.append(1);
2576   aHierarchyTypeIndexesList.append(2);
2577
2578   setPreferenceProperty( hierarchy_type, "strings", aHierarchyTypeList );
2579   setPreferenceProperty( hierarchy_type, "indexes", aHierarchyTypeIndexesList );
2580
2581   addPreference( tr( "GEOM_MOVE_POSSIBILITY" ), treeGeneralGroup,
2582                  LightApp_Preferences::Bool, "Geometry", "dependency_tree_move_nodes" );
2583
2584   int treeColorGroup = addPreference( tr( "PREF_GROUP_DEPENDENCY_VIEW_COLOR" ), DependencyViewId );
2585
2586   addPreference( tr( "PREF_DEPENDENCY_VIEW_BACKGROUND_COLOR"), treeColorGroup,
2587                  LightApp_Preferences::Color, "Geometry", "dependency_tree_background_color" );
2588
2589   addPreference( tr( "PREF_DEPENDENCY_VIEW_NODE_COLOR"), treeColorGroup,
2590                  LightApp_Preferences::Color, "Geometry", "dependency_tree_node_color" );
2591   addPreference( tr( "PREF_DEPENDENCY_VIEW_MAIN_NODE_COLOR"), treeColorGroup,
2592                  LightApp_Preferences::Color, "Geometry", "dependency_tree_main_node_color" );
2593   addPreference( tr( "PREF_DEPENDENCY_VIEW_UNPUBLISH_NODE_COLOR"), treeColorGroup,
2594                  LightApp_Preferences::Color, "Geometry", "dependency_tree_unpublish_node_color" );
2595   addPreference( tr( "PREF_DEPENDENCY_VIEW_SELECT_NODE_COLOR"), treeColorGroup,
2596                  LightApp_Preferences::Color, "Geometry", "dependency_tree_select_node_color" );
2597
2598   addPreference( tr( "PREF_DEPENDENCY_VIEW_ARROW_COLOR"), treeColorGroup,
2599                  LightApp_Preferences::Color, "Geometry", "dependency_tree_arrow_color" );
2600   addPreference( tr( "PREF_DEPENDENCY_VIEW_HIGHLIGHT_ARROW_COLOR"), treeColorGroup,
2601                  LightApp_Preferences::Color, "Geometry", "dependency_tree_highlight_arrow_color" );
2602   addPreference( tr( "PREF_DEPENDENCY_VIEW_SELECT_ARROW_COLOR"), treeColorGroup,
2603                  LightApp_Preferences::Color, "Geometry", "dependency_tree_select_arrow_color" );
2604
2605
2606
2607
2608 }
2609
2610 void GeometryGUI::preferencesChanged( const QString& section, const QString& param )
2611 {
2612   if (section == "Geometry") {
2613     SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
2614     if (param == QString("SettingsGeomStep")) {
2615       double spin_step = aResourceMgr->doubleValue(section, param, 100.);
2616       EmitSignalDefaultStepValueChanged(spin_step);
2617     }
2618     else if (param == QString("toplevel_color")) {
2619       QColor c = aResourceMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) );
2620       GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c));
2621     }
2622     else if (param == QString("toplevel_dm")) {
2623       GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)aResourceMgr->integerValue("Geometry", "toplevel_dm", 0));
2624     }
2625     else if (param == QString("scalar_bar_x_position") ||
2626              param == QString("scalar_bar_y_position") ||
2627              param == QString("scalar_bar_width") ||
2628              param == QString("scalar_bar_height") ||
2629              param == QString("scalar_bar_text_height") ||
2630              param == QString("scalar_bar_nb_intervals")) {
2631       if( SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) )
2632       {
2633         GEOM_Displayer aDisplayer( aStudy );
2634         bool anIsRedisplayFieldSteps = param == QString("scalar_bar_nb_intervals");
2635         aDisplayer.UpdateColorScale( anIsRedisplayFieldSteps, true );
2636       }
2637     }
2638     else if ( param == QString("dimensions_color")        ||
2639               param == QString("dimensions_line_width")   ||
2640               param == QString("dimensions_font_height")  ||
2641               param == QString("dimensions_arrow_length") ||
2642               param == QString("dimensions_show_units")   ||
2643               param == QString("dimensions_length_units") ||
2644               param == QString("dimensions_angle_units") )
2645     {
2646       SalomeApp_Application* anApp = getApp();
2647       if ( !anApp )
2648       {
2649         return;
2650       }
2651
2652       SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( anApp->activeStudy() );
2653       if ( !aStudy )
2654       {
2655         return;
2656       }
2657
2658       GEOM_Displayer aDisplayer( aStudy );
2659
2660       ViewManagerList aVMs;
2661       anApp->viewManagers( OCCViewer_Viewer::Type(), aVMs );
2662       ViewManagerList::Iterator anIt = aVMs.begin();
2663       for ( ; anIt != aVMs.end(); ++anIt )
2664       {
2665         SOCC_Viewer* aViewer = dynamic_cast<SOCC_Viewer*>( (*anIt)->getViewModel() );
2666         if ( !aViewer )
2667         {
2668           continue;
2669         }
2670
2671         SALOME_ListIO aVisible;
2672         aViewer->GetVisible( aVisible );
2673         aDisplayer.Redisplay( aVisible, false, aViewer );
2674       }
2675
2676       aDisplayer.UpdateViewer();
2677     }
2678     else if ( param.startsWith( "dependency_tree") )
2679       emit SignalDependencyTreeParamChanged( section, param );
2680   }
2681 }
2682
2683 LightApp_Displayer* GeometryGUI::displayer()
2684 {
2685   if ( !myDisplayer )
2686     myDisplayer = new GEOM_Displayer( dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) );
2687   return myDisplayer;
2688 }
2689
2690 void GeometryGUI::setLocalSelectionMode(const int mode)
2691 {
2692   myLocalSelectionMode = mode;
2693 }
2694
2695 int GeometryGUI::getLocalSelectionMode() const
2696 {
2697   return myLocalSelectionMode;
2698 }
2699
2700 const char gSeparator = '_'; // character used to separate parameter names
2701 const char gDigitsSep = ':'; // character used to separate numeric parameter values (color = r:g:b)
2702
2703 /*!
2704  * \brief Store visual parameters
2705  *
2706  * This method is called just before the study document is saved.
2707  * Store visual parameters in AttributeParameter attribute(s)
2708  */
2709 void GeometryGUI::storeVisualParameters (int savePoint)
2710 {
2711   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
2712   if ( !appStudy || !appStudy->studyDS() )
2713     return;
2714   _PTR(Study) studyDS = appStudy->studyDS();
2715
2716   // componentName is used for encoding of entries when storing them in IParameters
2717   std::string componentName = myComponentGeom->ComponentDataType();
2718   //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
2719   //if (!aSComponent) return;
2720
2721   // IParameters
2722   _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
2723                                                              componentName.c_str(),
2724                                                              savePoint);
2725   _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
2726
2727   QSet<QString> anEntriesToStoreShared;
2728   QList<SUIT_ViewManager*> lst;
2729   QList<SUIT_ViewManager*>::Iterator it;
2730
2731   // main cycle to store parameters of displayed objects
2732   lst.clear();
2733   getApp()->viewManagers(lst);
2734   for (it = lst.begin(); it != lst.end(); it++) {
2735     SUIT_ViewManager* vman = *it;
2736     QString vType = vman->getType();
2737     int aMgrId = vman->getGlobalId();
2738     // saving VTK actors properties
2739     QVector<SUIT_ViewWindow*> views = vman->getViews();
2740     for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++) {
2741       const ObjMap anObjects = appStudy->getObjectMap(aMgrId);
2742       ObjMap::ConstIterator o_it = anObjects.begin();
2743       for (; o_it != anObjects.end(); o_it++) {
2744         const PropMap aProps = o_it.value();
2745
2746         //Check that object exists in the study
2747         _PTR(SObject) obj( studyDS->FindObjectID( o_it.key().toLatin1().data() ) );
2748         if ( !obj || !(aProps.count() > 0))
2749           continue;
2750         // entry is "encoded" = it does NOT contain component adress, since it is a
2751         // subject to change on next component loading
2752
2753         std::string entry = ip->encodeEntry(o_it.key().toLatin1().data(), componentName);
2754
2755         _PTR(GenericAttribute) anAttr;
2756         if (!obj->FindAttribute(anAttr, "AttributeIOR"))
2757           continue;
2758
2759         // remember entry of object to store shared GEOM properties
2760         // (e.g. dimension properties).
2761         if ( vType == OCCViewer_Viewer::Type() )
2762         {
2763           anEntriesToStoreShared.insert( o_it.key() );
2764         }
2765
2766         QString param, occParam = vType;
2767         occParam += GEOM::sectionSeparator();
2768         occParam += QString::number(aMgrId);
2769         occParam += GEOM::sectionSeparator();
2770
2771         if (aProps.contains(GEOM::propertyName( GEOM::Visibility ))) {
2772           param = occParam + GEOM::propertyName( GEOM::Visibility );
2773           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Visibility )).toBool() ? "On" : "Off");
2774         }
2775
2776         if (aProps.contains(GEOM::propertyName( GEOM::DisplayMode ))) {
2777           param = occParam + GEOM::propertyName( GEOM::DisplayMode );
2778           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::DisplayMode )).toString().toStdString());
2779         }
2780
2781         if (aProps.contains(GEOM::propertyName( GEOM::Color ))) {
2782           QColor c = aProps.value(GEOM::propertyName( GEOM::Color )).value<QColor>();
2783           QStringList val;
2784           val << QString::number(c.redF());
2785           val << QString::number(c.greenF());
2786           val << QString::number(c.blueF());
2787           param = occParam + GEOM::propertyName( GEOM::Color );
2788           ip->setParameter(entry, param.toStdString(), val.join( GEOM::subSectionSeparator()).toStdString());
2789         }
2790         
2791         if (aProps.contains(GEOM::propertyName( GEOM::Texture ))) {
2792           param = occParam + GEOM::propertyName( GEOM::Texture );
2793           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Texture )).toString().toStdString());
2794         }
2795
2796         if (vType == SVTK_Viewer::Type()) {
2797           if (aProps.contains(GEOM::propertyName( GEOM::Opacity ))) {
2798             param = occParam + GEOM::propertyName( GEOM::Opacity );
2799             ip->setParameter(entry, param.toStdString(), QString::number(1. - aProps.value(GEOM::propertyName( GEOM::Transparency )).toDouble()).toStdString());
2800           }
2801         } else if (vType == SOCC_Viewer::Type()) {
2802           if (aProps.contains(GEOM::propertyName( GEOM::Transparency ))) {
2803             param = occParam + GEOM::propertyName( GEOM::Transparency );
2804             ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Transparency )).toString().toStdString());
2805           }
2806
2807           if (aProps.contains(GEOM::propertyName( GEOM::TopLevel ))) {
2808             param = occParam + GEOM::propertyName( GEOM::TopLevel );
2809             ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::TopLevel )).toString().toStdString());
2810           }
2811         }
2812
2813         if (aProps.contains(GEOM::propertyName( GEOM::NbIsos ))) {
2814           param = occParam + GEOM::propertyName( GEOM::NbIsos );
2815           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::NbIsos )).toString().toStdString());
2816         }
2817
2818         if (aProps.contains(GEOM::propertyName( GEOM::EdgesDirection ))) {
2819           param = occParam + GEOM::propertyName( GEOM::EdgesDirection );
2820           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::EdgesDirection )).toString().toStdString());
2821         }
2822
2823         if (aProps.contains(GEOM::propertyName( GEOM::Vertices ))) {
2824           param = occParam + GEOM::propertyName( GEOM::Vertices );
2825           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Vertices )).toString().toStdString());
2826         }
2827
2828         if (aProps.contains(GEOM::propertyName( GEOM::Deflection ))) {
2829           param = occParam + GEOM::propertyName( GEOM::Deflection );
2830           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Deflection )).toString().toStdString());
2831         }
2832
2833         //Marker type of the vertex - ONLY for the "Vertex" and "Compound of the Vertex"
2834         if (aProps.contains(GEOM::propertyName( GEOM::PointMarker ))) {
2835           param = occParam + GEOM::propertyName( GEOM::PointMarker );
2836           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::PointMarker )).toString().toStdString());
2837         }
2838
2839         if (aProps.contains(GEOM::propertyName( GEOM::Material ))) {
2840           param = occParam + GEOM::propertyName( GEOM::Material );
2841           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Material )).toString().toStdString());
2842         }
2843
2844         if (aProps.contains(GEOM::propertyName( GEOM::LineWidth ))) {
2845              param = occParam + GEOM::propertyName( GEOM::LineWidth );
2846            ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::LineWidth )).toString().toStdString());
2847         }
2848
2849         if (aProps.contains(GEOM::propertyName( GEOM::IsosWidth ))) {
2850           param = occParam + GEOM::propertyName( GEOM::IsosWidth );
2851           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::IsosWidth )).toString().toStdString());
2852         }
2853       } // object iterator
2854     } // for (views)
2855   } // for (viewManagers)
2856
2857   // store dimension attributes of objects:
2858   // since the displayed object always persists in property map, we remember the object entries
2859   // on the passes when we store viewer related properties - to avoid extra iterations on GEOM component tree.
2860   QString aDimensionParam = OCCViewer_Viewer::Type() + GEOM::sectionSeparator() + GEOM::propertyName( GEOM::Dimensions );
2861   QSet<QString>::ConstIterator aEntryIt = anEntriesToStoreShared.constBegin();
2862   for ( ; aEntryIt != anEntriesToStoreShared.constEnd(); ++aEntryIt )
2863   {
2864     std::string aStudyEntry = (*aEntryIt).toLatin1().data();
2865     std::string aStoreEntry = ip->encodeEntry( aStudyEntry, componentName);
2866
2867     GEOMGUI_DimensionProperty aDimensions( appStudy, aStudyEntry );
2868
2869     if ( aDimensions.GetNumber() == 0 )
2870     {
2871       continue;
2872     }
2873
2874     ip->setParameter( aStoreEntry, aDimensionParam.toStdString(), ((QString)aDimensions).toLatin1().data() );
2875   }
2876 }
2877
2878 /*!
2879  * \brief Restore visual parameters
2880  *
2881  * This method is called after the study document is opened.
2882  * Restore visual parameters from AttributeParameter attribute(s)
2883  */
2884 void GeometryGUI::restoreVisualParameters (int savePoint)
2885 {
2886   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
2887   if (!appStudy || !appStudy->studyDS())
2888     return;
2889   _PTR(Study) studyDS = appStudy->studyDS();
2890
2891   // componentName is used for encoding of entries when storing them in IParameters
2892   std::string componentName = myComponentGeom->ComponentDataType();
2893   //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
2894   //if (!aSComponent) return;
2895
2896   // IParameters
2897   _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
2898                                                              componentName.c_str(),
2899                                                              savePoint);
2900   _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
2901
2902   std::vector<std::string> entries = ip->getEntries();
2903
2904   for (std::vector<std::string>::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt)
2905   {
2906     // entry is a normal entry - it should be "decoded" (setting base adress of component)
2907     QString entry (ip->decodeEntry(*entIt).c_str());
2908
2909     // Check that the entry corresponds to a real object in the Study
2910     // as the object may be deleted or modified after the visual state is saved.
2911     _PTR(SObject) so = studyDS->FindObjectID(entry.toLatin1().data());
2912     if (!so) continue; //Skip the not existent entry
2913
2914     std::vector<std::string> paramNames = ip->getAllParameterNames( *entIt );
2915     std::vector<std::string> paramValues = ip->getAllParameterValues( *entIt );
2916
2917     std::vector<std::string>::iterator namesIt = paramNames.begin();
2918     std::vector<std::string>::iterator valuesIt = paramValues.begin();
2919
2920     // actors are stored in a map after displaying of them for
2921     // quicker access in the future: map < viewID to actor >
2922     NCollection_DataMap<int, GEOM_Actor*          > vtkActors;
2923     NCollection_DataMap<int, Handle(GEOM_AISShape)> occActors;
2924
2925     QString viewerTypStr;
2926     QString viewIndexStr;
2927     int viewIndex;
2928     QVector<PropMap> aListOfMap;
2929
2930     for (; namesIt != paramNames.end(); ++namesIt, ++valuesIt)
2931     {
2932       // visual parameters are stored in strings as follows: 
2933       //   1) ViewerType_ViewIndex_ParamName
2934       //   2) ViewerType_ParamName (shared for GEOM module)
2935       // '_' is used as separator and should not be used in viewer type or parameter names.
2936       QStringList lst = QString((*namesIt).c_str()).split( GEOM::sectionSeparator(), QString::SkipEmptyParts);
2937
2938       bool isShared = lst.size() == 2;
2939       bool isViewer = lst.size() == 3;
2940       if ( !isShared && !isViewer )
2941       {
2942         continue;
2943       }
2944
2945       // shared visual parameters
2946       if ( isShared )
2947       {
2948         QString aParamNameStr( lst[1] );
2949         QString aValuesStr( (*valuesIt).c_str() );
2950
2951         // shared dimension properties are stored as attribute
2952         if ( aParamNameStr == GEOM::propertyName( GEOM::Dimensions ) )
2953         {
2954           GEOMGUI_DimensionProperty aDimensionProp( aValuesStr );
2955           aDimensionProp.SaveToAttribute( appStudy, entry.toLatin1().data() );
2956         }
2957
2958         continue;
2959       }
2960
2961       // per view visual parameters
2962       viewerTypStr = lst[0];
2963       viewIndexStr = lst[1];
2964       QString paramNameStr = lst[2];
2965
2966       bool ok;
2967       viewIndex = viewIndexStr.toUInt(&ok);
2968       if (!ok) // bad conversion of view index to integer
2969         continue;
2970
2971       if ((viewIndex + 1) > aListOfMap.count()) {
2972         aListOfMap.resize(viewIndex + 1);
2973       }
2974
2975       QString val((*valuesIt).c_str());
2976       if (paramNameStr == GEOM::propertyName( GEOM::Visibility )) {
2977         aListOfMap[viewIndex].insert(GEOM::propertyName( GEOM::Visibility ), val == "On");
2978       } else if (paramNameStr == GEOM::propertyName( GEOM::Opacity )) {
2979         aListOfMap[viewIndex].insert(GEOM::propertyName( GEOM::Transparency ), 1. - val.toDouble());
2980       } else if (paramNameStr == GEOM::propertyName( GEOM::Transparency )) {
2981         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Transparency ), val.toDouble() );
2982       } else if (paramNameStr == GEOM::propertyName( GEOM::TopLevel )) {
2983         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::TopLevel ), val == "true" || val == "1");
2984       } else if (paramNameStr == GEOM::propertyName( GEOM::DisplayMode )) {
2985         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::DisplayMode ), val.toInt());
2986       } else if (paramNameStr == GEOM::propertyName( GEOM::NbIsos )) {
2987         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::NbIsos ), val);
2988       } else if (paramNameStr == GEOM::propertyName( GEOM::Color )) {
2989         QStringList rgb = val.split(GEOM::subSectionSeparator());
2990         if (rgb.count() == 3) {
2991           QColor c = QColor::fromRgbF(rgb[0].toDouble(), rgb[1].toDouble(), rgb[2].toDouble());
2992           aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Color ), c);
2993         }
2994       } else if (paramNameStr == GEOM::propertyName( GEOM::Texture )) {
2995         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Texture ), val );
2996       } else if (paramNameStr == GEOM::propertyName( GEOM::EdgesDirection )) {
2997         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::EdgesDirection ), val == "true" || val == "1");
2998       } else if (paramNameStr == GEOM::propertyName( GEOM::Vertices )) {
2999         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Vertices ), val == "true" || val == "1");
3000       } else if (paramNameStr == GEOM::propertyName( GEOM::Deflection )) {
3001         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Deflection ), val.toDouble());
3002       } else if (paramNameStr == GEOM::propertyName( GEOM::PointMarker )) {
3003         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::PointMarker ), val);
3004       } else if (paramNameStr == GEOM::propertyName( GEOM::Material )) {
3005         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Material ), val);
3006       } else if (paramNameStr == GEOM::propertyName( GEOM::LineWidth )) {
3007         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::LineWidth ), val.toInt());
3008       } else if (paramNameStr == GEOM::propertyName( GEOM::IsosWidth )) {
3009         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::IsosWidth ), val.toInt());
3010       }
3011     } // for names/parameters iterator
3012
3013     QList<SUIT_ViewManager*> lst = getApp()->viewManagers();
3014
3015     for (int index = 0; index < aListOfMap.count(); index++) {
3016
3017       appStudy->setObjectPropMap(index, entry, aListOfMap[index]);
3018
3019       //Get Visibility property of the current PropMap
3020       if (aListOfMap[index].value(GEOM::propertyName( GEOM::Visibility )) == 1) {
3021         SUIT_ViewManager* vman = lst.at(index);
3022         SUIT_ViewModel* vmodel = vman->getViewModel();
3023         displayer()->Display(entry, true, dynamic_cast<SALOME_View*>(vmodel));
3024       }
3025     }
3026   } // for entries iterator
3027
3028   // update all VTK and OCC views
3029   QList<SUIT_ViewManager*> lst;
3030   getApp()->viewManagers(lst);
3031   for (QList<SUIT_ViewManager*>::Iterator it = lst.begin(); it != lst.end(); it++) {
3032     SUIT_ViewModel* vmodel = (*it)->getViewModel();
3033     if (!vmodel)
3034       continue;
3035     if (vmodel->getType() == SVTK_Viewer::Type()) {
3036       SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) (*it)->getActiveView();
3037       vtkView->getRenderer()->ResetCameraClippingRange();
3038       vtkView->Repaint();
3039     }
3040     else if (vmodel->getType() == SOCC_Viewer::Type()) {
3041       //SOCC_ViewWindow* occView = (SOCC_ViewWindow*) (*it)->getActiveView();
3042       SALOME_View* occVMod = dynamic_cast<SALOME_View*>(vmodel);
3043       if (occVMod)
3044         occVMod->Repaint();
3045     }
3046   }
3047 }
3048
3049 void GeometryGUI::onViewAboutToShow()
3050 {
3051   SUIT_ViewWindow* window = application()->desktop()->activeWindow();
3052   QAction* a = action( GEOMOp::OpSwitchVectors );
3053   QAction* aVerticesAction = action( GEOMOp::OpSwitchVertices );
3054   if ( window ) {
3055     a->setEnabled(true);
3056     bool vmode = window->property("VectorsMode").toBool();
3057     a->setText ( vmode == 1 ? tr( "MEN_VECTOR_MODE_OFF" ) : tr("MEN_VECTOR_MODE_ON") );
3058     aVerticesAction->setEnabled(true);
3059     vmode = window->property("VerticesMode").toBool();
3060     aVerticesAction->setText ( vmode == 1 ? tr( "MEN_VERTICES_MODE_OFF" ) : tr("MEN_VERTICES_MODE_ON") );
3061   } else {
3062     a->setText ( tr("MEN_VECTOR_MODE_ON") );
3063     a->setEnabled(false);
3064     aVerticesAction->setText ( tr("MEN_VERTICES_MODE_ON") );
3065     aVerticesAction->setEnabled(false);
3066   }
3067 }
3068
3069 /*!
3070   \brief Return action by id
3071   \param id identifier of the action
3072   \return action
3073 */
3074 QAction* GeometryGUI::getAction(const int id) {
3075   return action(id);
3076 }
3077
3078 /*!
3079   \brief GEOM module message handler
3080
3081   This method can be re-implemented in the subclasses.
3082   This is a GEOM module message handler.
3083
3084   \param msg the message received.
3085 */
3086 void GeometryGUI::message(const QString& msg)
3087 {
3088   // dispatch message
3089   QStringList data = msg.split("/");
3090   const int nbStrings = data.count();
3091
3092   if (nbStrings > 0) {
3093     if (data[0] == "modified") {
3094       // get mesh entry
3095       QString anIOR = nbStrings > 1 ? data[1] : QString();
3096
3097       if ( anIOR.isEmpty() ) {
3098         return;
3099       }
3100
3101       // Get the geom object.
3102       GEOM::GEOM_Object_ptr anObj = GeometryGUI::GetObjectFromIOR (anIOR);
3103
3104       // Clear the shape buffer
3105       GeometryGUI::ClearShapeBuffer (anObj);
3106     }
3107   }
3108 }
3109
3110 /*!
3111   \brief Clears the shape buffer.
3112
3113   This is a static method. It clears the shape buffer.
3114
3115   \param theObj the object
3116 */
3117 void GeometryGUI::ClearShapeBuffer( GEOM::GEOM_Object_ptr theObj )
3118 {
3119   if ( CORBA::is_nil( theObj ) )
3120     return;
3121
3122   CORBA::String_var IOR = SalomeApp_Application::orb()->object_to_string( theObj );
3123   TCollection_AsciiString asciiIOR( (char *)IOR.in() );
3124   GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
3125
3126   SALOMEDSClient_StudyManager *aManager = SalomeApp_Application::studyMgr();
3127
3128   if (!aManager)
3129     return;
3130
3131   _PTR(Study) aStudy = aManager->GetStudyByID(theObj->GetStudyID());
3132
3133   if ( !aStudy )
3134     return;
3135
3136   _PTR(SObject) aSObj ( aStudy->FindObjectIOR( std::string( IOR ) ) );
3137   if ( !aSObj )
3138     return;
3139
3140   _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) );
3141   for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) {
3142     _PTR(GenericAttribute) anAttr;
3143     if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) {
3144       _PTR(AttributeIOR) anIOR ( anAttr );
3145       TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() );
3146       GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
3147     }
3148   }
3149 }
3150
3151 /*!
3152   \brief Returns the object from IOR.
3153
3154   This is a static method. It returns the object from its IOR.
3155
3156   \param IOR object IOR
3157   \return GEOM object.
3158 */
3159 GEOM::GEOM_Object_ptr GeometryGUI::GetObjectFromIOR( const QString& IOR )
3160 {
3161   GEOM::GEOM_Object_var geomObj;
3162   if ( !IOR.isEmpty() ) {
3163     CORBA::Object_var corbaObj = SalomeApp_Application::orb()->string_to_object
3164       ( IOR.toLatin1().constData() );
3165     if ( !CORBA::is_nil( corbaObj ) )
3166       geomObj = GEOM::GEOM_Object::_narrow( corbaObj );
3167   }
3168   return geomObj._retn();
3169 }
3170
3171 /*!
3172   \brief Returns IOR of the object.
3173
3174   This is a static method. It returns the object's IOR.
3175
3176   \param object the GEOM object.
3177   \return object's IOR.
3178 */
3179 QString GeometryGUI::GetIORFromObject( GEOM::GEOM_Object_ptr object )
3180 {
3181   QString IOR;
3182   if ( !CORBA::is_nil( object ) ) {
3183     CORBA::String_var anIOR =
3184       SalomeApp_Application::orb()->object_to_string( object );
3185     IOR = anIOR.in();
3186   }
3187   return IOR;
3188 }
3189
3190 /*!
3191   \brief Check if this object is can't be renamed in place
3192
3193   This method can be re-implemented in the subclasses.
3194   Return true in case if object isn't reference or component (module root).
3195
3196   \param entry column id
3197   \return \c true if the item can be renamed by the user in place (e.g. in the Object browser)
3198 */
3199 bool GeometryGUI::renameAllowed( const QString& entry) const {
3200
3201   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
3202   SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
3203   SalomeApp_DataObject* obj = appStudy ? dynamic_cast<SalomeApp_DataObject*>(appStudy->findObjectByEntry(entry)) : 0;
3204
3205   return (app && appStudy && obj && !appStudy->isComponent(entry) && !obj->isReference());
3206 }
3207
3208 /*!
3209   Rename object by entry.
3210   \param entry entry of the object
3211   \param name new name of the object
3212   \brief Return \c true if rename operation finished successfully, \c false otherwise.
3213 */
3214 bool GeometryGUI::renameObject( const QString& entry, const QString& name)
3215 {
3216   bool result = false;
3217
3218   SalomeApp_Application* app =
3219     dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication());
3220   SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
3221
3222   if (!appStudy)
3223     return result;
3224
3225   _PTR(Study) aStudy = appStudy->studyDS();
3226
3227   if (!aStudy)
3228     return result;
3229
3230   bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
3231   if ( aLocked ) {
3232     SUIT_MessageBox::warning ( app->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
3233     return result;
3234   }
3235
3236   _PTR(SObject) obj ( aStudy->FindObjectID(qPrintable(entry)) );
3237   _PTR(GenericAttribute) anAttr;
3238   if ( obj ) {
3239     if ( obj->FindAttribute(anAttr, "AttributeName") ) {
3240       _PTR(AttributeName) aName (anAttr);
3241
3242       aName->SetValue( name.toLatin1().data() ); // rename the SObject
3243       GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(obj));
3244       if (!CORBA::is_nil(anObj)) {
3245         anObj->SetName( name.toLatin1().data() );  // Rename the corresponding GEOM_Object
3246         emit SignalDependencyTreeRenameObject( anObj->GetEntry() );
3247       }
3248       result = true;
3249     }
3250   }
3251   return result;
3252 }
3253
3254 void GeometryGUI::updateMaterials()
3255 {
3256   LightApp_Preferences* pref = preferences();
3257   if ( pref ) {
3258     QStringList materials = Material_ResourceMgr::resourceMgr()->materials();
3259     QString currentMaterial = SUIT_Session::session()->resourceMgr()->stringValue( "Geometry", "material" );
3260     if ( !materials.contains( currentMaterial ) )
3261       // user material set as default in the preferences, might be removed
3262       SUIT_Session::session()->resourceMgr()->setValue( "Geometry", "material", QString( "Plastic" ) );
3263
3264     QtxPreferenceItem* prefItem = pref->rootItem()->findItem( tr( "PREF_MATERIAL" ), true );
3265     if ( prefItem ) {
3266       setPreferenceProperty( prefItem->id(),
3267                              "strings", materials );
3268       prefItem->retrieve();
3269     }
3270   }
3271 }
3272
3273 /*!
3274   \brief Check if the module allows "drag" operation of its objects.
3275
3276   Overloaded from LightApp_Module class.
3277   
3278   This function is a part of the general drag-n-drop mechanism.
3279   The goal of this function is to check data object passed as a parameter
3280   and decide if it can be dragged or no.
3281
3282   \param what data object being tested for drag operation
3283   \return \c true if module allows dragging of the specified object
3284   \sa isDropAccepted(), dropObjects()
3285 */
3286 bool GeometryGUI::isDraggable( const SUIT_DataObject* what ) const
3287 {
3288   // we allow dragging object under root and object from folder
3289   int aLevel = what->level();
3290   bool anObjectInFolder = false;
3291   if ( aLevel > 2 ) {
3292     const SalomeApp_DataObject* dataObj = dynamic_cast<const SalomeApp_DataObject*>( what );
3293     if ( dataObj ) {
3294       _PTR(SObject) aSO = dataObj->object();
3295       if ( aSO ) {
3296         _PTR(GenericAttribute) anAttr;
3297         _PTR(SObject) aFatherSO = aSO->GetStudy()->GetUseCaseBuilder()->GetFather( aSO );
3298         if ( aFatherSO && aFatherSO->FindAttribute(anAttr, "AttributeLocalID") ) {
3299           _PTR(AttributeLocalID) aLocalID( anAttr );
3300           anObjectInFolder = aLocalID->Value() == 999;
3301         }
3302       }
3303     }
3304   }
3305   return aLevel == 2 || anObjectInFolder;
3306 }
3307
3308 /*!
3309   \brief Check if the module allows "drop" operation on the given object.
3310
3311   Overloaded from LightApp_Module class.
3312
3313   This function is a part of the general drag-n-drop mechanism.
3314   The goal of this function is to check data object passed as a parameter
3315   and decide if it can be used as a target for the "drop" operation.
3316   The processing of the drop operation itself is done in the dropObjects() function.
3317
3318   \param where target data object
3319   \return \c true if module supports dropping on the \a where data object
3320   \sa isDraggable(), dropObjects()
3321 */
3322 bool GeometryGUI::isDropAccepted( const SUIT_DataObject* where ) const
3323 {
3324   // we allow dropping into folder and top-level GEOM object
3325   int aLevel = where->level();
3326   bool isFolder = false;
3327   if ( aLevel > 1 ) {
3328     const SalomeApp_DataObject* dataObj = dynamic_cast<const SalomeApp_DataObject*>( where );
3329     if ( dataObj ) {
3330       _PTR(SObject) aSO = dataObj->object();
3331       if ( aSO ) {
3332         _PTR(GenericAttribute) anAttr;
3333         if ( aSO->FindAttribute(anAttr, "AttributeLocalID") ) {
3334           _PTR(AttributeLocalID) aLocalID( anAttr );
3335           isFolder = aLocalID->Value() == 999;
3336         }
3337       }
3338     }
3339   }
3340   return aLevel == 1 || isFolder;
3341 }
3342
3343 /*!
3344   \brief Complete drag-n-drop operation.
3345   
3346   Overloaded from LightApp_Module class.
3347
3348   This function is a part of the general drag-n-drop mechanism.
3349   Its goal is to handle dropping of the objects being dragged according
3350   to the chosen operation (move). The dropping is performed in the
3351   context of the parent data object \a where and the \a row (position in the 
3352   children index) at which the data should be dropped. If \a row is equal to -1,
3353   this means that objects are added to the end of the children list.
3354
3355   \param what objects being dropped
3356   \param where target data object
3357   \param row child index at which the drop operation is performed
3358   \param action drag-n-drop operation (Qt::DropAction) - move
3359
3360   \sa isDraggable(), isDropAccepted()
3361 */
3362 void GeometryGUI::dropObjects( const DataObjectList& what, SUIT_DataObject* where,
3363                                const int row, Qt::DropAction action )
3364 {
3365   if (action != Qt::CopyAction && action != Qt::MoveAction)
3366     return; // unsupported action
3367
3368   // get parent object
3369   SalomeApp_DataObject* dataObj = dynamic_cast<SalomeApp_DataObject*>( where );
3370   if ( !dataObj ) return; // wrong parent
3371   _PTR(SObject) parentObj = dataObj->object();
3372
3373   // Find the current Study and StudyBuilder
3374   _PTR(Study) aStudy = parentObj->GetStudy();
3375   _PTR(UseCaseBuilder) aUseCaseBuilder = aStudy->GetUseCaseBuilder();
3376   // collect all parents of the target node
3377   QStringList parentIDs;
3378   _PTR(SObject) parent = parentObj;
3379   while( !parent->IsNull() ) {
3380     parentIDs << parent->GetID().c_str();
3381     parent = aUseCaseBuilder->GetFather(parent);
3382   }
3383
3384   // collect objects being dropped
3385   GEOM::object_list_var objects = new GEOM::object_list();
3386   objects->length( what.count() );
3387   int count = 0;
3388   for ( int i = 0; i < what.count(); i++ ) {
3389     dataObj = dynamic_cast<SalomeApp_DataObject*>( what[i] );
3390     if ( !dataObj ) continue;  // skip wrong objects
3391     _PTR(SObject) sobj = dataObj->object();
3392     // check that dropped object is not a parent of target object
3393     if ( parentIDs.contains( sobj->GetID().c_str() ) ) {
3394       return; // it's not allowed to move node into it's child 
3395     }
3396     objects[i] = _CAST(SObject, sobj)->GetSObject();
3397     count++;
3398   }
3399   objects->length( count );
3400
3401   // call engine function
3402   GetGeomGen()->Move( objects.in(),                              // what
3403                       _CAST(SObject, parentObj)->GetSObject(),   // where
3404                       row );                                     // row
3405
3406   // update Object browser
3407   getApp()->updateObjectBrowser( false );
3408 }