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