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