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