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