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