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