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