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