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