Salome HOME
1a344a25453d01b721e800faf10dae466a43e29d
[modules/geom.git] / src / GEOMGUI / GeometryGUI.cxx
1 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 //  File   : GeometryGUI.cxx
23 //  Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
24
25 #include <Standard_math.hxx>  // E.A. must be included before Python.h to fix compilation on windows
26 #ifdef HAVE_FINITE
27 #undef HAVE_FINITE            // VSR: avoid compilation warning on Linux : "HAVE_FINITE" redefined
28 #endif
29 #include "Python.h"
30 #include "GeometryGUI.h"
31 #include "GeometryGUI_Operations.h"
32 #include "GEOMGUI_OCCSelector.h"
33 #include "GEOMGUI_Selection.h"
34 #include "GEOM_Constants.h"
35 #include "GEOM_Displayer.h"
36 #include "GEOM_AISShape.hxx"
37
38 #include "GEOM_Actor.h"
39
40 #include <Material_ResourceMgr.h>
41
42 #include <SUIT_Desktop.h>
43 #include <SUIT_MessageBox.h>
44 #include <SUIT_ResourceMgr.h>
45 #include <SUIT_Session.h>
46 #include <SUIT_ViewManager.h>
47
48 #include <OCCViewer_ViewWindow.h>
49 #include <OCCViewer_ViewPort3d.h>
50 #include <OCCViewer_ViewModel.h>
51 #include <OCCViewer_ViewManager.h>
52
53 #include <SOCC_ViewModel.h>
54 #include <SOCC_ViewWindow.h>
55
56 #include <SVTK_ViewWindow.h>
57 #include <SVTK_RenderWindowInteractor.h>
58 #include <SVTK_InteractorStyle.h>
59 #include <SVTK_ViewModel.h>
60
61 #include <SalomeApp_Application.h>
62 #include <SalomeApp_DataObject.h>
63 #include <SalomeApp_Study.h>
64
65 #include <LightApp_SelectionMgr.h>
66 #include <LightApp_VTKSelector.h>
67 #include <LightApp_DataObject.h>
68 #include <LightApp_Preferences.h>
69
70 #include <SALOME_LifeCycleCORBA.hxx>
71 #include <SALOME_ListIO.hxx>
72 #include <SALOME_ListIteratorOfListIO.hxx>
73
74 #include <SALOMEDSClient_ClientFactory.hxx>
75 #include <SALOMEDSClient_IParameters.hxx>
76
77 #include <Basics_OCCTVersion.hxx>
78
79 // External includes
80 #include <QMenu>
81 #include <QTime>
82 #include <QAction>
83 #include <QFileInfo>
84 #include <QString>
85 #include <QPainter>
86
87 #include <AIS_Drawer.hxx>
88 #include <AIS_ListOfInteractive.hxx>
89 #include <AIS_ListIteratorOfListOfInteractive.hxx>
90 #include <Prs3d_Drawer.hxx>
91 #include <Prs3d_IsoAspect.hxx>
92 #include <Aspect_TypeOfMarker.hxx>
93 #include <OSD_SharedLibrary.hxx>
94 #include <NCollection_DataMap.hxx>
95
96 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
97 #include <TColStd_HArray1OfByte.hxx>
98 #else
99 #include <Graphic3d_HArray1OfBytes.hxx>
100 #endif
101
102 #include <utilities.h>
103
104 #include <vtkCamera.h>
105 #include <vtkRenderer.h>
106
107 #include <GEOM_version.h>
108
109
110 #include "GEOMImpl_Types.hxx"
111
112 extern "C" {
113   Standard_EXPORT CAM_Module* createModule() {
114     return new GeometryGUI();
115   }
116
117   Standard_EXPORT char* getModuleVersion() {
118     return (char*)GEOM_VERSION_STR;
119   }
120 }
121
122 GeometryGUI::StudyTextureMap GeometryGUI::myTextureMap;
123
124 GEOM::GEOM_Gen_var GeometryGUI::myComponentGeom = GEOM::GEOM_Gen::_nil();
125
126 GEOM::GEOM_Gen_var GeometryGUI::GetGeomGen()
127 {
128   // Bug 12290: exception in Mesh GUI on GEOMBase::GetShape() if Geometry GUI hasn't been loaded
129   if (CORBA::is_nil(myComponentGeom))
130     InitGeomGen();
131   return GeometryGUI::myComponentGeom;
132 }
133
134 bool GeometryGUI::InitGeomGen()
135 {
136   GeometryGUI aGG;
137   if( CORBA::is_nil( myComponentGeom ) ) return false;
138   return true;
139 }
140
141 //=======================================================================
142 // function : ClientSObjectToObject
143 // purpose  :
144 //=======================================================================
145 CORBA::Object_var GeometryGUI::ClientSObjectToObject (_PTR(SObject) theSObject)
146 {
147   _PTR(GenericAttribute) anAttr;
148   CORBA::Object_var anObj;
149   try {
150     std::string aValue = theSObject->GetIOR();
151     if (strcmp(aValue.c_str(), "") != 0) {
152       CORBA::ORB_ptr anORB = SalomeApp_Application::orb();
153       anObj = anORB->string_to_object(aValue.c_str());
154     }
155   } catch(...) {
156     INFOS("ClientSObjectToObject - Unknown exception was occured!!!");
157   }
158   return anObj._retn();
159 }
160
161 //=======================================================================
162 // function : ClientStudyToStudy
163 // purpose  :
164 //=======================================================================
165 SALOMEDS::Study_var GeometryGUI::ClientStudyToStudy (_PTR(Study) theStudy)
166 {
167   SALOME_NamingService *aNamingService = SalomeApp_Application::namingService();
168   CORBA::Object_var aSMObject = aNamingService->Resolve("/myStudyManager");
169   SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow(aSMObject);
170   int aStudyID = theStudy->StudyId();
171   SALOMEDS::Study_var aDSStudy = aStudyManager->GetStudyByID(aStudyID);
172   return aDSStudy._retn();
173 }
174
175 void GeometryGUI::Modified( bool theIsUpdateActions )
176 {
177   if( SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() ) ) {
178     if( SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) ) {
179       appStudy->Modified();
180       if( theIsUpdateActions )
181         app->updateActions();
182     }
183   }
184 }
185
186 //=======================================================================
187 // function : GeometryGUI::GeometryGUI()
188 // purpose  : Constructor
189 //=======================================================================
190 GeometryGUI::GeometryGUI() :
191   SalomeApp_Module( "GEOM" ),
192   LightApp_Module( "GEOM" )
193 {
194   if ( CORBA::is_nil( myComponentGeom ) )
195   {
196     Engines::EngineComponent_var comp =
197       SalomeApp_Application::lcc()->FindOrLoad_Component( "FactoryServer", "GEOM" );
198     myComponentGeom = GEOM::GEOM_Gen::_narrow( comp );
199   }
200
201   myActiveDialogBox = 0;
202
203   gp_Pnt origin = gp_Pnt(0., 0., 0.);
204   gp_Dir direction = gp_Dir(0., 0., 1.);
205   myWorkingPlane = gp_Ax3(origin, direction);
206
207   myDisplayer = 0;
208   myLocalSelectionMode = GEOM_ALLOBJECTS;
209 }
210
211 //=======================================================================
212 // function : GeometryGUI::~GeometryGUI()
213 // purpose  : Destructor
214 //=======================================================================
215 GeometryGUI::~GeometryGUI()
216 {
217   while (!myOCCSelectors.isEmpty())
218     delete myOCCSelectors.takeFirst();
219
220   while (!myVTKSelectors.isEmpty())
221     delete myVTKSelectors.takeFirst();
222
223   qDeleteAll(myGUIMap);
224 }
225
226 //=======================================================================
227 // function : GeometryGUI::getLibrary()
228 // purpose  : get or load GUI library by name [ internal ]
229 //=======================================================================
230 typedef GEOMGUI* (*LibraryGUI)( GeometryGUI* );
231 GEOMGUI* GeometryGUI::getLibrary( const QString& libraryName )
232 {
233   if ( !myGUIMap.contains( libraryName ) ) {
234     // try to load library if it is not loaded yet
235 #ifndef WNT
236     QString dirs = getenv( "LD_LIBRARY_PATH" );
237     QString sep  = ":";
238 #else
239     QString dirs = getenv( "PATH" );
240     QString sep  = ";";
241 #endif
242     if ( !dirs.isEmpty() ) {
243       QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries
244       QListIterator<QString> it( dirList ); it.toBack();
245       while ( it.hasPrevious() ) {
246         QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName );
247         if ( fi.exists() ) {
248           OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() );
249           bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY );
250           if ( !res ) {
251             MESSAGE( "Can't open library : " << aSharedLibrary.DlError() );
252             continue; // continue search further
253           }
254           OSD_Function osdF = aSharedLibrary.DlSymb( "GetLibGUI" );
255           if ( osdF != NULL ) {
256             LibraryGUI func = (GEOMGUI* (*) (GeometryGUI*))osdF;
257             GEOMGUI* libGUI = (*func)( this );
258             if ( libGUI ) {
259               myGUIMap[ libraryName ] = libGUI;
260               break; // found and loaded!
261             }
262           }
263         }
264       }
265     }
266   }
267   return myGUIMap.contains( libraryName ) ? myGUIMap[ libraryName ] : 0;
268 }
269
270 //=======================================================================
271 // function : GeometryGUI::ActiveWorkingPlane()
272 // purpose  : Activate Working Plane View
273 //=======================================================================
274 void GeometryGUI::ActiveWorkingPlane()
275 {
276   gp_Dir DZ = myWorkingPlane.Direction();
277   gp_Dir DY = myWorkingPlane.YDirection();
278
279   SUIT_ViewWindow* window = application()->desktop()->activeWindow();
280   bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
281   bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
282
283   if( ViewOCC ) {
284     OCCViewer_ViewWindow* vw = dynamic_cast<OCCViewer_ViewWindow*>( window );
285     if ( vw ) {
286       Handle(V3d_View) view3d =  vw->getViewPort()->getView();
287
288       view3d->SetProj(DZ.X(), DZ.Y(), DZ.Z());
289       view3d->SetUp(DY.X(), DY.Y(), DY.Z());
290       vw->onViewFitAll(); 
291     }
292   }
293   else if( ViewVTK ) {
294     SVTK_ViewWindow* vw = dynamic_cast<SVTK_ViewWindow*>( window );
295     if ( vw ) {
296       vtkCamera* camera = vw->getRenderer()->GetActiveCamera();
297
298       camera->SetPosition(DZ.X(), DZ.Y(), DZ.Z());
299       camera->SetViewUp(DY.X(), DY.Y(), DY.Z());
300       camera->SetFocalPoint(0,0,0);
301
302       vw->onFitAll();
303     }
304   }
305 }
306
307 //=======================================================================
308 // function : GeometryGUI::SetActiveDialogBox()
309 // purpose  : Set active dialog box
310 //=======================================================================
311 void GeometryGUI::SetActiveDialogBox( QDialog* aDlg )
312 {
313   myActiveDialogBox = (QDialog*)aDlg;
314 }
315
316 //=======================================================================
317 // function : GeometryGUI::EmitSignalDeactivateDialog()
318 // purpose  : Emit a signal to deactivate the active dialog Box
319 //=======================================================================
320 void GeometryGUI::EmitSignalDeactivateDialog()
321 {
322   emit SignalDeactivateActiveDialog();
323 }
324
325 //=======================================================================
326 // function : GeometryGUI::EmitSignalCloseAllDialogs()
327 // purpose  : Emit a signal to close all non modal dialogs box
328 //=======================================================================
329 void GeometryGUI::EmitSignalCloseAllDialogs()
330 {
331   emit SignalCloseAllDialogs();
332 }
333
334 //=======================================================================
335 // function : GeometryGUI::EmitSignalDefaultStepValueChanged()
336 // purpose  : Emit a signal to inform that default real spin box step has
337 //            been changed
338 //=======================================================================
339 void GeometryGUI::EmitSignalDefaultStepValueChanged(double newVal)
340 {
341   emit SignalDefaultStepValueChanged(newVal);
342 }
343
344 //=======================================================================
345 // function : GeometryGUI::OnGUIEvent()
346 // purpose  : common slot for all menu/toolbar actions
347 //=======================================================================
348 void GeometryGUI::OnGUIEvent()
349 {
350   const QObject* obj = sender();
351   if ( !obj || !obj->inherits( "QAction" ) )
352     return;
353   int id = actionId((QAction*)obj);
354   if ( id != -1 )
355     OnGUIEvent( id );
356 }
357
358 //=======================================================================
359 // function : GeometryGUI::OnGUIEvent()
360 // purpose  : manage all events on GUI [static]
361 //=======================================================================
362 void GeometryGUI::OnGUIEvent( int id )
363 {
364   SUIT_Application* anApp = application();
365   if (!anApp) return;
366   SUIT_Desktop* desk = anApp->desktop();
367
368   // check type of the active viewframe
369   SUIT_ViewWindow* window = desk->activeWindow();
370   bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
371   bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
372   // if current viewframe is not of OCC and not of VTK type - return immediately
373   // fix for IPAL8958 - allow some commands to execute even when NO viewer is active (rename for example)
374   QList<int> NotViewerDependentCommands;
375   NotViewerDependentCommands << GEOMOp::OpDelete
376                              << GEOMOp::OpShow
377                              << GEOMOp::OpShowOnly
378                              << GEOMOp::OpShowChildren
379                              << GEOMOp::OpHideChildren
380                              << GEOMOp::OpUnpublishObject
381                              << GEOMOp::OpPublishObject
382                              << GEOMOp::OpPointMarker;
383   if ( !ViewOCC && !ViewVTK && !NotViewerDependentCommands.contains( id ) )
384       return;
385
386   // fix for IPAL9103, point 2
387   if ( CORBA::is_nil( GetGeomGen() ) ) {
388     SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_GET_ENGINE" ), tr( "GEOM_BUT_OK" ) );
389     return;
390   }
391
392   QString libName;
393   // find corresponding GUI library
394   switch ( id ) {
395   case GEOMOp::OpOriginAndVectors:   // MENU BASIC - ORIGIN AND BASE VECTORS
396     createOriginAndBaseVectors(); // internal operation
397     return;
398   case GEOMOp::OpImport:             // MENU FILE - IMPORT
399   case GEOMOp::OpExport:             // MENU FILE - EXPORT
400   case GEOMOp::OpSelectVertex:       // POPUP MENU - SELECT ONLY - VERTEX
401   case GEOMOp::OpSelectEdge:         // POPUP MENU - SELECT ONLY - EDGE
402   case GEOMOp::OpSelectWire:         // POPUP MENU - SELECT ONLY - WIRE
403   case GEOMOp::OpSelectFace:         // POPUP MENU - SELECT ONLY - FACE
404   case GEOMOp::OpSelectShell:        // POPUP MENU - SELECT ONLY - SHELL
405   case GEOMOp::OpSelectSolid:        // POPUP MENU - SELECT ONLY - SOLID
406   case GEOMOp::OpSelectCompound:     // POPUP MENU - SELECT ONLY - COMPOUND
407   case GEOMOp::OpSelectAll:          // POPUP MENU - SELECT ONLY - SELECT ALL
408   case GEOMOp::OpDelete:             // MENU EDIT - DELETE
409   case GEOMOp::OpCheckGeom:          // MENU TOOLS - CHECK GEOMETRY
410   case GEOMOp::OpDeflection:         // POPUP MENU - DEFLECTION COEFFICIENT
411   case GEOMOp::OpColor:              // POPUP MENU - COLOR
412   case GEOMOp::OpSetTexture:         // POPUP MENU - SETTEXTURE
413   case GEOMOp::OpTransparency:       // POPUP MENU - TRANSPARENCY
414   case GEOMOp::OpIncrTransparency:   // SHORTCUT   - INCREASE TRANSPARENCY
415   case GEOMOp::OpDecrTransparency:   // SHORTCUT   - DECREASE TRANSPARENCY
416   case GEOMOp::OpIsos:               // POPUP MENU - ISOS
417   case GEOMOp::OpIncrNbIsos:         // SHORTCUT   - INCREASE NB ISOS
418   case GEOMOp::OpDecrNbIsos:         // SHORTCUT   - DECREASE NB ISOS
419   case GEOMOp::OpAutoColor:          // POPUP MENU - AUTO COLOR
420   case GEOMOp::OpNoAutoColor:        // POPUP MENU - DISABLE AUTO COLOR
421   case GEOMOp::OpShowChildren:       // POPUP MENU - SHOW CHILDREN
422   case GEOMOp::OpHideChildren:       // POPUP MENU - HIDE CHILDREN
423   case GEOMOp::OpUnpublishObject:    // POPUP MENU - UNPUBLISH
424   case GEOMOp::OpPublishObject:      // ROOT GEOM OBJECT - POPUP MENU - PUBLISH
425   case GEOMOp::OpPointMarker:        // POPUP MENU - POINT MARKER
426   case GEOMOp::OpMaterialProperties: // POPUP MENU - MATERIAL PROPERTIES
427   case GEOMOp::OpEdgeWidth:          // POPUP MENU - LINE WIDTH - EDGE WIDTH
428   case GEOMOp::OpIsosWidth:          // POPUP MENU - LINE WIDTH - ISOS WIDTH
429   case GEOMOp::OpBringToFront:       // POPUP MENU - BRING TO FRONT
430   case GEOMOp::OpClsBringToFront:    //
431     libName = "GEOMToolsGUI";
432     break;
433   case GEOMOp::OpDMWireframe:        // MENU VIEW - WIREFRAME
434   case GEOMOp::OpDMShading:          // MENU VIEW - SHADING
435   case GEOMOp::OpDMShadingWithEdges: // MENU VIEW - SHADING
436   case GEOMOp::OpShowAll:            // MENU VIEW - SHOW ALL
437   case GEOMOp::OpShowOnly:           // MENU VIEW - DISPLAY ONLY
438   case GEOMOp::OpHideAll:            // MENU VIEW - ERASE ALL
439   case GEOMOp::OpHide:               // MENU VIEW - ERASE
440   case GEOMOp::OpShow:               // MENU VIEW - DISPLAY
441   case GEOMOp::OpSwitchVectors:      // MENU VIEW - VECTOR MODE
442   case GEOMOp::OpWireframe:          // POPUP MENU - WIREFRAME
443   case GEOMOp::OpShading:            // POPUP MENU - SHADING
444   case GEOMOp::OpShadingWithEdges:   // POPUP MENU - SHADING WITH EDGES
445   case GEOMOp::OpTexture:            // POPUP MENU - TEXTURE
446   case GEOMOp::OpVectors:            // POPUP MENU - VECTORS
447     libName = "DisplayGUI";
448     break;
449   case GEOMOp::OpPoint:              // MENU BASIC - POINT
450   case GEOMOp::OpLine:               // MENU BASIC - LINE
451   case GEOMOp::OpCircle:             // MENU BASIC - CIRCLE
452   case GEOMOp::OpEllipse:            // MENU BASIC - ELLIPSE
453   case GEOMOp::OpArc:                // MENU BASIC - ARC
454   case GEOMOp::OpVector:             // MENU BASIC - VECTOR
455   case GEOMOp::OpPlane:              // MENU BASIC - PLANE
456   case GEOMOp::OpCurve:              // MENU BASIC - CURVE
457   case GEOMOp::OpLCS:                // MENU BASIC - LOCAL COORDINATE SYSTEM
458     libName = "BasicGUI";
459     break;
460   case GEOMOp::OpBox:                // MENU PRIMITIVE - BOX
461   case GEOMOp::OpCylinder:           // MENU PRIMITIVE - CYLINDER
462   case GEOMOp::OpSphere:             // MENU PRIMITIVE - SPHERE
463   case GEOMOp::OpTorus:              // MENU PRIMITIVE - TORUS
464   case GEOMOp::OpCone:               // MENU PRIMITIVE - CONE
465   case GEOMOp::OpRectangle:          // MENU PRIMITIVE - FACE
466   case GEOMOp::OpDisk:               // MENU PRIMITIVE - DISK
467     libName = "PrimitiveGUI";
468     break;
469   case GEOMOp::OpPrism:              // MENU GENERATION - PRISM
470   case GEOMOp::OpRevolution:         // MENU GENERATION - REVOLUTION
471   case GEOMOp::OpFilling:            // MENU GENERATION - FILLING
472   case GEOMOp::OpPipe:               // MENU GENERATION - PIPE
473     libName = "GenerationGUI";
474     break;
475   case GEOMOp::Op2dSketcher:         // MENU ENTITY - SKETCHER
476   case GEOMOp::Op3dSketcher:         // MENU ENTITY - 3D SKETCHER
477   case GEOMOp::OpExplode:            // MENU ENTITY - EXPLODE
478 #ifdef WITH_OPENCV
479   case GEOMOp::OpFeatureDetect:      // MENU ENTITY - FEATURE DETECTION
480 #endif
481   case GEOMOp::OpPictureImport:      // MENU ENTITY - IMPORT PICTURE IN VIEWER
482     libName = "EntityGUI";
483     break;
484   case GEOMOp::OpEdge:               // MENU BUILD - EDGE
485   case GEOMOp::OpWire:               // MENU BUILD - WIRE
486   case GEOMOp::OpFace:               // MENU BUILD - FACE
487   case GEOMOp::OpShell:              // MENU BUILD - SHELL
488   case GEOMOp::OpSolid:              // MENU BUILD - SOLID
489   case GEOMOp::OpCompound:           // MENU BUILD - COMPUND
490     libName = "BuildGUI";
491     break;
492   case GEOMOp::OpFuse:               // MENU BOOLEAN - FUSE
493   case GEOMOp::OpCommon:             // MENU BOOLEAN - COMMON
494   case GEOMOp::OpCut:                // MENU BOOLEAN - CUT
495   case GEOMOp::OpSection:            // MENU BOOLEAN - SECTION
496     libName = "BooleanGUI";
497     break;
498   case GEOMOp::OpTranslate:          // MENU TRANSFORMATION - TRANSLATION
499   case GEOMOp::OpRotate:             // MENU TRANSFORMATION - ROTATION
500   case GEOMOp::OpChangeLoc:          // MENU TRANSFORMATION - LOCATION
501   case GEOMOp::OpMirror:             // MENU TRANSFORMATION - MIRROR
502   case GEOMOp::OpScale:              // MENU TRANSFORMATION - SCALE
503   case GEOMOp::OpOffset:             // MENU TRANSFORMATION - OFFSET
504   case GEOMOp::OpProjection:         // MENU TRANSFORMATION - PROJECTION
505   case GEOMOp::OpMultiTranslate:     // MENU TRANSFORMATION - MULTI-TRANSLATION
506   case GEOMOp::OpMultiRotate:        // MENU TRANSFORMATION - MULTI-ROTATION
507   case GEOMOp::OpReimport:           // CONTEXT(POPUP) MENU - RELOAD_IMPORTED
508     libName = "TransformationGUI";
509     break;
510   case GEOMOp::OpPartition:          // MENU OPERATION - PARTITION
511   case GEOMOp::OpArchimede:          // MENU OPERATION - ARCHIMEDE
512   case GEOMOp::OpFillet3d:           // MENU OPERATION - FILLET
513   case GEOMOp::OpChamfer:            // MENU OPERATION - CHAMFER
514   case GEOMOp::OpClipping:           // MENU OPERATION - CLIPPING RANGE
515   case GEOMOp::OpShapesOnShape:      // MENU OPERATION - GET SHAPES ON SHAPE
516   case GEOMOp::OpFillet2d:           // MENU OPERATION - FILLET 2D
517   case GEOMOp::OpFillet1d:           // MENU OPERATION - FILLET 1D
518   case GEOMOp::OpSharedShapes:       // MENU OPERATION - GET SHARED SHAPES
519   case GEOMOp::OpExtrudedBoss:       // MENU OPERATION - EXTRUDED BOSS
520   case GEOMOp::OpExtrudedCut:        // MENU OPERATION - EXTRUDED CUT
521     libName = "OperationGUI";
522     break;
523   case GEOMOp::OpSewing:             // MENU REPAIR - SEWING
524   case GEOMOp::OpSuppressFaces:      // MENU REPAIR - SUPPRESS FACES
525   case GEOMOp::OpSuppressHoles:      // MENU REPAIR - SUPPRESS HOLE
526   case GEOMOp::OpShapeProcess:       // MENU REPAIR - SHAPE PROCESSING
527   case GEOMOp::OpCloseContour:       // MENU REPAIR - CLOSE CONTOUR
528   case GEOMOp::OpRemoveIntWires:     // MENU REPAIR - REMOVE INTERNAL WIRES
529   case GEOMOp::OpAddPointOnEdge:     // MENU REPAIR - ADD POINT ON EDGE
530   case GEOMOp::OpFreeBoundaries:     // MENU MEASURE - FREE BOUNDARIES
531   case GEOMOp::OpFreeFaces:          // MENU MEASURE - FREE FACES
532   case GEOMOp::OpOrientation:        // MENU REPAIR - CHANGE ORIENTATION
533   case GEOMOp::OpGlueFaces:          // MENU REPAIR - GLUE FACES
534   case GEOMOp::OpGlueEdges:          // MENU REPAIR - GLUE EDGES
535   case GEOMOp::OpLimitTolerance:     // MENU REPAIR - LIMIT TOLERANCE
536   case GEOMOp::OpRemoveExtraEdges:   // MENU REPAIR - REMOVE EXTRA EDGES
537     libName = "RepairGUI";
538     break;
539   case GEOMOp::OpProperties:         // MENU MEASURE - PROPERTIES
540   case GEOMOp::OpCenterMass:         // MENU MEASURE - CDG
541   case GEOMOp::OpInertia:            // MENU MEASURE - INERTIA
542   case GEOMOp::OpNormale:            // MENU MEASURE - NORMALE
543   case GEOMOp::OpBoundingBox:        // MENU MEASURE - BOUNDING BOX
544   case GEOMOp::OpMinDistance:        // MENU MEASURE - MIN DISTANCE
545   case GEOMOp::OpAngle:              // MENU MEASURE - ANGLE
546   case GEOMOp::OpTolerance:          // MENU MEASURE - TOLERANCE
547   case GEOMOp::OpWhatIs:             // MENU MEASURE - WHATIS
548   case GEOMOp::OpCheckShape:         // MENU MEASURE - CHECK
549   case GEOMOp::OpCheckCompound:      // MENU MEASURE - CHECK COMPOUND OF BLOCKS
550   case GEOMOp::OpPointCoordinates:   // MENU MEASURE - POINT COORDINATES
551   case GEOMOp::OpCheckSelfInters:    // MENU MEASURE - CHECK SELF INTERSECTIONS
552     libName = "MeasureGUI";
553     break;
554   case GEOMOp::OpGroupCreate:        // MENU GROUP - CREATE
555   case GEOMOp::OpGroupCreatePopup:   // POPUP MENU - CREATE GROUP
556   case GEOMOp::OpGroupEdit:          // MENU GROUP - EDIT
557     libName = "GroupGUI";
558     break;
559   case GEOMOp::OpHexaSolid:          // MENU BLOCKS - HEXAHEDRAL SOLID
560   case GEOMOp::OpMultiTransform:     // MENU BLOCKS - MULTI-TRANSFORMATION
561   case GEOMOp::OpQuadFace:           // MENU BLOCKS - QUADRANGLE FACE
562   case GEOMOp::OpPropagate:          // MENU BLOCKS - PROPAGATE
563   case GEOMOp::OpExplodeBlock:       // MENU BLOCKS - EXPLODE ON BLOCKS
564     libName = "BlocksGUI";
565     break;
566   case GEOMOp::OpAdvancedNoOp:       // NO OPERATION (advanced operations base)
567   case GEOMOp::OpPipeTShape:         // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE
568 //   case GEOMOp::OpPipeTShapeGroups:     // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS
569     //@@ 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 @@//
570     libName = "AdvancedGUI";
571     break;
572   default:
573     break;
574   }
575
576   GEOMGUI* library = 0;
577   if ( !libName.isEmpty() ) {
578 #ifndef WNT
579     libName = QString( "lib" ) + libName + ".so";
580 #else
581     libName = libName + ".dll";
582 #endif
583     library = getLibrary( libName );
584   }
585
586   // call method of corresponding GUI library
587   if ( library ) {
588     library->OnGUIEvent( id, desk );
589     
590     // Update a list of materials for "Preferences" dialog
591     if ( id == GEOMOp::OpMaterialProperties ) {
592       LightApp_Preferences* pref = preferences();
593       if ( pref ) {
594         Material_ResourceMgr aMatResMgr;
595         QStringList aPerfMatNames = aMatResMgr.getPreferenceMaterialsNames();
596         setPreferenceProperty( pref->rootItem()->findItem( tr( "PREF_MATERIAL" ), true )->id(),
597                                "strings",
598                                aPerfMatNames );
599       }
600     }
601   }
602   else
603     SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) );
604 }
605
606 //=================================================================================
607 // function : GeometryGUI::OnKeyPress()
608 // purpose  : Called when any key is pressed by user [static]
609 //=================================================================================
610 void GeometryGUI::OnKeyPress( SUIT_ViewWindow* w, QKeyEvent* e )
611 {
612   if ( !application() )
613     return;
614   foreach ( GEOMGUI* lib, myGUIMap )
615     lib->OnKeyPress( e, application()->desktop(), w );
616 }
617
618 //=================================================================================
619 // function : GeometryGUI::OnMouseMove()
620 // purpose  : Manages mouse move events [static]
621 //=================================================================================
622 void GeometryGUI::OnMouseMove( SUIT_ViewWindow* w, QMouseEvent* e )
623 {
624   if ( !application() )
625     return;
626   foreach ( GEOMGUI* lib, myGUIMap )
627     lib->OnMouseMove( e, application()->desktop(), w );
628 }
629
630 //=================================================================================
631 // function : GeometryGUI::OnMouseRelease()
632 // purpose  : Manages mouse release events [static]
633 //=================================================================================
634 void GeometryGUI::OnMouseRelease( SUIT_ViewWindow* w, QMouseEvent* e )
635 {
636   if ( !application() )
637     return;
638   foreach ( GEOMGUI* lib, myGUIMap )
639     lib->OnMouseRelease( e, application()->desktop(), w );
640 }
641
642 //=================================================================================
643 // function : GeometryGUI::OnMousePress()
644 // purpose  : Manage mouse press events [static]
645 //=================================================================================
646 void GeometryGUI::OnMousePress( SUIT_ViewWindow* w, QMouseEvent* e )
647 {
648   if ( !application() )
649     return;
650   foreach ( GEOMGUI* lib, myGUIMap )
651     lib->OnMousePress( e, application()->desktop(), w );
652 }
653
654 //=======================================================================
655 // function : createGeomAction
656 // purpose  :
657 //=======================================================================
658 void GeometryGUI::createGeomAction( const int id, const QString& label, const QString& icolabel,
659                                     const int accel, const bool toggle, const QString& shortcutAction )
660 {
661   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
662   QPixmap icon = icolabel.isEmpty() ? resMgr->loadPixmap( "GEOM", tr( (QString( "ICO_" )+label).toLatin1().constData() ), false )
663                                     : resMgr->loadPixmap( "GEOM", tr( icolabel.toLatin1().constData() ) );
664   createAction( id,
665                 tr( QString( "TOP_%1" ).arg( label ).toLatin1().constData() ),
666                 icon,
667                 tr( QString( "MEN_%1" ).arg( label ).toLatin1().constData() ),
668                 tr( QString( "STB_%1" ).arg( label ).toLatin1().constData() ),
669                 accel,
670                 application()->desktop(),
671                 toggle,
672                 this, SLOT( OnGUIEvent() ),
673                 shortcutAction );
674 }
675
676 //=======================================================================
677 // function : createOriginAndBaseVectors
678 // purpose  :
679 //=======================================================================
680 void GeometryGUI::createOriginAndBaseVectors()
681 {
682   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
683   if( appStudy ) {
684     _PTR(Study) studyDS = appStudy->studyDS();
685     if( studyDS && !CORBA::is_nil( GetGeomGen() ) ) {
686       GEOM::GEOM_IBasicOperations_var aBasicOperations = GetGeomGen()->GetIBasicOperations( studyDS->StudyId() );
687       if( !aBasicOperations->_is_nil() ) {
688         SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
689         double aLength = aResourceMgr->doubleValue( "Geometry", "base_vectors_length", 1.0 );
690         GEOM::GEOM_Object_var anOrigin = aBasicOperations->MakePointXYZ( 0.0, 0.0, 0.0 );
691         GEOM::GEOM_Object_var anOX = aBasicOperations->MakeVectorDXDYDZ( aLength, 0.0, 0.0 );
692         GEOM::GEOM_Object_var anOY = aBasicOperations->MakeVectorDXDYDZ( 0.0, aLength, 0.0 );
693         GEOM::GEOM_Object_var anOZ = aBasicOperations->MakeVectorDXDYDZ( 0.0, 0.0, aLength );
694
695         SALOMEDS::Study_var aDSStudy = ClientStudyToStudy( studyDS );
696         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOrigin, "O" );
697         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOX, "OX" );
698         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOY, "OY" );
699         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOZ, "OZ" );
700
701         getApp()->updateObjectBrowser( false );
702       }
703     }
704   }
705 }
706
707 //=======================================================================
708 // function : GeometryGUI::initialize()
709 // purpose  : Called when GEOM module is created
710 //=======================================================================
711 void GeometryGUI::initialize( CAM_Application* app )
712 {
713   SalomeApp_Module::initialize( app );
714
715   // ----- create actions --------------
716
717   createGeomAction( GEOMOp::OpImport,     "IMPORT", "", Qt::ControlModifier + Qt::Key_I );
718   createGeomAction( GEOMOp::OpExport,     "EXPORT", "", Qt::ControlModifier + Qt::Key_E );
719
720   createGeomAction( GEOMOp::OpDelete,     "DELETE", "", Qt::Key_Delete );
721
722   createGeomAction( GEOMOp::OpPoint,      "POINT" );
723   createGeomAction( GEOMOp::OpLine,       "LINE" );
724   createGeomAction( GEOMOp::OpCircle,     "CIRCLE" );
725   createGeomAction( GEOMOp::OpEllipse,    "ELLIPSE" );
726   createGeomAction( GEOMOp::OpArc,        "ARC" );
727   createGeomAction( GEOMOp::OpCurve,      "CURVE" );
728   createGeomAction( GEOMOp::OpVector,     "VECTOR" );
729   createGeomAction( GEOMOp::OpPlane,      "PLANE" );
730   createGeomAction( GEOMOp::OpLCS,        "LOCAL_CS" );
731   createGeomAction( GEOMOp::OpOriginAndVectors, "ORIGIN_AND_VECTORS" );
732
733   createGeomAction( GEOMOp::OpBox,        "BOX" );
734   createGeomAction( GEOMOp::OpCylinder,   "CYLINDER" );
735   createGeomAction( GEOMOp::OpSphere,     "SPHERE" );
736   createGeomAction( GEOMOp::OpTorus,      "TORUS" );
737   createGeomAction( GEOMOp::OpCone,       "CONE" );
738   createGeomAction( GEOMOp::OpRectangle,  "RECTANGLE" );
739   createGeomAction( GEOMOp::OpDisk,       "DISK" );
740
741   createGeomAction( GEOMOp::OpPrism,       "EXTRUSION" );
742   createGeomAction( GEOMOp::OpRevolution,  "REVOLUTION" );
743   createGeomAction( GEOMOp::OpFilling,     "FILLING" );
744   createGeomAction( GEOMOp::OpPipe,        "PIPE" );
745
746   createGeomAction( GEOMOp::OpGroupCreate, "GROUP_CREATE" );
747   createGeomAction( GEOMOp::OpGroupEdit,   "GROUP_EDIT" );
748
749   createGeomAction( GEOMOp::OpReimport,    "RELOAD_IMPORTED" );
750
751   createGeomAction( GEOMOp::OpQuadFace,    "Q_FACE" );
752   createGeomAction( GEOMOp::OpHexaSolid,   "HEX_SOLID" );
753
754   createGeomAction( GEOMOp::Op2dSketcher,  "SKETCH" );
755   createGeomAction( GEOMOp::Op3dSketcher,  "3DSKETCH" );
756   createGeomAction( GEOMOp::OpExplode,     "EXPLODE" );
757 #ifdef WITH_OPENCV
758   createGeomAction( GEOMOp::OpFeatureDetect,"FEATURE_DETECTION" );
759 #endif
760   createGeomAction( GEOMOp::OpPictureImport,"PICTURE_IMPORT" );
761
762   createGeomAction( GEOMOp::OpEdge,        "EDGE" );
763   createGeomAction( GEOMOp::OpWire,        "WIRE" );
764   createGeomAction( GEOMOp::OpFace,        "FACE" );
765   createGeomAction( GEOMOp::OpShell,       "SHELL" );
766   createGeomAction( GEOMOp::OpSolid,       "SOLID" );
767   createGeomAction( GEOMOp::OpCompound,    "COMPOUND" );
768
769   createGeomAction( GEOMOp::OpFuse,        "FUSE" );
770   createGeomAction( GEOMOp::OpCommon,      "COMMON" );
771   createGeomAction( GEOMOp::OpCut,         "CUT" );
772   createGeomAction( GEOMOp::OpSection,     "SECTION" );
773
774   createGeomAction( GEOMOp::OpTranslate,      "TRANSLATION" );
775   createGeomAction( GEOMOp::OpRotate,         "ROTATION" );
776   createGeomAction( GEOMOp::OpChangeLoc,      "MODIFY_LOCATION" );
777   createGeomAction( GEOMOp::OpMirror,         "MIRROR" );
778   createGeomAction( GEOMOp::OpScale,          "SCALE" );
779   createGeomAction( GEOMOp::OpOffset,         "OFFSET" );
780   createGeomAction( GEOMOp::OpProjection,     "PROJECTION" );
781   createGeomAction( GEOMOp::OpMultiTranslate, "MUL_TRANSLATION" );
782   createGeomAction( GEOMOp::OpMultiRotate,    "MUL_ROTATION" );
783
784   createGeomAction( GEOMOp::OpPartition,      "PARTITION" );
785   createGeomAction( GEOMOp::OpArchimede,      "ARCHIMEDE" );
786   createGeomAction( GEOMOp::OpFillet3d,       "FILLET" );
787   createGeomAction( GEOMOp::OpChamfer,        "CHAMFER" );
788   //createGeomAction( GEOMOp::OpClipping,        "CLIPPING" );
789   createGeomAction( GEOMOp::OpShapesOnShape,  "GET_SHAPES_ON_SHAPE" );
790   createGeomAction( GEOMOp::OpSharedShapes,   "GET_SHARED_SHAPES" );
791   createGeomAction( GEOMOp::OpExtrudedCut,    "EXTRUDED_CUT" );
792   createGeomAction( GEOMOp::OpExtrudedBoss,   "EXTRUDED_BOSS" );
793   createGeomAction( GEOMOp::OpFillet1d,       "FILLET_1D" );
794   createGeomAction( GEOMOp::OpFillet2d,       "FILLET_2D" );
795
796   createGeomAction( GEOMOp::OpMultiTransform, "MUL_TRANSFORM" );
797   createGeomAction( GEOMOp::OpExplodeBlock,   "EXPLODE_BLOCKS" );
798   createGeomAction( GEOMOp::OpPropagate,      "PROPAGATE" );
799
800   createGeomAction( GEOMOp::OpSewing,           "SEWING" );
801   createGeomAction( GEOMOp::OpGlueFaces,        "GLUE_FACES" );
802   createGeomAction( GEOMOp::OpGlueEdges,        "GLUE_EDGES" );
803   createGeomAction( GEOMOp::OpLimitTolerance,   "LIMIT_TOLERANCE" );
804   createGeomAction( GEOMOp::OpSuppressFaces,    "SUPPRESS_FACES" );
805   createGeomAction( GEOMOp::OpSuppressHoles,    "SUPPERSS_HOLES" );
806   createGeomAction( GEOMOp::OpShapeProcess,     "SHAPE_PROCESS" );
807   createGeomAction( GEOMOp::OpCloseContour,     "CLOSE_CONTOUR" );
808   createGeomAction( GEOMOp::OpRemoveIntWires,   "SUPPRESS_INT_WIRES" );
809   createGeomAction( GEOMOp::OpAddPointOnEdge,   "POINT_ON_EDGE" );
810   createGeomAction( GEOMOp::OpFreeBoundaries,   "CHECK_FREE_BNDS" );
811   createGeomAction( GEOMOp::OpFreeFaces,        "CHECK_FREE_FACES" );
812   createGeomAction( GEOMOp::OpOrientation,      "CHANGE_ORIENTATION" );
813   createGeomAction( GEOMOp::OpRemoveExtraEdges, "REMOVE_EXTRA_EDGES" );
814
815   createGeomAction( GEOMOp::OpPointCoordinates, "POINT_COORDS" );
816   createGeomAction( GEOMOp::OpProperties,       "BASIC_PROPS" );
817   createGeomAction( GEOMOp::OpCenterMass,       "MASS_CENTER" );
818   createGeomAction( GEOMOp::OpInertia,          "INERTIA" );
819   createGeomAction( GEOMOp::OpNormale,          "NORMALE" );
820   createGeomAction( GEOMOp::OpBoundingBox,      "BND_BOX" );
821   createGeomAction( GEOMOp::OpMinDistance,      "MIN_DIST" );
822   createGeomAction( GEOMOp::OpAngle,            "MEASURE_ANGLE" );
823
824   createGeomAction( GEOMOp::OpTolerance,        "TOLERANCE" );
825   createGeomAction( GEOMOp::OpWhatIs,           "WHAT_IS" );
826   createGeomAction( GEOMOp::OpCheckShape,       "CHECK" );
827   createGeomAction( GEOMOp::OpCheckCompound,    "CHECK_COMPOUND" );
828   createGeomAction( GEOMOp::OpCheckSelfInters,  "CHECK_SELF_INTERSECTIONS" );
829
830 #ifdef _DEBUG_ // PAL16821
831   createGeomAction( GEOMOp::OpCheckGeom,        "CHECK_GEOMETRY" );
832 #endif
833
834   createGeomAction( GEOMOp::OpDMWireframe,        "WIREFRAME" );
835   createGeomAction( GEOMOp::OpDMShading,          "SHADING" );
836   createGeomAction( GEOMOp::OpDMShadingWithEdges, "SHADING_WITH_EDGES" );
837   createGeomAction( GEOMOp::OpShowAll,          "DISPLAY_ALL" );
838   createGeomAction( GEOMOp::OpHideAll,          "ERASE_ALL" );
839   createGeomAction( GEOMOp::OpShow,             "DISPLAY" );
840   createGeomAction( GEOMOp::OpSwitchVectors,    "VECTOR_MODE");
841   createGeomAction( GEOMOp::OpSelectVertex,     "VERTEX_SEL_ONLY" ,"", 0, true );
842   createGeomAction( GEOMOp::OpSelectEdge,       "EDGE_SEL_ONLY", "", 0, true );
843   createGeomAction( GEOMOp::OpSelectWire,       "WIRE_SEL_ONLY", "",  0, true );
844   createGeomAction( GEOMOp::OpSelectFace,       "FACE_SEL_ONLY", "", 0, true );
845   createGeomAction( GEOMOp::OpSelectShell,      "SHELL_SEL_ONLY", "",  0, true );
846   createGeomAction( GEOMOp::OpSelectSolid,      "SOLID_SEL_ONLY", "", 0, true );
847   createGeomAction( GEOMOp::OpSelectCompound,   "COMPOUND_SEL_ONLY", "",  0, true );
848   createGeomAction( GEOMOp::OpSelectAll,        "ALL_SEL_ONLY", "",  0, true );
849   createGeomAction( GEOMOp::OpShowOnly,         "DISPLAY_ONLY" );
850   createGeomAction( GEOMOp::OpBringToFront,     "BRING_TO_FRONT", "", 0, true );
851   createGeomAction( GEOMOp::OpClsBringToFront,  "CLS_BRING_TO_FRONT" );
852   createGeomAction( GEOMOp::OpHide,             "ERASE" );
853
854   createGeomAction( GEOMOp::OpWireframe,        "POP_WIREFRAME", "", 0, true );
855   createGeomAction( GEOMOp::OpShading,          "POP_SHADING", "", 0, true );
856   createGeomAction( GEOMOp::OpShadingWithEdges, "POP_SHADING_WITH_EDGES", "", 0, true );
857   createGeomAction( GEOMOp::OpTexture,          "POP_TEXTURE", "", 0, true );
858   createGeomAction( GEOMOp::OpEdgeWidth,        "EDGE_WIDTH");
859   createGeomAction( GEOMOp::OpIsosWidth,        "ISOS_WIDTH");
860   createGeomAction( GEOMOp::OpVectors,          "POP_VECTORS", "", 0, true );
861   createGeomAction( GEOMOp::OpDeflection,       "POP_DEFLECTION" );
862   createGeomAction( GEOMOp::OpColor,            "POP_COLOR" );
863   createGeomAction( GEOMOp::OpSetTexture,       "POP_SETTEXTURE" );
864   createGeomAction( GEOMOp::OpTransparency,     "POP_TRANSPARENCY" );
865   createGeomAction( GEOMOp::OpIsos,             "POP_ISOS" );
866   createGeomAction( GEOMOp::OpAutoColor,        "POP_AUTO_COLOR" );
867   createGeomAction( GEOMOp::OpNoAutoColor,      "POP_DISABLE_AUTO_COLOR" );
868   createGeomAction( GEOMOp::OpGroupCreatePopup, "POP_CREATE_GROUP" );
869   createGeomAction( GEOMOp::OpShowChildren,     "POP_SHOW_CHILDREN" );
870   createGeomAction( GEOMOp::OpHideChildren,     "POP_HIDE_CHILDREN" );
871   createGeomAction( GEOMOp::OpUnpublishObject,  "POP_UNPUBLISH_OBJ" );
872   createGeomAction( GEOMOp::OpPublishObject,    "POP_PUBLISH_OBJ" );
873   createGeomAction( GEOMOp::OpPointMarker,      "POP_POINT_MARKER" );
874   createGeomAction( GEOMOp::OpMaterialProperties, "POP_MATERIAL_PROPERTIES" );
875
876   createGeomAction( GEOMOp::OpPipeTShape, "PIPETSHAPE" );
877
878   // Create actions for increase/decrease transparency shortcuts
879   createGeomAction( GEOMOp::OpIncrTransparency, "", "", 0, false,
880                     "Geometry:Increase transparency");
881   createGeomAction( GEOMOp::OpDecrTransparency, "", "", 0, false,
882                     "Geometry:Decrease transparency");
883
884   // Create actions for increase/decrease number of isolines
885   createGeomAction( GEOMOp::OpIncrNbIsos, "", "", 0, false,
886                     "Geometry:Increase number of isolines");
887   createGeomAction( GEOMOp::OpDecrNbIsos, "", "", 0, false,
888                     "Geometry:Decrease number of isolines");
889
890 //   createGeomAction( GEOMOp::OpPipeTShapeGroups, "PIPETSHAPEGROUPS" );
891   //@@ 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 @@//
892
893   // ---- create menus --------------------------
894
895   int fileId = createMenu( tr( "MEN_FILE" ), -1, -1 );
896   createMenu( separator(),      fileId, 10 );
897   createMenu( GEOMOp::OpImport, fileId, 10 );
898   createMenu( GEOMOp::OpExport, fileId, 10 );
899   createMenu( separator(),      fileId, -1 );
900
901   int editId = createMenu( tr( "MEN_EDIT" ), -1, -1 );
902   createMenu( GEOMOp::OpDelete, editId, -1 );
903
904   int newEntId = createMenu( tr( "MEN_NEW_ENTITY" ), -1, -1, 10 );
905
906   int basicId = createMenu( tr( "MEN_BASIC" ), newEntId, -1 );
907   createMenu( GEOMOp::OpPoint,   basicId, -1 );
908   createMenu( GEOMOp::OpLine,    basicId, -1 );
909   createMenu( GEOMOp::OpCircle,  basicId, -1 );
910   createMenu( GEOMOp::OpEllipse, basicId, -1 );
911   createMenu( GEOMOp::OpArc,     basicId, -1 );
912   createMenu( GEOMOp::OpCurve,   basicId, -1 );
913   createMenu( separator(),       basicId, -1 );
914   createMenu( GEOMOp::Op2dSketcher, basicId, -1 );
915   createMenu( GEOMOp::Op3dSketcher, basicId, -1 );
916   createMenu( GEOMOp::OpVector,  basicId, -1 );
917   createMenu( GEOMOp::OpPlane,   basicId, -1 );
918   createMenu( GEOMOp::OpLCS,     basicId, -1 );
919   createMenu( GEOMOp::OpOriginAndVectors, basicId, -1 );
920
921   int primId = createMenu( tr( "MEN_PRIMITIVES" ), newEntId, -1 );
922   createMenu( GEOMOp::OpBox,       primId, -1 );
923   createMenu( GEOMOp::OpCylinder,  primId, -1 );
924   createMenu( GEOMOp::OpSphere,    primId, -1 );
925   createMenu( GEOMOp::OpTorus,     primId, -1 );
926   createMenu( GEOMOp::OpCone,      primId, -1 );
927   createMenu( GEOMOp::OpRectangle, primId, -1 );
928   createMenu( GEOMOp::OpDisk,      primId, -1 );
929   createMenu( GEOMOp::OpPipeTShape,primId, -1 );
930
931   int genId = createMenu( tr( "MEN_GENERATION" ), newEntId, -1 );
932   createMenu( GEOMOp::OpPrism,      genId, -1 );
933   createMenu( GEOMOp::OpRevolution, genId, -1 );
934   createMenu( GEOMOp::OpFilling,    genId, -1 );
935   createMenu( GEOMOp::OpPipe,       genId, -1 );
936
937 //   int advId = createMenu( tr( "MEN_ADVANCED" ), newEntId, -1 );
938 //   createMenu( GEOMOp::OpPipeTShape, advId, -1 );
939 //   createMenu( GEOMOp::OpPipeTShapeGroups, advId, -1 );
940   //@@ 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 @@//
941
942   createMenu( separator(), newEntId, -1 );
943
944   int groupId = createMenu( tr( "MEN_GROUP" ), newEntId, -1 );
945   createMenu( GEOMOp::OpGroupCreate, groupId, -1 );
946   createMenu( GEOMOp::OpGroupEdit,   groupId, -1 );
947
948   createMenu( separator(), newEntId, -1 );
949
950   int blocksId = createMenu( tr( "MEN_BLOCKS" ), newEntId, -1 );
951   createMenu( GEOMOp::OpQuadFace,  blocksId, -1 );
952   createMenu( GEOMOp::OpHexaSolid, blocksId, -1 );
953
954   createMenu( separator(),          newEntId, -1 );
955
956   createMenu( GEOMOp::OpExplode,    newEntId, -1 );
957
958   int buildId = createMenu( tr( "MEN_BUILD" ), newEntId, -1 );
959   createMenu( GEOMOp::OpEdge,     buildId, -1 );
960   createMenu( GEOMOp::OpWire,     buildId, -1 );
961   createMenu( GEOMOp::OpFace,     buildId, -1 );
962   createMenu( GEOMOp::OpShell,    buildId, -1 );
963   createMenu( GEOMOp::OpSolid,    buildId, -1 );
964   createMenu( GEOMOp::OpCompound, buildId, -1 );
965   
966   createMenu( separator(),          newEntId, -1 );
967   
968   createMenu( GEOMOp::OpPictureImport, newEntId, -1 );
969 #ifdef WITH_OPENCV
970   createMenu( GEOMOp::OpFeatureDetect, newEntId, -1 );
971 #endif
972
973   int operId = createMenu( tr( "MEN_OPERATIONS" ), -1, -1, 10 );
974
975   int boolId = createMenu( tr( "MEN_BOOLEAN" ), operId, -1 );
976   createMenu( GEOMOp::OpFuse,    boolId, -1 );
977   createMenu( GEOMOp::OpCommon,  boolId, -1 );
978   createMenu( GEOMOp::OpCut,     boolId, -1 );
979   createMenu( GEOMOp::OpSection, boolId, -1 );
980
981   int transId = createMenu( tr( "MEN_TRANSFORMATION" ), operId, -1 );
982   createMenu( GEOMOp::OpTranslate,      transId, -1 );
983   createMenu( GEOMOp::OpRotate,         transId, -1 );
984   createMenu( GEOMOp::OpChangeLoc,      transId, -1 );
985   createMenu( GEOMOp::OpMirror,         transId, -1 );
986   createMenu( GEOMOp::OpScale,          transId, -1 );
987   createMenu( GEOMOp::OpOffset,         transId, -1 );
988   createMenu( GEOMOp::OpProjection,     transId, -1 );
989   createMenu( separator(),              transId, -1 );
990   createMenu( GEOMOp::OpMultiTranslate, transId, -1 );
991   createMenu( GEOMOp::OpMultiRotate,    transId, -1 );
992
993   int blockId = createMenu( tr( "MEN_BLOCKS" ), operId, -1 );
994   createMenu( GEOMOp::OpMultiTransform, blockId, -1 );
995   createMenu( GEOMOp::OpExplodeBlock,   blockId, -1 );
996   createMenu( GEOMOp::OpPropagate,      blockId, -1 );
997
998   createMenu( separator(), operId, -1 );
999
1000   createMenu( GEOMOp::OpPartition,     operId, -1 );
1001   createMenu( GEOMOp::OpArchimede,     operId, -1 );
1002   createMenu( GEOMOp::OpShapesOnShape, operId, -1 );
1003   createMenu( GEOMOp::OpSharedShapes,  operId, -1 );
1004
1005   createMenu( separator(), operId, -1 );
1006
1007   createMenu( GEOMOp::OpFillet1d,      operId, -1 );
1008   createMenu( GEOMOp::OpFillet2d,      operId, -1 );
1009   createMenu( GEOMOp::OpFillet3d,      operId, -1 );
1010   createMenu( GEOMOp::OpChamfer,       operId, -1 );
1011   createMenu( GEOMOp::OpExtrudedBoss,  operId, -1 );
1012   createMenu( GEOMOp::OpExtrudedCut,   operId, -1 );
1013   //createMenu( GEOMOp::OpClipping,      operId, -1 );
1014
1015   int repairId = createMenu( tr( "MEN_REPAIR" ), -1, -1, 10 );
1016   createMenu( GEOMOp::OpShapeProcess,    repairId, -1 );
1017   createMenu( GEOMOp::OpSuppressFaces,   repairId, -1 );
1018   createMenu( GEOMOp::OpCloseContour,    repairId, -1 );
1019   createMenu( GEOMOp::OpRemoveIntWires,  repairId, -1 );
1020   createMenu( GEOMOp::OpSuppressHoles,   repairId, -1 );
1021   createMenu( GEOMOp::OpSewing,          repairId, -1 );
1022   createMenu( GEOMOp::OpGlueFaces,       repairId, -1 );
1023   createMenu( GEOMOp::OpGlueEdges,       repairId, -1 );
1024   createMenu( GEOMOp::OpLimitTolerance,  repairId, -1 );
1025   createMenu( GEOMOp::OpAddPointOnEdge,  repairId, -1 );
1026   //createMenu( GEOMOp::OpFreeBoundaries,  repairId, -1 );
1027   //createMenu( GEOMOp::OpFreeFaces,       repairId, -1 );
1028   createMenu( GEOMOp::OpOrientation,      repairId, -1 );
1029   createMenu( GEOMOp::OpRemoveExtraEdges, repairId, -1 );
1030
1031   int measurId = createMenu( tr( "MEN_MEASURES" ), -1, -1, 10 );
1032   createMenu( GEOMOp::OpPointCoordinates, measurId, -1 );
1033   createMenu( GEOMOp::OpProperties,       measurId, -1 );
1034   createMenu( separator(),                measurId, -1 );
1035   createMenu( GEOMOp::OpCenterMass,       measurId, -1 );
1036   createMenu( GEOMOp::OpInertia,          measurId, -1 );
1037   createMenu( GEOMOp::OpNormale,          measurId, -1 );
1038   createMenu( separator(),                measurId, -1 );
1039   createMenu( GEOMOp::OpFreeBoundaries,   measurId, -1 );
1040   createMenu( GEOMOp::OpFreeFaces,        measurId, -1 );
1041   createMenu( separator(),                measurId, -1 );
1042
1043   int dimId = createMenu( tr( "MEN_DIMENSIONS" ), measurId, -1 );
1044   createMenu( GEOMOp::OpBoundingBox, dimId, -1 );
1045   createMenu( GEOMOp::OpMinDistance, dimId, -1 );
1046   createMenu( GEOMOp::OpAngle,       dimId, -1 );
1047
1048   createMenu( separator(),               measurId, -1 );
1049   createMenu( GEOMOp::OpTolerance,       measurId, -1 );
1050   createMenu( separator(),               measurId, -1 );
1051   createMenu( GEOMOp::OpWhatIs,          measurId, -1 );
1052   createMenu( GEOMOp::OpCheckShape,      measurId, -1 );
1053   createMenu( GEOMOp::OpCheckCompound,   measurId, -1 );
1054   createMenu( GEOMOp::OpCheckSelfInters, measurId, -1 );
1055
1056 #ifdef _DEBUG_ // PAL16821
1057   int toolsId = createMenu( tr( "MEN_TOOLS" ), -1, -1, 50 );
1058   createMenu( separator(),         toolsId, -1 );
1059   createMenu( GEOMOp::OpCheckGeom, toolsId, -1 );
1060 #endif
1061
1062   int viewId = createMenu( tr( "MEN_VIEW" ), -1, -1 );
1063   createMenu( separator(),       viewId, -1 );
1064
1065   int dispmodeId = createMenu( tr( "MEN_DISPLAY_MODE" ), viewId, -1 );
1066   createMenu( GEOMOp::OpDMWireframe,        dispmodeId, -1 );
1067   createMenu( GEOMOp::OpDMShading,          dispmodeId, -1 );
1068   createMenu( GEOMOp::OpDMShadingWithEdges, dispmodeId, -1 );
1069   createMenu( separator(),                  dispmodeId, -1 );
1070   createMenu( GEOMOp::OpSwitchVectors,      dispmodeId, -1 );
1071
1072   createMenu( separator(),       viewId, -1 );
1073   createMenu( GEOMOp::OpShowAll, viewId, -1 );
1074   createMenu( GEOMOp::OpHideAll, viewId, -1 );
1075   createMenu( separator(),       viewId, -1 );
1076   createMenu( GEOMOp::OpPublishObject, viewId, -1 );
1077   createMenu( separator(),       viewId, -1 );
1078
1079 /*
1080   PAL9111:
1081   because of these items are accessible through object browser and viewers
1082   we have removed they from main menu
1083
1084   createMenu( GEOMOp::OpShow, viewId, -1 );
1085   createMenu( GEOMOp::OpShowOnly, viewId, -1 );
1086   createMenu( GEOMOp::OpHide, viewId, -1 );
1087 */
1088
1089   // ---- create toolbars --------------------------
1090   
1091   int basicTbId = createTool( tr( "TOOL_BASIC" ) );
1092   createTool( GEOMOp::OpPoint,      basicTbId );
1093   createTool( GEOMOp::OpLine,       basicTbId );
1094   createTool( GEOMOp::OpCircle,     basicTbId );
1095   createTool( GEOMOp::OpEllipse,    basicTbId );
1096   createTool( GEOMOp::OpArc,        basicTbId );
1097   createTool( GEOMOp::OpCurve,      basicTbId );
1098   createTool( GEOMOp::OpVector,     basicTbId );
1099   createTool( GEOMOp::Op2dSketcher, basicTbId ); //rnc
1100   createTool( GEOMOp::Op3dSketcher, basicTbId ); //rnc
1101   createTool( GEOMOp::OpPlane,      basicTbId );
1102   createTool( GEOMOp::OpLCS,        basicTbId );
1103   createTool( GEOMOp::OpOriginAndVectors, basicTbId );
1104   
1105 //   int sketchTbId = createTool( tr( "TOOL_SKETCH" ) );
1106 //   createTool( GEOMOp::Op2dSketcher,  sketchTbId );
1107 //   createTool( GEOMOp::Op3dSketcher,  sketchTbId );
1108   
1109   int primTbId = createTool( tr( "TOOL_PRIMITIVES" ) );
1110   createTool( GEOMOp::OpBox,        primTbId );
1111   createTool( GEOMOp::OpCylinder,   primTbId );
1112   createTool( GEOMOp::OpSphere,     primTbId );
1113   createTool( GEOMOp::OpTorus,      primTbId );
1114   createTool( GEOMOp::OpCone,       primTbId );
1115   createTool( GEOMOp::OpRectangle,  primTbId );
1116   createTool( GEOMOp::OpDisk,       primTbId );
1117   createTool( GEOMOp::OpPipeTShape, primTbId ); //rnc
1118   
1119 //   int advancedTbId = createTool( tr( "TOOL_ADVANCED" ) ); //rnc
1120 //   createTool( GEOMOp::OpPipeTShape, advancedTbId );
1121   
1122   int boolTbId = createTool( tr( "TOOL_BOOLEAN" ) );
1123   createTool( GEOMOp::OpFuse,       boolTbId );
1124   createTool( GEOMOp::OpCommon,     boolTbId );
1125   createTool( GEOMOp::OpCut,        boolTbId );
1126   createTool( GEOMOp::OpSection,    boolTbId );
1127   
1128    int genTbId = createTool( tr( "TOOL_GENERATION" ) );
1129   createTool( GEOMOp::OpPrism,      genTbId );
1130   createTool( GEOMOp::OpRevolution, genTbId );
1131   createTool( GEOMOp::OpFilling,    genTbId );
1132   createTool( GEOMOp::OpPipe,       genTbId );
1133   
1134   int transTbId = createTool( tr( "TOOL_TRANSFORMATION" ) );
1135   createTool( GEOMOp::OpTranslate,      transTbId );
1136   createTool( GEOMOp::OpRotate,         transTbId );
1137   createTool( GEOMOp::OpChangeLoc,      transTbId );
1138   createTool( GEOMOp::OpMirror,         transTbId );
1139   createTool( GEOMOp::OpScale,          transTbId );
1140   createTool( GEOMOp::OpOffset,         transTbId );
1141   createTool( GEOMOp::OpProjection,     transTbId );
1142   createTool( separator(),              transTbId );
1143   createTool( GEOMOp::OpMultiTranslate, transTbId );
1144   createTool( GEOMOp::OpMultiRotate,    transTbId );
1145   
1146   int operTbId = createTool( tr( "TOOL_OPERATIONS" ) );
1147   createTool( GEOMOp::OpExplode,         operTbId );
1148   createTool( GEOMOp::OpPartition,       operTbId );
1149   createTool( GEOMOp::OpArchimede,       operTbId );
1150   createTool( GEOMOp::OpShapesOnShape,   operTbId );
1151   createTool( GEOMOp::OpSharedShapes,    operTbId );
1152   
1153   int featTbId = createTool( tr( "TOOL_FEATURES" ) );
1154   createTool( GEOMOp::OpFillet1d,        featTbId );
1155   createTool( GEOMOp::OpFillet2d,        featTbId );
1156   createTool( GEOMOp::OpFillet3d,        featTbId );
1157   createTool( GEOMOp::OpChamfer,         featTbId );
1158   createTool( GEOMOp::OpExtrudedBoss,    featTbId );
1159   createTool( GEOMOp::OpExtrudedCut,     featTbId );
1160   
1161   int buildTbId = createTool( tr( "TOOL_BUILD" ) );
1162   createTool( GEOMOp::OpEdge,     buildTbId );
1163   createTool( GEOMOp::OpWire,     buildTbId );
1164   createTool( GEOMOp::OpFace,     buildTbId );
1165   createTool( GEOMOp::OpShell,    buildTbId );
1166   createTool( GEOMOp::OpSolid,    buildTbId );
1167   createTool( GEOMOp::OpCompound, buildTbId );
1168
1169   int measureTbId = createTool( tr( "TOOL_MEASURES" ) );
1170   createTool( GEOMOp::OpPointCoordinates, measureTbId );
1171   createTool( GEOMOp::OpProperties,       measureTbId );
1172   createTool( GEOMOp::OpCenterMass,       measureTbId );
1173   createTool( GEOMOp::OpInertia,          measureTbId );
1174   createTool( GEOMOp::OpNormale,          measureTbId );
1175   createTool( separator(),                measureTbId );
1176   createTool( GEOMOp::OpBoundingBox,      measureTbId );
1177   createTool( GEOMOp::OpMinDistance,      measureTbId );
1178   createTool( GEOMOp::OpAngle,            measureTbId );
1179   createTool( GEOMOp::OpTolerance  ,      measureTbId );
1180   createTool( separator(),                measureTbId );
1181   createTool( GEOMOp::OpFreeBoundaries,   measureTbId );
1182   createTool( GEOMOp::OpFreeFaces,        measureTbId );
1183   createTool( separator(),                measureTbId );
1184   createTool( GEOMOp::OpWhatIs,           measureTbId );
1185   createTool( GEOMOp::OpCheckShape,       measureTbId );
1186   createTool( GEOMOp::OpCheckCompound,    measureTbId );
1187   createTool( GEOMOp::OpCheckSelfInters,  measureTbId );
1188   
1189   int picturesTbId = createTool( tr( "TOOL_PICTURES" ) );
1190   createTool( GEOMOp::OpPictureImport,    picturesTbId );
1191   #ifdef WITH_OPENCV
1192     createTool( GEOMOp::OpFeatureDetect,  picturesTbId );
1193   #endif
1194
1195   //@@ 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 @@//
1196
1197   // ---- create popup menus --------------------------
1198
1199   QString clientOCCorVTK = "(client='OCCViewer' or client='VTKViewer')";
1200   QString clientOCC = "(client='OCCViewer')";
1201   QString clientOCCorVTK_AndSomeVisible = clientOCCorVTK + " and selcount>0 and isVisible";
1202   QString clientOCC_AndSomeVisible = clientOCC + " and selcount>0 and isVisible";
1203
1204   QString clientOCCorOB = "(client='ObjectBrowser' or client='OCCViewer')";
1205   QString clientOCCorVTKorOB = "(client='ObjectBrowser' or client='OCCViewer' or client='VTKViewer')";
1206   QString clientOCCorVTKorOB_AndSomeVisible = clientOCCorVTKorOB + " and selcount>0 and isVisible";
1207   QString clientOCCorOB_AndSomeVisible = clientOCCorOB + " and selcount>0 and isVisible";
1208
1209   QString autoColorPrefix =
1210     "(client='ObjectBrowser' or client='OCCViewer') and type='Shape' and selcount=1 and isOCC=true";
1211
1212   QtxPopupMgr* mgr = popupMgr();
1213
1214   mgr->insert( action(  GEOMOp::OpDelete ), -1, -1 );  // delete
1215   mgr->setRule( action( GEOMOp::OpDelete ), QString("$type in {'Shape' 'Group'} and selcount>0"), QtxPopupMgr::VisibleRule );
1216   mgr->insert( action(  GEOMOp::OpGroupCreatePopup ), -1, -1 ); // create group
1217   mgr->setRule( action( GEOMOp::OpGroupCreatePopup ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1218   mgr->insert( action(  GEOMOp::OpShowChildren ), -1, -1 ); // show children
1219   mgr->setRule( action( GEOMOp::OpShowChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasHiddenChildren=true"), QtxPopupMgr::VisibleRule );
1220
1221   mgr->insert( action(  GEOMOp::OpHideChildren ), -1, -1 ); // hide children
1222   mgr->setRule( action( GEOMOp::OpHideChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasShownChildren=true"), QtxPopupMgr::VisibleRule );
1223   mgr->insert( action(  GEOMOp::OpGroupEdit ), -1, -1 );  // edit group
1224   mgr->setRule( action( GEOMOp::OpGroupEdit ),  QString("client='ObjectBrowser' and type='Group' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1225   mgr->insert( separator(), -1, -1 );     // -----------
1226
1227 #if OCC_VERSION_LARGE > 0x06050200
1228   //QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and (selcount>0) and isOCC=true and topLevel=false";
1229   QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and (selcount>0) and isOCC=true";
1230   mgr->insert( action(GEOMOp::OpBringToFront ), -1, -1 ); // bring to front
1231   mgr->setRule(action(GEOMOp::OpBringToFront), bringRule, QtxPopupMgr::VisibleRule );
1232   mgr->setRule(action(GEOMOp::OpBringToFront), "topLevel=true", QtxPopupMgr::ToggleRule );
1233   mgr->insert( action(GEOMOp::OpClsBringToFront ), -1, -1 ); // clear bring to front
1234   mgr->setRule( action(GEOMOp::OpClsBringToFront ), clientOCC, QtxPopupMgr::VisibleRule );  
1235 #endif
1236   mgr->insert( separator(), -1, -1 );     // -----------
1237   dispmodeId = mgr->insert(  tr( "MEN_DISPLAY_MODE" ), -1, -1 ); // display mode menu
1238   mgr->insert( action(  GEOMOp::OpWireframe ), dispmodeId, -1 ); // wireframe
1239   mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1240   mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK + " and displaymode='Wireframe'", QtxPopupMgr::ToggleRule );
1241   mgr->insert( action(  GEOMOp::OpShading ), dispmodeId, -1 ); // shading
1242   mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1243   mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK + " and displaymode='Shading'", QtxPopupMgr::ToggleRule );
1244   mgr->insert( action(  GEOMOp::OpShadingWithEdges ), dispmodeId, -1 ); // shading with edges
1245   mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1246   mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK + " and displaymode='ShadingWithEdges'", QtxPopupMgr::ToggleRule );
1247   mgr->insert( action(  GEOMOp::OpTexture ), dispmodeId, -1 ); // wireframe
1248   mgr->setRule( action( GEOMOp::OpTexture ), clientOCC_AndSomeVisible, QtxPopupMgr::VisibleRule );
1249   mgr->setRule( action( GEOMOp::OpTexture), clientOCC + " and displaymode='Texture'", QtxPopupMgr::ToggleRule );
1250   mgr->insert( separator(), dispmodeId, -1 );
1251   mgr->insert( action(  GEOMOp::OpVectors ), dispmodeId, -1 ); // vectors
1252   mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1253   mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK + " and isVectorsMode", QtxPopupMgr::ToggleRule );
1254   mgr->insert( separator(), -1, -1 );     // -----------
1255   mgr->insert( action(  GEOMOp::OpColor ), -1, -1 ); // color
1256   mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})" + "and isPhysicalMaterial=false", QtxPopupMgr::VisibleRule );
1257   mgr->insert( action(  GEOMOp::OpTransparency ), -1, -1 ); // transparency
1258   mgr->setRule( action( GEOMOp::OpTransparency ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1259   mgr->insert( action(  GEOMOp::OpIsos ), -1, -1 ); // isos
1260   mgr->setRule( action( GEOMOp::OpIsos ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible", QtxPopupMgr::VisibleRule );
1261   mgr->insert( action(  GEOMOp::OpDeflection ), -1, -1 ); // deflection
1262   mgr->setRule( action( GEOMOp::OpDeflection ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible", QtxPopupMgr::VisibleRule );
1263   mgr->insert( action(  GEOMOp::OpPointMarker ), -1, -1 ); // point marker
1264   //mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and $typeid in {%1}" ).arg(GEOM_POINT ), QtxPopupMgr::VisibleRule );
1265   mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and ( $typeid in {%1} or compoundOfVertices=true ) " ).arg(GEOM::VERTEX).arg(GEOM::COMPOUND), QtxPopupMgr::VisibleRule );
1266   mgr->insert( action(  GEOMOp::OpMaterialProperties ), -1, -1 ); // material properties  
1267   mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'}) and selcount>0 and isVisible", QtxPopupMgr::VisibleRule );
1268   mgr->insert( action(  GEOMOp::OpSetTexture ), -1, -1 ); // texture
1269   mgr->setRule( action( GEOMOp::OpSetTexture ), clientOCCorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1270
1271   int lineW = mgr->insert(  tr( "MEN_LINE_WIDTH" ), -1, -1 ); // line width menu
1272   mgr->insert( action(  GEOMOp::OpEdgeWidth ), lineW, -1 ); // edge width
1273   mgr->setRule( action( GEOMOp::OpEdgeWidth ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1274
1275   mgr->insert( action(  GEOMOp::OpIsosWidth ), lineW, -1 ); // isos width
1276   mgr->setRule( action( GEOMOp::OpIsosWidth ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
1277   
1278   mgr->insert( separator(), -1, -1 );     // -----------
1279   mgr->insert( action(  GEOMOp::OpAutoColor ), -1, -1 ); // auto color
1280   mgr->setRule( action( GEOMOp::OpAutoColor ), autoColorPrefix + " and isAutoColor=false", QtxPopupMgr::VisibleRule );
1281   mgr->insert( action(  GEOMOp::OpNoAutoColor ), -1, -1 ); // disable auto color
1282   mgr->setRule( action( GEOMOp::OpNoAutoColor ), autoColorPrefix + " and isAutoColor=true", QtxPopupMgr::VisibleRule );
1283   mgr->insert( separator(), -1, -1 );     // -----------
1284
1285   QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ",
1286           onlyComponent = "((type='Component') and selcount=1)",
1287           rule = canDisplay + "and ((($type in {%1}) and( %2 )) or " + onlyComponent + ")",
1288           types = "'Shape' 'Group'";
1289
1290   mgr->insert( action(  GEOMOp::OpShow ), -1, -1 ); // display
1291   mgr->setRule( action( GEOMOp::OpShow ), rule.arg( types ).arg( "not isVisible" ), QtxPopupMgr::VisibleRule );
1292
1293   mgr->insert( action(  GEOMOp::OpHide ), -1, -1 ); // erase
1294   mgr->setRule( action( GEOMOp::OpHide ), rule.arg( types ).arg( "isVisible" ), QtxPopupMgr::VisibleRule );
1295
1296   mgr->insert( action(  GEOMOp::OpHideAll ), -1, -1 ); // erase All
1297   mgr->setRule( action( GEOMOp::OpHideAll ), clientOCCorVTK, QtxPopupMgr::VisibleRule );
1298
1299   QString selectOnly = "(client='OCCViewer' or client='VTKViewer') and (selcount=0)";
1300
1301   int selectonlyId = mgr->insert( tr("MEN_SELECT_ONLY"), -1, -1);                //select only menu
1302   mgr->insert( action(GEOMOp::OpSelectVertex),   selectonlyId, -1);                                  //Vertex
1303   mgr->setRule(action(GEOMOp::OpSelectVertex),   selectOnly, QtxPopupMgr::VisibleRule);
1304   mgr->setRule(action(GEOMOp::OpSelectVertex),   selectOnly + " and selectionmode='VERTEX'", QtxPopupMgr::ToggleRule);
1305   mgr->insert( action(GEOMOp::OpSelectEdge),     selectonlyId, -1);                                  //Edge
1306   mgr->setRule(action(GEOMOp::OpSelectEdge),     selectOnly, QtxPopupMgr::VisibleRule);
1307   mgr->setRule(action(GEOMOp::OpSelectEdge),     selectOnly + " and selectionmode='EDGE'", QtxPopupMgr::ToggleRule);
1308   mgr->insert( action(GEOMOp::OpSelectWire),     selectonlyId, -1);                                  //Wire
1309   mgr->setRule(action(GEOMOp::OpSelectWire),     selectOnly, QtxPopupMgr::VisibleRule);
1310   mgr->setRule(action(GEOMOp::OpSelectWire),     selectOnly + " and selectionmode='WIRE'", QtxPopupMgr::ToggleRule);
1311   mgr->insert( action(GEOMOp::OpSelectFace),     selectonlyId, -1);                                  //Face
1312   mgr->setRule(action(GEOMOp::OpSelectFace),     selectOnly, QtxPopupMgr::VisibleRule);
1313   mgr->setRule(action(GEOMOp::OpSelectFace),     selectOnly + " and selectionmode='FACE'", QtxPopupMgr::ToggleRule);
1314   mgr->insert( action(GEOMOp::OpSelectShell),    selectonlyId, -1);                                  //Shell
1315   mgr->setRule(action(GEOMOp::OpSelectShell),    selectOnly, QtxPopupMgr::VisibleRule);
1316   mgr->setRule(action(GEOMOp::OpSelectShell),    selectOnly + " and selectionmode='SHELL'", QtxPopupMgr::ToggleRule);
1317   mgr->insert( action(GEOMOp::OpSelectSolid),    selectonlyId, -1);                                  //Solid
1318   mgr->setRule(action(GEOMOp::OpSelectSolid),    selectOnly, QtxPopupMgr::VisibleRule);
1319   mgr->setRule(action(GEOMOp::OpSelectSolid),    selectOnly + " and selectionmode='SOLID'", QtxPopupMgr::ToggleRule);
1320   mgr->insert( action(GEOMOp::OpSelectCompound), selectonlyId, -1);                                  //Compound
1321   mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly, QtxPopupMgr::VisibleRule);
1322   mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly + " and selectionmode='COMPOUND'", QtxPopupMgr::ToggleRule);
1323   mgr->insert( separator(), selectonlyId, -1);
1324   mgr->insert( action(GEOMOp::OpSelectAll),      selectonlyId, -1);                                  //Clear selection filter
1325   mgr->setRule(action(GEOMOp::OpSelectAll),      selectOnly, QtxPopupMgr::VisibleRule);
1326   mgr->setRule(action(GEOMOp::OpSelectAll),      selectOnly + " and selectionmode='ALL'", QtxPopupMgr::ToggleRule);
1327   mgr->insert( action(GEOMOp::OpShowOnly ), -1, -1 ); // display only
1328   mgr->setRule(action(GEOMOp::OpShowOnly ), rule.arg( types ).arg( "true" ), QtxPopupMgr::VisibleRule );
1329
1330   mgr->insert( separator(), -1, -1 );     // -----------
1331   mgr->insert( action(  GEOMOp::OpUnpublishObject ), -1, -1 ); // Unpublish object
1332   mgr->setRule( action( GEOMOp::OpUnpublishObject ), QString("client='ObjectBrowser' and $type in {'Shape' 'Group'} and selcount>0"), QtxPopupMgr::VisibleRule );
1333
1334
1335   mgr->insert( action(  GEOMOp::OpPublishObject ), -1, -1 ); // Publish object
1336   mgr->setRule( action( GEOMOp::OpPublishObject ), QString("client='ObjectBrowser' and isComponent=true"), QtxPopupMgr::VisibleRule );
1337
1338   mgr->insert( action(  GEOMOp::OpReimport ), -1, -1 );  // delete
1339   mgr->setRule( action( GEOMOp::OpReimport ), QString("$imported in {'true'} and selcount>0"), QtxPopupMgr::VisibleRule );
1340
1341   mgr->hide( mgr->actionId( action( myEraseAll ) ) );
1342 }
1343
1344 //=======================================================================
1345 // function : GeometryGUI::activateModule()
1346 // purpose  : Called when GEOM module is activated
1347 //=======================================================================
1348 bool GeometryGUI::activateModule( SUIT_Study* study )
1349 {
1350   if ( CORBA::is_nil( myComponentGeom ) )
1351     return false;
1352
1353   bool res = SalomeApp_Module::activateModule( study );
1354
1355   if ( !res )
1356     return false;
1357   setMenuShown( true );
1358   setToolShown( true );
1359
1360   // import Python module that manages GEOM plugins (need to be here because SalomePyQt API uses active module)
1361   PyGILState_STATE gstate = PyGILState_Ensure();
1362   PyObject* pluginsmanager=PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
1363   if(pluginsmanager==NULL)
1364     PyErr_Print();
1365   else
1366     {
1367       PyObject* result=PyObject_CallMethod( pluginsmanager, (char*)"initialize", (char*)"isss",1,"geom",tr("MEN_NEW_ENTITY").toStdString().c_str(),tr("GEOM_PLUGINS_OTHER").toStdString().c_str());
1368       if(result==NULL)
1369         PyErr_Print();
1370       Py_XDECREF(result);
1371     }
1372   PyGILState_Release(gstate);
1373   // end of GEOM plugins loading
1374
1375   connect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1376           this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1377
1378   // Reset actions accelerator keys
1379   action(GEOMOp::OpImport)->setEnabled( true ); // Import: CTRL + Key_I
1380   action(GEOMOp::OpExport)->setEnabled( true ); // Export: CTRL + Key_E
1381   action(GEOMOp::OpDelete)->setEnabled( true ); // Delete: Key_Delete
1382
1383   GUIMap::Iterator it;
1384   for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1385     it.value()->activate( application()->desktop() );
1386
1387   LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1388
1389   SUIT_ViewManager* vm;
1390   ViewManagerList OCCViewManagers, VTKViewManagers;
1391
1392   application()->viewManagers( OCCViewer_Viewer::Type(), OCCViewManagers );
1393   QListIterator<SUIT_ViewManager*> itOCC( OCCViewManagers );
1394   while ( itOCC.hasNext() && (vm = itOCC.next()) )
1395     myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
1396
1397   application()->viewManagers( SVTK_Viewer::Type(), VTKViewManagers );
1398   QListIterator<SUIT_ViewManager*> itVTK( VTKViewManagers );
1399   while ( itVTK.hasNext() && (vm = itVTK.next()) )
1400     myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
1401
1402   //NPAL 19674
1403   SALOME_ListIO selected;
1404   sm->selectedObjects( selected );
1405   sm->clearSelected();
1406
1407   // disable OCC selectors
1408   getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
1409   QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1410   while ( itOCCSel.hasNext() )
1411     if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1412       sr->setEnabled(true);
1413
1414   // disable VTK selectors
1415   getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
1416   QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1417   while ( itVTKSel.hasNext() )
1418     if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1419       sr->setEnabled(true);
1420
1421   sm->setSelectedObjects( selected, true );   //NPAL 19674
1422
1423   QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1424   if ( viewMenu )
1425     connect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1426
1427   // 0020836 (Basic vectors and origin)
1428   SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
1429   if( aResourceMgr->booleanValue( "Geometry", "auto_create_base_objects", false ) ) {
1430     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
1431     if( appStudy ) {
1432       _PTR(Study) studyDS = appStudy->studyDS();
1433       if( studyDS ) {
1434         _PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
1435         if( !aSComponent ) // create objects automatically only if there is no GEOM component
1436           createOriginAndBaseVectors();
1437       }
1438     }
1439   }
1440
1441   return true;
1442 }
1443
1444
1445 //=======================================================================
1446 // function : GeometryGUI::deactivateModule()
1447 // purpose  : Called when GEOM module is deactivated
1448 //=======================================================================
1449 bool GeometryGUI::deactivateModule( SUIT_Study* study )
1450 {
1451   QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1452   if ( viewMenu )
1453     disconnect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1454
1455   setMenuShown( false );
1456   setToolShown( false );
1457
1458   disconnect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1459              this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1460
1461   EmitSignalCloseAllDialogs();
1462
1463   GUIMap::Iterator it;
1464   for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1465     it.value()->deactivate();
1466
1467   // Unset actions accelerator keys
1468   action(GEOMOp::OpImport)->setEnabled( false ); // Import: CTRL + Key_I
1469   action(GEOMOp::OpExport)->setEnabled( false ); // Export: CTRL + Key_E
1470   action(GEOMOp::OpDelete)->setEnabled( false ); // Delete: Key_Delete
1471
1472   qDeleteAll(myOCCSelectors);
1473   myOCCSelectors.clear();
1474   getApp()->selectionMgr()->setEnabled( true, OCCViewer_Viewer::Type() );
1475
1476   qDeleteAll(myVTKSelectors);
1477   myVTKSelectors.clear();
1478   getApp()->selectionMgr()->setEnabled( true, SVTK_Viewer::Type() );
1479
1480   return SalomeApp_Module::deactivateModule( study );
1481 }
1482
1483 //=======================================================================
1484 // function : onWindowActivated()
1485 // purpose  : update menu items' status - disable non-OCC-viewer-compatible actions
1486 //=======================================================================
1487 void GeometryGUI::onWindowActivated( SUIT_ViewWindow* win )
1488 {
1489   if ( !win )
1490     return;
1491
1492   const bool ViewOCC = ( win->getViewManager()->getType() == OCCViewer_Viewer::Type() );
1493   //const bool ViewVTK = ( win->getViewManager()->getType() == SVTK_Viewer::Type() );
1494
1495   // disable non-OCC viewframe menu commands
1496 //  action( GEOMOp::Op2dSketcher )->setEnabled( ViewOCC ); // SKETCHER
1497   action( GEOMOp::OpSuppressFaces )->setEnabled( ViewOCC ); // SuppressFace
1498   action( GEOMOp::OpSuppressHoles )->setEnabled( ViewOCC ); // SuppressHole
1499   action( GEOMOp::OpCloseContour )->setEnabled( ViewOCC ); // CloseContour
1500   action( GEOMOp::OpRemoveIntWires )->setEnabled( ViewOCC ); // RemoveInternalWires
1501   action( GEOMOp::OpAddPointOnEdge )->setEnabled( ViewOCC ); // AddPointOnEdge
1502 //  action( GEOMOp::OpFreeBoundaries )->setEnabled( ViewOCC ); // Free boundaries
1503
1504   action( GEOMOp::OpGroupCreate )->setEnabled( ViewOCC ); // Create Group
1505   action( GEOMOp::OpGroupEdit )->setEnabled( ViewOCC ); // Edit Group
1506
1507   action( GEOMOp::OpMultiTransform )->setEnabled( ViewOCC ); // MENU BLOCKS - MULTI-TRANSFORMATION
1508 }
1509
1510 void GeometryGUI::windows( QMap<int, int>& mappa ) const
1511 {
1512   mappa.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
1513   mappa.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
1514 }
1515
1516 void GeometryGUI::viewManagers( QStringList& lst ) const
1517 {
1518   lst.append( OCCViewer_Viewer::Type() );
1519 }
1520
1521 void GeometryGUI::onViewManagerAdded( SUIT_ViewManager* vm )
1522 {
1523   if ( vm && vm->getType() == OCCViewer_Viewer::Type() )
1524   {
1525     qDebug( "connect" );
1526     connect( vm, SIGNAL( keyPress  ( SUIT_ViewWindow*, QKeyEvent* ) ),
1527              this, SLOT( OnKeyPress( SUIT_ViewWindow*, QKeyEvent* ) ) );
1528     connect( vm, SIGNAL( mousePress( SUIT_ViewWindow*, QMouseEvent* ) ),
1529              this, SLOT( OnMousePress( SUIT_ViewWindow*, QMouseEvent* ) ) );
1530     connect( vm, SIGNAL( mouseMove ( SUIT_ViewWindow*, QMouseEvent* ) ),
1531              this, SLOT( OnMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) );
1532     connect( vm, SIGNAL( mouseRelease ( SUIT_ViewWindow*, QMouseEvent* ) ),
1533              this, SLOT( OnMouseRelease( SUIT_ViewWindow*, QMouseEvent* ) ) );
1534     
1535     LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1536     myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
1537
1538     // disable OCC selectors
1539     getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
1540     QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1541     while ( itOCCSel.hasNext() )
1542       if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1543         sr->setEnabled(true);
1544   }
1545   else if ( vm->getType() == SVTK_Viewer::Type() )
1546   {
1547     LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1548     myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
1549
1550     // disable VTK selectors
1551     getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
1552     QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1553     while ( itVTKSel.hasNext() )
1554       if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1555         sr->setEnabled(true);
1556   }
1557 }
1558
1559 void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm )
1560 {
1561   SUIT_ViewModel* viewer = vm->getViewModel();
1562   if ( vm->getType() == OCCViewer_Viewer::Type() )
1563   {
1564     QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1565     while ( itOCCSel.hasNext() )
1566       if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1567         if ( sr->viewer() == viewer )
1568         {
1569           delete myOCCSelectors.takeAt( myOCCSelectors.indexOf( sr ) );
1570           break;
1571         }
1572   }
1573   if ( vm->getType() == SVTK_Viewer::Type() )
1574   {
1575     QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1576     while ( itVTKSel.hasNext() )
1577       if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1578         if ( sr->viewer() == viewer )
1579         {
1580           delete myVTKSelectors.takeAt( myVTKSelectors.indexOf( sr ) );
1581           break;
1582         }
1583   }
1584 }
1585
1586 QString GeometryGUI::engineIOR() const
1587 {
1588   if ( !CORBA::is_nil( GetGeomGen() ) )
1589     return QString( getApp()->orb()->object_to_string( GetGeomGen() ) );
1590   return "";
1591 }
1592
1593 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
1594 Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture
1595 #else
1596 Handle(Graphic3d_HArray1OfBytes) GeometryGUI::getTexture
1597 #endif
1598       (SalomeApp_Study* theStudy, int theId, int& theWidth, int& theHeight)
1599 {
1600   theWidth = theHeight = 0;
1601
1602 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
1603   Handle(TColStd_HArray1OfByte) aTexture;
1604 #else
1605   Handle(Graphic3d_HArray1OfBytes) aTexture;
1606 #endif
1607
1608   if (theStudy) {
1609     TextureMap aTextureMap = myTextureMap[ theStudy->studyDS()->StudyId() ];
1610     aTexture = aTextureMap[ theId ];
1611     if ( aTexture.IsNull() ) {
1612       GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGen()->GetIInsertOperations( theStudy->studyDS()->StudyId() );
1613       if ( !aInsOp->_is_nil() ) {
1614         CORBA::Long aWidth, aHeight;
1615         SALOMEDS::TMPFile_var aStream = aInsOp->GetTexture( theId, aWidth, aHeight );
1616         if ( aWidth > 0 && aHeight > 0 && aStream->length() > 0 ) {
1617           theWidth  = aWidth;
1618           theHeight = aHeight;
1619
1620 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
1621           aTexture  = new TColStd_HArray1OfByte (1, aStream->length());
1622 #else
1623           aTexture  = new Graphic3d_HArray1OfBytes (1, aStream->length());
1624 #endif
1625
1626           for (int i = 0; i < aStream->length(); i++)
1627             aTexture->SetValue( i+1, (Standard_Byte)aStream[i] );
1628           aTextureMap[ theId ] = aTexture;
1629         }
1630       }
1631     }
1632   }
1633   return aTexture;
1634 }
1635
1636 LightApp_Selection* GeometryGUI::createSelection() const
1637 {
1638   return new GEOMGUI_Selection();
1639 }
1640
1641 void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
1642 {
1643   SalomeApp_Module::contextMenuPopup( client, menu, title );
1644
1645   /*
1646   SALOME_ListIO lst;
1647   getApp()->selectionMgr()->selectedObjects(lst);
1648   if (lst.Extent() < 1)
1649     return;
1650
1651   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
1652   _PTR(Study) study = appStudy->studyDS();
1653
1654   bool isImported = true;
1655   SALOME_ListIteratorOfListIO anIt (lst);
1656   for (; anIt.More() && isImported; anIt.Next()) {
1657     Handle(SALOME_InteractiveObject) io = anIt.Value();
1658     _PTR(SObject) aSObj = study->FindObjectID(io->getEntry());
1659     if (aSObj) {
1660       if (lst.Extent() == 1) {
1661         // Set context menu title
1662         if (client == "OCCViewer" || client == "VTKViewer")
1663           title = QString(aSObj->GetName().c_str());
1664       }
1665
1666       CORBA::Object_var anObj = GeometryGUI::ClientSObjectToObject(aSObj);
1667       GEOM::GEOM_Object_var aGeomObj = GEOM::GEOM_Object::_narrow(anObj);
1668       if (CORBA::is_nil(aGeomObj) || aGeomObj->GetType() != GEOM_IMPORT)
1669         isImported = false;
1670     } else {
1671       isImported = false;
1672     }
1673   }
1674
1675   if (isImported) {
1676     menu->addAction(action(GEOMOp::OpReimport)); // Reload imported shape
1677   }
1678   */
1679 }
1680
1681 void GeometryGUI::createPreferences()
1682 {
1683   int tabId = addPreference( tr( "PREF_TAB_SETTINGS" ) );
1684
1685   int genGroup = addPreference( tr( "PREF_GROUP_GENERAL" ), tabId );
1686   setPreferenceProperty( genGroup, "columns", 2 );
1687
1688   int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), genGroup,
1689                                 LightApp_Preferences::Selector,
1690                                 "Geometry", "display_mode" );
1691
1692   addPreference( tr( "PREF_SHADING_COLOR" ), genGroup,
1693                  LightApp_Preferences::Color, "Geometry", "shading_color" );
1694
1695   addPreference( tr( "PREF_EDGES_IN_SHADING" ), genGroup,
1696                  LightApp_Preferences::Color, "Geometry", "edges_in_shading_color" );
1697
1698   addPreference( tr( "PREF_WIREFRAME_COLOR" ), genGroup,
1699                  LightApp_Preferences::Color, "Geometry", "wireframe_color" );
1700
1701   addPreference( tr( "PREF_FREE_BOUND_COLOR" ), genGroup,
1702                  LightApp_Preferences::Color, "Geometry", "free_bound_color" );
1703
1704   addPreference( tr( "PREF_LINE_COLOR"), genGroup,
1705                  LightApp_Preferences::Color, "Geometry", "line_color" );
1706
1707   addPreference( tr( "PREF_POINT_COLOR"), genGroup,
1708                  LightApp_Preferences::Color, "Geometry", "point_color" );
1709
1710   addPreference( tr( "PREF_ISOS_COLOR" ), genGroup,
1711                  LightApp_Preferences::Color, "Geometry", "isos_color" );
1712
1713   addPreference( tr( "PREF_TOPLEVEL_COLOR" ), genGroup,
1714                  LightApp_Preferences::Color, "Geometry", "toplevel_color" );
1715
1716   addPreference( "", genGroup, LightApp_Preferences::Space );
1717
1718
1719   int step = addPreference( tr( "PREF_STEP_VALUE" ), genGroup,
1720                             LightApp_Preferences::IntSpin, "Geometry", "SettingsGeomStep" );
1721
1722   int defl = addPreference( tr( "PREF_DEFLECTION" ), genGroup,
1723                             LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" );
1724
1725   int material = addPreference( tr( "PREF_MATERIAL" ), genGroup,
1726                                       LightApp_Preferences::Selector,
1727                                       "Geometry", "material" );
1728   
1729   const int nb = 4;
1730   int wd[nb];
1731   int iter=0;
1732
1733   wd[iter++] = addPreference( tr( "PREF_EDGE_WIDTH" ), genGroup,
1734                               LightApp_Preferences::IntSpin, "Geometry", "edge_width" );
1735
1736   wd[iter++] = addPreference( tr( "PREF_ISOLINES_WIDTH" ), genGroup,
1737                               LightApp_Preferences::IntSpin, "Geometry", "isolines_width" );
1738
1739   wd[iter++] = addPreference( tr( "PREF_PREVIEW_EDGE_WIDTH" ), genGroup,
1740                                      LightApp_Preferences::IntSpin, "Geometry", "preview_edge_width" );
1741   
1742   wd[iter++] = addPreference( tr( "PREF_MEASURES_LINE_WIDTH" ), genGroup,
1743                               LightApp_Preferences::IntSpin, "Geometry", "measures_line_width" );
1744
1745   for(int i = 0; i < nb; i++) {
1746     setPreferenceProperty( wd[i], "min", 1 );    
1747     setPreferenceProperty( wd[i], "max", 5 );
1748   }
1749
1750
1751   // Quantities with individual precision settings
1752   int precGroup = addPreference( tr( "GEOM_PREF_GROUP_PRECISION" ), tabId );
1753   setPreferenceProperty( precGroup, "columns", 2 );
1754
1755   const int nbQuantities = 8;
1756   int prec[nbQuantities], ii = 0;
1757   prec[ii++] = addPreference( tr( "GEOM_PREF_length_precision" ), precGroup,
1758                               LightApp_Preferences::IntSpin, "Geometry", "length_precision" );
1759   prec[ii++] = addPreference( tr( "GEOM_PREF_angle_precision" ), precGroup,
1760                               LightApp_Preferences::IntSpin, "Geometry", "angle_precision" );
1761   prec[ii++] = addPreference( tr( "GEOM_PREF_len_tol_precision" ), precGroup,
1762                               LightApp_Preferences::IntSpin, "Geometry", "len_tol_precision" );
1763   prec[ii++] = addPreference( tr( "GEOM_PREF_ang_tol_precision" ), precGroup,
1764                               LightApp_Preferences::IntSpin, "Geometry", "ang_tol_precision" );
1765   prec[ii++] = addPreference( tr( "GEOM_PREF_weight_precision" ), precGroup,
1766                               LightApp_Preferences::IntSpin, "Geometry", "weight_precision" );
1767   prec[ii++] = addPreference( tr( "GEOM_PREF_density_precision" ), precGroup,
1768                               LightApp_Preferences::IntSpin, "Geometry", "density_precision" );
1769   prec[ii++] = addPreference( tr( "GEOM_PREF_parametric_precision" ), precGroup,
1770                               LightApp_Preferences::IntSpin, "Geometry", "parametric_precision" );
1771   prec[ii  ] = addPreference( tr( "GEOM_PREF_param_tol_precision" ), precGroup,
1772                               LightApp_Preferences::IntSpin, "Geometry", "param_tol_precision" );
1773
1774   // Set property for precision value for spinboxes
1775   for ( ii = 0; ii < nbQuantities; ii++ ){
1776     setPreferenceProperty( prec[ii], "min", -14 );
1777     setPreferenceProperty( prec[ii], "max", 14 );
1778     setPreferenceProperty( prec[ii], "precision", 2 );
1779   }
1780
1781   int VertexGroup = addPreference( tr( "PREF_GROUP_VERTEX" ), tabId );
1782   setPreferenceProperty( VertexGroup, "columns", 2 );
1783
1784   int typeOfMarker = addPreference( tr( "PREF_TYPE_OF_MARKER" ), VertexGroup,
1785                                     LightApp_Preferences::Selector, "Geometry", "type_of_marker" );
1786
1787   int markerScale = addPreference( tr( "PREF_MARKER_SCALE" ), VertexGroup,
1788                                    LightApp_Preferences::Selector, "Geometry", "marker_scale" );
1789
1790   // Set property for default display mode
1791   QStringList aModesList;
1792   aModesList.append( tr("MEN_WIREFRAME") );
1793   aModesList.append( tr("MEN_SHADING") );
1794   aModesList.append( tr("MEN_SHADING_WITH_EDGES") );
1795
1796   QList<QVariant> anIndexesList;
1797   anIndexesList.append(0);
1798   anIndexesList.append(1);
1799   anIndexesList.append(2);
1800
1801   setPreferenceProperty( dispmode, "strings", aModesList );
1802   setPreferenceProperty( dispmode, "indexes", anIndexesList );
1803
1804   // Set property for step value for spinboxes
1805   setPreferenceProperty( step, "min", 1 );
1806   setPreferenceProperty( step, "max", 10000 );
1807   setPreferenceProperty( step, "precision", 3 );
1808
1809   // Set property for deflection value for spinboxes
1810   setPreferenceProperty( defl, "min", DEFLECTION_MIN );
1811   setPreferenceProperty( defl, "max", 1.0 );
1812   setPreferenceProperty( defl, "step", 1.0e-04 );
1813   setPreferenceProperty( defl, "precision", 6 );
1814
1815   // Set property for default material
1816   Material_ResourceMgr aMatResMgr;
1817   QStringList aPrefMatNames = aMatResMgr.getPreferenceMaterialsNames();
1818   setPreferenceProperty( material, "strings", aPrefMatNames );
1819
1820   // Set property vertex marker type
1821   QList<QVariant> aMarkerTypeIndicesList;
1822   QList<QVariant> aMarkerTypeIconsList;
1823
1824   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1825   for ( int i = GEOM::MT_POINT; i < GEOM::MT_USER; i++ ) {
1826     QString icoFile = QString( "ICON_VERTEX_MARKER_%1" ).arg( i );
1827     QPixmap pixmap = resMgr->loadPixmap( "GEOM", tr( qPrintable( icoFile ) ) );
1828     aMarkerTypeIndicesList << (i-1);
1829     aMarkerTypeIconsList << pixmap;
1830   }
1831
1832   setPreferenceProperty( typeOfMarker, "indexes", aMarkerTypeIndicesList );
1833   setPreferenceProperty( typeOfMarker, "icons",   aMarkerTypeIconsList );
1834
1835   // Set property for vertex marker scale
1836   QList<QVariant> aMarkerScaleIndicesList;
1837   QStringList     aMarkerScaleValuesList;
1838
1839   for ( int iii = GEOM::MS_10; iii <= GEOM::MS_70; iii++ ) {
1840     aMarkerScaleIndicesList << iii;
1841     aMarkerScaleValuesList  << QString::number( (iii-(int)GEOM::MS_10)*0.5 + 1.0 );
1842   }
1843
1844   setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList );
1845   setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
1846
1847   int originGroup = addPreference( tr( "PREF_GROUP_ORIGIN_AND_BASE_VECTORS" ), tabId );
1848   setPreferenceProperty( originGroup, "columns", 2 );
1849
1850   int baseVectorsLength = addPreference( tr( "PREF_BASE_VECTORS_LENGTH" ), originGroup,
1851                                          LightApp_Preferences::DblSpin, "Geometry", "base_vectors_length" );
1852   setPreferenceProperty( baseVectorsLength, "min", 0.01 );
1853   setPreferenceProperty( baseVectorsLength, "max", 1000 );
1854
1855   addPreference( tr( "PREF_AUTO_CREATE" ), originGroup,
1856                  LightApp_Preferences::Bool, "Geometry", "auto_create_base_objects" );
1857
1858
1859   int operationsGroup = addPreference( tr( "PREF_GROUP_OPERATIONS" ), tabId );
1860   setPreferenceProperty( operationsGroup, "columns", 2 );
1861
1862   addPreference( tr( "GEOM_PREVIEW" ), operationsGroup,
1863                  LightApp_Preferences::Bool, "Geometry", "geom_preview" );
1864 }
1865
1866 void GeometryGUI::preferencesChanged( const QString& section, const QString& param )
1867 {
1868   if (section == "Geometry") {
1869     SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
1870     if (param == QString("SettingsGeomStep")) {
1871       double spin_step = aResourceMgr->doubleValue(section, param, 100.);
1872       EmitSignalDefaultStepValueChanged(spin_step);
1873     }
1874   }
1875 }
1876
1877 LightApp_Displayer* GeometryGUI::displayer()
1878 {
1879   if( !myDisplayer )
1880     myDisplayer = new GEOM_Displayer( dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) );
1881   return myDisplayer;
1882 }
1883
1884 void GeometryGUI::setLocalSelectionMode(const int mode)
1885 {
1886   myLocalSelectionMode = mode;
1887 }
1888 int GeometryGUI::getLocalSelectionMode() const
1889 {
1890   return myLocalSelectionMode;
1891 }
1892
1893 const char gSeparator = '_'; // character used to separate parameter names
1894 const char gDigitsSep = ':'; // character used to separate numeric parameter values (color = r:g:b)
1895
1896 /*!
1897  * \brief Store visual parameters
1898  *
1899  * This method is called just before the study document is saved.
1900  * Store visual parameters in AttributeParameter attribute(s)
1901  */
1902 void GeometryGUI::storeVisualParameters (int savePoint)
1903 {
1904   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
1905   if ( !appStudy || !appStudy->studyDS() )
1906     return;
1907   _PTR(Study) studyDS = appStudy->studyDS();
1908
1909   // componentName is used for encoding of entries when storing them in IParameters
1910   std::string componentName = myComponentGeom->ComponentDataType();
1911   //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
1912   //if (!aSComponent) return;
1913
1914   // IParameters
1915   _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
1916                                                              componentName.c_str(),
1917                                                              savePoint);
1918   _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
1919
1920   QList<SUIT_ViewManager*> lst;
1921   QList<SUIT_ViewManager*>::Iterator it;
1922
1923   // main cycle to store parameters of displayed objects
1924   lst.clear();
1925   getApp()->viewManagers(lst);
1926   for (it = lst.begin(); it != lst.end(); it++) {
1927     SUIT_ViewManager* vman = *it;
1928     QString vType = vman->getType();
1929     int aMgrId = vman->getGlobalId();
1930     // saving VTK actors properties
1931     QVector<SUIT_ViewWindow*> views = vman->getViews();
1932     for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++) {
1933       const ObjMap anObjects = appStudy->getObjectMap(aMgrId);
1934       ObjMap::ConstIterator o_it = anObjects.begin();
1935       for (; o_it != anObjects.end(); o_it++) {
1936         const PropMap aProps = o_it.value();
1937
1938         //Check that object exists in the study
1939         _PTR(SObject) obj( studyDS->FindObjectID( o_it.key().toLatin1().data() ) );
1940         if ( !obj || !(aProps.count() > 0))
1941           continue;
1942         // entry is "encoded" = it does NOT contain component adress, since it is a
1943         // subject to change on next component loading
1944
1945         std::string entry = ip->encodeEntry(o_it.key().toLatin1().data(), componentName);
1946
1947         _PTR(GenericAttribute) anAttr;
1948         if( !obj->FindAttribute(anAttr, "AttributeIOR"))
1949           continue;
1950
1951         std::string param,occParam = vType.toLatin1().data();
1952         occParam += NAME_SEPARATOR;
1953         occParam += QString::number(aMgrId).toLatin1().data();
1954         occParam += NAME_SEPARATOR;
1955
1956         if(aProps.contains(VISIBILITY_PROP)) {
1957           param = occParam + VISIBILITY_PROP;
1958           ip->setParameter(entry, param, aProps.value(VISIBILITY_PROP).toInt() == 1 ? "On" : "Off");
1959         }
1960
1961         if(aProps.contains(DISPLAY_MODE_PROP)) {
1962           param = occParam + DISPLAY_MODE_PROP;
1963           ip->setParameter(entry, param, QString::number(aProps.value(DISPLAY_MODE_PROP).toInt()).toLatin1().data());
1964         }
1965
1966         if(aProps.contains(COLOR_PROP)) {
1967           QColor c = aProps.value(COLOR_PROP).value<QColor>();
1968           QString colorStr = QString::number(c.red()/255.);
1969           colorStr += DIGIT_SEPARATOR; colorStr += QString::number(c.green()/255.);
1970           colorStr += DIGIT_SEPARATOR; colorStr += QString::number(c.blue()/255.);
1971           param = occParam + COLOR_PROP;
1972           ip->setParameter(entry, param, colorStr.toLatin1().data());
1973         }
1974
1975         if(vType == SVTK_Viewer::Type()) {
1976           if(aProps.contains(OPACITY_PROP)) {
1977             param = occParam + OPACITY_PROP;
1978             ip->setParameter(entry, param, QString::number(1. - aProps.value(TRANSPARENCY_PROP).toDouble()).toLatin1().data());
1979           }
1980         } else if (vType == SOCC_Viewer::Type()) {
1981           if(aProps.contains(TRANSPARENCY_PROP)) {
1982             param = occParam + TRANSPARENCY_PROP;
1983             ip->setParameter(entry, param, QString::number(aProps.value(TRANSPARENCY_PROP).toDouble()).toLatin1().data());
1984           }
1985
1986           if(aProps.contains(TOP_LEVEL_PROP)) {
1987             param = occParam + TOP_LEVEL_PROP;
1988             Standard_Boolean val = aProps.value(TOP_LEVEL_PROP).value<Standard_Boolean>();
1989             if (val == Standard_True) 
1990               ip->setParameter(entry, param, "1");
1991           }       
1992         }
1993
1994         if(aProps.contains(ISOS_PROP)) {
1995           param = occParam + ISOS_PROP;
1996           ip->setParameter(entry, param, aProps.value(ISOS_PROP).toString().toLatin1().data());
1997         }
1998
1999         if(aProps.contains(VECTOR_MODE_PROP)) {
2000           param = occParam + VECTOR_MODE_PROP;
2001           ip->setParameter(entry, param, QString::number(aProps.value(VECTOR_MODE_PROP).toInt()).toLatin1().data());
2002         }
2003
2004         if(aProps.contains(DEFLECTION_COEFF_PROP)) {
2005           param = occParam + DEFLECTION_COEFF_PROP;
2006           ip->setParameter(entry, param, QString::number(aProps.value(DEFLECTION_COEFF_PROP).toDouble()).toLatin1().data());
2007         }
2008
2009         //Marker type of the vertex - ONLY for the "Vertex" and "Compound of the Vertex"
2010         if(aProps.contains(MARKER_TYPE_PROP)) {
2011           param = occParam + MARKER_TYPE_PROP;
2012           ip->setParameter(entry, param, aProps.value(MARKER_TYPE_PROP).toString().toLatin1().data());
2013         }
2014
2015         if(aProps.contains(MATERIAL_PROP)) {
2016           param = occParam + MATERIAL_PROP;
2017           ip->setParameter(entry, param, aProps.value(MATERIAL_PROP).toString().toLatin1().data());
2018         }
2019
2020         if(aProps.contains( EDGE_WIDTH_PROP )) {
2021              param = occParam + EDGE_WIDTH_PROP;
2022            ip->setParameter(entry, param, aProps.value(EDGE_WIDTH_PROP).toString().toLatin1().data());                               
2023         }
2024         
2025         if(aProps.contains( ISOS_WIDTH_PROP )) {
2026           param = occParam + ISOS_WIDTH_PROP;
2027           ip->setParameter(entry, param, aProps.value(ISOS_WIDTH_PROP).toString().toLatin1().data());
2028         }
2029       } // object iterator
2030     } // for (views)
2031   } // for (viewManagers)
2032 }
2033
2034 /*!
2035  * \brief Restore visual parameters
2036  *
2037  * This method is called after the study document is opened.
2038  * Restore visual parameters from AttributeParameter attribute(s)
2039  */
2040 void GeometryGUI::restoreVisualParameters (int savePoint)
2041 {
2042   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
2043   if (!appStudy || !appStudy->studyDS())
2044     return;
2045   _PTR(Study) studyDS = appStudy->studyDS();
2046
2047   // componentName is used for encoding of entries when storing them in IParameters
2048   std::string componentName = myComponentGeom->ComponentDataType();
2049   //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
2050   //if (!aSComponent) return;
2051
2052   // IParameters
2053   _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
2054                                                              componentName.c_str(),
2055                                                              savePoint);
2056   _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
2057
2058   std::vector<std::string> entries = ip->getEntries();
2059
2060   for (std::vector<std::string>::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt)
2061   {
2062     // entry is a normal entry - it should be "decoded" (setting base adress of component)
2063     QString entry (ip->decodeEntry(*entIt).c_str());
2064
2065     // Check that the entry corresponds to a real object in the Study
2066     // as the object may be deleted or modified after the visual state is saved.
2067     _PTR(SObject) so = studyDS->FindObjectID(entry.toLatin1().data());
2068     if (!so) continue; //Skip the not existent entry
2069
2070     std::vector<std::string> paramNames = ip->getAllParameterNames( *entIt );
2071     std::vector<std::string> paramValues = ip->getAllParameterValues( *entIt );
2072
2073     std::vector<std::string>::iterator namesIt = paramNames.begin();
2074     std::vector<std::string>::iterator valuesIt = paramValues.begin();
2075
2076     // actors are stored in a map after displaying of them for
2077     // quicker access in the future: map < viewID to actor >
2078     NCollection_DataMap<int, GEOM_Actor*          > vtkActors;
2079     NCollection_DataMap<int, Handle(GEOM_AISShape)> occActors;
2080
2081     QString viewerTypStr;
2082     QString viewIndexStr;
2083     int viewIndex;
2084     QVector<PropMap> aListOfMap;
2085
2086     for (; namesIt != paramNames.end(); ++namesIt, ++valuesIt)
2087     {
2088       // visual parameters are stored in strings as follows: ViewerType_ViewIndex_ParamName.
2089       // '_' is used as separator and should not be used in viewer type or parameter names.
2090       QStringList lst = QString((*namesIt).c_str()).split(NAME_SEPARATOR, QString::SkipEmptyParts);
2091       if (lst.size() != 3)
2092         continue;
2093
2094       viewerTypStr = lst[0];
2095       viewIndexStr = lst[1];
2096       QString paramNameStr = lst[2];
2097
2098       bool ok;
2099       viewIndex = viewIndexStr.toUInt(&ok);
2100       if (!ok) // bad conversion of view index to integer
2101         continue;
2102
2103       if((viewIndex + 1) > aListOfMap.count()) {
2104         aListOfMap.resize(viewIndex + 1);
2105       }
2106
2107       QString val((*valuesIt).c_str());
2108       if(paramNameStr == VISIBILITY_PROP){
2109         aListOfMap[viewIndex].insert(VISIBILITY_PROP, val == "On" ? 1 : 0);
2110
2111       } else if(paramNameStr == OPACITY_PROP) {
2112         aListOfMap[viewIndex].insert(TRANSPARENCY_PROP, 1. - val.toDouble());
2113
2114       } else if(paramNameStr == TRANSPARENCY_PROP) {
2115         aListOfMap[viewIndex].insert( TRANSPARENCY_PROP, val.toDouble() );
2116
2117       } else if(paramNameStr == TOP_LEVEL_PROP) {
2118           aListOfMap[viewIndex].insert( TRANSPARENCY_PROP, val == "1" ? Standard_True : Standard_False );
2119           
2120       } else if(paramNameStr == DISPLAY_MODE_PROP) {
2121         aListOfMap[viewIndex].insert( DISPLAY_MODE_PROP, val.toInt());
2122
2123       } else if(paramNameStr == ISOS_PROP) {
2124         aListOfMap[viewIndex].insert( ISOS_PROP, val);
2125
2126       } else if(paramNameStr == COLOR_PROP) {
2127         QStringList rgb = val.split(DIGIT_SEPARATOR);
2128         if(rgb.count() == 3) {
2129           QColor c(int(rgb[0].toDouble()*255), int(rgb[1].toDouble()*255), int(rgb[2].toDouble()*255));
2130           aListOfMap[viewIndex].insert( COLOR_PROP, c);
2131         }
2132       } else if(paramNameStr == VECTOR_MODE_PROP) {
2133         aListOfMap[viewIndex].insert( VECTOR_MODE_PROP, val.toInt());
2134
2135       }  else if(paramNameStr == DEFLECTION_COEFF_PROP) {
2136         aListOfMap[viewIndex].insert( DEFLECTION_COEFF_PROP, val.toDouble());
2137       }  else if(paramNameStr == MARKER_TYPE_PROP) {
2138         aListOfMap[viewIndex].insert( MARKER_TYPE_PROP, val);
2139       } else if(paramNameStr == MATERIAL_PROP) {
2140         aListOfMap[viewIndex].insert( MATERIAL_PROP, val);
2141       }  else if(paramNameStr == EDGE_WIDTH_PROP) {
2142         aListOfMap[viewIndex].insert( EDGE_WIDTH_PROP , val);
2143       }  else if(paramNameStr == ISOS_WIDTH_PROP) {
2144         aListOfMap[viewIndex].insert( ISOS_WIDTH_PROP , val);
2145       }
2146
2147                     
2148
2149     } // for names/parameters iterator
2150
2151     QList<SUIT_ViewManager*> lst = getApp()->viewManagers();
2152
2153     for (int index = 0; index < aListOfMap.count(); index++) {
2154
2155       appStudy->setObjectPropMap(index, entry, aListOfMap[index]);
2156
2157       //Get Visibility property of the current PropMap
2158       if (aListOfMap[index].value(VISIBILITY_PROP) == 1) {
2159         SUIT_ViewManager* vman = lst.at(index);
2160         SUIT_ViewModel* vmodel = vman->getViewModel();
2161         displayer()->Display(entry, true, dynamic_cast<SALOME_View*>(vmodel));
2162       }
2163     }
2164
2165   } // for entries iterator
2166
2167   // update all VTK and OCC views
2168   QList<SUIT_ViewManager*> lst;
2169   getApp()->viewManagers(lst);
2170   for (QList<SUIT_ViewManager*>::Iterator it = lst.begin(); it != lst.end(); it++) {
2171     SUIT_ViewModel* vmodel = (*it)->getViewModel();
2172     if (!vmodel)
2173       continue;
2174     if (vmodel->getType() == SVTK_Viewer::Type()) {
2175       SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) (*it)->getActiveView();
2176       vtkView->getRenderer()->ResetCameraClippingRange();
2177       vtkView->Repaint();
2178     }
2179     else if (vmodel->getType() == SOCC_Viewer::Type()) {
2180       //SOCC_ViewWindow* occView = (SOCC_ViewWindow*) (*it)->getActiveView();
2181       SALOME_View* occVMod = dynamic_cast<SALOME_View*>(vmodel);
2182       if (occVMod)
2183         occVMod->Repaint();
2184     }
2185   }
2186 }
2187
2188 void GeometryGUI::onViewAboutToShow()
2189 {
2190   SUIT_ViewWindow* window = application()->desktop()->activeWindow();
2191   QAction* a = action( GEOMOp::OpSwitchVectors );
2192   if ( window ) {
2193     a->setEnabled(true);
2194     bool vmode = window->property("VectorsMode").toBool();
2195     a->setText ( vmode == 1 ? tr( "MEN_VECTOR_MODE_OFF" ) : tr("MEN_VECTOR_MODE_ON") );
2196   } else {
2197     a->setText ( tr("MEN_VECTOR_MODE_ON") );
2198     a->setEnabled(false);
2199   }
2200 }
2201
2202 /*!
2203   \brief Return action by id
2204   \param id identifier of the action
2205   \return action 
2206 */
2207 QAction* GeometryGUI::getAction(const int id) {
2208   return action(id);
2209 }
2210
2211 /*!
2212   \brief Check if this object is can't be renamed in place
2213
2214   This method can be re-implemented in the subclasses.
2215   Return true in case if object isn't reference or component (module root).
2216
2217   \param entry column id
2218   \return \c true if the item can be renamed by the user in place (e.g. in the Object browser)
2219 */
2220 bool GeometryGUI::renameAllowed( const QString& entry) const {
2221
2222   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
2223   SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0; 
2224   SalomeApp_DataObject* obj = appStudy ? dynamic_cast<SalomeApp_DataObject*>(appStudy->findObjectByEntry(entry)) : 0;
2225   
2226   return (app && appStudy && obj && !appStudy->isComponent(entry) && !obj->isReference());
2227 }
2228
2229
2230 /*!
2231   Rename object by entry.
2232   \param entry entry of the object
2233   \param name new name of the object
2234   \brief Return \c true if rename operation finished successfully, \c false otherwise.
2235 */
2236 bool GeometryGUI::renameObject( const QString& entry, const QString& name) {
2237   
2238   bool result = false;
2239   
2240   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication());
2241   SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
2242   
2243   if(!appStudy)
2244     return result;
2245   
2246   _PTR(Study) aStudy = appStudy->studyDS();
2247   
2248   if(!aStudy)
2249     return result;
2250
2251   bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
2252   if ( aLocked ) {
2253     SUIT_MessageBox::warning ( app->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
2254     return result;
2255   }
2256
2257   _PTR(SObject) obj ( aStudy->FindObjectID(qPrintable(entry)) );
2258   _PTR(GenericAttribute) anAttr;
2259   if ( obj ) {
2260     if ( obj->FindAttribute(anAttr, "AttributeName") ) {
2261       _PTR(AttributeName) aName (anAttr);
2262
2263       GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(obj));
2264       if (!CORBA::is_nil(anObj)) {
2265         aName->SetValue( name.toLatin1().data() ); // rename the SObject
2266         anObj->SetName( name.toLatin1().data() );  // Rename the corresponding GEOM_Object
2267         result = true;
2268       }
2269     }
2270   }
2271   return result;
2272 }
2273