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