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