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