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