1 // Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
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.
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.
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
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // File : GeometryGUI.cxx
23 // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
25 #include <Standard_math.hxx> // E.A. must be included before Python.h to fix compilation on windows
27 #undef HAVE_FINITE // VSR: avoid compilation warning on Linux : "HAVE_FINITE" redefined
30 #include "GeometryGUI.h"
31 #include "GeometryGUI_Operations.h"
32 #include "GEOMPluginGUI.h"
33 #include "GEOMGUI_XmlHandler.h"
34 #include "GEOMGUI_OCCSelector.h"
35 #include "GEOMGUI_Selection.h"
36 #include "GEOMGUI_CreationInfoWdg.h"
37 #include "GEOM_Constants.h"
38 #include "GEOM_Displayer.h"
39 #include "GEOM_AISShape.hxx"
41 #include "GEOM_Actor.h"
43 #include <Material_ResourceMgr.h>
44 #include <Material_Model.h>
46 #include <SUIT_Desktop.h>
47 #include <SUIT_MessageBox.h>
48 #include <SUIT_ResourceMgr.h>
49 #include <SUIT_Session.h>
50 #include <SUIT_ViewManager.h>
52 #include <PyInterp_Interp.h>
54 #include <OCCViewer_ViewWindow.h>
55 #include <OCCViewer_ViewPort3d.h>
56 #include <OCCViewer_ViewModel.h>
57 #include <OCCViewer_ViewManager.h>
59 #include <SOCC_ViewModel.h>
60 #include <SOCC_ViewWindow.h>
62 #include <SVTK_ViewWindow.h>
63 #include <SVTK_RenderWindowInteractor.h>
64 #include <SVTK_InteractorStyle.h>
65 #include <SVTK_ViewModel.h>
67 #include <SalomeApp_Application.h>
68 #include <SalomeApp_DataObject.h>
69 #include <SalomeApp_Study.h>
70 #include <SalomeApp_Tools.h>
72 #include <LightApp_SelectionMgr.h>
73 #include <LightApp_VTKSelector.h>
74 #include <LightApp_DataObject.h>
75 #include <LightApp_Preferences.h>
77 #include <SALOME_LifeCycleCORBA.hxx>
78 // #include <SALOME_ListIO.hxx>
79 #include <SALOME_ListIteratorOfListIO.hxx>
81 #include <SALOMEDSClient_ClientFactory.hxx>
82 #include <SALOMEDSClient_IParameters.hxx>
84 #include <SALOMEDS_SObject.hxx>
86 #include <Basics_OCCTVersion.hxx>
96 #include <QSignalMapper>
98 #include <AIS_Drawer.hxx>
99 #include <AIS_ListOfInteractive.hxx>
100 #include <AIS_ListIteratorOfListOfInteractive.hxx>
101 #include <Prs3d_Drawer.hxx>
102 #include <Prs3d_IsoAspect.hxx>
103 #include <Aspect_TypeOfMarker.hxx>
104 #include <OSD_SharedLibrary.hxx>
105 #include <NCollection_DataMap.hxx>
107 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
108 #include <TColStd_HArray1OfByte.hxx>
110 #include <Graphic3d_HArray1OfBytes.hxx>
113 #include <utilities.h>
115 #include <vtkCamera.h>
116 #include <vtkRenderer.h>
118 #include <Standard_Failure.hxx>
119 #include <Standard_ErrorHandler.hxx>
121 #include "GEOM_version.h"
122 #include "GEOMImpl_Types.hxx" // dangerous hxx (defines short-name macros) - include after all
125 Standard_EXPORT CAM_Module* createModule() {
126 return new GeometryGUI();
129 Standard_EXPORT char* getModuleVersion() {
130 return (char*)GEOM_VERSION_STR;
134 GeometryGUI::StudyTextureMap GeometryGUI::myTextureMap;
136 GEOM::GEOM_Gen_var GeometryGUI::myComponentGeom = GEOM::GEOM_Gen::_nil();
138 GEOM::GEOM_Gen_var GeometryGUI::GetGeomGen()
140 // Bug 12290: exception in Mesh GUI on GEOMBase::GetShape() if Geometry GUI hasn't been loaded
141 if (CORBA::is_nil(myComponentGeom))
143 return GeometryGUI::myComponentGeom;
146 bool GeometryGUI::InitGeomGen()
149 if ( CORBA::is_nil( myComponentGeom ) ) return false;
153 //=======================================================================
154 // function : ClientSObjectToObject
156 //=======================================================================
157 CORBA::Object_var GeometryGUI::ClientSObjectToObject (_PTR(SObject) theSObject)
159 _PTR(GenericAttribute) anAttr;
160 CORBA::Object_var anObj;
162 std::string aValue = theSObject->GetIOR();
163 if (strcmp(aValue.c_str(), "") != 0) {
164 CORBA::ORB_ptr anORB = SalomeApp_Application::orb();
165 anObj = anORB->string_to_object(aValue.c_str());
168 INFOS("ClientSObjectToObject - Unknown exception was occured!!!");
170 return anObj._retn();
173 //=======================================================================
174 // function : ClientStudyToStudy
176 //=======================================================================
177 SALOMEDS::Study_var GeometryGUI::ClientStudyToStudy (_PTR(Study) theStudy)
179 SALOME_NamingService *aNamingService = SalomeApp_Application::namingService();
180 CORBA::Object_var aSMObject = aNamingService->Resolve("/myStudyManager");
181 SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow(aSMObject);
182 int aStudyID = theStudy->StudyId();
183 SALOMEDS::Study_var aDSStudy = aStudyManager->GetStudyByID(aStudyID);
184 return aDSStudy._retn();
187 void GeometryGUI::Modified (bool theIsUpdateActions)
189 if ( SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() ) ) {
190 if ( SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) ) {
191 appStudy->Modified();
192 if ( theIsUpdateActions )
193 app->updateActions();
198 //=======================================================================
199 // function : GeometryGUI::GeometryGUI()
200 // purpose : Constructor
201 //=======================================================================
202 GeometryGUI::GeometryGUI() :
203 SalomeApp_Module( "GEOM" ),
206 if ( CORBA::is_nil( myComponentGeom ) )
208 Engines::EngineComponent_var comp =
209 SalomeApp_Application::lcc()->FindOrLoad_Component( "FactoryServer", "GEOM" );
210 myComponentGeom = GEOM::GEOM_Gen::_narrow( comp );
213 myActiveDialogBox = 0;
215 gp_Pnt origin = gp_Pnt(0., 0., 0.);
216 gp_Dir direction = gp_Dir(0., 0., 1.);
217 myWorkingPlane = gp_Ax3(origin, direction);
220 myLocalSelectionMode = GEOM_ALLOBJECTS;
222 myCreationInfoWdg = 0;
224 connect( Material_ResourceMgr::resourceMgr(), SIGNAL( changed() ), this, SLOT( updateMaterials() ) );
227 //=======================================================================
228 // function : GeometryGUI::~GeometryGUI()
229 // purpose : Destructor
230 //=======================================================================
231 GeometryGUI::~GeometryGUI()
233 while (!myOCCSelectors.isEmpty())
234 delete myOCCSelectors.takeFirst();
236 while (!myVTKSelectors.isEmpty())
237 delete myVTKSelectors.takeFirst();
239 qDeleteAll(myGUIMap);
242 //=======================================================================
243 // function : GeometryGUI::getLibrary()
244 // purpose : get or load GUI library by name [ internal ]
245 //=======================================================================
246 typedef GEOMGUI* (*LibraryGUI)( GeometryGUI* );
247 GEOMGUI* GeometryGUI::getLibrary( const QString& libraryName )
249 if ( !myGUIMap.contains( libraryName ) ) {
250 // try to load library if it is not loaded yet
252 QString dirs = getenv( "LD_LIBRARY_PATH" );
255 QString dirs = getenv( "PATH" );
258 if ( !dirs.isEmpty() ) {
259 QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries
260 QListIterator<QString> it( dirList ); it.toBack();
261 while ( it.hasPrevious() ) {
262 QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName );
264 OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() );
265 bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY );
267 MESSAGE( "Can't open library : " << aSharedLibrary.DlError() );
268 continue; // continue search further
270 OSD_Function osdF = aSharedLibrary.DlSymb( "GetLibGUI" );
271 if ( osdF != NULL ) {
272 LibraryGUI func = (GEOMGUI* (*) (GeometryGUI*))osdF;
273 GEOMGUI* libGUI = (*func)( this );
275 myGUIMap[ libraryName ] = libGUI;
276 break; // found and loaded!
283 return myGUIMap.contains( libraryName ) ? myGUIMap[ libraryName ] : 0;
286 //=======================================================================
287 // function : GeometryGUI::getPluginLibrary()
288 // purpose : get or load GUI Plugin library by name [ internal ]
289 //=======================================================================
290 typedef GEOMPluginGUI* (*PluginLibraryGUI)( GeometryGUI* );
291 GEOMPluginGUI* GeometryGUI::getPluginLibrary( const QString& libraryName )
293 if ( !myGUIMap.contains( libraryName ) ) {
294 // try to load library if it is not loaded yet
296 QString dirs = getenv( "LD_LIBRARY_PATH" );
299 QString dirs = getenv( "PATH" );
302 if ( !dirs.isEmpty() ) {
303 QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries
304 QListIterator<QString> it( dirList ); it.toBack();
305 while ( it.hasPrevious() ) {
306 QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName );
308 OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() );
309 bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY );
311 MESSAGE( "Can't open library : " << aSharedLibrary.DlError() );
312 continue; // continue search further
314 OSD_Function osdF = aSharedLibrary.DlSymb( "GetLibGUI" );
315 if ( osdF != NULL ) {
316 PluginLibraryGUI func = (GEOMPluginGUI* (*) (GeometryGUI*))osdF;
317 GEOMPluginGUI* libGUI = (*func)( this );
319 myGUIMap[ libraryName ] = libGUI;
320 break; // found and loaded!
327 return myGUIMap.contains( libraryName ) ? (GEOMPluginGUI*)myGUIMap[ libraryName ] : 0;
330 //=======================================================================
331 // function : GeometryGUI::ActiveWorkingPlane()
332 // purpose : Activate Working Plane View
333 //=======================================================================
334 void GeometryGUI::ActiveWorkingPlane()
336 gp_Dir DZ = myWorkingPlane.Direction();
337 gp_Dir DY = myWorkingPlane.YDirection();
339 SUIT_ViewWindow* window = application()->desktop()->activeWindow();
340 bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
341 bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
344 OCCViewer_ViewWindow* vw = dynamic_cast<OCCViewer_ViewWindow*>( window );
346 Handle(V3d_View) view3d = vw->getViewPort()->getView();
348 view3d->SetProj(DZ.X(), DZ.Y(), DZ.Z());
349 view3d->SetUp(DY.X(), DY.Y(), DY.Z());
353 else if ( ViewVTK ) {
354 SVTK_ViewWindow* vw = dynamic_cast<SVTK_ViewWindow*>( window );
356 vtkCamera* camera = vw->getRenderer()->GetActiveCamera();
358 camera->SetPosition(DZ.X(), DZ.Y(), DZ.Z());
359 camera->SetViewUp(DY.X(), DY.Y(), DY.Z());
360 camera->SetFocalPoint(0,0,0);
367 //=======================================================================
368 // function : GeometryGUI::SetActiveDialogBox()
369 // purpose : Set active dialog box
370 //=======================================================================
371 void GeometryGUI::SetActiveDialogBox( QDialog* aDlg )
373 myActiveDialogBox = (QDialog*)aDlg;
376 //=======================================================================
377 // function : GeometryGUI::EmitSignalDeactivateDialog()
378 // purpose : Emit a signal to deactivate the active dialog Box
379 //=======================================================================
380 void GeometryGUI::EmitSignalDeactivateDialog()
382 emit SignalDeactivateActiveDialog();
385 //=======================================================================
386 // function : GeometryGUI::EmitSignalCloseAllDialogs()
387 // purpose : Emit a signal to close all non modal dialogs box
388 //=======================================================================
389 void GeometryGUI::EmitSignalCloseAllDialogs()
391 emit SignalCloseAllDialogs();
394 //=======================================================================
395 // function : GeometryGUI::EmitSignalDefaultStepValueChanged()
396 // purpose : Emit a signal to inform that default real spin box step has
398 //=======================================================================
399 void GeometryGUI::EmitSignalDefaultStepValueChanged(double newVal)
401 emit SignalDefaultStepValueChanged(newVal);
404 //=======================================================================
405 // function : GeometryGUI::OnGUIEvent()
406 // purpose : common slot for all menu/toolbar actions
407 //=======================================================================
408 void GeometryGUI::OnGUIEvent()
410 const QObject* obj = sender();
411 if ( !obj || !obj->inherits( "QAction" ) )
413 int id = actionId((QAction*)obj);
418 //=======================================================================
419 // function : GeometryGUI::OnGUIEvent()
420 // purpose : manage all events on GUI [static]
421 //=======================================================================
422 void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
424 SUIT_Application* anApp = application();
426 SUIT_Desktop* desk = anApp->desktop();
428 // check type of the active viewframe
429 SUIT_ViewWindow* window = desk->activeWindow();
430 bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
431 bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
432 // if current viewframe is not of OCC and not of VTK type - return immediately
433 // fix for IPAL8958 - allow some commands to execute even when NO viewer is active (rename for example)
434 QList<int> NotViewerDependentCommands;
435 NotViewerDependentCommands << GEOMOp::OpDelete
437 << GEOMOp::OpShowOnly
438 << GEOMOp::OpShowOnlyChildren
439 << GEOMOp::OpDiscloseChildren
440 << GEOMOp::OpConcealChildren
441 << GEOMOp::OpUnpublishObject
442 << GEOMOp::OpPublishObject
443 << GEOMOp::OpPointMarker
444 << GEOMOp::OpCreateFolder
445 << GEOMOp::OpSortChildren;
446 if ( !ViewOCC && !ViewVTK && !NotViewerDependentCommands.contains( id ) ) {
447 // activate OCC viewer
448 getApp()->getViewManager(OCCViewer_Viewer::Type(), /*create=*/true);
451 // fix for IPAL9103, point 2
452 if ( CORBA::is_nil( GetGeomGen() ) ) {
453 SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_GET_ENGINE" ), tr( "GEOM_BUT_OK" ) );
458 // find corresponding GUI library
460 case GEOMOp::OpOriginAndVectors: // MENU BASIC - ORIGIN AND BASE VECTORS
461 createOriginAndBaseVectors(); // internal operation
463 case GEOMOp::OpImport: // MENU FILE - IMPORT
464 case GEOMOp::OpExport: // MENU FILE - EXPORT
465 case GEOMOp::OpSelectVertex: // POPUP MENU - SELECT ONLY - VERTEX
466 case GEOMOp::OpSelectEdge: // POPUP MENU - SELECT ONLY - EDGE
467 case GEOMOp::OpSelectWire: // POPUP MENU - SELECT ONLY - WIRE
468 case GEOMOp::OpSelectFace: // POPUP MENU - SELECT ONLY - FACE
469 case GEOMOp::OpSelectShell: // POPUP MENU - SELECT ONLY - SHELL
470 case GEOMOp::OpSelectSolid: // POPUP MENU - SELECT ONLY - SOLID
471 case GEOMOp::OpSelectCompound: // POPUP MENU - SELECT ONLY - COMPOUND
472 case GEOMOp::OpSelectAll: // POPUP MENU - SELECT ONLY - SELECT ALL
473 case GEOMOp::OpDelete: // MENU EDIT - DELETE
474 case GEOMOp::OpCheckGeom: // MENU TOOLS - CHECK GEOMETRY
475 case GEOMOp::OpMaterialsLibrary: // MENU TOOLS - MATERIALS LIBRARY
476 case GEOMOp::OpDeflection: // POPUP MENU - DEFLECTION COEFFICIENT
477 case GEOMOp::OpColor: // POPUP MENU - COLOR
478 case GEOMOp::OpSetTexture: // POPUP MENU - SETTEXTURE
479 case GEOMOp::OpTransparency: // POPUP MENU - TRANSPARENCY
480 case GEOMOp::OpIncrTransparency: // SHORTCUT - INCREASE TRANSPARENCY
481 case GEOMOp::OpDecrTransparency: // SHORTCUT - DECREASE TRANSPARENCY
482 case GEOMOp::OpIsos: // POPUP MENU - ISOS
483 case GEOMOp::OpIncrNbIsos: // SHORTCUT - INCREASE NB ISOS
484 case GEOMOp::OpDecrNbIsos: // SHORTCUT - DECREASE NB ISOS
485 case GEOMOp::OpAutoColor: // POPUP MENU - AUTO COLOR
486 case GEOMOp::OpNoAutoColor: // POPUP MENU - DISABLE AUTO COLOR
487 case GEOMOp::OpDiscloseChildren: // POPUP MENU - DISCLOSE CHILD ITEMS
488 case GEOMOp::OpConcealChildren: // POPUP MENU - CONCEAL CHILD ITEMS
489 case GEOMOp::OpUnpublishObject: // POPUP MENU - UNPUBLISH
490 case GEOMOp::OpPublishObject: // ROOT GEOM OBJECT - POPUP MENU - PUBLISH
491 case GEOMOp::OpPointMarker: // POPUP MENU - POINT MARKER
492 case GEOMOp::OpMaterialProperties: // POPUP MENU - MATERIAL PROPERTIES
493 case GEOMOp::OpPredefMaterial: // POPUP MENU - <SOME MATERIAL>
494 case GEOMOp::OpPredefMaterCustom: // POPUP MENU - MATERIAL PROPERTIES - CUSTOM...
495 case GEOMOp::OpEdgeWidth: // POPUP MENU - LINE WIDTH - EDGE WIDTH
496 case GEOMOp::OpIsosWidth: // POPUP MENU - LINE WIDTH - ISOS WIDTH
497 case GEOMOp::OpBringToFront: // POPUP MENU - BRING TO FRONT
498 case GEOMOp::OpClsBringToFront: //
499 case GEOMOp::OpCreateFolder: // POPUP MENU - CREATE FOLDER
500 case GEOMOp::OpSortChildren: // POPUP MENU - SORT CHILD ITEMS
501 libName = "GEOMToolsGUI";
503 case GEOMOp::OpDMWireframe: // MENU VIEW - WIREFRAME
504 case GEOMOp::OpDMShading: // MENU VIEW - SHADING
505 case GEOMOp::OpDMShadingWithEdges: // MENU VIEW - SHADING
506 case GEOMOp::OpDMTexture: // MENU VIEW - TEXTURE
507 case GEOMOp::OpShowAll: // MENU VIEW - SHOW ALL
508 case GEOMOp::OpShowOnly: // MENU VIEW - DISPLAY ONLY
509 case GEOMOp::OpShowOnlyChildren: // MENU VIEW - SHOW ONLY CHILDREN
510 case GEOMOp::OpHideAll: // MENU VIEW - ERASE ALL
511 case GEOMOp::OpHide: // MENU VIEW - ERASE
512 case GEOMOp::OpShow: // MENU VIEW - DISPLAY
513 case GEOMOp::OpSwitchVectors: // MENU VIEW - VECTOR MODE
514 case GEOMOp::OpWireframe: // POPUP MENU - WIREFRAME
515 case GEOMOp::OpShading: // POPUP MENU - SHADING
516 case GEOMOp::OpShadingWithEdges: // POPUP MENU - SHADING WITH EDGES
517 case GEOMOp::OpTexture: // POPUP MENU - TEXTURE
518 case GEOMOp::OpVectors: // POPUP MENU - VECTORS
519 libName = "DisplayGUI";
521 case GEOMOp::OpPoint: // MENU BASIC - POINT
522 case GEOMOp::OpLine: // MENU BASIC - LINE
523 case GEOMOp::OpCircle: // MENU BASIC - CIRCLE
524 case GEOMOp::OpEllipse: // MENU BASIC - ELLIPSE
525 case GEOMOp::OpArc: // MENU BASIC - ARC
526 case GEOMOp::OpVector: // MENU BASIC - VECTOR
527 case GEOMOp::OpPlane: // MENU BASIC - PLANE
528 case GEOMOp::OpCurve: // MENU BASIC - CURVE
529 case GEOMOp::OpLCS: // MENU BASIC - LOCAL COORDINATE SYSTEM
530 libName = "BasicGUI";
532 case GEOMOp::OpBox: // MENU PRIMITIVE - BOX
533 case GEOMOp::OpCylinder: // MENU PRIMITIVE - CYLINDER
534 case GEOMOp::OpSphere: // MENU PRIMITIVE - SPHERE
535 case GEOMOp::OpTorus: // MENU PRIMITIVE - TORUS
536 case GEOMOp::OpCone: // MENU PRIMITIVE - CONE
537 case GEOMOp::OpRectangle: // MENU PRIMITIVE - FACE
538 case GEOMOp::OpDisk: // MENU PRIMITIVE - DISK
539 libName = "PrimitiveGUI";
541 case GEOMOp::OpPrism: // MENU GENERATION - PRISM
542 case GEOMOp::OpRevolution: // MENU GENERATION - REVOLUTION
543 case GEOMOp::OpFilling: // MENU GENERATION - FILLING
544 case GEOMOp::OpPipe: // MENU GENERATION - PIPE
545 case GEOMOp::OpPipePath: // MENU GENERATION - RESTORE PATH
546 libName = "GenerationGUI";
548 case GEOMOp::Op2dSketcher: // MENU ENTITY - SKETCHER
549 case GEOMOp::Op3dSketcher: // MENU ENTITY - 3D SKETCHER
550 case GEOMOp::OpIsoline: // MENU BASIC - ISOLINE
551 case GEOMOp::OpExplode: // MENU ENTITY - EXPLODE
553 case GEOMOp::OpFeatureDetect: // MENU ENTITY - FEATURE DETECTION
555 case GEOMOp::OpPictureImport: // MENU ENTITY - IMPORT PICTURE IN VIEWER
556 case GEOMOp::OpCreateField: // MENU FIELD - CREATE FIELD
557 case GEOMOp::OpEditField: // MENU FIELD - EDIT FIELD
558 case GEOMOp::OpEditFieldPopup: // POPUP MENU - EDIT FIELD
559 libName = "EntityGUI";
561 case GEOMOp::OpEdge: // MENU BUILD - EDGE
562 case GEOMOp::OpWire: // MENU BUILD - WIRE
563 case GEOMOp::OpFace: // MENU BUILD - FACE
564 case GEOMOp::OpShell: // MENU BUILD - SHELL
565 case GEOMOp::OpSolid: // MENU BUILD - SOLID
566 case GEOMOp::OpCompound: // MENU BUILD - COMPUND
567 libName = "BuildGUI";
569 case GEOMOp::OpFuse: // MENU BOOLEAN - FUSE
570 case GEOMOp::OpCommon: // MENU BOOLEAN - COMMON
571 case GEOMOp::OpCut: // MENU BOOLEAN - CUT
572 case GEOMOp::OpSection: // MENU BOOLEAN - SECTION
573 libName = "BooleanGUI";
575 case GEOMOp::OpTranslate: // MENU TRANSFORMATION - TRANSLATION
576 case GEOMOp::OpRotate: // MENU TRANSFORMATION - ROTATION
577 case GEOMOp::OpChangeLoc: // MENU TRANSFORMATION - LOCATION
578 case GEOMOp::OpMirror: // MENU TRANSFORMATION - MIRROR
579 case GEOMOp::OpScale: // MENU TRANSFORMATION - SCALE
580 case GEOMOp::OpOffset: // MENU TRANSFORMATION - OFFSET
581 case GEOMOp::OpProjection: // MENU TRANSFORMATION - PROJECTION
582 case GEOMOp::OpMultiTranslate: // MENU TRANSFORMATION - MULTI-TRANSLATION
583 case GEOMOp::OpMultiRotate: // MENU TRANSFORMATION - MULTI-ROTATION
584 case GEOMOp::OpReimport: // CONTEXT(POPUP) MENU - RELOAD_IMPORTED
585 libName = "TransformationGUI";
587 case GEOMOp::OpPartition: // MENU OPERATION - PARTITION
588 case GEOMOp::OpArchimede: // MENU OPERATION - ARCHIMEDE
589 case GEOMOp::OpFillet3d: // MENU OPERATION - FILLET
590 case GEOMOp::OpChamfer: // MENU OPERATION - CHAMFER
591 case GEOMOp::OpClipping: // MENU OPERATION - CLIPPING RANGE
592 case GEOMOp::OpShapesOnShape: // MENU OPERATION - GET SHAPES ON SHAPE
593 case GEOMOp::OpFillet2d: // MENU OPERATION - FILLET 2D
594 case GEOMOp::OpFillet1d: // MENU OPERATION - FILLET 1D
595 case GEOMOp::OpSharedShapes: // MENU OPERATION - GET SHARED SHAPES
596 case GEOMOp::OpExtrudedBoss: // MENU OPERATION - EXTRUDED BOSS
597 case GEOMOp::OpExtrudedCut: // MENU OPERATION - EXTRUDED CUT
598 #ifdef DEBUG_CURVE_CREATOR
599 // for debug purposes, to be removed
600 case GEOMOp::OpCurveCreator: // MENU OPERATION - CURVE CREATOR
602 libName = "OperationGUI";
604 case GEOMOp::OpSewing: // MENU REPAIR - SEWING
605 case GEOMOp::OpSuppressFaces: // MENU REPAIR - SUPPRESS FACES
606 case GEOMOp::OpSuppressHoles: // MENU REPAIR - SUPPRESS HOLE
607 case GEOMOp::OpShapeProcess: // MENU REPAIR - SHAPE PROCESSING
608 case GEOMOp::OpCloseContour: // MENU REPAIR - CLOSE CONTOUR
609 case GEOMOp::OpRemoveIntWires: // MENU REPAIR - REMOVE INTERNAL WIRES
610 case GEOMOp::OpAddPointOnEdge: // MENU REPAIR - ADD POINT ON EDGE
611 case GEOMOp::OpFreeBoundaries: // MENU MEASURE - FREE BOUNDARIES
612 case GEOMOp::OpFreeFaces: // MENU MEASURE - FREE FACES
613 case GEOMOp::OpOrientation: // MENU REPAIR - CHANGE ORIENTATION
614 case GEOMOp::OpGlueFaces: // MENU REPAIR - GLUE FACES
615 case GEOMOp::OpGlueEdges: // MENU REPAIR - GLUE EDGES
616 case GEOMOp::OpLimitTolerance: // MENU REPAIR - LIMIT TOLERANCE
617 case GEOMOp::OpRemoveWebs: // MENU REPAIR - REMOVE INTERNAL FACES
618 case GEOMOp::OpRemoveExtraEdges: // MENU REPAIR - REMOVE EXTRA EDGES
619 case GEOMOp::OpFuseEdges: // MENU REPAIR - FUSE COLLINEAR EDGES
620 case GEOMOp::OpUnionFaces: // MENU REPAIR - UNION FACES
621 libName = "RepairGUI";
623 case GEOMOp::OpProperties: // MENU MEASURE - PROPERTIES
624 case GEOMOp::OpCenterMass: // MENU MEASURE - CDG
625 case GEOMOp::OpInertia: // MENU MEASURE - INERTIA
626 case GEOMOp::OpNormale: // MENU MEASURE - NORMALE
627 case GEOMOp::OpBoundingBox: // MENU MEASURE - BOUNDING BOX
628 case GEOMOp::OpMinDistance: // MENU MEASURE - MIN DISTANCE
629 case GEOMOp::OpAngle: // MENU MEASURE - ANGLE
630 case GEOMOp::OpTolerance: // MENU MEASURE - TOLERANCE
631 case GEOMOp::OpWhatIs: // MENU MEASURE - WHATIS
632 case GEOMOp::OpCheckShape: // MENU MEASURE - CHECK
633 case GEOMOp::OpCheckCompound: // MENU MEASURE - CHECK COMPOUND OF BLOCKS
634 case GEOMOp::OpGetNonBlocks: // MENU MEASURE - Get NON BLOCKS
635 case GEOMOp::OpPointCoordinates: // MENU MEASURE - POINT COORDINATES
636 case GEOMOp::OpCheckSelfInters: // MENU MEASURE - CHECK SELF INTERSECTIONS
637 case GEOMOp::OpManageDimensions: // MENU MEASURE - MANAGE DIMENSIONS
638 case GEOMOp::OpShowAllDimensions: // POPUP MENU - SHOW ALL DIMENSIONS
639 case GEOMOp::OpHideAllDimensions: // POPUP MENU - HIDE ALL DIMENSIONS
640 libName = "MeasureGUI";
642 case GEOMOp::OpGroupCreate: // MENU GROUP - CREATE
643 case GEOMOp::OpGroupCreatePopup: // POPUP MENU - CREATE GROUP
644 case GEOMOp::OpGroupEdit: // MENU GROUP - EDIT
645 case GEOMOp::OpGroupUnion: // MENU GROUP - UNION
646 case GEOMOp::OpGroupIntersect: // MENU GROUP - INTERSECT
647 case GEOMOp::OpGroupCut: // MENU GROUP - CUT
648 libName = "GroupGUI";
650 case GEOMOp::OpHexaSolid: // MENU BLOCKS - HEXAHEDRAL SOLID
651 case GEOMOp::OpMultiTransform: // MENU BLOCKS - MULTI-TRANSFORMATION
652 case GEOMOp::OpQuadFace: // MENU BLOCKS - QUADRANGLE FACE
653 case GEOMOp::OpPropagate: // MENU BLOCKS - PROPAGATE
654 case GEOMOp::OpExplodeBlock: // MENU BLOCKS - EXPLODE ON BLOCKS
655 libName = "BlocksGUI";
657 case GEOMOp::OpExportXAO: // MENU NEW ENTITY - IMPORTEXPORT - EXPORTXAO
658 case GEOMOp::OpImportXAO: // MENU NEW ENTITY - IMPORTEXPORT - IMPORTXAO
659 libName = "ImportExportGUI";
661 //case GEOMOp::OpAdvancedNoOp: // NO OPERATION (advanced operations base)
662 //case GEOMOp::OpPipeTShape: // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE
663 //case GEOMOp::OpPipeTShapeGroups: // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS
664 //case GEOMOp::OpDividedDisk: // MENU NEW ENTITY - ADVANCED - DIVIDEDDISK
665 //case GEOMOp::OpDividedCylinder: // MENU NEW ENTITY - ADVANCED - DIVIDEDCYLINDER
666 //case GEOMOp::OpSmoothingSurface: // MENU NEW ENTITY - ADVANCED - SMOOTHINGSURFACE
667 //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@//
668 //libName = "AdvancedGUI";
671 if (myPluginActions.contains(id)) {
672 libName = myPluginActions[id].first;
674 GEOMPluginGUI* library = 0;
675 if ( !libName.isEmpty() ) {
677 libName = QString( "lib" ) + libName + ".so";
679 libName = libName + ".dll";
681 library = getPluginLibrary( libName );
684 // call method of corresponding GUI library
686 //QString action ("%1");
687 //action = action.arg(id);
689 //if( !theParam.isValid() )
690 library->OnGUIEvent( myPluginActions[id].second, desk );
692 // library->OnGUIEvent( id, desk, theParam);
695 SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) );
697 updateCreationInfo();
703 GEOMGUI* library = 0;
704 if ( !libName.isEmpty() ) {
706 libName = QString( "lib" ) + libName + ".so";
708 libName = libName + ".dll";
710 library = getLibrary( libName );
713 // call method of corresponding GUI library
715 if( !theParam.isValid() )
716 library->OnGUIEvent( id, desk );
718 library->OnGUIEvent( id, desk, theParam);
721 SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) );
723 updateCreationInfo();
726 //=================================================================================
727 // function : GeometryGUI::activateOperation()
729 //=================================================================================
730 bool GeometryGUI::activateOperation( int actionId )
732 OnGUIEvent(actionId);
736 //=================================================================================
737 // function : GeometryGUI::activateOperation()
739 //=================================================================================
740 bool GeometryGUI::activateOperation( const QString& actionId )
744 int id = actionId.toInt(&isOk);
751 //=================================================================================
752 // function : GeometryGUI::activateOperation()
754 //=================================================================================
755 bool GeometryGUI::activateOperation( const QString& actionId, const QString& plugin )
759 QString pluginLib = plugin;
760 // TODO: if <plugin> is a plugin name, find plugin library name
761 if (myPluginLibs.contains(plugin))
762 pluginLib = myPluginLibs[plugin];
764 QMap<int, PluginAction>::iterator actionsIter = myPluginActions.begin();
765 for (; actionsIter != myPluginActions.end(); ++actionsIter) {
766 const PluginAction& anAction = actionsIter.value();
767 if (anAction.first == pluginLib && anAction.second == actionId) {
768 // activate operation
769 OnGUIEvent(actionsIter.key());
777 //=================================================================================
778 // function : GeometryGUI::OnKeyPress()
779 // purpose : Called when any key is pressed by user [static]
780 //=================================================================================
781 void GeometryGUI::OnKeyPress( SUIT_ViewWindow* w, QKeyEvent* e )
783 if ( !application() )
785 foreach ( GEOMGUI* lib, myGUIMap )
786 lib->OnKeyPress( e, application()->desktop(), w );
789 //=================================================================================
790 // function : GeometryGUI::OnMouseMove()
791 // purpose : Manages mouse move events [static]
792 //=================================================================================
793 void GeometryGUI::OnMouseMove( SUIT_ViewWindow* w, QMouseEvent* e )
795 if ( !application() )
797 foreach ( GEOMGUI* lib, myGUIMap )
798 lib->OnMouseMove( e, application()->desktop(), w );
801 //=================================================================================
802 // function : GeometryGUI::OnMouseRelease()
803 // purpose : Manages mouse release events [static]
804 //=================================================================================
805 void GeometryGUI::OnMouseRelease( SUIT_ViewWindow* w, QMouseEvent* e )
807 if ( !application() )
809 foreach ( GEOMGUI* lib, myGUIMap )
810 lib->OnMouseRelease( e, application()->desktop(), w );
813 //=================================================================================
814 // function : GeometryGUI::OnMousePress()
815 // purpose : Manage mouse press events [static]
816 //=================================================================================
817 void GeometryGUI::OnMousePress( SUIT_ViewWindow* w, QMouseEvent* e )
819 if ( !application() )
821 foreach ( GEOMGUI* lib, myGUIMap )
822 lib->OnMousePress( e, application()->desktop(), w );
825 //=======================================================================
826 // function : createGeomAction
828 //=======================================================================
829 void GeometryGUI::createGeomAction( const int id, const QString& label, const QString& icolabel,
830 const int accel, const bool toggle, const QString& shortcutAction )
832 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
833 QPixmap icon = icolabel.isEmpty() ? resMgr->loadPixmap( "GEOM", tr( (QString( "ICO_" )+label).toLatin1().constData() ), false )
834 : resMgr->loadPixmap( "GEOM", tr( icolabel.toLatin1().constData() ) );
836 tr( QString( "TOP_%1" ).arg( label ).toLatin1().constData() ),
838 tr( QString( "MEN_%1" ).arg( label ).toLatin1().constData() ),
839 tr( QString( "STB_%1" ).arg( label ).toLatin1().constData() ),
841 application()->desktop(),
843 this, SLOT( OnGUIEvent() ),
847 //=======================================================================
848 // function : createOriginAndBaseVectors
850 //=======================================================================
851 void GeometryGUI::createOriginAndBaseVectors()
853 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
854 bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
856 SUIT_MessageBox::warning ( application()->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
860 _PTR(Study) studyDS = appStudy->studyDS();
861 if ( studyDS && !CORBA::is_nil( GetGeomGen() ) ) {
862 GEOM::GEOM_IBasicOperations_var aBasicOperations = GetGeomGen()->GetIBasicOperations( studyDS->StudyId() );
863 if ( !aBasicOperations->_is_nil() ) {
864 SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
865 double aLength = aResourceMgr->doubleValue( "Geometry", "base_vectors_length", 1.0 );
866 GEOM::GEOM_Object_var anOrigin = aBasicOperations->MakePointXYZ( 0.0, 0.0, 0.0 );
867 GEOM::GEOM_Object_var anOX = aBasicOperations->MakeVectorDXDYDZ( aLength, 0.0, 0.0 );
868 GEOM::GEOM_Object_var anOY = aBasicOperations->MakeVectorDXDYDZ( 0.0, aLength, 0.0 );
869 GEOM::GEOM_Object_var anOZ = aBasicOperations->MakeVectorDXDYDZ( 0.0, 0.0, aLength );
871 SALOMEDS::Study_var aDSStudy = ClientStudyToStudy( studyDS );
872 GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOrigin, "O" );
873 GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOX, "OX" );
874 GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOY, "OY" );
875 GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOZ, "OZ" );
877 getApp()->updateObjectBrowser( true );
883 //=======================================================================
884 // function : GeometryGUI::initialize()
885 // purpose : Called when GEOM module is created
886 //=======================================================================
887 void GeometryGUI::initialize( CAM_Application* app )
889 SalomeApp_Module::initialize( app );
891 // ----- create actions --------------
893 createGeomAction( GEOMOp::OpImport, "IMPORT", "", Qt::ControlModifier + Qt::Key_I );
894 createGeomAction( GEOMOp::OpExport, "EXPORT", "", Qt::ControlModifier + Qt::Key_E );
896 createGeomAction( GEOMOp::OpDelete, "DELETE", "", Qt::Key_Delete );
898 createGeomAction( GEOMOp::OpPoint, "POINT" );
899 createGeomAction( GEOMOp::OpLine, "LINE" );
900 createGeomAction( GEOMOp::OpCircle, "CIRCLE" );
901 createGeomAction( GEOMOp::OpEllipse, "ELLIPSE" );
902 createGeomAction( GEOMOp::OpArc, "ARC" );
903 createGeomAction( GEOMOp::OpCurve, "CURVE" );
904 createGeomAction( GEOMOp::OpIsoline, "ISOLINE" );
905 createGeomAction( GEOMOp::OpVector, "VECTOR" );
906 createGeomAction( GEOMOp::OpPlane, "PLANE" );
907 createGeomAction( GEOMOp::OpLCS, "LOCAL_CS" );
908 createGeomAction( GEOMOp::OpOriginAndVectors, "ORIGIN_AND_VECTORS" );
910 createGeomAction( GEOMOp::OpBox, "BOX" );
911 createGeomAction( GEOMOp::OpCylinder, "CYLINDER" );
912 createGeomAction( GEOMOp::OpSphere, "SPHERE" );
913 createGeomAction( GEOMOp::OpTorus, "TORUS" );
914 createGeomAction( GEOMOp::OpCone, "CONE" );
915 createGeomAction( GEOMOp::OpRectangle, "RECTANGLE" );
916 createGeomAction( GEOMOp::OpDisk, "DISK" );
918 createGeomAction( GEOMOp::OpPrism, "EXTRUSION" );
919 createGeomAction( GEOMOp::OpRevolution, "REVOLUTION" );
920 createGeomAction( GEOMOp::OpFilling, "FILLING" );
921 createGeomAction( GEOMOp::OpPipe, "PIPE" );
922 createGeomAction( GEOMOp::OpPipePath, "PIPE_PATH" );
924 createGeomAction( GEOMOp::OpGroupCreate, "GROUP_CREATE" );
925 createGeomAction( GEOMOp::OpGroupEdit, "GROUP_EDIT" );
926 createGeomAction( GEOMOp::OpGroupUnion, "GROUP_UNION" );
927 createGeomAction( GEOMOp::OpGroupIntersect, "GROUP_INTERSECT" );
928 createGeomAction( GEOMOp::OpGroupCut, "GROUP_CUT" );
930 createGeomAction( GEOMOp::OpCreateField, "FIELD_CREATE" );
931 createGeomAction( GEOMOp::OpEditField, "FIELD_EDIT" );
933 createGeomAction( GEOMOp::OpReimport, "RELOAD_IMPORTED" );
935 createGeomAction( GEOMOp::OpQuadFace, "Q_FACE" );
936 createGeomAction( GEOMOp::OpHexaSolid, "HEX_SOLID" );
938 createGeomAction( GEOMOp::Op2dSketcher, "SKETCH" );
939 createGeomAction( GEOMOp::Op3dSketcher, "3DSKETCH" );
940 createGeomAction( GEOMOp::OpIsoline, "ISOLINE" );
941 createGeomAction( GEOMOp::OpExplode, "EXPLODE" );
943 createGeomAction( GEOMOp::OpFeatureDetect,"FEATURE_DETECTION" );
945 createGeomAction( GEOMOp::OpPictureImport,"PICTURE_IMPORT" );
947 createGeomAction( GEOMOp::OpEdge, "EDGE" );
948 createGeomAction( GEOMOp::OpWire, "WIRE" );
949 createGeomAction( GEOMOp::OpFace, "FACE" );
950 createGeomAction( GEOMOp::OpShell, "SHELL" );
951 createGeomAction( GEOMOp::OpSolid, "SOLID" );
952 createGeomAction( GEOMOp::OpCompound, "COMPOUND" );
954 createGeomAction( GEOMOp::OpFuse, "FUSE" );
955 createGeomAction( GEOMOp::OpCommon, "COMMON" );
956 createGeomAction( GEOMOp::OpCut, "CUT" );
957 createGeomAction( GEOMOp::OpSection, "SECTION" );
959 createGeomAction( GEOMOp::OpTranslate, "TRANSLATION" );
960 createGeomAction( GEOMOp::OpRotate, "ROTATION" );
961 createGeomAction( GEOMOp::OpChangeLoc, "MODIFY_LOCATION" );
962 createGeomAction( GEOMOp::OpMirror, "MIRROR" );
963 createGeomAction( GEOMOp::OpScale, "SCALE" );
964 createGeomAction( GEOMOp::OpOffset, "OFFSET" );
965 createGeomAction( GEOMOp::OpProjection, "PROJECTION" );
966 createGeomAction( GEOMOp::OpMultiTranslate, "MUL_TRANSLATION" );
967 createGeomAction( GEOMOp::OpMultiRotate, "MUL_ROTATION" );
969 createGeomAction( GEOMOp::OpPartition, "PARTITION" );
970 createGeomAction( GEOMOp::OpArchimede, "ARCHIMEDE" );
971 createGeomAction( GEOMOp::OpFillet3d, "FILLET" );
972 createGeomAction( GEOMOp::OpChamfer, "CHAMFER" );
973 //createGeomAction( GEOMOp::OpClipping, "CLIPPING" );
974 createGeomAction( GEOMOp::OpShapesOnShape, "GET_SHAPES_ON_SHAPE" );
975 createGeomAction( GEOMOp::OpSharedShapes, "GET_SHARED_SHAPES" );
976 createGeomAction( GEOMOp::OpExtrudedCut, "EXTRUDED_CUT" );
977 createGeomAction( GEOMOp::OpExtrudedBoss, "EXTRUDED_BOSS" );
978 #ifdef DEBUG_CURVE_CREATOR
979 // for debug purposes, to be removed
980 createGeomAction( GEOMOp::OpCurveCreator, "CURVE_CREATOR" );
982 createGeomAction( GEOMOp::OpFillet1d, "FILLET_1D" );
983 createGeomAction( GEOMOp::OpFillet2d, "FILLET_2D" );
985 createGeomAction( GEOMOp::OpMultiTransform, "MUL_TRANSFORM" );
986 createGeomAction( GEOMOp::OpExplodeBlock, "EXPLODE_BLOCKS" );
987 createGeomAction( GEOMOp::OpPropagate, "PROPAGATE" );
989 createGeomAction( GEOMOp::OpSewing, "SEWING" );
990 createGeomAction( GEOMOp::OpGlueFaces, "GLUE_FACES" );
991 createGeomAction( GEOMOp::OpGlueEdges, "GLUE_EDGES" );
992 createGeomAction( GEOMOp::OpLimitTolerance, "LIMIT_TOLERANCE" );
993 createGeomAction( GEOMOp::OpSuppressFaces, "SUPPRESS_FACES" );
994 createGeomAction( GEOMOp::OpSuppressHoles, "SUPPERSS_HOLES" );
995 createGeomAction( GEOMOp::OpShapeProcess, "SHAPE_PROCESS" );
996 createGeomAction( GEOMOp::OpCloseContour, "CLOSE_CONTOUR" );
997 createGeomAction( GEOMOp::OpRemoveIntWires, "SUPPRESS_INT_WIRES" );
998 createGeomAction( GEOMOp::OpAddPointOnEdge, "POINT_ON_EDGE" );
999 createGeomAction( GEOMOp::OpFreeBoundaries, "CHECK_FREE_BNDS" );
1000 createGeomAction( GEOMOp::OpFreeFaces, "CHECK_FREE_FACES" );
1001 createGeomAction( GEOMOp::OpOrientation, "CHANGE_ORIENTATION" );
1002 createGeomAction( GEOMOp::OpRemoveWebs, "REMOVE_WEBS" );
1003 createGeomAction( GEOMOp::OpRemoveExtraEdges, "REMOVE_EXTRA_EDGES" );
1004 createGeomAction( GEOMOp::OpFuseEdges, "FUSE_EDGES" );
1005 createGeomAction( GEOMOp::OpUnionFaces, "UNION_FACES" );
1007 createGeomAction( GEOMOp::OpPointCoordinates, "POINT_COORDS" );
1008 createGeomAction( GEOMOp::OpProperties, "BASIC_PROPS" );
1009 createGeomAction( GEOMOp::OpCenterMass, "MASS_CENTER" );
1010 createGeomAction( GEOMOp::OpInertia, "INERTIA" );
1011 createGeomAction( GEOMOp::OpNormale, "NORMALE" );
1012 createGeomAction( GEOMOp::OpBoundingBox, "BND_BOX" );
1013 createGeomAction( GEOMOp::OpMinDistance, "MIN_DIST" );
1014 createGeomAction( GEOMOp::OpAngle, "MEASURE_ANGLE" );
1015 createGeomAction( GEOMOp::OpManageDimensions, "MANAGE_DIMENSIONS" );
1017 createGeomAction( GEOMOp::OpTolerance, "TOLERANCE" );
1018 createGeomAction( GEOMOp::OpWhatIs, "WHAT_IS" );
1019 createGeomAction( GEOMOp::OpCheckShape, "CHECK" );
1020 createGeomAction( GEOMOp::OpCheckCompound, "CHECK_COMPOUND" );
1021 createGeomAction( GEOMOp::OpGetNonBlocks, "GET_NON_BLOCKS" );
1022 createGeomAction( GEOMOp::OpCheckSelfInters, "CHECK_SELF_INTERSECTIONS" );
1024 #ifdef _DEBUG_ // PAL16821
1025 createGeomAction( GEOMOp::OpCheckGeom, "CHECK_GEOMETRY" );
1028 createGeomAction( GEOMOp::OpMaterialsLibrary, "MATERIALS_LIBRARY" );
1029 createGeomAction( GEOMOp::OpDMWireframe, "WIREFRAME" );
1030 createGeomAction( GEOMOp::OpDMShading, "SHADING" );
1031 createGeomAction( GEOMOp::OpDMShadingWithEdges, "SHADING_WITH_EDGES" );
1032 createGeomAction( GEOMOp::OpDMTexture, "TEXTURE" );
1033 createGeomAction( GEOMOp::OpShowAll, "DISPLAY_ALL" );
1034 createGeomAction( GEOMOp::OpHideAll, "ERASE_ALL" );
1035 createGeomAction( GEOMOp::OpShow, "DISPLAY" );
1036 createGeomAction( GEOMOp::OpSwitchVectors, "VECTOR_MODE");
1037 createGeomAction( GEOMOp::OpSelectVertex, "VERTEX_SEL_ONLY" ,"", 0, true );
1038 createGeomAction( GEOMOp::OpSelectEdge, "EDGE_SEL_ONLY", "", 0, true );
1039 createGeomAction( GEOMOp::OpSelectWire, "WIRE_SEL_ONLY", "", 0, true );
1040 createGeomAction( GEOMOp::OpSelectFace, "FACE_SEL_ONLY", "", 0, true );
1041 createGeomAction( GEOMOp::OpSelectShell, "SHELL_SEL_ONLY", "", 0, true );
1042 createGeomAction( GEOMOp::OpSelectSolid, "SOLID_SEL_ONLY", "", 0, true );
1043 createGeomAction( GEOMOp::OpSelectCompound, "COMPOUND_SEL_ONLY", "", 0, true );
1044 createGeomAction( GEOMOp::OpSelectAll, "ALL_SEL_ONLY", "", 0, true );
1045 createGeomAction( GEOMOp::OpShowOnly, "DISPLAY_ONLY" );
1046 createGeomAction( GEOMOp::OpShowOnlyChildren, "SHOW_ONLY_CHILDREN" );
1047 createGeomAction( GEOMOp::OpBringToFront, "BRING_TO_FRONT", "", 0, true );
1048 createGeomAction( GEOMOp::OpClsBringToFront, "CLS_BRING_TO_FRONT" );
1049 createGeomAction( GEOMOp::OpHide, "ERASE" );
1051 createGeomAction( GEOMOp::OpWireframe, "POP_WIREFRAME", "", 0, true );
1052 createGeomAction( GEOMOp::OpShading, "POP_SHADING", "", 0, true );
1053 createGeomAction( GEOMOp::OpShadingWithEdges, "POP_SHADING_WITH_EDGES", "", 0, true );
1054 createGeomAction( GEOMOp::OpTexture, "POP_TEXTURE", "", 0, true );
1055 createGeomAction( GEOMOp::OpEdgeWidth, "EDGE_WIDTH");
1056 createGeomAction( GEOMOp::OpIsosWidth, "ISOS_WIDTH");
1057 createGeomAction( GEOMOp::OpVectors, "POP_VECTORS", "", 0, true );
1058 createGeomAction( GEOMOp::OpDeflection, "POP_DEFLECTION" );
1059 createGeomAction( GEOMOp::OpColor, "POP_COLOR" );
1060 createGeomAction( GEOMOp::OpSetTexture, "POP_SETTEXTURE" );
1061 createGeomAction( GEOMOp::OpTransparency, "POP_TRANSPARENCY" );
1062 createGeomAction( GEOMOp::OpIsos, "POP_ISOS" );
1063 createGeomAction( GEOMOp::OpAutoColor, "POP_AUTO_COLOR" );
1064 createGeomAction( GEOMOp::OpNoAutoColor, "POP_DISABLE_AUTO_COLOR" );
1065 createGeomAction( GEOMOp::OpGroupCreatePopup, "POP_CREATE_GROUP" );
1066 createGeomAction( GEOMOp::OpEditFieldPopup, "POP_EDIT_FIELD" );
1067 createGeomAction( GEOMOp::OpDiscloseChildren, "POP_DISCLOSE_CHILDREN" );
1068 createGeomAction( GEOMOp::OpConcealChildren, "POP_CONCEAL_CHILDREN" );
1069 createGeomAction( GEOMOp::OpUnpublishObject, "POP_UNPUBLISH_OBJ" );
1070 createGeomAction( GEOMOp::OpPublishObject, "POP_PUBLISH_OBJ" );
1071 createGeomAction( GEOMOp::OpPointMarker, "POP_POINT_MARKER" );
1072 createGeomAction( GEOMOp::OpMaterialProperties, "POP_MATERIAL_PROPERTIES" );
1073 createGeomAction( GEOMOp::OpPredefMaterCustom, "POP_PREDEF_MATER_CUSTOM" );
1074 createGeomAction( GEOMOp::OpCreateFolder, "POP_CREATE_FOLDER" );
1075 createGeomAction( GEOMOp::OpSortChildren, "POP_SORT_CHILD_ITEMS" );
1076 createGeomAction( GEOMOp::OpShowAllDimensions, "POP_SHOW_ALL_DIMENSIONS" );
1077 createGeomAction( GEOMOp::OpHideAllDimensions, "POP_HIDE_ALL_DIMENSIONS" );
1079 // Create actions for increase/decrease transparency shortcuts
1080 createGeomAction( GEOMOp::OpIncrTransparency, "", "", 0, false,
1081 "Geometry:Increase transparency");
1082 createGeomAction( GEOMOp::OpDecrTransparency, "", "", 0, false,
1083 "Geometry:Decrease transparency");
1085 // Create actions for increase/decrease number of isolines
1086 createGeomAction( GEOMOp::OpIncrNbIsos, "", "", 0, false,
1087 "Geometry:Increase number of isolines");
1088 createGeomAction( GEOMOp::OpDecrNbIsos, "", "", 0, false,
1089 "Geometry:Decrease number of isolines");
1091 // Import/Export XAO
1092 createGeomAction( GEOMOp::OpExportXAO, "EXPORTXAO" );
1093 createGeomAction( GEOMOp::OpImportXAO, "IMPORTXAO" );
1095 //createGeomAction( GEOMOp::OpPipeTShape, "PIPETSHAPE" );
1096 //createGeomAction( GEOMOp::OpDividedDisk, "DIVIDEDDISK" );
1097 //createGeomAction( GEOMOp::OpDividedCylinder, "DIVIDEDCYLINDER" );
1098 //createGeomAction( GEOMOp::OpSmoothingSurface, "SMOOTHINGSURFACE" );
1099 //@@ 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 @@//
1101 // ---- create menus --------------------------
1103 int fileId = createMenu( tr( "MEN_FILE" ), -1, -1 );
1104 createMenu( separator(), fileId, 10 );
1105 createMenu( GEOMOp::OpImport, fileId, 10 );
1106 createMenu( GEOMOp::OpExport, fileId, 10 );
1107 int impexpId = createMenu( tr( "MEN_IMPORTEXPORT" ), fileId, -1, 10 );
1108 createMenu( GEOMOp::OpExportXAO, impexpId, -1 );
1109 createMenu( GEOMOp::OpImportXAO, impexpId, -1 );
1110 createMenu( separator(), fileId, -1 );
1112 int editId = createMenu( tr( "MEN_EDIT" ), -1, -1 );
1113 createMenu( GEOMOp::OpDelete, editId, -1 );
1115 int newEntId = createMenu( tr( "MEN_NEW_ENTITY" ), -1, -1, 10 );
1117 int basicId = createMenu( tr( "MEN_BASIC" ), newEntId, -1 );
1118 createMenu( GEOMOp::OpPoint, basicId, -1 );
1119 createMenu( GEOMOp::OpLine, basicId, -1 );
1120 createMenu( GEOMOp::OpCircle, basicId, -1 );
1121 createMenu( GEOMOp::OpEllipse, basicId, -1 );
1122 createMenu( GEOMOp::OpArc, basicId, -1 );
1123 createMenu( GEOMOp::OpCurve, basicId, -1 );
1124 createMenu( GEOMOp::Op2dSketcher, basicId, -1 );
1125 createMenu( GEOMOp::Op3dSketcher, basicId, -1 );
1126 createMenu( GEOMOp::OpIsoline, basicId, -1 );
1127 createMenu( separator(), basicId, -1 );
1128 createMenu( GEOMOp::OpVector, basicId, -1 );
1129 createMenu( GEOMOp::OpPlane, basicId, -1 );
1130 createMenu( GEOMOp::OpLCS, basicId, -1 );
1131 createMenu( GEOMOp::OpOriginAndVectors, basicId, -1 );
1133 int primId = createMenu( tr( "MEN_PRIMITIVES" ), newEntId, -1 );
1134 createMenu( GEOMOp::OpBox, primId, -1 );
1135 createMenu( GEOMOp::OpCylinder, primId, -1 );
1136 createMenu( GEOMOp::OpSphere, primId, -1 );
1137 createMenu( GEOMOp::OpTorus, primId, -1 );
1138 createMenu( GEOMOp::OpCone, primId, -1 );
1139 createMenu( GEOMOp::OpRectangle, primId, -1 );
1140 createMenu( GEOMOp::OpDisk, primId, -1 );
1141 //createMenu( GEOMOp::OpPipeTShape,primId, -1 );
1143 int genId = createMenu( tr( "MEN_GENERATION" ), newEntId, -1 );
1144 createMenu( GEOMOp::OpPrism, genId, -1 );
1145 createMenu( GEOMOp::OpRevolution, genId, -1 );
1146 createMenu( GEOMOp::OpFilling, genId, -1 );
1147 createMenu( GEOMOp::OpPipe, genId, -1 );
1148 #if OCC_VERSION_LARGE > 0x06050300
1149 createMenu( GEOMOp::OpPipePath, genId, -1 );
1152 //int advId = createMenu( tr( "MEN_ADVANCED" ), newEntId, -1 );
1153 //createMenu( GEOMOp::OpSmoothingSurface, advId, -1 );
1154 //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@//
1156 createMenu( separator(), newEntId, -1 );
1158 int groupId = createMenu( tr( "MEN_GROUP" ), newEntId, -1 );
1159 createMenu( GEOMOp::OpGroupCreate, groupId, -1 );
1160 createMenu( GEOMOp::OpGroupEdit, groupId, -1 );
1161 createMenu( GEOMOp::OpGroupUnion, groupId, -1 );
1162 createMenu( GEOMOp::OpGroupIntersect, groupId, -1 );
1163 createMenu( GEOMOp::OpGroupCut, groupId, -1 );
1165 createMenu( separator(), newEntId, -1 );
1167 int fieldId = createMenu( tr( "MEN_FIELD" ), newEntId, -1 );
1168 createMenu( GEOMOp::OpCreateField, fieldId, -1 );
1169 createMenu( GEOMOp::OpEditField, fieldId, -1 );
1171 createMenu( separator(), newEntId, -1 );
1173 int blocksId = createMenu( tr( "MEN_BLOCKS" ), newEntId, -1 );
1174 createMenu( GEOMOp::OpQuadFace, blocksId, -1 );
1175 createMenu( GEOMOp::OpHexaSolid, blocksId, -1 );
1176 //createMenu( GEOMOp::OpDividedDisk, blocksId, -1 );
1177 //createMenu( GEOMOp::OpDividedCylinder, blocksId, -1 );
1179 createMenu( separator(), newEntId, -1 );
1181 createMenu( GEOMOp::OpExplode, newEntId, -1 );
1183 int buildId = createMenu( tr( "MEN_BUILD" ), newEntId, -1 );
1184 createMenu( GEOMOp::OpEdge, buildId, -1 );
1185 createMenu( GEOMOp::OpWire, buildId, -1 );
1186 createMenu( GEOMOp::OpFace, buildId, -1 );
1187 createMenu( GEOMOp::OpShell, buildId, -1 );
1188 createMenu( GEOMOp::OpSolid, buildId, -1 );
1189 createMenu( GEOMOp::OpCompound, buildId, -1 );
1191 createMenu( separator(), newEntId, -1 );
1193 createMenu( GEOMOp::OpPictureImport, newEntId, -1 );
1195 createMenu( GEOMOp::OpFeatureDetect, newEntId, -1 );
1198 int operId = createMenu( tr( "MEN_OPERATIONS" ), -1, -1, 10 );
1200 int boolId = createMenu( tr( "MEN_BOOLEAN" ), operId, -1 );
1201 createMenu( GEOMOp::OpFuse, boolId, -1 );
1202 createMenu( GEOMOp::OpCommon, boolId, -1 );
1203 createMenu( GEOMOp::OpCut, boolId, -1 );
1204 createMenu( GEOMOp::OpSection, boolId, -1 );
1206 int transId = createMenu( tr( "MEN_TRANSFORMATION" ), operId, -1 );
1207 createMenu( GEOMOp::OpTranslate, transId, -1 );
1208 createMenu( GEOMOp::OpRotate, transId, -1 );
1209 createMenu( GEOMOp::OpChangeLoc, transId, -1 );
1210 createMenu( GEOMOp::OpMirror, transId, -1 );
1211 createMenu( GEOMOp::OpScale, transId, -1 );
1212 createMenu( GEOMOp::OpOffset, transId, -1 );
1213 createMenu( GEOMOp::OpProjection, transId, -1 );
1214 createMenu( separator(), transId, -1 );
1215 createMenu( GEOMOp::OpMultiTranslate, transId, -1 );
1216 createMenu( GEOMOp::OpMultiRotate, transId, -1 );
1218 int blockId = createMenu( tr( "MEN_BLOCKS" ), operId, -1 );
1219 createMenu( GEOMOp::OpMultiTransform, blockId, -1 );
1220 createMenu( GEOMOp::OpExplodeBlock, blockId, -1 );
1221 createMenu( GEOMOp::OpPropagate, blockId, -1 );
1223 createMenu( separator(), operId, -1 );
1225 createMenu( GEOMOp::OpPartition, operId, -1 );
1226 createMenu( GEOMOp::OpArchimede, operId, -1 );
1227 createMenu( GEOMOp::OpShapesOnShape, operId, -1 );
1228 createMenu( GEOMOp::OpSharedShapes, operId, -1 );
1230 createMenu( separator(), operId, -1 );
1232 createMenu( GEOMOp::OpFillet1d, operId, -1 );
1233 createMenu( GEOMOp::OpFillet2d, operId, -1 );
1234 createMenu( GEOMOp::OpFillet3d, operId, -1 );
1235 createMenu( GEOMOp::OpChamfer, operId, -1 );
1236 createMenu( GEOMOp::OpExtrudedBoss, operId, -1 );
1237 createMenu( GEOMOp::OpExtrudedCut, operId, -1 );
1238 #ifdef DEBUG_CURVE_CREATOR
1239 // for debug purposes, to be removed
1240 createMenu( separator(), operId, -1 );
1241 createMenu( GEOMOp::OpCurveCreator, operId, -1 );
1243 //createMenu( GEOMOp::OpClipping, operId, -1 );
1245 int repairId = createMenu( tr( "MEN_REPAIR" ), -1, -1, 10 );
1246 createMenu( GEOMOp::OpShapeProcess, repairId, -1 );
1247 createMenu( GEOMOp::OpSuppressFaces, repairId, -1 );
1248 createMenu( GEOMOp::OpCloseContour, repairId, -1 );
1249 createMenu( GEOMOp::OpRemoveIntWires, repairId, -1 );
1250 createMenu( GEOMOp::OpSuppressHoles, repairId, -1 );
1251 createMenu( GEOMOp::OpSewing, repairId, -1 );
1252 createMenu( GEOMOp::OpGlueFaces, repairId, -1 );
1253 createMenu( GEOMOp::OpGlueEdges, repairId, -1 );
1254 createMenu( GEOMOp::OpLimitTolerance, repairId, -1 );
1255 createMenu( GEOMOp::OpAddPointOnEdge, repairId, -1 );
1256 //createMenu( GEOMOp::OpFreeBoundaries, repairId, -1 );
1257 //createMenu( GEOMOp::OpFreeFaces, repairId, -1 );
1258 createMenu( GEOMOp::OpOrientation, repairId, -1 );
1259 createMenu( GEOMOp::OpRemoveWebs, repairId, -1 );
1260 createMenu( GEOMOp::OpRemoveExtraEdges, repairId, -1 );
1261 createMenu( GEOMOp::OpFuseEdges, repairId, -1 );
1262 createMenu( GEOMOp::OpUnionFaces, repairId, -1 );
1264 int measurId = createMenu( tr( "MEN_MEASURES" ), -1, -1, 10 );
1265 createMenu( GEOMOp::OpPointCoordinates, measurId, -1 );
1266 createMenu( GEOMOp::OpProperties, measurId, -1 );
1267 createMenu( separator(), measurId, -1 );
1268 createMenu( GEOMOp::OpCenterMass, measurId, -1 );
1269 createMenu( GEOMOp::OpInertia, measurId, -1 );
1270 createMenu( GEOMOp::OpNormale, measurId, -1 );
1271 createMenu( separator(), measurId, -1 );
1272 createMenu( GEOMOp::OpFreeBoundaries, measurId, -1 );
1273 createMenu( GEOMOp::OpFreeFaces, measurId, -1 );
1274 createMenu( separator(), measurId, -1 );
1276 int dimId = createMenu( tr( "MEN_DIMENSIONS" ), measurId, -1 );
1277 createMenu( GEOMOp::OpBoundingBox, dimId, -1 );
1278 createMenu( GEOMOp::OpMinDistance, dimId, -1 );
1279 createMenu( GEOMOp::OpAngle, dimId, -1 );
1280 createMenu( GEOMOp::OpManageDimensions, dimId, -1 );
1282 createMenu( separator(), measurId, -1 );
1283 createMenu( GEOMOp::OpTolerance, measurId, -1 );
1284 createMenu( separator(), measurId, -1 );
1285 createMenu( GEOMOp::OpWhatIs, measurId, -1 );
1286 createMenu( GEOMOp::OpCheckShape, measurId, -1 );
1287 createMenu( GEOMOp::OpCheckCompound, measurId, -1 );
1288 createMenu( GEOMOp::OpGetNonBlocks, measurId, -1 );
1289 createMenu( GEOMOp::OpCheckSelfInters, measurId, -1 );
1291 int toolsId = createMenu( tr( "MEN_TOOLS" ), -1, -1, 50 );
1292 #if defined(_DEBUG_) || defined(_DEBUG) // PAL16821
1293 createMenu( separator(), toolsId, -1 );
1294 createMenu( GEOMOp::OpCheckGeom, toolsId, -1 );
1297 createMenu( separator(), toolsId, -1 );
1298 createMenu( GEOMOp::OpMaterialsLibrary, toolsId, -1 );
1299 createMenu( separator(), toolsId, -1 );
1301 int viewId = createMenu( tr( "MEN_VIEW" ), -1, -1 );
1302 createMenu( separator(), viewId, -1 );
1304 int dispmodeId = createMenu( tr( "MEN_DISPLAY_MODE" ), viewId, -1 );
1305 createMenu( GEOMOp::OpDMWireframe, dispmodeId, -1 );
1306 createMenu( GEOMOp::OpDMShading, dispmodeId, -1 );
1307 createMenu( GEOMOp::OpDMShadingWithEdges, dispmodeId, -1 );
1308 createMenu( GEOMOp::OpDMTexture, dispmodeId, -1 );
1309 createMenu( separator(), dispmodeId, -1 );
1310 createMenu( GEOMOp::OpSwitchVectors, dispmodeId, -1 );
1312 createMenu( separator(), viewId, -1 );
1313 createMenu( GEOMOp::OpShowAll, viewId, -1 );
1314 createMenu( GEOMOp::OpHideAll, viewId, -1 );
1315 createMenu( separator(), viewId, -1 );
1316 createMenu( GEOMOp::OpPublishObject, viewId, -1 );
1317 createMenu( separator(), viewId, -1 );
1321 because of these items are accessible through object browser and viewers
1322 we have removed they from main menu
1324 createMenu( GEOMOp::OpShow, viewId, -1 );
1325 createMenu( GEOMOp::OpShowOnly, viewId, -1 );
1326 createMenu( GEOMOp::OpHide, viewId, -1 );
1329 // ---- create toolbars --------------------------
1331 int basicTbId = createTool( tr( "TOOL_BASIC" ) );
1332 createTool( GEOMOp::OpPoint, basicTbId );
1333 createTool( GEOMOp::OpLine, basicTbId );
1334 createTool( GEOMOp::OpCircle, basicTbId );
1335 createTool( GEOMOp::OpEllipse, basicTbId );
1336 createTool( GEOMOp::OpArc, basicTbId );
1337 createTool( GEOMOp::OpCurve, basicTbId );
1338 createTool( GEOMOp::OpVector, basicTbId );
1339 createTool( GEOMOp::Op2dSketcher, basicTbId ); //rnc
1340 createTool( GEOMOp::Op3dSketcher, basicTbId ); //rnc
1341 createTool( GEOMOp::OpIsoline, basicTbId );
1342 createTool( GEOMOp::OpPlane, basicTbId );
1343 createTool( GEOMOp::OpLCS, basicTbId );
1344 createTool( GEOMOp::OpOriginAndVectors, basicTbId );
1346 // int sketchTbId = createTool( tr( "TOOL_SKETCH" ) );
1347 // createTool( GEOMOp::Op2dSketcher, sketchTbId );
1348 // createTool( GEOMOp::Op3dSketcher, sketchTbId );
1350 int primTbId = createTool( tr( "TOOL_PRIMITIVES" ) );
1351 createTool( GEOMOp::OpBox, primTbId );
1352 createTool( GEOMOp::OpCylinder, primTbId );
1353 createTool( GEOMOp::OpSphere, primTbId );
1354 createTool( GEOMOp::OpTorus, primTbId );
1355 createTool( GEOMOp::OpCone, primTbId );
1356 createTool( GEOMOp::OpRectangle, primTbId );
1357 createTool( GEOMOp::OpDisk, primTbId );
1358 //createTool( GEOMOp::OpPipeTShape, primTbId ); //rnc
1360 //int blocksTbId = createTool( tr( "TOOL_BLOCKS" ) );
1361 //createTool( GEOMOp::OpDividedDisk, blocksTbId );
1362 //createTool( GEOMOp::OpDividedCylinder, blocksTbId );
1364 int boolTbId = createTool( tr( "TOOL_BOOLEAN" ) );
1365 createTool( GEOMOp::OpFuse, boolTbId );
1366 createTool( GEOMOp::OpCommon, boolTbId );
1367 createTool( GEOMOp::OpCut, boolTbId );
1368 createTool( GEOMOp::OpSection, boolTbId );
1370 int genTbId = createTool( tr( "TOOL_GENERATION" ) );
1371 createTool( GEOMOp::OpPrism, genTbId );
1372 createTool( GEOMOp::OpRevolution, genTbId );
1373 createTool( GEOMOp::OpFilling, genTbId );
1374 createTool( GEOMOp::OpPipe, genTbId );
1375 #if OCC_VERSION_LARGE > 0x06050300
1376 createTool( GEOMOp::OpPipePath, genTbId );
1379 int transTbId = createTool( tr( "TOOL_TRANSFORMATION" ) );
1380 createTool( GEOMOp::OpTranslate, transTbId );
1381 createTool( GEOMOp::OpRotate, transTbId );
1382 createTool( GEOMOp::OpChangeLoc, transTbId );
1383 createTool( GEOMOp::OpMirror, transTbId );
1384 createTool( GEOMOp::OpScale, transTbId );
1385 createTool( GEOMOp::OpOffset, transTbId );
1386 createTool( GEOMOp::OpProjection, transTbId );
1387 createTool( separator(), transTbId );
1388 createTool( GEOMOp::OpMultiTranslate, transTbId );
1389 createTool( GEOMOp::OpMultiRotate, transTbId );
1391 int operTbId = createTool( tr( "TOOL_OPERATIONS" ) );
1392 createTool( GEOMOp::OpExplode, operTbId );
1393 createTool( GEOMOp::OpPartition, operTbId );
1394 createTool( GEOMOp::OpArchimede, operTbId );
1395 createTool( GEOMOp::OpShapesOnShape, operTbId );
1396 createTool( GEOMOp::OpSharedShapes, operTbId );
1398 int featTbId = createTool( tr( "TOOL_FEATURES" ) );
1399 createTool( GEOMOp::OpFillet1d, featTbId );
1400 createTool( GEOMOp::OpFillet2d, featTbId );
1401 createTool( GEOMOp::OpFillet3d, featTbId );
1402 createTool( GEOMOp::OpChamfer, featTbId );
1403 createTool( GEOMOp::OpExtrudedBoss, featTbId );
1404 createTool( GEOMOp::OpExtrudedCut, featTbId );
1405 #ifdef DEBUG_CURVE_CREATOR
1406 // for debug purposes, to be removed
1407 createTool( GEOMOp::OpCurveCreator, featTbId );
1410 int buildTbId = createTool( tr( "TOOL_BUILD" ) );
1411 createTool( GEOMOp::OpEdge, buildTbId );
1412 createTool( GEOMOp::OpWire, buildTbId );
1413 createTool( GEOMOp::OpFace, buildTbId );
1414 createTool( GEOMOp::OpShell, buildTbId );
1415 createTool( GEOMOp::OpSolid, buildTbId );
1416 createTool( GEOMOp::OpCompound, buildTbId );
1418 int measureTbId = createTool( tr( "TOOL_MEASURES" ) );
1419 createTool( GEOMOp::OpPointCoordinates, measureTbId );
1420 createTool( GEOMOp::OpProperties, measureTbId );
1421 createTool( GEOMOp::OpCenterMass, measureTbId );
1422 createTool( GEOMOp::OpInertia, measureTbId );
1423 createTool( GEOMOp::OpNormale, measureTbId );
1424 createTool( separator(), measureTbId );
1425 createTool( GEOMOp::OpBoundingBox, measureTbId );
1426 createTool( GEOMOp::OpMinDistance, measureTbId );
1427 createTool( GEOMOp::OpAngle, measureTbId );
1428 createTool( GEOMOp::OpTolerance , measureTbId );
1429 createTool( separator(), measureTbId );
1430 createTool( GEOMOp::OpFreeBoundaries, measureTbId );
1431 createTool( GEOMOp::OpFreeFaces, measureTbId );
1432 createTool( separator(), measureTbId );
1433 createTool( GEOMOp::OpWhatIs, measureTbId );
1434 createTool( GEOMOp::OpCheckShape, measureTbId );
1435 createTool( GEOMOp::OpCheckCompound, measureTbId );
1436 createTool( GEOMOp::OpGetNonBlocks, measureTbId );
1437 createTool( GEOMOp::OpCheckSelfInters, measureTbId );
1439 int picturesTbId = createTool( tr( "TOOL_PICTURES" ) );
1440 createTool( GEOMOp::OpPictureImport, picturesTbId );
1442 createTool( GEOMOp::OpFeatureDetect, picturesTbId );
1445 int impexpTbId = createTool( tr( "TOOL_IMPORTEXPORT" ) );
1446 createTool( GEOMOp::OpExportXAO, impexpTbId );
1447 createTool( GEOMOp::OpImportXAO, impexpTbId );
1449 //int advancedTbId = createTool( tr( "TOOL_ADVANCED" ) );
1450 //createTool( GEOMOp::OpSmoothingSurface, advancedTbId );
1451 //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@//
1453 // ---- create popup menus --------------------------
1455 QString clientOCCorVTK = "(client='OCCViewer' or client='VTKViewer')";
1456 QString clientOCC = "(client='OCCViewer')";
1457 QString clientOCCorVTK_AndSomeVisible = clientOCCorVTK + " and selcount>0 and isVisible";
1458 QString clientOCC_AndSomeVisible = clientOCC + " and selcount>0 and isVisible";
1460 QString clientOCCorOB = "(client='ObjectBrowser' or client='OCCViewer')";
1461 QString clientOCCorVTKorOB = "(client='ObjectBrowser' or client='OCCViewer' or client='VTKViewer')";
1462 QString clientOCCorVTKorOB_AndSomeVisible = clientOCCorVTKorOB + " and selcount>0 and isVisible";
1463 QString clientOCCorOB_AndSomeVisible = clientOCCorOB + " and selcount>0 and isVisible";
1465 QString autoColorPrefix =
1466 "(client='ObjectBrowser' or client='OCCViewer') and type='Shape' and selcount=1 and isOCC=true";
1468 QtxPopupMgr* mgr = popupMgr();
1470 mgr->insert( action( GEOMOp::OpDelete ), -1, -1 ); // delete
1471 mgr->setRule( action( GEOMOp::OpDelete ), QString("$type in {'Shape' 'Group' 'Folder' 'Field' 'FieldStep'} and selcount>0"), QtxPopupMgr::VisibleRule );
1472 mgr->insert( action( GEOMOp::OpGroupCreatePopup ), -1, -1 ); // create group
1473 mgr->setRule( action( GEOMOp::OpGroupCreatePopup ), QString("type='Shape' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1474 mgr->insert( action( GEOMOp::OpEditFieldPopup ), -1, -1 ); // edit field
1475 mgr->setRule( action( GEOMOp::OpEditFieldPopup ), QString("(type='Field' or type='FieldStep') and isOCC=true"), QtxPopupMgr::VisibleRule );
1476 mgr->insert( action( GEOMOp::OpDiscloseChildren ), -1, -1 ); // disclose child items
1477 mgr->setRule( action( GEOMOp::OpDiscloseChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasConcealedChildren=true"), QtxPopupMgr::VisibleRule );
1479 mgr->insert( action( GEOMOp::OpConcealChildren ), -1, -1 ); // conceal child items
1480 mgr->setRule( action( GEOMOp::OpConcealChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasDisclosedChildren=true"), QtxPopupMgr::VisibleRule );
1481 mgr->insert( action( GEOMOp::OpGroupEdit ), -1, -1 ); // edit group
1482 mgr->setRule( action( GEOMOp::OpGroupEdit ), QString("client='ObjectBrowser' and type='Group' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1483 mgr->insert( separator(), -1, -1 ); // -----------
1485 #if OCC_VERSION_LARGE > 0x06050200
1486 //QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and (selcount>0) and isOCC=true and topLevel=false";
1487 QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and isFolder=false and (selcount>0) and isOCC=true";
1488 mgr->insert( action(GEOMOp::OpBringToFront ), -1, -1 ); // bring to front
1489 mgr->setRule(action(GEOMOp::OpBringToFront), bringRule + " and autoBringToFront = false", QtxPopupMgr::VisibleRule );
1490 mgr->setRule(action(GEOMOp::OpBringToFront), "topLevel=true", QtxPopupMgr::ToggleRule );
1491 mgr->insert( action(GEOMOp::OpClsBringToFront ), -1, -1 ); // clear bring to front
1492 mgr->setRule( action(GEOMOp::OpClsBringToFront ), clientOCC + " and autoBringToFront = false", QtxPopupMgr::VisibleRule );
1494 mgr->insert( separator(), -1, -1 ); // -----------
1495 dispmodeId = mgr->insert( tr( "MEN_DISPLAY_MODE" ), -1, -1 ); // display mode menu
1496 mgr->insert( action( GEOMOp::OpWireframe ), dispmodeId, -1 ); // wireframe
1497 mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1498 mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK + " and displaymode='Wireframe'", QtxPopupMgr::ToggleRule );
1499 mgr->insert( action( GEOMOp::OpShading ), dispmodeId, -1 ); // shading
1500 mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1501 mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK + " and displaymode='Shading'", QtxPopupMgr::ToggleRule );
1502 mgr->insert( action( GEOMOp::OpShadingWithEdges ), dispmodeId, -1 ); // shading with edges
1503 mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1504 mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK + " and displaymode='ShadingWithEdges'", QtxPopupMgr::ToggleRule );
1505 mgr->insert( action( GEOMOp::OpTexture ), dispmodeId, -1 ); // wireframe
1506 mgr->setRule( action( GEOMOp::OpTexture ), clientOCC_AndSomeVisible, QtxPopupMgr::VisibleRule );
1507 mgr->setRule( action( GEOMOp::OpTexture), clientOCC + " and displaymode='Texture'", QtxPopupMgr::ToggleRule );
1508 mgr->insert( separator(), dispmodeId, -1 );
1509 mgr->insert( action( GEOMOp::OpVectors ), dispmodeId, -1 ); // vectors
1510 mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1511 mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK + " and isVectorsMode", QtxPopupMgr::ToggleRule );
1512 mgr->insert( separator(), -1, -1 ); // -----------
1514 mgr->insert( action( GEOMOp::OpColor ), -1, -1 ); // color
1515 mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})" + "and isPhysicalMaterial=false", QtxPopupMgr::VisibleRule );
1516 mgr->insert( action( GEOMOp::OpTransparency ), -1, -1 ); // transparency
1517 mgr->setRule( action( GEOMOp::OpTransparency ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1518 mgr->insert( action( GEOMOp::OpIsos ), -1, -1 ); // isos
1519 mgr->setRule( action( GEOMOp::OpIsos ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1520 mgr->insert( action( GEOMOp::OpDeflection ), -1, -1 ); // deflection
1521 mgr->setRule( action( GEOMOp::OpDeflection ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1522 mgr->insert( action( GEOMOp::OpPointMarker ), -1, -1 ); // point marker
1523 //mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and $typeid in {%1}" ).arg(GEOM_POINT ), QtxPopupMgr::VisibleRule );
1524 mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and ( $typeid in {%1} or compoundOfVertices=true ) " ).arg(GEOM::VERTEX).arg(GEOM::COMPOUND), QtxPopupMgr::VisibleRule );
1526 // material properties
1527 mgr->insert( action( GEOMOp::OpMaterialProperties ), -1, -1 );
1528 mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1531 mgr->insert( action( GEOMOp::OpSetTexture ), -1, -1 );
1532 mgr->setRule( action( GEOMOp::OpSetTexture ), clientOCCorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1534 int lineW = mgr->insert( tr( "MEN_LINE_WIDTH" ), -1, -1 ); // line width menu
1535 mgr->insert( action( GEOMOp::OpEdgeWidth ), lineW, -1 ); // edge width
1536 mgr->setRule( action( GEOMOp::OpEdgeWidth ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1538 mgr->insert( action( GEOMOp::OpIsosWidth ), lineW, -1 ); // isos width
1539 mgr->setRule( action( GEOMOp::OpIsosWidth ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1541 mgr->insert( separator(), -1, -1 ); // -----------
1542 mgr->insert( action( GEOMOp::OpAutoColor ), -1, -1 ); // auto color
1543 mgr->setRule( action( GEOMOp::OpAutoColor ), autoColorPrefix + " and isAutoColor=false", QtxPopupMgr::VisibleRule );
1544 mgr->insert( action( GEOMOp::OpNoAutoColor ), -1, -1 ); // disable auto color
1545 mgr->setRule( action( GEOMOp::OpNoAutoColor ), autoColorPrefix + " and isAutoColor=true", QtxPopupMgr::VisibleRule );
1546 mgr->insert( separator(), -1, -1 ); // -----------
1548 QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ",
1549 onlyComponent = "((type='Component') and selcount=1)",
1550 rule = canDisplay + "and ((($type in {%1}) and( %2 )) or " + onlyComponent + ")",
1551 types = "'Shape' 'Group' 'FieldStep'";
1553 mgr->insert( action( GEOMOp::OpShow ), -1, -1 ); // display
1554 mgr->setRule( action( GEOMOp::OpShow ), rule.arg( types ).arg( "not isVisible" ), QtxPopupMgr::VisibleRule );
1556 mgr->insert( action( GEOMOp::OpHide ), -1, -1 ); // erase
1557 mgr->setRule( action( GEOMOp::OpHide ), rule.arg( types ).arg( "isVisible" ), QtxPopupMgr::VisibleRule );
1559 mgr->insert( action( GEOMOp::OpHideAll ), -1, -1 ); // erase All
1560 mgr->setRule( action( GEOMOp::OpHideAll ), clientOCCorVTK, QtxPopupMgr::VisibleRule );
1562 QString selectOnly = "(client='OCCViewer' or client='VTKViewer') and (selcount=0)";
1564 int selectonlyId = mgr->insert( tr("MEN_SELECT_ONLY"), -1, -1); //select only menu
1565 mgr->insert( action(GEOMOp::OpSelectVertex), selectonlyId, -1); //Vertex
1566 mgr->setRule(action(GEOMOp::OpSelectVertex), selectOnly, QtxPopupMgr::VisibleRule);
1567 mgr->setRule(action(GEOMOp::OpSelectVertex), selectOnly + " and selectionmode='VERTEX'", QtxPopupMgr::ToggleRule);
1568 mgr->insert( action(GEOMOp::OpSelectEdge), selectonlyId, -1); //Edge
1569 mgr->setRule(action(GEOMOp::OpSelectEdge), selectOnly, QtxPopupMgr::VisibleRule);
1570 mgr->setRule(action(GEOMOp::OpSelectEdge), selectOnly + " and selectionmode='EDGE'", QtxPopupMgr::ToggleRule);
1571 mgr->insert( action(GEOMOp::OpSelectWire), selectonlyId, -1); //Wire
1572 mgr->setRule(action(GEOMOp::OpSelectWire), selectOnly, QtxPopupMgr::VisibleRule);
1573 mgr->setRule(action(GEOMOp::OpSelectWire), selectOnly + " and selectionmode='WIRE'", QtxPopupMgr::ToggleRule);
1574 mgr->insert( action(GEOMOp::OpSelectFace), selectonlyId, -1); //Face
1575 mgr->setRule(action(GEOMOp::OpSelectFace), selectOnly, QtxPopupMgr::VisibleRule);
1576 mgr->setRule(action(GEOMOp::OpSelectFace), selectOnly + " and selectionmode='FACE'", QtxPopupMgr::ToggleRule);
1577 mgr->insert( action(GEOMOp::OpSelectShell), selectonlyId, -1); //Shell
1578 mgr->setRule(action(GEOMOp::OpSelectShell), selectOnly, QtxPopupMgr::VisibleRule);
1579 mgr->setRule(action(GEOMOp::OpSelectShell), selectOnly + " and selectionmode='SHELL'", QtxPopupMgr::ToggleRule);
1580 mgr->insert( action(GEOMOp::OpSelectSolid), selectonlyId, -1); //Solid
1581 mgr->setRule(action(GEOMOp::OpSelectSolid), selectOnly, QtxPopupMgr::VisibleRule);
1582 mgr->setRule(action(GEOMOp::OpSelectSolid), selectOnly + " and selectionmode='SOLID'", QtxPopupMgr::ToggleRule);
1583 mgr->insert( action(GEOMOp::OpSelectCompound), selectonlyId, -1); //Compound
1584 mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly, QtxPopupMgr::VisibleRule);
1585 mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly + " and selectionmode='COMPOUND'", QtxPopupMgr::ToggleRule);
1586 mgr->insert( separator(), selectonlyId, -1);
1587 mgr->insert( action(GEOMOp::OpSelectAll), selectonlyId, -1); //Clear selection filter
1588 mgr->setRule(action(GEOMOp::OpSelectAll), selectOnly, QtxPopupMgr::VisibleRule);
1589 mgr->setRule(action(GEOMOp::OpSelectAll), selectOnly + " and selectionmode='ALL'", QtxPopupMgr::ToggleRule);
1590 mgr->insert( action(GEOMOp::OpShowOnly ), -1, -1 ); // display only
1591 mgr->setRule(action(GEOMOp::OpShowOnly ), rule.arg( types ).arg( "true" ), QtxPopupMgr::VisibleRule );
1592 mgr->insert( action(GEOMOp::OpShowOnlyChildren ), -1, -1 ); // display only children
1593 mgr->setRule(action(GEOMOp::OpShowOnlyChildren ), (canDisplay + "and ($type in {%1}) and client='ObjectBrowser' and hasChildren=true").arg( types ), QtxPopupMgr::VisibleRule );
1595 QString aDimensionRule = "($component={'GEOM'}) and selcount=1 and isVisible and type='Shape' and %1";
1597 mgr->insert( separator(), -1, -1 ); // -----------
1598 mgr->insert( action( GEOMOp::OpShowAllDimensions ), -1, -1 ); // show all dimensions
1599 mgr->setRule( action( GEOMOp::OpShowAllDimensions ), aDimensionRule.arg( "hasHiddenDimensions" ), QtxPopupMgr::VisibleRule );
1600 mgr->insert( action( GEOMOp::OpHideAllDimensions ), -1, -1 ); // hide all dimensions
1601 mgr->setRule( action( GEOMOp::OpHideAllDimensions ), aDimensionRule.arg( "hasVisibleDimensions" ), QtxPopupMgr::VisibleRule );
1603 mgr->insert( separator(), -1, -1 ); // -----------
1604 mgr->insert( action( GEOMOp::OpUnpublishObject ), -1, -1 ); // Unpublish object
1605 mgr->setRule( action( GEOMOp::OpUnpublishObject ), QString("client='ObjectBrowser' and $type in {'Shape' 'Group' 'Field' 'FieldStep'} and selcount>0"), QtxPopupMgr::VisibleRule );
1607 mgr->insert( action( GEOMOp::OpPublishObject ), -1, -1 ); // Publish object
1608 mgr->setRule( action( GEOMOp::OpPublishObject ), QString("client='ObjectBrowser' and isComponent=true"), QtxPopupMgr::VisibleRule );
1610 mgr->insert( action( GEOMOp::OpReimport ), -1, -1 ); // delete
1611 mgr->setRule( action( GEOMOp::OpReimport ), QString("$imported in {'true'} and selcount>0"), QtxPopupMgr::VisibleRule );
1613 mgr->insert( separator(), -1, -1 ); // -----------
1614 mgr->insert( action( GEOMOp::OpCreateFolder ), -1, -1 ); // Create Folder
1615 mgr->setRule( action( GEOMOp::OpCreateFolder ), QString("client='ObjectBrowser' and $component={'GEOM'} and (isComponent=true or isFolder=true)"), QtxPopupMgr::VisibleRule );
1617 mgr->insert( separator(), -1, -1 ); // -----------
1618 mgr->insert( action( GEOMOp::OpSortChildren ), -1, -1 ); // Sort child items
1619 mgr->setRule( action( GEOMOp::OpSortChildren ), QString("client='ObjectBrowser' and $component={'GEOM'} and nbChildren>1"), QtxPopupMgr::VisibleRule );
1621 mgr->hide( mgr->actionId( action( myEraseAll ) ) );
1623 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1625 GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)resMgr->integerValue("Geometry", "toplevel_dm", 0));
1626 QColor c = resMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) );
1627 GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c));
1630 // create plugin actions and menus
1634 //=======================================================================
1635 // function : GeometryGUI::addPluginActions()
1637 //=======================================================================
1638 void GeometryGUI::addPluginActions()
1641 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1642 if (!resMgr) return;
1644 // Find names of a resource XML files ("GEOMActions.xml" and others);
1646 char* cenv = getenv("GEOM_PluginsList");
1648 PluginsXml.sprintf("%s", cenv);
1650 QStringList PluginsXmlList = PluginsXml.split(":", QString::SkipEmptyParts);
1651 if (PluginsXmlList.count() == 0) return;
1653 // get full names of xml files from PluginsXmlList
1654 QStringList xmlFiles;
1655 xmlFiles.append(QDir::home().filePath("CustomGeomPlugins.xml")); // may be inexistent
1656 for (int i = 0; i < PluginsXmlList.count(); i++) {
1657 PluginsXml = PluginsXmlList[ i ];
1659 // Find full path to the resource XML file
1660 QString xmlFile = resMgr->path("resources", "GEOM", PluginsXml + ".xml");
1661 if ( xmlFile.isEmpty() ) // try PLUGIN resources
1662 xmlFile = resMgr->path("resources", PluginsXml, PluginsXml + ".xml");
1663 if ( !xmlFile.isEmpty() )
1664 xmlFiles.append( xmlFile );
1667 // create "Advanced Operations" menu and corresponding toolbar
1668 //int advancedMenuId = createMenu(tr("MEN_ADVANCED"), -1, -1, 10);
1669 //int advancedTbarId = createTool(tr("TOOL_ADVANCED"));
1670 int id = GEOMOp::OpLastOperationID; // TODO?
1673 QString aNoAccessFiles;
1674 for (int i = 0; i < xmlFiles.count(); i++) {
1675 QString xmlFile = xmlFiles[ i ];
1677 QFile file (xmlFile);
1678 if (file.exists() && file.open(QIODevice::ReadOnly)) {
1681 GEOMGUI_XmlHandler* aXmlHandler = new GEOMGUI_XmlHandler();
1682 ASSERT(aXmlHandler);
1684 QXmlInputSource source (&file);
1685 QXmlSimpleReader reader;
1686 reader.setContentHandler(aXmlHandler);
1687 reader.setErrorHandler(aXmlHandler);
1688 bool ok = reader.parse(source);
1692 // bind action lib and label to its ID for activateOperation() method proper work
1693 myPluginLibs[aXmlHandler->myPluginData.myName] = aXmlHandler->myPluginData.myClientLib;
1695 QListIterator<GEOMGUI_ActionData> anActionsIter (aXmlHandler->myPluginData.myListOfActions);
1696 while (anActionsIter.hasNext()) {
1697 GEOMGUI_ActionData anActionData = anActionsIter.next();
1699 //QPixmap icon = resMgr->loadPixmap("GEOM", tr(anActionData.myIcon.toLatin1().constData()));
1700 QPixmap icon = resMgr->loadPixmap(aXmlHandler->myPluginData.myName,
1701 anActionData.myIcon.toLatin1().constData());
1703 // path to action in menu
1704 QStringList smenus = anActionData.myMenu.split( "/" );
1705 QString actionName = smenus.last();
1706 actionName = actionName.toUpper().prepend("MEN_");
1707 smenus.removeLast();
1709 // path to action in toolbar
1710 QStringList stools = anActionData.myTooltip.split( "/" );
1711 QString actionTool = stools.last();
1712 actionTool = actionTool.toUpper().prepend("TOP_");
1713 stools.removeLast();
1715 QString actionStat = anActionData.myStatusBar;
1716 actionStat = actionStat.toUpper().prepend("STB_");
1718 createAction(id, // ~ anActionData.myLabel
1719 tr(actionTool.toLatin1().constData()),
1721 tr(actionName.toLatin1().constData()),
1722 tr(actionStat.toLatin1().constData()),
1724 application()->desktop(),
1726 this, SLOT(OnGUIEvent()),
1727 QString() /*shortcutAction*/);
1730 foreach (QString subMenu, smenus) {
1731 subMenu = subMenu.toUpper().prepend("MEN_");
1732 menuId = createMenu(tr(subMenu.toLatin1().constData()), menuId, -1);
1734 //createMenu(id, pluginMenuId, -1);
1735 createMenu(id, menuId, -1);
1737 QString subTool = stools[0];
1738 subTool = subTool.toUpper().prepend("TOOL_");
1739 int toolId = createTool(tr(subTool.toLatin1().constData()));
1740 //createTool(id, advancedTbarId);
1741 createTool(id, toolId);
1743 // add action id to map
1744 PluginAction anAction (aXmlHandler->myPluginData.myClientLib, anActionData.myLabel);
1745 myPluginActions[id] = anAction;
1751 SUIT_MessageBox::critical(application()->desktop(),
1752 tr("INF_PARSE_ERROR"),
1753 tr(aXmlHandler->errorProtocol().toLatin1().data()));
1757 else if ( i > 0 ) { // 1st is ~/CustomGeomPlugins.xml
1758 if (aNoAccessFiles.isEmpty())
1759 aNoAccessFiles = xmlFile;
1761 aNoAccessFiles += ", " + xmlFile;
1763 } // end loop on xmlFiles
1765 if (!aNoAccessFiles.isEmpty()) {
1766 QString aMess = QObject::tr("PLUGIN_FILE_CANT_OPEN") + " " + aNoAccessFiles + "\n";
1767 aMess += QObject::tr("PLUGIN_FILE_CHECK_VARIABLE");
1768 SUIT_MessageBox::warning(application()->desktop(), tr("GEOM_WRN_WARNING"), aMess);
1772 //=======================================================================
1773 // function : GeometryGUI::activateModule()
1774 // purpose : Called when GEOM module is activated
1775 //=======================================================================
1776 bool GeometryGUI::activateModule( SUIT_Study* study )
1778 if ( CORBA::is_nil( myComponentGeom ) )
1781 bool res = SalomeApp_Module::activateModule( study );
1785 setMenuShown( true );
1786 setToolShown( true );
1788 // import Python module that manages GEOM plugins (need to be here because SalomePyQt API uses active module)
1789 PyGILState_STATE gstate = PyGILState_Ensure();
1790 PyObjWrapper pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
1791 if ( !pluginsmanager ) {
1795 PyObjWrapper result =
1796 PyObject_CallMethod(pluginsmanager, (char*)"initialize", (char*)"isss", 1, "geom",
1797 tr("MEN_NEW_ENTITY").toStdString().c_str(),
1798 tr("GEOM_PLUGINS_OTHER").toStdString().c_str());
1802 PyGILState_Release(gstate);
1803 // end of GEOM plugins loading
1805 connect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1806 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1808 // Reset actions accelerator keys
1809 action(GEOMOp::OpImport)->setEnabled( true ); // Import: CTRL + Key_I
1810 action(GEOMOp::OpExport)->setEnabled( true ); // Export: CTRL + Key_E
1811 action(GEOMOp::OpDelete)->setEnabled( true ); // Delete: Key_Delete
1813 GUIMap::Iterator it;
1814 for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1815 it.value()->activate( application()->desktop() );
1817 LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1819 connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
1820 connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( onAutoBringToFront() ));
1821 connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
1823 if ( !myCreationInfoWdg )
1824 myCreationInfoWdg = new GEOMGUI_CreationInfoWdg( getApp() );
1825 getApp()->insertDockWindow( myCreationInfoWdg->getWinID(), myCreationInfoWdg );
1826 getApp()->placeDockWindow( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
1828 SUIT_ViewManager* vm;
1829 ViewManagerList OCCViewManagers, VTKViewManagers;
1831 application()->viewManagers( OCCViewer_Viewer::Type(), OCCViewManagers );
1832 QListIterator<SUIT_ViewManager*> itOCC( OCCViewManagers );
1833 while ( itOCC.hasNext() && (vm = itOCC.next()) )
1834 myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
1836 application()->viewManagers( SVTK_Viewer::Type(), VTKViewManagers );
1837 QListIterator<SUIT_ViewManager*> itVTK( VTKViewManagers );
1838 while ( itVTK.hasNext() && (vm = itVTK.next()) )
1839 myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
1842 SALOME_ListIO selected;
1843 sm->selectedObjects( selected );
1844 sm->clearSelected();
1846 // disable OCC selectors
1847 getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
1848 QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1849 while ( itOCCSel.hasNext() )
1850 if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1851 sr->setEnabled(true);
1853 // disable VTK selectors
1854 getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
1855 QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1856 while ( itVTKSel.hasNext() )
1857 if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1858 sr->setEnabled(true);
1860 sm->setSelectedObjects( selected, true ); //NPAL 19674
1862 QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1864 connect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1866 // 0020836 (Basic vectors and origin)
1867 SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
1868 if ( aResourceMgr->booleanValue( "Geometry", "auto_create_base_objects", false ) ) {
1869 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
1871 _PTR(Study) studyDS = appStudy->studyDS();
1873 _PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
1874 if ( !aSComponent ) // create objects automatically only if there is no GEOM component
1875 createOriginAndBaseVectors();
1883 //=======================================================================
1884 // function : GeometryGUI::deactivateModule()
1885 // purpose : Called when GEOM module is deactivated
1886 //=======================================================================
1887 bool GeometryGUI::deactivateModule( SUIT_Study* study )
1889 QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1891 disconnect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1893 setMenuShown( false );
1894 setToolShown( false );
1896 disconnect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1897 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1899 LightApp_SelectionMgr* selMrg = getApp()->selectionMgr();
1901 disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
1902 disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
1903 getApp()->removeDockWindow( myCreationInfoWdg->getWinID() );
1904 myCreationInfoWdg = 0;
1906 EmitSignalCloseAllDialogs();
1908 GUIMap::Iterator it;
1909 for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1910 it.value()->deactivate();
1912 // Unset actions accelerator keys
1913 action(GEOMOp::OpImport)->setEnabled( false ); // Import: CTRL + Key_I
1914 action(GEOMOp::OpExport)->setEnabled( false ); // Export: CTRL + Key_E
1915 action(GEOMOp::OpDelete)->setEnabled( false ); // Delete: Key_Delete
1917 qDeleteAll(myOCCSelectors);
1918 myOCCSelectors.clear();
1919 selMrg->setEnabled( true, OCCViewer_Viewer::Type() );
1921 qDeleteAll(myVTKSelectors);
1922 myVTKSelectors.clear();
1923 selMrg->setEnabled( true, SVTK_Viewer::Type() );
1925 return SalomeApp_Module::deactivateModule( study );
1928 //=======================================================================
1929 // function : onWindowActivated()
1930 // purpose : update menu items' status - disable non-OCC-viewer-compatible actions
1931 //=======================================================================
1932 void GeometryGUI::onWindowActivated( SUIT_ViewWindow* win )
1937 const bool ViewOCC = ( win->getViewManager()->getType() == OCCViewer_Viewer::Type() );
1938 //const bool ViewVTK = ( win->getViewManager()->getType() == SVTK_Viewer::Type() );
1940 // disable non-OCC viewframe menu commands
1941 // action( GEOMOp::Op2dSketcher )->setEnabled( ViewOCC ); // SKETCHER
1942 action( GEOMOp::OpSuppressFaces )->setEnabled( ViewOCC ); // SuppressFace
1943 action( GEOMOp::OpSuppressHoles )->setEnabled( ViewOCC ); // SuppressHole
1944 action( GEOMOp::OpCloseContour )->setEnabled( ViewOCC ); // CloseContour
1945 action( GEOMOp::OpRemoveIntWires )->setEnabled( ViewOCC ); // RemoveInternalWires
1946 action( GEOMOp::OpAddPointOnEdge )->setEnabled( ViewOCC ); // AddPointOnEdge
1947 // action( GEOMOp::OpFreeBoundaries )->setEnabled( ViewOCC ); // Free boundaries
1949 action( GEOMOp::OpGroupCreate )->setEnabled( ViewOCC ); // Create Group
1950 action( GEOMOp::OpGroupEdit )->setEnabled( ViewOCC ); // Edit Group
1951 action( GEOMOp::OpCreateField )->setEnabled( ViewOCC ); // Create Field
1952 action( GEOMOp::OpEditField )->setEnabled( ViewOCC ); // Edit Field
1954 action( GEOMOp::OpMultiTransform )->setEnabled( ViewOCC ); // MENU BLOCKS - MULTI-TRANSFORMATION
1957 void GeometryGUI::windows( QMap<int, int>& mappa ) const
1959 mappa.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
1960 mappa.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
1961 if ( myCreationInfoWdg )
1962 mappa.insert( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
1965 void GeometryGUI::viewManagers( QStringList& lst ) const
1967 lst.append( OCCViewer_Viewer::Type() );
1970 void GeometryGUI::onViewManagerAdded( SUIT_ViewManager* vm )
1972 if ( vm && vm->getType() == OCCViewer_Viewer::Type() )
1974 qDebug( "connect" );
1975 connect( vm, SIGNAL( keyPress ( SUIT_ViewWindow*, QKeyEvent* ) ),
1976 this, SLOT( OnKeyPress( SUIT_ViewWindow*, QKeyEvent* ) ) );
1977 connect( vm, SIGNAL( mousePress( SUIT_ViewWindow*, QMouseEvent* ) ),
1978 this, SLOT( OnMousePress( SUIT_ViewWindow*, QMouseEvent* ) ) );
1979 connect( vm, SIGNAL( mouseMove ( SUIT_ViewWindow*, QMouseEvent* ) ),
1980 this, SLOT( OnMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) );
1981 connect( vm, SIGNAL( mouseRelease ( SUIT_ViewWindow*, QMouseEvent* ) ),
1982 this, SLOT( OnMouseRelease( SUIT_ViewWindow*, QMouseEvent* ) ) );
1984 LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1985 myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
1987 // disable OCC selectors
1988 getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
1989 QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1990 while ( itOCCSel.hasNext() )
1991 if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1992 sr->setEnabled(true);
1994 else if ( vm->getType() == SVTK_Viewer::Type() )
1996 LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1997 myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
1999 // disable VTK selectors
2000 getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
2001 QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
2002 while ( itVTKSel.hasNext() )
2003 if ( LightApp_VTKSelector* sr = itVTKSel.next() )
2004 sr->setEnabled(true);
2008 void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm )
2010 SUIT_ViewModel* viewer = vm->getViewModel();
2011 if ( vm->getType() == OCCViewer_Viewer::Type() )
2013 QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
2014 while ( itOCCSel.hasNext() )
2015 if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
2016 if ( sr->viewer() == viewer )
2018 /*delete*/ myOCCSelectors.takeAt( myOCCSelectors.indexOf( sr ) );
2022 if ( vm->getType() == SVTK_Viewer::Type() )
2024 QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
2025 while ( itVTKSel.hasNext() )
2026 if ( LightApp_VTKSelector* sr = itVTKSel.next() )
2027 if ( sr->viewer() == viewer )
2029 /*delete*/ myVTKSelectors.takeAt( myVTKSelectors.indexOf( sr ) );
2035 //================================================================================
2037 * \brief Slot called when selection changed. Shows creation info of a selected object
2039 //================================================================================
2041 void GeometryGUI::updateCreationInfo()
2043 if ( myCreationInfoWdg )
2044 myCreationInfoWdg->clear();
2046 // Code below is commented to have myCreationInfoWdg filled as soon as it is shown again
2047 // if ( !myCreationInfoWdg->isVisible() )
2050 // look for a sole selected GEOM_Object
2051 GEOM::GEOM_BaseObject_var geomObj;
2053 SALOME_ListIO selected;
2054 getApp()->selectionMgr()->selectedObjects( selected );
2056 _PTR(Study) study = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() )->studyDS();
2057 SALOME_ListIteratorOfListIO selIt( selected );
2058 for ( ; selIt.More(); selIt.Next() )
2060 Handle(SALOME_InteractiveObject) io = selIt.Value();
2061 if ( !io->hasEntry() ) continue;
2062 _PTR(SObject) sobj = study->FindObjectID( io->getEntry() );
2063 if ( !sobj ) continue;
2064 CORBA::Object_var obj = GeometryGUI::ClientSObjectToObject( sobj );
2065 GEOM::GEOM_BaseObject_var gobj = GEOM::GEOM_BaseObject::_narrow( obj );
2066 if ( !gobj->_is_nil() )
2068 if ( !geomObj->_is_nil() )
2069 return; // several GEOM objects selected
2073 if ( geomObj->_is_nil() ) return;
2075 // pass creation info of geomObj to myCreationInfoWdg
2077 if ( myCreationInfoWdg ) {
2079 QString operationName;
2080 myCreationInfoWdg->setOperation( icon, operationName );
2084 GEOM::CreationInformation_var info = geomObj->GetCreationInformation();
2086 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
2087 QString name = info->operationName.in();
2088 if ( !name.isEmpty() ) {
2089 icon = resMgr->loadPixmap( "GEOM", tr( ("ICO_"+name).toLatin1().constData() ), false );
2090 operationName = tr( ("MEN_"+name).toLatin1().constData() );
2091 if ( operationName.startsWith( "MEN_" ))
2092 operationName = name; // no translation
2093 myCreationInfoWdg->setOperation( icon, operationName );
2095 for ( size_t i = 0; i < info->params.length(); ++i )
2096 myCreationInfoWdg->addParam( info->params[i].name.in(),
2097 info->params[i].value.in() );
2106 void GeometryGUI::onAutoBringToFront()
2108 bool isAutoBringToFront = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "auto_bring_to_front" );
2109 if( !isAutoBringToFront )
2112 SUIT_ViewWindow* SUIT_window = application()->desktop()->activeWindow();
2113 if ( !SUIT_window || SUIT_window->getViewManager()->getType() != OCCViewer_Viewer::Type() )
2116 SalomeApp_Study* appStudy = dynamic_cast< SalomeApp_Study* >( getApp()->activeStudy() );
2117 if (!appStudy) return;
2119 GEOM_Displayer displayer( appStudy );
2121 SALOME_View* window = displayer.GetActiveView();
2122 if ( !window ) return;
2124 int aMgrId = dynamic_cast< SUIT_ViewModel* >( window )->getViewManager()->getGlobalId();
2126 SALOME_ListIO selected;
2127 getApp()->selectionMgr()->selectedObjects( selected );
2128 if (!myTopLevelIOList.IsEmpty())
2130 for( SALOME_ListIteratorOfListIO It( myTopLevelIOList ); It.More(); It.Next() )
2132 Handle( SALOME_InteractiveObject ) io = It.Value();
2133 bool isSelected = false;
2134 for( SALOME_ListIteratorOfListIO It_sel( selected ); It_sel.More(); It_sel.Next() )
2136 Handle( SALOME_InteractiveObject ) sel_io = It_sel.Value();
2137 if( io->isSame( sel_io ) )
2140 if (!isSelected && appStudy->findObjectByEntry(io->getEntry()))
2142 appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), false );
2143 if ( window->isVisible( io ) ) displayer.Redisplay( io, false );
2148 myTopLevelIOList.Assign(selected);
2149 for( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() )
2151 Handle( SALOME_InteractiveObject ) io = It.Value();
2152 appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), true );
2153 if ( window->isVisible( io ) ) displayer.Redisplay( io, false );
2156 displayer.UpdateViewer();
2157 GeometryGUI::Modified();
2160 void GeometryGUI::updateFieldColorScale()
2162 if( SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) )
2164 GEOM_Displayer aDisplayer( aStudy );
2165 aDisplayer.UpdateColorScale();
2169 QString GeometryGUI::engineIOR() const
2171 if ( !CORBA::is_nil( GetGeomGen() ) )
2172 return QString( getApp()->orb()->object_to_string( GetGeomGen() ) );
2176 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
2177 Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture
2179 Handle(Graphic3d_HArray1OfBytes) GeometryGUI::getTexture
2181 (SalomeApp_Study* theStudy, int theId, int& theWidth, int& theHeight)
2183 theWidth = theHeight = 0;
2185 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
2186 Handle(TColStd_HArray1OfByte) aTexture;
2188 Handle(Graphic3d_HArray1OfBytes) aTexture;
2192 TextureMap aTextureMap = myTextureMap[ theStudy->studyDS()->StudyId() ];
2193 aTexture = aTextureMap[ theId ];
2194 if ( aTexture.IsNull() ) {
2195 GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGen()->GetIInsertOperations( theStudy->studyDS()->StudyId() );
2196 if ( !aInsOp->_is_nil() ) {
2197 CORBA::Long aWidth, aHeight;
2198 SALOMEDS::TMPFile_var aStream = aInsOp->GetTexture( theId, aWidth, aHeight );
2199 if ( aWidth > 0 && aHeight > 0 && aStream->length() > 0 ) {
2201 theHeight = aHeight;
2203 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
2204 aTexture = new TColStd_HArray1OfByte (1, aStream->length());
2206 aTexture = new Graphic3d_HArray1OfBytes (1, aStream->length());
2209 for (int i = 0; i < aStream->length(); i++)
2210 aTexture->SetValue( i+1, (Standard_Byte)aStream[i] );
2211 aTextureMap[ theId ] = aTexture;
2219 LightApp_Selection* GeometryGUI::createSelection() const
2221 return new GEOMGUI_Selection();
2224 void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
2226 SalomeApp_Module::contextMenuPopup( client, menu, title );
2228 getApp()->selectionMgr()->selectedObjects( lst );
2230 //Add submenu for predefined materials
2231 bool isPredefMat = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "predef_materials" );
2232 if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() > 0 ) {
2233 QtxPopupMgr* mgr = popupMgr();
2234 //get parrent for submenu
2235 QAction* act = mgr->action( mgr->actionId( action( GEOMOp::OpMaterialProperties ) ) );
2237 QMenu* oldMenu = act->menu() ;
2242 QMenu* matMenu = new QMenu();
2243 QSignalMapper* signalMapper = new QSignalMapper( matMenu );
2245 //Get current material model for the object
2247 LightApp_Application* anApp = dynamic_cast<LightApp_Application*>( getApp() );
2248 if ( anApp && anApp->activeViewManager() ) {
2249 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( anApp->activeStudy() );
2251 v = aStudy->getObjectProperty( anApp->activeViewManager()->getGlobalId(), lst.Last()->getEntry(), GEOM::propertyName( GEOM::Material ), QVariant() );
2254 QString curModel = "";
2255 if ( v.canConvert<QString>() ) curModel = v.toString();
2256 // get list of all predefined materials
2257 QStringList materials = Material_ResourceMgr::resourceMgr()->materials();
2259 foreach ( QString material, materials )
2261 QAction* menAct = matMenu->addAction( material );
2262 connect(menAct, SIGNAL( toggled( bool ) ), signalMapper, SLOT( map() ) );
2263 signalMapper->setMapping( menAct, material );
2264 menAct->setCheckable( true );
2265 // Set checked if this material is current
2266 Material_Model aModel;
2267 aModel.fromResources( material );
2268 if ( !found && aModel.toProperties() == curModel ) {
2269 menAct->setChecked( true );
2273 matMenu->insertAction( matMenu->addSeparator(), action( GEOMOp::OpPredefMaterCustom ) );
2274 matMenu->insertSeparator( action( GEOMOp::OpPredefMaterCustom ) );
2275 connect( signalMapper, SIGNAL( mapped( const QString & ) ),
2276 this, SLOT( OnSetMaterial( const QString & ) ) );
2277 act->setMenu( matMenu );
2281 if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() == 1 ) {
2282 Handle(SALOME_InteractiveObject) io = lst.First();
2283 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
2284 _PTR(Study) study = appStudy->studyDS();
2285 _PTR(SObject) obj = study->FindObjectID( io->getEntry() );
2287 QString aName = QString( obj->GetName().c_str() );
2288 aName.remove( QRegExp("\\s+$") );
2294 void GeometryGUI::OnSetMaterial(const QString& theName)
2296 OnGUIEvent( GEOMOp::OpPredefMaterial, QVariant( theName ) );
2300 void GeometryGUI::createPreferences()
2302 int tabId = addPreference( tr( "PREF_TAB_SETTINGS" ) );
2304 int genGroup = addPreference( tr( "PREF_GROUP_GENERAL" ), tabId );
2305 setPreferenceProperty( genGroup, "columns", 2 );
2307 int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), genGroup,
2308 LightApp_Preferences::Selector,
2309 "Geometry", "display_mode" );
2311 addPreference( tr( "PREF_SHADING_COLOR" ), genGroup,
2312 LightApp_Preferences::Color, "Geometry", "shading_color" );
2314 addPreference( tr( "PREF_EDGES_IN_SHADING" ), genGroup,
2315 LightApp_Preferences::Color, "Geometry", "edges_in_shading_color" );
2317 addPreference( tr( "PREF_WIREFRAME_COLOR" ), genGroup,
2318 LightApp_Preferences::Color, "Geometry", "wireframe_color" );
2320 addPreference( tr( "PREF_FREE_BOUND_COLOR" ), genGroup,
2321 LightApp_Preferences::Color, "Geometry", "free_bound_color" );
2323 addPreference( tr( "PREF_LINE_COLOR"), genGroup,
2324 LightApp_Preferences::Color, "Geometry", "line_color" );
2326 addPreference( tr( "PREF_POINT_COLOR"), genGroup,
2327 LightApp_Preferences::Color, "Geometry", "point_color" );
2329 addPreference( tr( "PREF_ISOS_COLOR" ), genGroup,
2330 LightApp_Preferences::Color, "Geometry", "isos_color" );
2332 addPreference( tr( "PREF_TOPLEVEL_COLOR" ), genGroup,
2333 LightApp_Preferences::Color, "Geometry", "toplevel_color" );
2335 int top_lev_dm = addPreference( tr( "PREF_TOPLEVEL_DM" ), genGroup,
2336 LightApp_Preferences::Selector, "Geometry", "toplevel_dm" );
2338 int step = addPreference( tr( "PREF_STEP_VALUE" ), genGroup,
2339 LightApp_Preferences::IntSpin, "Geometry", "SettingsGeomStep" );
2341 int defl = addPreference( tr( "PREF_DEFLECTION" ), genGroup,
2342 LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" );
2344 addPreference( tr( "PREF_PREDEF_MATERIALS" ), genGroup,
2345 LightApp_Preferences::Bool, "Geometry", "predef_materials" );
2347 int material = addPreference( tr( "PREF_MATERIAL" ), genGroup,
2348 LightApp_Preferences::Selector,
2349 "Geometry", "material" );
2351 addPreference( tr( "PREF_EDITGROUP_COLOR" ), genGroup,
2352 LightApp_Preferences::Color, "Geometry", "editgroup_color" );
2358 wd[iter++] = addPreference( tr( "PREF_EDGE_WIDTH" ), genGroup,
2359 LightApp_Preferences::IntSpin, "Geometry", "edge_width" );
2361 wd[iter++] = addPreference( tr( "PREF_ISOLINES_WIDTH" ), genGroup,
2362 LightApp_Preferences::IntSpin, "Geometry", "isolines_width" );
2364 wd[iter++] = addPreference( tr( "PREF_PREVIEW_EDGE_WIDTH" ), genGroup,
2365 LightApp_Preferences::IntSpin, "Geometry", "preview_edge_width" );
2367 wd[iter++] = addPreference( tr( "PREF_MEASURES_LINE_WIDTH" ), genGroup,
2368 LightApp_Preferences::IntSpin, "Geometry", "measures_line_width" );
2370 for (int i = 0; i < nb; i++) {
2371 setPreferenceProperty( wd[i], "min", 1 );
2372 setPreferenceProperty( wd[i], "max", 5 );
2375 addPreference( tr( "PREF_AUTO_BRING_TO_FRONT" ), genGroup,
2376 LightApp_Preferences::Bool, "Geometry", "auto_bring_to_front" );
2378 int aDimGroupId = addPreference( tr( "PREF_DIMENSIONS" ), tabId );
2379 setPreferenceProperty( aDimGroupId, "columns", 2 );
2381 addPreference( tr( "PREF_DIMENSIONS_COLOR" ), aDimGroupId,
2382 LightApp_Preferences::Color, "Geometry", "dimensions_color" );
2384 int aDimLineWidthId = addPreference( tr( "PREF_DIMENSIONS_LINE_WIDTH" ), aDimGroupId,
2385 LightApp_Preferences::IntSpin, "Geometry", "dimensions_line_width" );
2387 setPreferenceProperty( aDimLineWidthId, "min", 1 );
2388 setPreferenceProperty( aDimLineWidthId, "max", 5 );
2390 int aDimFontHeightId = addPreference( tr( "PREF_DIMENSIONS_FONT_HEIGHT" ), aDimGroupId,
2391 LightApp_Preferences::DblSpin, "Geometry", "dimensions_font_height" );
2393 setPreferenceProperty( aDimFontHeightId, "min", 1e-9 );
2394 setPreferenceProperty( aDimFontHeightId, "max", 1e+9 );
2395 setPreferenceProperty( aDimFontHeightId, "precision", 9 );
2397 int aDimArrLengthId = addPreference( tr( "PREF_DIMENSIONS_ARROW_LENGTH" ), aDimGroupId,
2398 LightApp_Preferences::DblSpin, "Geometry", "dimensions_arrow_length" );
2400 setPreferenceProperty( aDimArrLengthId, "min", 1e-9 );
2401 setPreferenceProperty( aDimArrLengthId, "max", 1e+9 );
2402 setPreferenceProperty( aDimArrLengthId, "precision", 9 );
2404 int aLengthUnitsId = addPreference( tr( "PREF_DIMENSIONS_LENGTH_UNITS" ), aDimGroupId,
2405 LightApp_Preferences::Selector, "Geometry", "dimensions_length_units" );
2407 int anAngUnitsId = addPreference( tr( "PREF_DIMENSIONS_ANGLE_UNITS" ), aDimGroupId,
2408 LightApp_Preferences::Selector, "Geometry", "dimensions_angle_units" );
2410 addPreference( tr( "PREF_DIMENSIONS_SHOW_UNITS" ), aDimGroupId,
2411 LightApp_Preferences::Bool, "Geometry", "dimensions_show_units" );
2413 QStringList aListOfLengthUnits;
2414 aListOfLengthUnits << "m";
2415 aListOfLengthUnits << "cm";
2416 aListOfLengthUnits << "mm";
2417 aListOfLengthUnits << "in.";
2418 aListOfLengthUnits << "ft.";
2420 QStringList aListOfAngUnits;
2421 aListOfAngUnits << "rad";
2422 aListOfAngUnits << "deg";
2424 setPreferenceProperty( aLengthUnitsId, "strings", aListOfLengthUnits );
2425 setPreferenceProperty( anAngUnitsId, "strings", aListOfAngUnits );
2427 int aDimDefFlyout = addPreference( tr( "PREF_DIMENSIONS_DEFAULT_FLYOUT" ), aDimGroupId,
2428 LightApp_Preferences::DblSpin, "Geometry", "dimensions_default_flyout" );
2430 setPreferenceProperty( aDimDefFlyout, "min", 1e-9 );
2431 setPreferenceProperty( aDimDefFlyout, "max", 1e+9 );
2432 setPreferenceProperty( aDimDefFlyout, "precision", 9 );
2434 int isoGroup = addPreference( tr( "PREF_ISOS" ), tabId );
2435 setPreferenceProperty( isoGroup, "columns", 2 );
2436 int isoU = addPreference( tr( "PREF_ISOS_U" ), isoGroup,
2437 LightApp_Preferences::IntSpin, "Geometry", "iso_number_u" );
2438 setPreferenceProperty( isoU, "min", 0 );
2439 setPreferenceProperty( isoU, "max", 100000 );
2440 int isoV = addPreference( tr( "PREF_ISOS_V" ), isoGroup,
2441 LightApp_Preferences::IntSpin, "Geometry", "iso_number_v" );
2442 setPreferenceProperty( isoV, "min", 0 );
2443 setPreferenceProperty( isoV, "max", 100000 );
2445 // Quantities with individual precision settings
2446 int precGroup = addPreference( tr( "GEOM_PREF_GROUP_PRECISION" ), tabId );
2447 setPreferenceProperty( precGroup, "columns", 2 );
2449 const int nbQuantities = 8;
2450 int prec[nbQuantities], ii = 0;
2451 prec[ii++] = addPreference( tr( "GEOM_PREF_length_precision" ), precGroup,
2452 LightApp_Preferences::IntSpin, "Geometry", "length_precision" );
2453 prec[ii++] = addPreference( tr( "GEOM_PREF_angle_precision" ), precGroup,
2454 LightApp_Preferences::IntSpin, "Geometry", "angle_precision" );
2455 prec[ii++] = addPreference( tr( "GEOM_PREF_len_tol_precision" ), precGroup,
2456 LightApp_Preferences::IntSpin, "Geometry", "len_tol_precision" );
2457 prec[ii++] = addPreference( tr( "GEOM_PREF_ang_tol_precision" ), precGroup,
2458 LightApp_Preferences::IntSpin, "Geometry", "ang_tol_precision" );
2459 prec[ii++] = addPreference( tr( "GEOM_PREF_weight_precision" ), precGroup,
2460 LightApp_Preferences::IntSpin, "Geometry", "weight_precision" );
2461 prec[ii++] = addPreference( tr( "GEOM_PREF_density_precision" ), precGroup,
2462 LightApp_Preferences::IntSpin, "Geometry", "density_precision" );
2463 prec[ii++] = addPreference( tr( "GEOM_PREF_parametric_precision" ), precGroup,
2464 LightApp_Preferences::IntSpin, "Geometry", "parametric_precision" );
2465 prec[ii ] = addPreference( tr( "GEOM_PREF_param_tol_precision" ), precGroup,
2466 LightApp_Preferences::IntSpin, "Geometry", "param_tol_precision" );
2468 // Set property for precision value for spinboxes
2469 for ( ii = 0; ii < nbQuantities; ii++ ){
2470 setPreferenceProperty( prec[ii], "min", -14 );
2471 setPreferenceProperty( prec[ii], "max", 14 );
2472 setPreferenceProperty( prec[ii], "precision", 2 );
2475 int VertexGroup = addPreference( tr( "PREF_GROUP_VERTEX" ), tabId );
2476 setPreferenceProperty( VertexGroup, "columns", 2 );
2478 int typeOfMarker = addPreference( tr( "PREF_TYPE_OF_MARKER" ), VertexGroup,
2479 LightApp_Preferences::Selector, "Geometry", "type_of_marker" );
2481 int markerScale = addPreference( tr( "PREF_MARKER_SCALE" ), VertexGroup,
2482 LightApp_Preferences::Selector, "Geometry", "marker_scale" );
2484 // Set property for default display mode
2485 QStringList aModesList;
2486 aModesList.append( tr("MEN_WIREFRAME") );
2487 aModesList.append( tr("MEN_SHADING") );
2488 aModesList.append( tr("MEN_SHADING_WITH_EDGES") );
2490 QList<QVariant> anIndexesList;
2491 anIndexesList.append(0);
2492 anIndexesList.append(1);
2493 anIndexesList.append(2);
2495 setPreferenceProperty( dispmode, "strings", aModesList );
2496 setPreferenceProperty( dispmode, "indexes", anIndexesList );
2498 // Set property for top level display mode
2499 QStringList aTopModesList;
2500 aTopModesList.append( tr("MEN_SHOW_ADD_WACTOR") );
2501 aTopModesList.append( tr("MEN_KEEP_CURRENT_DM") );
2502 aTopModesList.append( tr("MEN_WIREFRAME") );
2503 aTopModesList.append( tr("MEN_SHADING") );
2504 aTopModesList.append( tr("MEN_SHADING_WITH_EDGES") );
2506 QList<QVariant> aTopIndexesList;
2507 aTopIndexesList.append(0);
2508 aTopIndexesList.append(1);
2509 aTopIndexesList.append(2);
2510 aTopIndexesList.append(3);
2511 aTopIndexesList.append(4);
2513 setPreferenceProperty( top_lev_dm, "strings", aTopModesList );
2514 setPreferenceProperty( top_lev_dm, "indexes", aTopIndexesList );
2516 // Set property for step value for spinboxes
2517 setPreferenceProperty( step, "min", 1 );
2518 setPreferenceProperty( step, "max", 10000 );
2519 setPreferenceProperty( step, "precision", 3 );
2521 // Set property for deflection value for spinboxes
2522 setPreferenceProperty( defl, "min", GEOM::minDeflection() );
2523 setPreferenceProperty( defl, "max", 1.0 );
2524 setPreferenceProperty( defl, "step", 1.0e-04 );
2525 setPreferenceProperty( defl, "precision", 6 );
2527 // Set property for default material
2528 setPreferenceProperty( material, "strings", Material_ResourceMgr::resourceMgr()->materials() );
2530 // Set property vertex marker type
2531 QList<QVariant> aMarkerTypeIndicesList;
2532 QList<QVariant> aMarkerTypeIconsList;
2534 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
2535 for ( int i = GEOM::MT_POINT; i < GEOM::MT_USER; i++ ) {
2536 QString icoFile = QString( "ICON_VERTEX_MARKER_%1" ).arg( i );
2537 QPixmap pixmap = resMgr->loadPixmap( "GEOM", tr( qPrintable( icoFile ) ) );
2538 aMarkerTypeIndicesList << (i-1);
2539 aMarkerTypeIconsList << pixmap;
2542 setPreferenceProperty( typeOfMarker, "indexes", aMarkerTypeIndicesList );
2543 setPreferenceProperty( typeOfMarker, "icons", aMarkerTypeIconsList );
2545 // Set property for vertex marker scale
2546 QList<QVariant> aMarkerScaleIndicesList;
2547 QStringList aMarkerScaleValuesList;
2549 for ( int iii = GEOM::MS_10; iii <= GEOM::MS_70; iii++ ) {
2550 aMarkerScaleIndicesList << iii;
2551 aMarkerScaleValuesList << QString::number( (iii-(int)GEOM::MS_10)*0.5 + 1.0 );
2554 setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList );
2555 setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
2557 // Scalar bar for field step presentation
2558 int scalarBarGroup = addPreference( tr( "PREF_GROUP_SCALAR_BAR" ), tabId );
2559 setPreferenceProperty( scalarBarGroup, "columns", 2 );
2561 int sbXPosition = addPreference( tr( "PREF_SCALAR_BAR_X_POSITION" ), scalarBarGroup,
2562 LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_x_position" );
2563 setPreferenceProperty( sbXPosition, "min", 0 );
2564 setPreferenceProperty( sbXPosition, "max", 1 );
2565 setPreferenceProperty( sbXPosition, "step", 0.05 );
2567 int sbYPosition = addPreference( tr( "PREF_SCALAR_BAR_Y_POSITION" ), scalarBarGroup,
2568 LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_y_position" );
2569 setPreferenceProperty( sbYPosition, "min", 0 );
2570 setPreferenceProperty( sbYPosition, "max", 1 );
2571 setPreferenceProperty( sbYPosition, "step", 0.05 );
2573 int sbWidth = addPreference( tr( "PREF_SCALAR_BAR_WIDTH" ), scalarBarGroup,
2574 LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_width" );
2575 setPreferenceProperty( sbWidth, "min", 0 );
2576 setPreferenceProperty( sbWidth, "max", 1 );
2577 setPreferenceProperty( sbWidth, "step", 0.05 );
2579 int sbHeight = addPreference( tr( "PREF_SCALAR_BAR_HEIGHT" ), scalarBarGroup,
2580 LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_height" );
2581 setPreferenceProperty( sbHeight, "min", 0 );
2582 setPreferenceProperty( sbHeight, "max", 1 );
2583 setPreferenceProperty( sbHeight, "step", 0.05 );
2585 int sbTextHeight = addPreference( tr( "PREF_SCALAR_BAR_TEXT_HEIGHT" ), scalarBarGroup,
2586 LightApp_Preferences::IntSpin, "Geometry", "scalar_bar_text_height" );
2587 setPreferenceProperty( sbTextHeight, "min", 6 );
2588 setPreferenceProperty( sbTextHeight, "max", 24 );
2589 setPreferenceProperty( sbTextHeight, "step", 1 );
2591 int sbNbIntervals = addPreference( tr( "PREF_SCALAR_BAR_NUMBER_OF_INTERVALS" ), scalarBarGroup,
2592 LightApp_Preferences::IntSpin, "Geometry", "scalar_bar_nb_intervals" );
2593 setPreferenceProperty( sbNbIntervals, "min", 2 );
2594 setPreferenceProperty( sbNbIntervals, "max", 64 );
2595 setPreferenceProperty( sbNbIntervals, "step", 1 );
2597 int originGroup = addPreference( tr( "PREF_GROUP_ORIGIN_AND_BASE_VECTORS" ), tabId );
2598 setPreferenceProperty( originGroup, "columns", 2 );
2600 int baseVectorsLength = addPreference( tr( "PREF_BASE_VECTORS_LENGTH" ), originGroup,
2601 LightApp_Preferences::DblSpin, "Geometry", "base_vectors_length" );
2602 setPreferenceProperty( baseVectorsLength, "min", 0.01 );
2603 setPreferenceProperty( baseVectorsLength, "max", 1000 );
2605 addPreference( tr( "PREF_AUTO_CREATE" ), originGroup,
2606 LightApp_Preferences::Bool, "Geometry", "auto_create_base_objects" );
2608 int operationsGroup = addPreference( tr( "PREF_GROUP_OPERATIONS" ), tabId );
2609 setPreferenceProperty( operationsGroup, "columns", 2 );
2611 addPreference( tr( "GEOM_PREVIEW" ), operationsGroup,
2612 LightApp_Preferences::Bool, "Geometry", "geom_preview" );
2615 void GeometryGUI::preferencesChanged( const QString& section, const QString& param )
2617 if (section == "Geometry") {
2618 SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
2619 if (param == QString("SettingsGeomStep")) {
2620 double spin_step = aResourceMgr->doubleValue(section, param, 100.);
2621 EmitSignalDefaultStepValueChanged(spin_step);
2623 else if (param == QString("toplevel_color")) {
2624 QColor c = aResourceMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) );
2625 GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c));
2627 else if (param == QString("toplevel_dm")) {
2628 GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)aResourceMgr->integerValue("Geometry", "toplevel_dm", 0));
2630 else if (param == QString("scalar_bar_x_position") ||
2631 param == QString("scalar_bar_y_position") ||
2632 param == QString("scalar_bar_width") ||
2633 param == QString("scalar_bar_height") ||
2634 param == QString("scalar_bar_text_height") ||
2635 param == QString("scalar_bar_nb_intervals")) {
2636 if( SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) )
2638 GEOM_Displayer aDisplayer( aStudy );
2639 bool anIsRedisplayFieldSteps = param == QString("scalar_bar_nb_intervals");
2640 aDisplayer.UpdateColorScale( anIsRedisplayFieldSteps, true );
2643 else if ( param == QString("dimensions_color") ||
2644 param == QString("dimensions_line_width") ||
2645 param == QString("dimensions_font_height") ||
2646 param == QString("dimensions_arrow_length") ||
2647 param == QString("dimensions_show_units") ||
2648 param == QString("dimensions_length_units") ||
2649 param == QString("dimensions_angle_units") )
2651 SalomeApp_Application* anApp = getApp();
2657 SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( anApp->activeStudy() );
2663 GEOM_Displayer aDisplayer( aStudy );
2665 ViewManagerList aVMs;
2666 anApp->viewManagers( OCCViewer_Viewer::Type(), aVMs );
2667 ViewManagerList::Iterator anIt = aVMs.begin();
2668 for ( ; anIt != aVMs.end(); ++anIt )
2670 SOCC_Viewer* aViewer = dynamic_cast<SOCC_Viewer*>( (*anIt)->getViewModel() );
2676 SALOME_ListIO aVisible;
2677 aViewer->GetVisible( aVisible );
2678 aDisplayer.Redisplay( aVisible, false, aViewer );
2681 aDisplayer.UpdateViewer();
2686 LightApp_Displayer* GeometryGUI::displayer()
2689 myDisplayer = new GEOM_Displayer( dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) );
2693 void GeometryGUI::setLocalSelectionMode(const int mode)
2695 myLocalSelectionMode = mode;
2698 int GeometryGUI::getLocalSelectionMode() const
2700 return myLocalSelectionMode;
2703 const char gSeparator = '_'; // character used to separate parameter names
2704 const char gDigitsSep = ':'; // character used to separate numeric parameter values (color = r:g:b)
2707 * \brief Store visual parameters
2709 * This method is called just before the study document is saved.
2710 * Store visual parameters in AttributeParameter attribute(s)
2712 void GeometryGUI::storeVisualParameters (int savePoint)
2714 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
2715 if ( !appStudy || !appStudy->studyDS() )
2717 _PTR(Study) studyDS = appStudy->studyDS();
2719 // componentName is used for encoding of entries when storing them in IParameters
2720 std::string componentName = myComponentGeom->ComponentDataType();
2721 //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
2722 //if (!aSComponent) return;
2725 _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
2726 componentName.c_str(),
2728 _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
2730 QList<SUIT_ViewManager*> lst;
2731 QList<SUIT_ViewManager*>::Iterator it;
2733 // main cycle to store parameters of displayed objects
2735 getApp()->viewManagers(lst);
2736 for (it = lst.begin(); it != lst.end(); it++) {
2737 SUIT_ViewManager* vman = *it;
2738 QString vType = vman->getType();
2739 int aMgrId = vman->getGlobalId();
2740 // saving VTK actors properties
2741 QVector<SUIT_ViewWindow*> views = vman->getViews();
2742 for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++) {
2743 const ObjMap anObjects = appStudy->getObjectMap(aMgrId);
2744 ObjMap::ConstIterator o_it = anObjects.begin();
2745 for (; o_it != anObjects.end(); o_it++) {
2746 const PropMap aProps = o_it.value();
2748 //Check that object exists in the study
2749 _PTR(SObject) obj( studyDS->FindObjectID( o_it.key().toLatin1().data() ) );
2750 if ( !obj || !(aProps.count() > 0))
2752 // entry is "encoded" = it does NOT contain component adress, since it is a
2753 // subject to change on next component loading
2755 std::string entry = ip->encodeEntry(o_it.key().toLatin1().data(), componentName);
2757 _PTR(GenericAttribute) anAttr;
2758 if (!obj->FindAttribute(anAttr, "AttributeIOR"))
2761 QString param, occParam = vType;
2762 occParam += GEOM::sectionSeparator();
2763 occParam += QString::number(aMgrId);
2764 occParam += GEOM::sectionSeparator();
2766 if (aProps.contains(GEOM::propertyName( GEOM::Visibility ))) {
2767 param = occParam + GEOM::propertyName( GEOM::Visibility );
2768 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Visibility )).toBool() ? "On" : "Off");
2771 if (aProps.contains(GEOM::propertyName( GEOM::DisplayMode ))) {
2772 param = occParam + GEOM::propertyName( GEOM::DisplayMode );
2773 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::DisplayMode )).toString().toStdString());
2776 if (aProps.contains(GEOM::propertyName( GEOM::Color ))) {
2777 QColor c = aProps.value(GEOM::propertyName( GEOM::Color )).value<QColor>();
2779 val << QString::number(c.redF());
2780 val << QString::number(c.greenF());
2781 val << QString::number(c.blueF());
2782 param = occParam + GEOM::propertyName( GEOM::Color );
2783 ip->setParameter(entry, param.toStdString(), val.join( GEOM::subSectionSeparator()).toStdString());
2786 if (aProps.contains(GEOM::propertyName( GEOM::Texture ))) {
2787 param = occParam + GEOM::propertyName( GEOM::Texture );
2788 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Texture )).toString().toStdString());
2791 if (vType == SVTK_Viewer::Type()) {
2792 if (aProps.contains(GEOM::propertyName( GEOM::Opacity ))) {
2793 param = occParam + GEOM::propertyName( GEOM::Opacity );
2794 ip->setParameter(entry, param.toStdString(), QString::number(1. - aProps.value(GEOM::propertyName( GEOM::Transparency )).toDouble()).toStdString());
2796 } else if (vType == SOCC_Viewer::Type()) {
2797 if (aProps.contains(GEOM::propertyName( GEOM::Transparency ))) {
2798 param = occParam + GEOM::propertyName( GEOM::Transparency );
2799 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Transparency )).toString().toStdString());
2802 if (aProps.contains(GEOM::propertyName( GEOM::TopLevel ))) {
2803 param = occParam + GEOM::propertyName( GEOM::TopLevel );
2804 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::TopLevel )).toString().toStdString());
2808 if (aProps.contains(GEOM::propertyName( GEOM::NbIsos ))) {
2809 param = occParam + GEOM::propertyName( GEOM::NbIsos );
2810 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::NbIsos )).toString().toStdString());
2813 if (aProps.contains(GEOM::propertyName( GEOM::EdgesDirection ))) {
2814 param = occParam + GEOM::propertyName( GEOM::EdgesDirection );
2815 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::EdgesDirection )).toString().toStdString());
2818 if (aProps.contains(GEOM::propertyName( GEOM::Deflection ))) {
2819 param = occParam + GEOM::propertyName( GEOM::Deflection );
2820 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Deflection )).toString().toStdString());
2823 //Marker type of the vertex - ONLY for the "Vertex" and "Compound of the Vertex"
2824 if (aProps.contains(GEOM::propertyName( GEOM::PointMarker ))) {
2825 param = occParam + GEOM::propertyName( GEOM::PointMarker );
2826 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::PointMarker )).toString().toStdString());
2829 if (aProps.contains(GEOM::propertyName( GEOM::Material ))) {
2830 param = occParam + GEOM::propertyName( GEOM::Material );
2831 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Material )).toString().toStdString());
2834 if (aProps.contains(GEOM::propertyName( GEOM::LineWidth ))) {
2835 param = occParam + GEOM::propertyName( GEOM::LineWidth );
2836 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::LineWidth )).toString().toStdString());
2839 if (aProps.contains(GEOM::propertyName( GEOM::IsosWidth ))) {
2840 param = occParam + GEOM::propertyName( GEOM::IsosWidth );
2841 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::IsosWidth )).toString().toStdString());
2843 } // object iterator
2845 } // for (viewManagers)
2849 * \brief Restore visual parameters
2851 * This method is called after the study document is opened.
2852 * Restore visual parameters from AttributeParameter attribute(s)
2854 void GeometryGUI::restoreVisualParameters (int savePoint)
2856 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
2857 if (!appStudy || !appStudy->studyDS())
2859 _PTR(Study) studyDS = appStudy->studyDS();
2861 // componentName is used for encoding of entries when storing them in IParameters
2862 std::string componentName = myComponentGeom->ComponentDataType();
2863 //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
2864 //if (!aSComponent) return;
2867 _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
2868 componentName.c_str(),
2870 _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
2872 std::vector<std::string> entries = ip->getEntries();
2874 for (std::vector<std::string>::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt)
2876 // entry is a normal entry - it should be "decoded" (setting base adress of component)
2877 QString entry (ip->decodeEntry(*entIt).c_str());
2879 // Check that the entry corresponds to a real object in the Study
2880 // as the object may be deleted or modified after the visual state is saved.
2881 _PTR(SObject) so = studyDS->FindObjectID(entry.toLatin1().data());
2882 if (!so) continue; //Skip the not existent entry
2884 std::vector<std::string> paramNames = ip->getAllParameterNames( *entIt );
2885 std::vector<std::string> paramValues = ip->getAllParameterValues( *entIt );
2887 std::vector<std::string>::iterator namesIt = paramNames.begin();
2888 std::vector<std::string>::iterator valuesIt = paramValues.begin();
2890 // actors are stored in a map after displaying of them for
2891 // quicker access in the future: map < viewID to actor >
2892 NCollection_DataMap<int, GEOM_Actor* > vtkActors;
2893 NCollection_DataMap<int, Handle(GEOM_AISShape)> occActors;
2895 QString viewerTypStr;
2896 QString viewIndexStr;
2898 QVector<PropMap> aListOfMap;
2900 for (; namesIt != paramNames.end(); ++namesIt, ++valuesIt)
2902 // visual parameters are stored in strings as follows: ViewerType_ViewIndex_ParamName.
2903 // '_' is used as separator and should not be used in viewer type or parameter names.
2904 QStringList lst = QString((*namesIt).c_str()).split( GEOM::sectionSeparator(), QString::SkipEmptyParts);
2905 if (lst.size() != 3)
2908 viewerTypStr = lst[0];
2909 viewIndexStr = lst[1];
2910 QString paramNameStr = lst[2];
2913 viewIndex = viewIndexStr.toUInt(&ok);
2914 if (!ok) // bad conversion of view index to integer
2917 if ((viewIndex + 1) > aListOfMap.count()) {
2918 aListOfMap.resize(viewIndex + 1);
2921 QString val((*valuesIt).c_str());
2922 if (paramNameStr == GEOM::propertyName( GEOM::Visibility )) {
2923 aListOfMap[viewIndex].insert(GEOM::propertyName( GEOM::Visibility ), val == "On");
2924 } else if (paramNameStr == GEOM::propertyName( GEOM::Opacity )) {
2925 aListOfMap[viewIndex].insert(GEOM::propertyName( GEOM::Transparency ), 1. - val.toDouble());
2926 } else if (paramNameStr == GEOM::propertyName( GEOM::Transparency )) {
2927 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Transparency ), val.toDouble() );
2928 } else if (paramNameStr == GEOM::propertyName( GEOM::TopLevel )) {
2929 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::TopLevel ), val == "true" || val == "1");
2930 } else if (paramNameStr == GEOM::propertyName( GEOM::DisplayMode )) {
2931 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::DisplayMode ), val.toInt());
2932 } else if (paramNameStr == GEOM::propertyName( GEOM::NbIsos )) {
2933 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::NbIsos ), val);
2934 } else if (paramNameStr == GEOM::propertyName( GEOM::Color )) {
2935 QStringList rgb = val.split(GEOM::subSectionSeparator());
2936 if (rgb.count() == 3) {
2937 QColor c = QColor::fromRgbF(rgb[0].toDouble(), rgb[1].toDouble(), rgb[2].toDouble());
2938 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Color ), c);
2940 } else if (paramNameStr == GEOM::propertyName( GEOM::Texture )) {
2941 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Texture ), val );
2942 } else if (paramNameStr == GEOM::propertyName( GEOM::EdgesDirection )) {
2943 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::EdgesDirection ), val == "true" || val == "1");
2944 } else if (paramNameStr == GEOM::propertyName( GEOM::Deflection )) {
2945 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Deflection ), val.toDouble());
2946 } else if (paramNameStr == GEOM::propertyName( GEOM::PointMarker )) {
2947 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::PointMarker ), val);
2948 } else if (paramNameStr == GEOM::propertyName( GEOM::Material )) {
2949 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Material ), val);
2950 } else if (paramNameStr == GEOM::propertyName( GEOM::LineWidth )) {
2951 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::LineWidth ), val.toInt());
2952 } else if (paramNameStr == GEOM::propertyName( GEOM::IsosWidth )) {
2953 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::IsosWidth ), val.toInt());
2955 } // for names/parameters iterator
2957 QList<SUIT_ViewManager*> lst = getApp()->viewManagers();
2959 for (int index = 0; index < aListOfMap.count(); index++) {
2961 appStudy->setObjectPropMap(index, entry, aListOfMap[index]);
2963 //Get Visibility property of the current PropMap
2964 if (aListOfMap[index].value(GEOM::propertyName( GEOM::Visibility )) == 1) {
2965 SUIT_ViewManager* vman = lst.at(index);
2966 SUIT_ViewModel* vmodel = vman->getViewModel();
2967 displayer()->Display(entry, true, dynamic_cast<SALOME_View*>(vmodel));
2970 } // for entries iterator
2972 // update all VTK and OCC views
2973 QList<SUIT_ViewManager*> lst;
2974 getApp()->viewManagers(lst);
2975 for (QList<SUIT_ViewManager*>::Iterator it = lst.begin(); it != lst.end(); it++) {
2976 SUIT_ViewModel* vmodel = (*it)->getViewModel();
2979 if (vmodel->getType() == SVTK_Viewer::Type()) {
2980 SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) (*it)->getActiveView();
2981 vtkView->getRenderer()->ResetCameraClippingRange();
2984 else if (vmodel->getType() == SOCC_Viewer::Type()) {
2985 //SOCC_ViewWindow* occView = (SOCC_ViewWindow*) (*it)->getActiveView();
2986 SALOME_View* occVMod = dynamic_cast<SALOME_View*>(vmodel);
2993 void GeometryGUI::onViewAboutToShow()
2995 SUIT_ViewWindow* window = application()->desktop()->activeWindow();
2996 QAction* a = action( GEOMOp::OpSwitchVectors );
2998 a->setEnabled(true);
2999 bool vmode = window->property("VectorsMode").toBool();
3000 a->setText ( vmode == 1 ? tr( "MEN_VECTOR_MODE_OFF" ) : tr("MEN_VECTOR_MODE_ON") );
3002 a->setText ( tr("MEN_VECTOR_MODE_ON") );
3003 a->setEnabled(false);
3008 \brief Return action by id
3009 \param id identifier of the action
3012 QAction* GeometryGUI::getAction(const int id) {
3017 \brief GEOM module message handler
3019 This method can be re-implemented in the subclasses.
3020 This is a GEOM module message handler.
3022 \param msg the message received.
3024 void GeometryGUI::message(const QString& msg)
3027 QStringList data = msg.split("/");
3028 const int nbStrings = data.count();
3030 if (nbStrings > 0) {
3031 if (data[0] == "modified") {
3033 QString anIOR = nbStrings > 1 ? data[1] : QString();
3035 if ( anIOR.isEmpty() ) {
3039 // Get the geom object.
3040 GEOM::GEOM_Object_ptr anObj = GeometryGUI::GetObjectFromIOR (anIOR);
3042 // Clear the shape buffer
3043 GeometryGUI::ClearShapeBuffer (anObj);
3049 \brief Clears the shape buffer.
3051 This is a static method. It clears the shape buffer.
3053 \param theObj the object
3055 void GeometryGUI::ClearShapeBuffer( GEOM::GEOM_Object_ptr theObj )
3057 if ( CORBA::is_nil( theObj ) )
3060 CORBA::String_var IOR = SalomeApp_Application::orb()->object_to_string( theObj );
3061 TCollection_AsciiString asciiIOR( (char *)IOR.in() );
3062 GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
3064 SALOMEDSClient_StudyManager *aManager = SalomeApp_Application::studyMgr();
3069 _PTR(Study) aStudy = aManager->GetStudyByID(theObj->GetStudyID());
3074 _PTR(SObject) aSObj ( aStudy->FindObjectIOR( std::string( IOR ) ) );
3078 _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) );
3079 for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) {
3080 _PTR(GenericAttribute) anAttr;
3081 if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) {
3082 _PTR(AttributeIOR) anIOR ( anAttr );
3083 TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() );
3084 GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
3090 \brief Returns the object from IOR.
3092 This is a static method. It returns the object from its IOR.
3094 \param IOR object IOR
3095 \return GEOM object.
3097 GEOM::GEOM_Object_ptr GeometryGUI::GetObjectFromIOR( const QString& IOR )
3099 GEOM::GEOM_Object_var geomObj;
3100 if ( !IOR.isEmpty() ) {
3101 CORBA::Object_var corbaObj = SalomeApp_Application::orb()->string_to_object
3102 ( IOR.toLatin1().constData() );
3103 if ( !CORBA::is_nil( corbaObj ) )
3104 geomObj = GEOM::GEOM_Object::_narrow( corbaObj );
3106 return geomObj._retn();
3110 \brief Returns IOR of the object.
3112 This is a static method. It returns the object's IOR.
3114 \param object the GEOM object.
3115 \return object's IOR.
3117 QString GeometryGUI::GetIORFromObject( GEOM::GEOM_Object_ptr object )
3120 if ( !CORBA::is_nil( object ) ) {
3121 CORBA::String_var anIOR =
3122 SalomeApp_Application::orb()->object_to_string( object );
3129 \brief Check if this object is can't be renamed in place
3131 This method can be re-implemented in the subclasses.
3132 Return true in case if object isn't reference or component (module root).
3134 \param entry column id
3135 \return \c true if the item can be renamed by the user in place (e.g. in the Object browser)
3137 bool GeometryGUI::renameAllowed( const QString& entry) const {
3139 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
3140 SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
3141 SalomeApp_DataObject* obj = appStudy ? dynamic_cast<SalomeApp_DataObject*>(appStudy->findObjectByEntry(entry)) : 0;
3143 return (app && appStudy && obj && !appStudy->isComponent(entry) && !obj->isReference());
3147 Rename object by entry.
3148 \param entry entry of the object
3149 \param name new name of the object
3150 \brief Return \c true if rename operation finished successfully, \c false otherwise.
3152 bool GeometryGUI::renameObject( const QString& entry, const QString& name)
3154 bool result = false;
3156 SalomeApp_Application* app =
3157 dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication());
3158 SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
3163 _PTR(Study) aStudy = appStudy->studyDS();
3168 bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
3170 SUIT_MessageBox::warning ( app->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
3174 _PTR(SObject) obj ( aStudy->FindObjectID(qPrintable(entry)) );
3175 _PTR(GenericAttribute) anAttr;
3177 if ( obj->FindAttribute(anAttr, "AttributeName") ) {
3178 _PTR(AttributeName) aName (anAttr);
3180 aName->SetValue( name.toLatin1().data() ); // rename the SObject
3181 GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(obj));
3182 if (!CORBA::is_nil(anObj)) {
3183 anObj->SetName( name.toLatin1().data() ); // Rename the corresponding GEOM_Object
3191 void GeometryGUI::updateMaterials()
3193 LightApp_Preferences* pref = preferences();
3195 QStringList materials = Material_ResourceMgr::resourceMgr()->materials();
3196 QString currentMaterial = SUIT_Session::session()->resourceMgr()->stringValue( "Geometry", "material" );
3197 if ( !materials.contains( currentMaterial ) )
3198 // user material set as default in the preferences, might be removed
3199 SUIT_Session::session()->resourceMgr()->setValue( "Geometry", "material", QString( "Plastic" ) );
3201 QtxPreferenceItem* prefItem = pref->rootItem()->findItem( tr( "PREF_MATERIAL" ), true );
3203 setPreferenceProperty( prefItem->id(),
3204 "strings", materials );
3205 prefItem->retrieve();
3211 \brief Check if the module allows "drag" operation of its objects.
3213 Overloaded from LightApp_Module class.
3215 This function is a part of the general drag-n-drop mechanism.
3216 The goal of this function is to check data object passed as a parameter
3217 and decide if it can be dragged or no.
3219 \param what data object being tested for drag operation
3220 \return \c true if module allows dragging of the specified object
3221 \sa isDropAccepted(), dropObjects()
3223 bool GeometryGUI::isDraggable( const SUIT_DataObject* what ) const
3225 // we allow dragging object under root and object from folder
3226 int aLevel = what->level();
3227 bool anObjectInFolder = false;
3229 const SalomeApp_DataObject* dataObj = dynamic_cast<const SalomeApp_DataObject*>( what );
3231 _PTR(SObject) aSO = dataObj->object();
3233 _PTR(GenericAttribute) anAttr;
3234 _PTR(SObject) aFatherSO = aSO->GetStudy()->GetUseCaseBuilder()->GetFather( aSO );
3235 if ( aFatherSO && aFatherSO->FindAttribute(anAttr, "AttributeLocalID") ) {
3236 _PTR(AttributeLocalID) aLocalID( anAttr );
3237 anObjectInFolder = aLocalID->Value() == 999;
3242 return aLevel == 2 || anObjectInFolder;
3246 \brief Check if the module allows "drop" operation on the given object.
3248 Overloaded from LightApp_Module class.
3250 This function is a part of the general drag-n-drop mechanism.
3251 The goal of this function is to check data object passed as a parameter
3252 and decide if it can be used as a target for the "drop" operation.
3253 The processing of the drop operation itself is done in the dropObjects() function.
3255 \param where target data object
3256 \return \c true if module supports dropping on the \a where data object
3257 \sa isDraggable(), dropObjects()
3259 bool GeometryGUI::isDropAccepted( const SUIT_DataObject* where ) const
3261 // we allow dropping into folder and top-level GEOM object
3262 int aLevel = where->level();
3263 bool isFolder = false;
3265 const SalomeApp_DataObject* dataObj = dynamic_cast<const SalomeApp_DataObject*>( where );
3267 _PTR(SObject) aSO = dataObj->object();
3269 _PTR(GenericAttribute) anAttr;
3270 if ( aSO->FindAttribute(anAttr, "AttributeLocalID") ) {
3271 _PTR(AttributeLocalID) aLocalID( anAttr );
3272 isFolder = aLocalID->Value() == 999;
3277 return aLevel == 1 || isFolder;
3281 \brief Complete drag-n-drop operation.
3283 Overloaded from LightApp_Module class.
3285 This function is a part of the general drag-n-drop mechanism.
3286 Its goal is to handle dropping of the objects being dragged according
3287 to the chosen operation (move). The dropping is performed in the
3288 context of the parent data object \a where and the \a row (position in the
3289 children index) at which the data should be dropped. If \a row is equal to -1,
3290 this means that objects are added to the end of the children list.
3292 \param what objects being dropped
3293 \param where target data object
3294 \param row child index at which the drop operation is performed
3295 \param action drag-n-drop operation (Qt::DropAction) - move
3297 \sa isDraggable(), isDropAccepted()
3299 void GeometryGUI::dropObjects( const DataObjectList& what, SUIT_DataObject* where,
3300 const int row, Qt::DropAction action )
3302 if (action != Qt::CopyAction && action != Qt::MoveAction)
3303 return; // unsupported action
3305 // get parent object
3306 SalomeApp_DataObject* dataObj = dynamic_cast<SalomeApp_DataObject*>( where );
3307 if ( !dataObj ) return; // wrong parent
3308 _PTR(SObject) parentObj = dataObj->object();
3310 // Find the current Study and StudyBuilder
3311 _PTR(Study) aStudy = parentObj->GetStudy();
3312 _PTR(UseCaseBuilder) aUseCaseBuilder = aStudy->GetUseCaseBuilder();
3313 // collect all parents of the target node
3314 QStringList parentIDs;
3315 _PTR(SObject) parent = parentObj;
3316 while( !parent->IsNull() ) {
3317 parentIDs << parent->GetID().c_str();
3318 parent = aUseCaseBuilder->GetFather(parent);
3321 // collect objects being dropped
3322 GEOM::object_list_var objects = new GEOM::object_list();
3323 objects->length( what.count() );
3325 for ( int i = 0; i < what.count(); i++ ) {
3326 dataObj = dynamic_cast<SalomeApp_DataObject*>( what[i] );
3327 if ( !dataObj ) continue; // skip wrong objects
3328 _PTR(SObject) sobj = dataObj->object();
3329 // check that dropped object is not a parent of target object
3330 if ( parentIDs.contains( sobj->GetID().c_str() ) ) {
3331 return; // it's not allowed to move node into it's child
3333 objects[i] = _CAST(SObject, sobj)->GetSObject();
3336 objects->length( count );
3338 // call engine function
3339 GetGeomGen()->Move( objects.in(), // what
3340 _CAST(SObject, parentObj)->GetSObject(), // where
3343 // update Object browser
3344 getApp()->updateObjectBrowser( false );