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