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