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