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