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