1 // Copyright (C) 2007-2014 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, or (at your option) any later version.
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 "GEOMGUI_DimensionProperty.h"
38 #include "GEOM_Constants.h"
39 #include "GEOM_Displayer.h"
40 #include "GEOM_AISShape.hxx"
42 #include "GEOM_Actor.h"
44 #include <Material_ResourceMgr.h>
45 #include <Material_Model.h>
47 #include <SUIT_Desktop.h>
48 #include <SUIT_MessageBox.h>
49 #include <SUIT_ResourceMgr.h>
50 #include <SUIT_Session.h>
51 #include <SUIT_ViewManager.h>
53 #include <PyInterp_Interp.h>
55 #include <OCCViewer_ViewWindow.h>
56 #include <OCCViewer_ViewPort3d.h>
57 #include <OCCViewer_ViewModel.h>
58 #include <OCCViewer_ViewManager.h>
60 #include <SOCC_ViewModel.h>
61 #include <SOCC_ViewWindow.h>
63 #include <SVTK_ViewWindow.h>
64 #include <SVTK_RenderWindowInteractor.h>
65 #include <SVTK_InteractorStyle.h>
66 #include <SVTK_ViewModel.h>
68 #include <SalomeApp_Application.h>
69 #include <SalomeApp_DataObject.h>
70 #include <SalomeApp_Study.h>
71 #include <SalomeApp_Tools.h>
73 #include <LightApp_SelectionMgr.h>
74 #include <LightApp_VTKSelector.h>
75 #include <LightApp_DataObject.h>
76 #include <LightApp_Preferences.h>
78 #include <SALOME_LifeCycleCORBA.hxx>
79 // #include <SALOME_ListIO.hxx>
80 #include <SALOME_ListIteratorOfListIO.hxx>
82 #include <SALOMEDSClient_ClientFactory.hxx>
83 #include <SALOMEDSClient_IParameters.hxx>
85 #include <SALOMEDS_SObject.hxx>
87 #include <Basics_OCCTVersion.hxx>
98 #include <QSignalMapper>
100 #include <AIS_Drawer.hxx>
101 #include <AIS_ListOfInteractive.hxx>
102 #include <AIS_ListIteratorOfListOfInteractive.hxx>
103 #include <Prs3d_Drawer.hxx>
104 #include <Prs3d_IsoAspect.hxx>
105 #include <Aspect_TypeOfMarker.hxx>
106 #include <OSD_SharedLibrary.hxx>
107 #include <NCollection_DataMap.hxx>
109 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
110 #include <TColStd_HArray1OfByte.hxx>
112 #include <Graphic3d_HArray1OfBytes.hxx>
115 #include <utilities.h>
117 #include <vtkCamera.h>
118 #include <vtkRenderer.h>
120 #include <Standard_Failure.hxx>
121 #include <Standard_ErrorHandler.hxx>
123 #include "GEOM_version.h"
124 #include "GEOMImpl_Types.hxx" // dangerous hxx (defines short-name macros) - include after all
127 Standard_EXPORT CAM_Module* createModule() {
128 return new GeometryGUI();
131 Standard_EXPORT char* getModuleVersion() {
132 return (char*)GEOM_VERSION_STR;
136 GeometryGUI::StudyTextureMap GeometryGUI::myTextureMap;
138 GEOM::GEOM_Gen_var GeometryGUI::myComponentGeom = GEOM::GEOM_Gen::_nil();
140 GEOM::GEOM_Gen_var GeometryGUI::GetGeomGen()
142 // Bug 12290: exception in Mesh GUI on GEOMBase::GetShape() if Geometry GUI hasn't been loaded
143 if (CORBA::is_nil(myComponentGeom))
145 return GeometryGUI::myComponentGeom;
148 bool GeometryGUI::InitGeomGen()
151 if ( CORBA::is_nil( myComponentGeom ) ) return false;
155 //=======================================================================
156 // function : ClientSObjectToObject
158 //=======================================================================
159 CORBA::Object_var GeometryGUI::ClientSObjectToObject (_PTR(SObject) theSObject)
161 _PTR(GenericAttribute) anAttr;
162 CORBA::Object_var anObj;
164 std::string aValue = theSObject->GetIOR();
165 if (strcmp(aValue.c_str(), "") != 0) {
166 CORBA::ORB_ptr anORB = SalomeApp_Application::orb();
167 anObj = anORB->string_to_object(aValue.c_str());
170 INFOS("ClientSObjectToObject - Unknown exception was occured!!!");
172 return anObj._retn();
175 //=======================================================================
176 // function : ClientStudyToStudy
178 //=======================================================================
179 SALOMEDS::Study_var GeometryGUI::ClientStudyToStudy (_PTR(Study) theStudy)
181 SALOME_NamingService *aNamingService = SalomeApp_Application::namingService();
182 CORBA::Object_var aSMObject = aNamingService->Resolve("/myStudyManager");
183 SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow(aSMObject);
184 int aStudyID = theStudy->StudyId();
185 SALOMEDS::Study_var aDSStudy = aStudyManager->GetStudyByID(aStudyID);
186 return aDSStudy._retn();
189 void GeometryGUI::Modified (bool theIsUpdateActions)
191 if ( SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() ) ) {
192 if ( SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) ) {
193 appStudy->Modified();
194 if ( theIsUpdateActions )
195 app->updateActions();
200 //=======================================================================
201 // function : GeometryGUI::GeometryGUI()
202 // purpose : Constructor
203 //=======================================================================
204 GeometryGUI::GeometryGUI() :
205 SalomeApp_Module( "GEOM" ),
208 if ( CORBA::is_nil( myComponentGeom ) )
210 Engines::EngineComponent_var comp =
211 SalomeApp_Application::lcc()->FindOrLoad_Component( "FactoryServer", "GEOM" );
212 myComponentGeom = GEOM::GEOM_Gen::_narrow( comp );
215 myActiveDialogBox = 0;
217 gp_Pnt origin = gp_Pnt(0., 0., 0.);
218 gp_Dir direction = gp_Dir(0., 0., 1.);
219 myWorkingPlane = gp_Ax3(origin, direction);
222 myLocalSelectionMode = GEOM_ALLOBJECTS;
224 myCreationInfoWdg = 0;
226 connect( Material_ResourceMgr::resourceMgr(), SIGNAL( changed() ), this, SLOT( updateMaterials() ) );
228 Q_INIT_RESOURCE( GEOMGUI );
231 //=======================================================================
232 // function : GeometryGUI::~GeometryGUI()
233 // purpose : Destructor
234 //=======================================================================
235 GeometryGUI::~GeometryGUI()
237 while (!myOCCSelectors.isEmpty())
238 delete myOCCSelectors.takeFirst();
240 while (!myVTKSelectors.isEmpty())
241 delete myVTKSelectors.takeFirst();
243 qDeleteAll(myGUIMap);
246 //=======================================================================
247 // function : GeometryGUI::getLibrary()
248 // purpose : get or load GUI library by name [ internal ]
249 //=======================================================================
250 typedef GEOMGUI* (*LibraryGUI)( GeometryGUI* );
251 GEOMGUI* GeometryGUI::getLibrary( const QString& libraryName )
253 if ( !myGUIMap.contains( libraryName ) ) {
254 // try to load library if it is not loaded yet
256 QString dirs = getenv( "LD_LIBRARY_PATH" );
259 QString dirs = getenv( "PATH" );
262 if ( !dirs.isEmpty() ) {
263 QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries
264 QListIterator<QString> it( dirList ); it.toBack();
265 while ( it.hasPrevious() ) {
266 QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName );
268 OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() );
269 bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY );
271 MESSAGE( "Can't open library : " << aSharedLibrary.DlError() );
272 continue; // continue search further
274 OSD_Function osdF = aSharedLibrary.DlSymb( "GetLibGUI" );
275 if ( osdF != NULL ) {
276 LibraryGUI func = (GEOMGUI* (*) (GeometryGUI*))osdF;
277 GEOMGUI* libGUI = (*func)( this );
279 myGUIMap[ libraryName ] = libGUI;
280 break; // found and loaded!
287 return myGUIMap.contains( libraryName ) ? myGUIMap[ libraryName ] : 0;
290 //=======================================================================
291 // function : GeometryGUI::getPluginLibrary()
292 // purpose : get or load GUI Plugin library by name [ internal ]
293 //=======================================================================
294 typedef GEOMPluginGUI* (*PluginLibraryGUI)( GeometryGUI* );
295 GEOMPluginGUI* GeometryGUI::getPluginLibrary( const QString& libraryName )
297 if ( !myGUIMap.contains( libraryName ) ) {
298 // try to load library if it is not loaded yet
300 QString dirs = getenv( "LD_LIBRARY_PATH" );
303 QString dirs = getenv( "PATH" );
306 if ( !dirs.isEmpty() ) {
307 QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries
308 QListIterator<QString> it( dirList ); it.toBack();
309 while ( it.hasPrevious() ) {
310 QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName );
312 OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() );
313 bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY );
315 MESSAGE( "Can't open library : " << aSharedLibrary.DlError() );
316 continue; // continue search further
318 OSD_Function osdF = aSharedLibrary.DlSymb( "GetLibGUI" );
319 if ( osdF != NULL ) {
320 PluginLibraryGUI func = (GEOMPluginGUI* (*) (GeometryGUI*))osdF;
321 GEOMPluginGUI* libGUI = (*func)( this );
323 myGUIMap[ libraryName ] = libGUI;
324 break; // found and loaded!
331 return myGUIMap.contains( libraryName ) ? (GEOMPluginGUI*)myGUIMap[ libraryName ] : 0;
334 //=======================================================================
335 // function : GeometryGUI::ActiveWorkingPlane()
336 // purpose : Activate Working Plane View
337 //=======================================================================
338 void GeometryGUI::ActiveWorkingPlane()
340 gp_Dir DZ = myWorkingPlane.Direction();
341 gp_Dir DY = myWorkingPlane.YDirection();
343 SUIT_ViewWindow* window = application()->desktop()->activeWindow();
344 bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
345 bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
348 OCCViewer_ViewWindow* vw = dynamic_cast<OCCViewer_ViewWindow*>( window );
350 Handle(V3d_View) view3d = vw->getViewPort()->getView();
352 view3d->SetProj(DZ.X(), DZ.Y(), DZ.Z());
353 view3d->SetUp(DY.X(), DY.Y(), DY.Z());
357 else if ( ViewVTK ) {
358 SVTK_ViewWindow* vw = dynamic_cast<SVTK_ViewWindow*>( window );
360 vtkCamera* camera = vw->getRenderer()->GetActiveCamera();
362 camera->SetPosition(DZ.X(), DZ.Y(), DZ.Z());
363 camera->SetViewUp(DY.X(), DY.Y(), DY.Z());
364 camera->SetFocalPoint(0,0,0);
371 //=======================================================================
372 // function : GeometryGUI::SetActiveDialogBox()
373 // purpose : Set active dialog box
374 //=======================================================================
375 void GeometryGUI::SetActiveDialogBox( QDialog* aDlg )
377 myActiveDialogBox = (QDialog*)aDlg;
380 //=======================================================================
381 // function : GeometryGUI::EmitSignalDeactivateDialog()
382 // purpose : Emit a signal to deactivate the active dialog Box
383 //=======================================================================
384 void GeometryGUI::EmitSignalDeactivateDialog()
386 emit SignalDeactivateActiveDialog();
389 //=======================================================================
390 // function : GeometryGUI::EmitSignalCloseAllDialogs()
391 // purpose : Emit a signal to close all non modal dialogs box
392 //=======================================================================
393 void GeometryGUI::EmitSignalCloseAllDialogs()
395 emit SignalCloseAllDialogs();
398 //=======================================================================
399 // function : GeometryGUI::EmitSignalDefaultStepValueChanged()
400 // purpose : Emit a signal to inform that default real spin box step has
402 //=======================================================================
403 void GeometryGUI::EmitSignalDefaultStepValueChanged(double newVal)
405 emit SignalDefaultStepValueChanged(newVal);
408 //=======================================================================
409 // function : GeometryGUI::OnGUIEvent()
410 // purpose : common slot for all menu/toolbar actions
411 //=======================================================================
412 void GeometryGUI::OnGUIEvent()
414 const QObject* obj = sender();
415 if ( !obj || !obj->inherits( "QAction" ) )
417 int id = actionId((QAction*)obj);
422 //=======================================================================
423 // function : GeometryGUI::OnGUIEvent()
424 // purpose : manage all events on GUI [static]
425 //=======================================================================
426 void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
428 SUIT_Application* anApp = application();
430 SUIT_Desktop* desk = anApp->desktop();
432 // check type of the active viewframe
433 SUIT_ViewWindow* window = desk->activeWindow();
434 bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
435 bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
436 // if current viewframe is not of OCC and not of VTK type - return immediately
437 // fix for IPAL8958 - allow some commands to execute even when NO viewer is active (rename for example)
438 QList<int> NotViewerDependentCommands;
439 NotViewerDependentCommands << GEOMOp::OpDelete
441 << GEOMOp::OpShowOnly
442 << GEOMOp::OpShowOnlyChildren
443 << GEOMOp::OpDiscloseChildren
444 << GEOMOp::OpConcealChildren
445 << GEOMOp::OpUnpublishObject
446 << GEOMOp::OpPublishObject
447 << GEOMOp::OpPointMarker
448 << GEOMOp::OpCreateFolder
449 << GEOMOp::OpSortChildren;
450 if ( !ViewOCC && !ViewVTK && !NotViewerDependentCommands.contains( id ) ) {
451 // activate OCC viewer
452 getApp()->getViewManager(OCCViewer_Viewer::Type(), /*create=*/true);
455 // fix for IPAL9103, point 2
456 if ( CORBA::is_nil( GetGeomGen() ) ) {
457 SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_GET_ENGINE" ), tr( "GEOM_BUT_OK" ) );
462 // find corresponding GUI library
464 case GEOMOp::OpOriginAndVectors: // MENU BASIC - ORIGIN AND BASE VECTORS
465 createOriginAndBaseVectors(); // internal operation
467 case GEOMOp::OpImport: // MENU FILE - IMPORT
468 case GEOMOp::OpExport: // MENU FILE - EXPORT
469 case GEOMOp::OpSelectVertex: // POPUP MENU - SELECT ONLY - VERTEX
470 case GEOMOp::OpSelectEdge: // POPUP MENU - SELECT ONLY - EDGE
471 case GEOMOp::OpSelectWire: // POPUP MENU - SELECT ONLY - WIRE
472 case GEOMOp::OpSelectFace: // POPUP MENU - SELECT ONLY - FACE
473 case GEOMOp::OpSelectShell: // POPUP MENU - SELECT ONLY - SHELL
474 case GEOMOp::OpSelectSolid: // POPUP MENU - SELECT ONLY - SOLID
475 case GEOMOp::OpSelectCompound: // POPUP MENU - SELECT ONLY - COMPOUND
476 case GEOMOp::OpSelectAll: // POPUP MENU - SELECT ONLY - SELECT ALL
477 case GEOMOp::OpDelete: // MENU EDIT - DELETE
478 case GEOMOp::OpCheckGeom: // MENU TOOLS - CHECK GEOMETRY
479 case GEOMOp::OpMaterialsLibrary: // MENU TOOLS - MATERIALS LIBRARY
480 case GEOMOp::OpDeflection: // POPUP MENU - DEFLECTION COEFFICIENT
481 case GEOMOp::OpColor: // POPUP MENU - COLOR
482 case GEOMOp::OpSetTexture: // POPUP MENU - SETTEXTURE
483 case GEOMOp::OpTransparency: // POPUP MENU - TRANSPARENCY
484 case GEOMOp::OpIncrTransparency: // SHORTCUT - INCREASE TRANSPARENCY
485 case GEOMOp::OpDecrTransparency: // SHORTCUT - DECREASE TRANSPARENCY
486 case GEOMOp::OpIsos: // POPUP MENU - ISOS
487 case GEOMOp::OpIncrNbIsos: // SHORTCUT - INCREASE NB ISOS
488 case GEOMOp::OpDecrNbIsos: // SHORTCUT - DECREASE NB ISOS
489 case GEOMOp::OpAutoColor: // POPUP MENU - AUTO COLOR
490 case GEOMOp::OpNoAutoColor: // POPUP MENU - DISABLE AUTO COLOR
491 case GEOMOp::OpDiscloseChildren: // POPUP MENU - DISCLOSE CHILD ITEMS
492 case GEOMOp::OpConcealChildren: // POPUP MENU - CONCEAL CHILD ITEMS
493 case GEOMOp::OpUnpublishObject: // POPUP MENU - UNPUBLISH
494 case GEOMOp::OpPublishObject: // ROOT GEOM OBJECT - POPUP MENU - PUBLISH
495 case GEOMOp::OpPointMarker: // POPUP MENU - POINT MARKER
496 case GEOMOp::OpMaterialProperties: // POPUP MENU - MATERIAL PROPERTIES
497 case GEOMOp::OpPredefMaterial: // POPUP MENU - <SOME MATERIAL>
498 case GEOMOp::OpPredefMaterCustom: // POPUP MENU - MATERIAL PROPERTIES - CUSTOM...
499 case GEOMOp::OpEdgeWidth: // POPUP MENU - LINE WIDTH - EDGE WIDTH
500 case GEOMOp::OpIsosWidth: // POPUP MENU - LINE WIDTH - ISOS WIDTH
501 case GEOMOp::OpBringToFront: // POPUP MENU - BRING TO FRONT
502 case GEOMOp::OpClsBringToFront: //
503 case GEOMOp::OpCreateFolder: // POPUP MENU - CREATE FOLDER
504 case GEOMOp::OpSortChildren: // POPUP MENU - SORT CHILD ITEMS
505 libName = "GEOMToolsGUI";
507 case GEOMOp::OpDMWireframe: // MENU VIEW - WIREFRAME
508 case GEOMOp::OpDMShading: // MENU VIEW - SHADING
509 case GEOMOp::OpDMShadingWithEdges: // MENU VIEW - SHADING
510 case GEOMOp::OpDMTexture: // MENU VIEW - TEXTURE
511 case GEOMOp::OpShowAll: // MENU VIEW - SHOW ALL
512 case GEOMOp::OpShowOnly: // MENU VIEW - DISPLAY ONLY
513 case GEOMOp::OpShowOnlyChildren: // MENU VIEW - SHOW ONLY CHILDREN
514 case GEOMOp::OpHideAll: // MENU VIEW - ERASE ALL
515 case GEOMOp::OpHide: // MENU VIEW - ERASE
516 case GEOMOp::OpShow: // MENU VIEW - DISPLAY
517 case GEOMOp::OpSwitchVectors: // MENU VIEW - VECTOR MODE
518 case GEOMOp::OpWireframe: // POPUP MENU - WIREFRAME
519 case GEOMOp::OpShading: // POPUP MENU - SHADING
520 case GEOMOp::OpShadingWithEdges: // POPUP MENU - SHADING WITH EDGES
521 case GEOMOp::OpTexture: // POPUP MENU - TEXTURE
522 case GEOMOp::OpVectors: // POPUP MENU - VECTORS
523 libName = "DisplayGUI";
525 case GEOMOp::OpPoint: // MENU BASIC - POINT
526 case GEOMOp::OpLine: // MENU BASIC - LINE
527 case GEOMOp::OpCircle: // MENU BASIC - CIRCLE
528 case GEOMOp::OpEllipse: // MENU BASIC - ELLIPSE
529 case GEOMOp::OpArc: // MENU BASIC - ARC
530 case GEOMOp::OpVector: // MENU BASIC - VECTOR
531 case GEOMOp::OpPlane: // MENU BASIC - PLANE
532 case GEOMOp::OpCurve: // MENU BASIC - CURVE
533 case GEOMOp::OpLCS: // MENU BASIC - LOCAL COORDINATE SYSTEM
534 libName = "BasicGUI";
536 case GEOMOp::OpBox: // MENU PRIMITIVE - BOX
537 case GEOMOp::OpCylinder: // MENU PRIMITIVE - CYLINDER
538 case GEOMOp::OpSphere: // MENU PRIMITIVE - SPHERE
539 case GEOMOp::OpTorus: // MENU PRIMITIVE - TORUS
540 case GEOMOp::OpCone: // MENU PRIMITIVE - CONE
541 case GEOMOp::OpRectangle: // MENU PRIMITIVE - FACE
542 case GEOMOp::OpDisk: // MENU PRIMITIVE - DISK
543 libName = "PrimitiveGUI";
545 case GEOMOp::OpPrism: // MENU GENERATION - PRISM
546 case GEOMOp::OpRevolution: // MENU GENERATION - REVOLUTION
547 case GEOMOp::OpFilling: // MENU GENERATION - FILLING
548 case GEOMOp::OpPipe: // MENU GENERATION - PIPE
549 case GEOMOp::OpPipePath: // MENU GENERATION - RESTORE PATH
550 libName = "GenerationGUI";
552 case GEOMOp::Op2dSketcher: // MENU ENTITY - SKETCHER
553 case GEOMOp::Op3dSketcher: // MENU ENTITY - 3D SKETCHER
554 case GEOMOp::OpIsoline: // MENU BASIC - ISOLINE
555 case GEOMOp::OpExplode: // MENU ENTITY - EXPLODE
557 case GEOMOp::OpFeatureDetect: // MENU ENTITY - FEATURE DETECTION
559 case GEOMOp::OpPictureImport: // MENU ENTITY - IMPORT PICTURE IN VIEWER
560 case GEOMOp::OpCreateField: // MENU FIELD - CREATE FIELD
561 case GEOMOp::OpEditField: // MENU FIELD - EDIT FIELD
562 case GEOMOp::OpEditFieldPopup: // POPUP MENU - EDIT FIELD
563 libName = "EntityGUI";
565 case GEOMOp::OpEdge: // MENU BUILD - EDGE
566 case GEOMOp::OpWire: // MENU BUILD - WIRE
567 case GEOMOp::OpFace: // MENU BUILD - FACE
568 case GEOMOp::OpShell: // MENU BUILD - SHELL
569 case GEOMOp::OpSolid: // MENU BUILD - SOLID
570 case GEOMOp::OpCompound: // MENU BUILD - COMPUND
571 libName = "BuildGUI";
573 case GEOMOp::OpFuse: // MENU BOOLEAN - FUSE
574 case GEOMOp::OpCommon: // MENU BOOLEAN - COMMON
575 case GEOMOp::OpCut: // MENU BOOLEAN - CUT
576 case GEOMOp::OpSection: // MENU BOOLEAN - SECTION
577 libName = "BooleanGUI";
579 case GEOMOp::OpTranslate: // MENU TRANSFORMATION - TRANSLATION
580 case GEOMOp::OpRotate: // MENU TRANSFORMATION - ROTATION
581 case GEOMOp::OpChangeLoc: // MENU TRANSFORMATION - LOCATION
582 case GEOMOp::OpMirror: // MENU TRANSFORMATION - MIRROR
583 case GEOMOp::OpScale: // MENU TRANSFORMATION - SCALE
584 case GEOMOp::OpOffset: // MENU TRANSFORMATION - OFFSET
585 case GEOMOp::OpProjection: // MENU TRANSFORMATION - PROJECTION
586 case GEOMOp::OpMultiTranslate: // MENU TRANSFORMATION - MULTI-TRANSLATION
587 case GEOMOp::OpMultiRotate: // MENU TRANSFORMATION - MULTI-ROTATION
588 case GEOMOp::OpReimport: // CONTEXT(POPUP) MENU - RELOAD_IMPORTED
589 libName = "TransformationGUI";
591 case GEOMOp::OpPartition: // MENU OPERATION - PARTITION
592 case GEOMOp::OpArchimede: // MENU OPERATION - ARCHIMEDE
593 case GEOMOp::OpFillet3d: // MENU OPERATION - FILLET
594 case GEOMOp::OpChamfer: // MENU OPERATION - CHAMFER
595 case GEOMOp::OpClipping: // MENU OPERATION - CLIPPING RANGE
596 case GEOMOp::OpShapesOnShape: // MENU OPERATION - GET SHAPES ON SHAPE
597 case GEOMOp::OpFillet2d: // MENU OPERATION - FILLET 2D
598 case GEOMOp::OpFillet1d: // MENU OPERATION - FILLET 1D
599 case GEOMOp::OpSharedShapes: // MENU OPERATION - GET SHARED SHAPES
600 case GEOMOp::OpExtrudedBoss: // MENU OPERATION - EXTRUDED BOSS
601 case GEOMOp::OpExtrudedCut: // MENU OPERATION - EXTRUDED CUT
602 #ifdef DEBUG_CURVE_CREATOR
603 // for debug purposes, to be removed
604 case GEOMOp::OpCurveCreator: // MENU OPERATION - CURVE CREATOR
606 libName = "OperationGUI";
608 case GEOMOp::OpSewing: // MENU REPAIR - SEWING
609 case GEOMOp::OpSuppressFaces: // MENU REPAIR - SUPPRESS FACES
610 case GEOMOp::OpSuppressHoles: // MENU REPAIR - SUPPRESS HOLE
611 case GEOMOp::OpShapeProcess: // MENU REPAIR - SHAPE PROCESSING
612 case GEOMOp::OpCloseContour: // MENU REPAIR - CLOSE CONTOUR
613 case GEOMOp::OpRemoveIntWires: // MENU REPAIR - REMOVE INTERNAL WIRES
614 case GEOMOp::OpAddPointOnEdge: // MENU REPAIR - ADD POINT ON EDGE
615 case GEOMOp::OpFreeBoundaries: // MENU MEASURE - FREE BOUNDARIES
616 case GEOMOp::OpFreeFaces: // MENU MEASURE - FREE FACES
617 case GEOMOp::OpOrientation: // MENU REPAIR - CHANGE ORIENTATION
618 case GEOMOp::OpGlueFaces: // MENU REPAIR - GLUE FACES
619 case GEOMOp::OpGlueEdges: // MENU REPAIR - GLUE EDGES
620 case GEOMOp::OpLimitTolerance: // MENU REPAIR - LIMIT TOLERANCE
621 case GEOMOp::OpRemoveWebs: // MENU REPAIR - REMOVE INTERNAL FACES
622 case GEOMOp::OpRemoveExtraEdges: // MENU REPAIR - REMOVE EXTRA EDGES
623 case GEOMOp::OpFuseEdges: // MENU REPAIR - FUSE COLLINEAR EDGES
624 case GEOMOp::OpUnionFaces: // MENU REPAIR - UNION FACES
625 libName = "RepairGUI";
627 case GEOMOp::OpProperties: // MENU MEASURE - PROPERTIES
628 case GEOMOp::OpCenterMass: // MENU MEASURE - CDG
629 case GEOMOp::OpInertia: // MENU MEASURE - INERTIA
630 case GEOMOp::OpNormale: // MENU MEASURE - NORMALE
631 case GEOMOp::OpBoundingBox: // MENU MEASURE - BOUNDING BOX
632 case GEOMOp::OpMinDistance: // MENU MEASURE - MIN DISTANCE
633 case GEOMOp::OpAngle: // MENU MEASURE - ANGLE
634 case GEOMOp::OpTolerance: // MENU MEASURE - TOLERANCE
635 case GEOMOp::OpWhatIs: // MENU MEASURE - WHATIS
636 case GEOMOp::OpCheckShape: // MENU MEASURE - CHECK
637 case GEOMOp::OpCheckCompound: // MENU MEASURE - CHECK COMPOUND OF BLOCKS
638 case GEOMOp::OpGetNonBlocks: // MENU MEASURE - Get NON BLOCKS
639 case GEOMOp::OpPointCoordinates: // MENU MEASURE - POINT COORDINATES
640 case GEOMOp::OpCheckSelfInters: // MENU MEASURE - CHECK SELF INTERSECTIONS
641 case GEOMOp::OpManageDimensions: // MENU MEASURE - MANAGE DIMENSIONS
642 case GEOMOp::OpShowAllDimensions: // POPUP MENU - SHOW ALL DIMENSIONS
643 case GEOMOp::OpHideAllDimensions: // POPUP MENU - HIDE ALL DIMENSIONS
644 libName = "MeasureGUI";
646 case GEOMOp::OpGroupCreate: // MENU GROUP - CREATE
647 case GEOMOp::OpGroupCreatePopup: // POPUP MENU - CREATE GROUP
648 case GEOMOp::OpGroupEdit: // MENU GROUP - EDIT
649 case GEOMOp::OpGroupUnion: // MENU GROUP - UNION
650 case GEOMOp::OpGroupIntersect: // MENU GROUP - INTERSECT
651 case GEOMOp::OpGroupCut: // MENU GROUP - CUT
652 libName = "GroupGUI";
654 case GEOMOp::OpHexaSolid: // MENU BLOCKS - HEXAHEDRAL SOLID
655 case GEOMOp::OpMultiTransform: // MENU BLOCKS - MULTI-TRANSFORMATION
656 case GEOMOp::OpQuadFace: // MENU BLOCKS - QUADRANGLE FACE
657 case GEOMOp::OpPropagate: // MENU BLOCKS - PROPAGATE
658 case GEOMOp::OpExplodeBlock: // MENU BLOCKS - EXPLODE ON BLOCKS
659 libName = "BlocksGUI";
661 case GEOMOp::OpExportXAO: // MENU NEW ENTITY - IMPORTEXPORT - EXPORTXAO
662 case GEOMOp::OpImportXAO: // MENU NEW ENTITY - IMPORTEXPORT - IMPORTXAO
663 libName = "ImportExportGUI";
665 //case GEOMOp::OpAdvancedNoOp: // NO OPERATION (advanced operations base)
666 //case GEOMOp::OpPipeTShape: // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE
667 //case GEOMOp::OpPipeTShapeGroups: // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS
668 //case GEOMOp::OpDividedDisk: // MENU NEW ENTITY - ADVANCED - DIVIDEDDISK
669 //case GEOMOp::OpDividedCylinder: // MENU NEW ENTITY - ADVANCED - DIVIDEDCYLINDER
670 //case GEOMOp::OpSmoothingSurface: // MENU NEW ENTITY - ADVANCED - SMOOTHINGSURFACE
671 //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@//
672 //libName = "AdvancedGUI";
675 if (myPluginActions.contains(id)) {
676 libName = myPluginActions[id].first;
678 GEOMPluginGUI* library = 0;
679 if ( !libName.isEmpty() ) {
681 libName = QString( "lib" ) + libName + ".so";
683 libName = libName + ".dll";
685 library = getPluginLibrary( libName );
688 // call method of corresponding GUI library
690 //QString action ("%1");
691 //action = action.arg(id);
693 //if( !theParam.isValid() )
694 library->OnGUIEvent( myPluginActions[id].second, desk );
696 // library->OnGUIEvent( id, desk, theParam);
699 SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) );
701 updateCreationInfo();
707 GEOMGUI* library = 0;
708 if ( !libName.isEmpty() ) {
710 libName = QString( "lib" ) + libName + ".so";
712 libName = libName + ".dll";
714 library = getLibrary( libName );
717 // call method of corresponding GUI library
719 if( !theParam.isValid() )
720 library->OnGUIEvent( id, desk );
722 library->OnGUIEvent( id, desk, theParam);
725 SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) );
727 updateCreationInfo();
730 //=================================================================================
731 // function : GeometryGUI::activateOperation()
733 //=================================================================================
734 bool GeometryGUI::activateOperation( int actionId )
736 OnGUIEvent(actionId);
740 //=================================================================================
741 // function : GeometryGUI::activateOperation()
743 //=================================================================================
744 bool GeometryGUI::activateOperation( const QString& actionId )
748 int id = actionId.toInt(&isOk);
755 //=================================================================================
756 // function : GeometryGUI::activateOperation()
758 //=================================================================================
759 bool GeometryGUI::activateOperation( const QString& actionId, const QString& plugin )
763 QString pluginLib = plugin;
764 // TODO: if <plugin> is a plugin name, find plugin library name
765 if (myPluginLibs.contains(plugin))
766 pluginLib = myPluginLibs[plugin];
768 QMap<int, PluginAction>::iterator actionsIter = myPluginActions.begin();
769 for (; actionsIter != myPluginActions.end(); ++actionsIter) {
770 const PluginAction& anAction = actionsIter.value();
771 if (anAction.first == pluginLib && anAction.second == actionId) {
772 // activate operation
773 OnGUIEvent(actionsIter.key());
781 //=================================================================================
782 // function : GeometryGUI::OnKeyPress()
783 // purpose : Called when any key is pressed by user [static]
784 //=================================================================================
785 void GeometryGUI::OnKeyPress( SUIT_ViewWindow* w, QKeyEvent* e )
787 if ( !application() )
789 foreach ( GEOMGUI* lib, myGUIMap )
790 lib->OnKeyPress( e, application()->desktop(), w );
793 //=================================================================================
794 // function : GeometryGUI::OnMouseMove()
795 // purpose : Manages mouse move events [static]
796 //=================================================================================
797 void GeometryGUI::OnMouseMove( SUIT_ViewWindow* w, QMouseEvent* e )
799 if ( !application() )
801 foreach ( GEOMGUI* lib, myGUIMap )
802 lib->OnMouseMove( e, application()->desktop(), w );
805 //=================================================================================
806 // function : GeometryGUI::OnMouseRelease()
807 // purpose : Manages mouse release events [static]
808 //=================================================================================
809 void GeometryGUI::OnMouseRelease( SUIT_ViewWindow* w, QMouseEvent* e )
811 if ( !application() )
813 foreach ( GEOMGUI* lib, myGUIMap )
814 lib->OnMouseRelease( e, application()->desktop(), w );
817 //=================================================================================
818 // function : GeometryGUI::OnMousePress()
819 // purpose : Manage mouse press events [static]
820 //=================================================================================
821 void GeometryGUI::OnMousePress( SUIT_ViewWindow* w, QMouseEvent* e )
823 if ( !application() )
825 foreach ( GEOMGUI* lib, myGUIMap )
826 lib->OnMousePress( e, application()->desktop(), w );
829 //=======================================================================
830 // function : createGeomAction
832 //=======================================================================
833 void GeometryGUI::createGeomAction( const int id, const QString& label, const QString& icolabel,
834 const int accel, const bool toggle, const QString& shortcutAction )
836 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
837 QPixmap icon = icolabel.isEmpty() ? resMgr->loadPixmap( "GEOM", tr( (QString( "ICO_" )+label).toLatin1().constData() ), false )
838 : resMgr->loadPixmap( "GEOM", tr( icolabel.toLatin1().constData() ) );
840 tr( QString( "TOP_%1" ).arg( label ).toLatin1().constData() ),
842 tr( QString( "MEN_%1" ).arg( label ).toLatin1().constData() ),
843 tr( QString( "STB_%1" ).arg( label ).toLatin1().constData() ),
845 application()->desktop(),
847 this, SLOT( OnGUIEvent() ),
851 //=======================================================================
852 // function : createOriginAndBaseVectors
854 //=======================================================================
855 void GeometryGUI::createOriginAndBaseVectors()
857 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
858 bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
860 SUIT_MessageBox::warning ( application()->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
864 _PTR(Study) studyDS = appStudy->studyDS();
865 if ( studyDS && !CORBA::is_nil( GetGeomGen() ) ) {
866 GEOM::GEOM_IBasicOperations_var aBasicOperations = GetGeomGen()->GetIBasicOperations( studyDS->StudyId() );
867 if ( !aBasicOperations->_is_nil() ) {
868 SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
869 double aLength = aResourceMgr->doubleValue( "Geometry", "base_vectors_length", 1.0 );
870 GEOM::GEOM_Object_var anOrigin = aBasicOperations->MakePointXYZ( 0.0, 0.0, 0.0 );
871 GEOM::GEOM_Object_var anOX = aBasicOperations->MakeVectorDXDYDZ( aLength, 0.0, 0.0 );
872 GEOM::GEOM_Object_var anOY = aBasicOperations->MakeVectorDXDYDZ( 0.0, aLength, 0.0 );
873 GEOM::GEOM_Object_var anOZ = aBasicOperations->MakeVectorDXDYDZ( 0.0, 0.0, aLength );
875 SALOMEDS::Study_var aDSStudy = ClientStudyToStudy( studyDS );
876 GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOrigin, "O" );
877 GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOX, "OX" );
878 GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOY, "OY" );
879 GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOZ, "OZ" );
881 getApp()->updateObjectBrowser( true );
887 //=======================================================================
888 // function : GeometryGUI::initialize()
889 // purpose : Called when GEOM module is created
890 //=======================================================================
891 void GeometryGUI::initialize( CAM_Application* app )
893 SalomeApp_Module::initialize( app );
895 // ----- create actions --------------
897 createGeomAction( GEOMOp::OpImport, "IMPORT", "", Qt::ControlModifier + Qt::Key_I );
898 createGeomAction( GEOMOp::OpExport, "EXPORT", "", Qt::ControlModifier + Qt::Key_E );
900 createGeomAction( GEOMOp::OpDelete, "DELETE", "", Qt::Key_Delete );
902 createGeomAction( GEOMOp::OpPoint, "POINT" );
903 createGeomAction( GEOMOp::OpLine, "LINE" );
904 createGeomAction( GEOMOp::OpCircle, "CIRCLE" );
905 createGeomAction( GEOMOp::OpEllipse, "ELLIPSE" );
906 createGeomAction( GEOMOp::OpArc, "ARC" );
907 createGeomAction( GEOMOp::OpCurve, "CURVE" );
908 createGeomAction( GEOMOp::OpIsoline, "ISOLINE" );
909 createGeomAction( GEOMOp::OpVector, "VECTOR" );
910 createGeomAction( GEOMOp::OpPlane, "PLANE" );
911 createGeomAction( GEOMOp::OpLCS, "LOCAL_CS" );
912 createGeomAction( GEOMOp::OpOriginAndVectors, "ORIGIN_AND_VECTORS" );
914 createGeomAction( GEOMOp::OpBox, "BOX" );
915 createGeomAction( GEOMOp::OpCylinder, "CYLINDER" );
916 createGeomAction( GEOMOp::OpSphere, "SPHERE" );
917 createGeomAction( GEOMOp::OpTorus, "TORUS" );
918 createGeomAction( GEOMOp::OpCone, "CONE" );
919 createGeomAction( GEOMOp::OpRectangle, "RECTANGLE" );
920 createGeomAction( GEOMOp::OpDisk, "DISK" );
922 createGeomAction( GEOMOp::OpPrism, "EXTRUSION" );
923 createGeomAction( GEOMOp::OpRevolution, "REVOLUTION" );
924 createGeomAction( GEOMOp::OpFilling, "FILLING" );
925 createGeomAction( GEOMOp::OpPipe, "PIPE" );
926 createGeomAction( GEOMOp::OpPipePath, "PIPE_PATH" );
928 createGeomAction( GEOMOp::OpGroupCreate, "GROUP_CREATE" );
929 createGeomAction( GEOMOp::OpGroupEdit, "GROUP_EDIT" );
930 createGeomAction( GEOMOp::OpGroupUnion, "GROUP_UNION" );
931 createGeomAction( GEOMOp::OpGroupIntersect, "GROUP_INTERSECT" );
932 createGeomAction( GEOMOp::OpGroupCut, "GROUP_CUT" );
934 createGeomAction( GEOMOp::OpCreateField, "FIELD_CREATE" );
935 createGeomAction( GEOMOp::OpEditField, "FIELD_EDIT" );
937 createGeomAction( GEOMOp::OpReimport, "RELOAD_IMPORTED" );
939 createGeomAction( GEOMOp::OpQuadFace, "Q_FACE" );
940 createGeomAction( GEOMOp::OpHexaSolid, "HEX_SOLID" );
942 createGeomAction( GEOMOp::Op2dSketcher, "SKETCH" );
943 createGeomAction( GEOMOp::Op3dSketcher, "3DSKETCH" );
944 createGeomAction( GEOMOp::OpIsoline, "ISOLINE" );
945 createGeomAction( GEOMOp::OpExplode, "EXPLODE" );
947 createGeomAction( GEOMOp::OpFeatureDetect,"FEATURE_DETECTION" );
949 createGeomAction( GEOMOp::OpPictureImport,"PICTURE_IMPORT" );
951 createGeomAction( GEOMOp::OpEdge, "EDGE" );
952 createGeomAction( GEOMOp::OpWire, "WIRE" );
953 createGeomAction( GEOMOp::OpFace, "FACE" );
954 createGeomAction( GEOMOp::OpShell, "SHELL" );
955 createGeomAction( GEOMOp::OpSolid, "SOLID" );
956 createGeomAction( GEOMOp::OpCompound, "COMPOUND" );
958 createGeomAction( GEOMOp::OpFuse, "FUSE" );
959 createGeomAction( GEOMOp::OpCommon, "COMMON" );
960 createGeomAction( GEOMOp::OpCut, "CUT" );
961 createGeomAction( GEOMOp::OpSection, "SECTION" );
963 createGeomAction( GEOMOp::OpTranslate, "TRANSLATION" );
964 createGeomAction( GEOMOp::OpRotate, "ROTATION" );
965 createGeomAction( GEOMOp::OpChangeLoc, "MODIFY_LOCATION" );
966 createGeomAction( GEOMOp::OpMirror, "MIRROR" );
967 createGeomAction( GEOMOp::OpScale, "SCALE" );
968 createGeomAction( GEOMOp::OpOffset, "OFFSET" );
969 createGeomAction( GEOMOp::OpProjection, "PROJECTION" );
970 createGeomAction( GEOMOp::OpMultiTranslate, "MUL_TRANSLATION" );
971 createGeomAction( GEOMOp::OpMultiRotate, "MUL_ROTATION" );
973 createGeomAction( GEOMOp::OpPartition, "PARTITION" );
974 createGeomAction( GEOMOp::OpArchimede, "ARCHIMEDE" );
975 createGeomAction( GEOMOp::OpFillet3d, "FILLET" );
976 createGeomAction( GEOMOp::OpChamfer, "CHAMFER" );
977 //createGeomAction( GEOMOp::OpClipping, "CLIPPING" );
978 createGeomAction( GEOMOp::OpShapesOnShape, "GET_SHAPES_ON_SHAPE" );
979 createGeomAction( GEOMOp::OpSharedShapes, "GET_SHARED_SHAPES" );
980 createGeomAction( GEOMOp::OpExtrudedCut, "EXTRUDED_CUT" );
981 createGeomAction( GEOMOp::OpExtrudedBoss, "EXTRUDED_BOSS" );
982 #ifdef DEBUG_CURVE_CREATOR
983 // for debug purposes, to be removed
984 createGeomAction( GEOMOp::OpCurveCreator, "CURVE_CREATOR" );
986 createGeomAction( GEOMOp::OpFillet1d, "FILLET_1D" );
987 createGeomAction( GEOMOp::OpFillet2d, "FILLET_2D" );
989 createGeomAction( GEOMOp::OpMultiTransform, "MUL_TRANSFORM" );
990 createGeomAction( GEOMOp::OpExplodeBlock, "EXPLODE_BLOCKS" );
991 createGeomAction( GEOMOp::OpPropagate, "PROPAGATE" );
993 createGeomAction( GEOMOp::OpSewing, "SEWING" );
994 createGeomAction( GEOMOp::OpGlueFaces, "GLUE_FACES" );
995 createGeomAction( GEOMOp::OpGlueEdges, "GLUE_EDGES" );
996 createGeomAction( GEOMOp::OpLimitTolerance, "LIMIT_TOLERANCE" );
997 createGeomAction( GEOMOp::OpSuppressFaces, "SUPPRESS_FACES" );
998 createGeomAction( GEOMOp::OpSuppressHoles, "SUPPERSS_HOLES" );
999 createGeomAction( GEOMOp::OpShapeProcess, "SHAPE_PROCESS" );
1000 createGeomAction( GEOMOp::OpCloseContour, "CLOSE_CONTOUR" );
1001 createGeomAction( GEOMOp::OpRemoveIntWires, "SUPPRESS_INT_WIRES" );
1002 createGeomAction( GEOMOp::OpAddPointOnEdge, "POINT_ON_EDGE" );
1003 createGeomAction( GEOMOp::OpFreeBoundaries, "CHECK_FREE_BNDS" );
1004 createGeomAction( GEOMOp::OpFreeFaces, "CHECK_FREE_FACES" );
1005 createGeomAction( GEOMOp::OpOrientation, "CHANGE_ORIENTATION" );
1006 createGeomAction( GEOMOp::OpRemoveWebs, "REMOVE_WEBS" );
1007 createGeomAction( GEOMOp::OpRemoveExtraEdges, "REMOVE_EXTRA_EDGES" );
1008 createGeomAction( GEOMOp::OpFuseEdges, "FUSE_EDGES" );
1009 createGeomAction( GEOMOp::OpUnionFaces, "UNION_FACES" );
1011 createGeomAction( GEOMOp::OpPointCoordinates, "POINT_COORDS" );
1012 createGeomAction( GEOMOp::OpProperties, "BASIC_PROPS" );
1013 createGeomAction( GEOMOp::OpCenterMass, "MASS_CENTER" );
1014 createGeomAction( GEOMOp::OpInertia, "INERTIA" );
1015 createGeomAction( GEOMOp::OpNormale, "NORMALE" );
1016 createGeomAction( GEOMOp::OpBoundingBox, "BND_BOX" );
1017 createGeomAction( GEOMOp::OpMinDistance, "MIN_DIST" );
1018 createGeomAction( GEOMOp::OpAngle, "MEASURE_ANGLE" );
1019 createGeomAction( GEOMOp::OpManageDimensions, "MANAGE_DIMENSIONS" );
1021 createGeomAction( GEOMOp::OpTolerance, "TOLERANCE" );
1022 createGeomAction( GEOMOp::OpWhatIs, "WHAT_IS" );
1023 createGeomAction( GEOMOp::OpCheckShape, "CHECK" );
1024 createGeomAction( GEOMOp::OpCheckCompound, "CHECK_COMPOUND" );
1025 createGeomAction( GEOMOp::OpGetNonBlocks, "GET_NON_BLOCKS" );
1026 createGeomAction( GEOMOp::OpCheckSelfInters, "CHECK_SELF_INTERSECTIONS" );
1028 #ifdef _DEBUG_ // PAL16821
1029 createGeomAction( GEOMOp::OpCheckGeom, "CHECK_GEOMETRY" );
1032 createGeomAction( GEOMOp::OpMaterialsLibrary, "MATERIALS_LIBRARY" );
1033 createGeomAction( GEOMOp::OpDMWireframe, "WIREFRAME" );
1034 createGeomAction( GEOMOp::OpDMShading, "SHADING" );
1035 createGeomAction( GEOMOp::OpDMShadingWithEdges, "SHADING_WITH_EDGES" );
1036 createGeomAction( GEOMOp::OpDMTexture, "TEXTURE" );
1037 createGeomAction( GEOMOp::OpShowAll, "DISPLAY_ALL" );
1038 createGeomAction( GEOMOp::OpHideAll, "ERASE_ALL" );
1039 createGeomAction( GEOMOp::OpShow, "DISPLAY" );
1040 createGeomAction( GEOMOp::OpSwitchVectors, "VECTOR_MODE");
1041 createGeomAction( GEOMOp::OpSelectVertex, "VERTEX_SEL_ONLY" ,"", 0, true );
1042 createGeomAction( GEOMOp::OpSelectEdge, "EDGE_SEL_ONLY", "", 0, true );
1043 createGeomAction( GEOMOp::OpSelectWire, "WIRE_SEL_ONLY", "", 0, true );
1044 createGeomAction( GEOMOp::OpSelectFace, "FACE_SEL_ONLY", "", 0, true );
1045 createGeomAction( GEOMOp::OpSelectShell, "SHELL_SEL_ONLY", "", 0, true );
1046 createGeomAction( GEOMOp::OpSelectSolid, "SOLID_SEL_ONLY", "", 0, true );
1047 createGeomAction( GEOMOp::OpSelectCompound, "COMPOUND_SEL_ONLY", "", 0, true );
1048 createGeomAction( GEOMOp::OpSelectAll, "ALL_SEL_ONLY", "", 0, true );
1049 createGeomAction( GEOMOp::OpShowOnly, "DISPLAY_ONLY" );
1050 createGeomAction( GEOMOp::OpShowOnlyChildren, "SHOW_ONLY_CHILDREN" );
1051 createGeomAction( GEOMOp::OpBringToFront, "BRING_TO_FRONT", "", 0, true );
1052 createGeomAction( GEOMOp::OpClsBringToFront, "CLS_BRING_TO_FRONT" );
1053 createGeomAction( GEOMOp::OpHide, "ERASE" );
1055 createGeomAction( GEOMOp::OpWireframe, "POP_WIREFRAME", "", 0, true );
1056 createGeomAction( GEOMOp::OpShading, "POP_SHADING", "", 0, true );
1057 createGeomAction( GEOMOp::OpShadingWithEdges, "POP_SHADING_WITH_EDGES", "", 0, true );
1058 createGeomAction( GEOMOp::OpTexture, "POP_TEXTURE", "", 0, true );
1059 createGeomAction( GEOMOp::OpEdgeWidth, "EDGE_WIDTH");
1060 createGeomAction( GEOMOp::OpIsosWidth, "ISOS_WIDTH");
1061 createGeomAction( GEOMOp::OpVectors, "POP_VECTORS", "", 0, true );
1062 createGeomAction( GEOMOp::OpDeflection, "POP_DEFLECTION" );
1063 createGeomAction( GEOMOp::OpColor, "POP_COLOR" );
1064 createGeomAction( GEOMOp::OpSetTexture, "POP_SETTEXTURE" );
1065 createGeomAction( GEOMOp::OpTransparency, "POP_TRANSPARENCY" );
1066 createGeomAction( GEOMOp::OpIsos, "POP_ISOS" );
1067 createGeomAction( GEOMOp::OpAutoColor, "POP_AUTO_COLOR" );
1068 createGeomAction( GEOMOp::OpNoAutoColor, "POP_DISABLE_AUTO_COLOR" );
1069 createGeomAction( GEOMOp::OpGroupCreatePopup, "POP_CREATE_GROUP" );
1070 createGeomAction( GEOMOp::OpEditFieldPopup, "POP_EDIT_FIELD" );
1071 createGeomAction( GEOMOp::OpDiscloseChildren, "POP_DISCLOSE_CHILDREN" );
1072 createGeomAction( GEOMOp::OpConcealChildren, "POP_CONCEAL_CHILDREN" );
1073 createGeomAction( GEOMOp::OpUnpublishObject, "POP_UNPUBLISH_OBJ" );
1074 createGeomAction( GEOMOp::OpPublishObject, "POP_PUBLISH_OBJ" );
1075 createGeomAction( GEOMOp::OpPointMarker, "POP_POINT_MARKER" );
1076 createGeomAction( GEOMOp::OpMaterialProperties, "POP_MATERIAL_PROPERTIES" );
1077 createGeomAction( GEOMOp::OpPredefMaterCustom, "POP_PREDEF_MATER_CUSTOM" );
1078 createGeomAction( GEOMOp::OpCreateFolder, "POP_CREATE_FOLDER" );
1079 createGeomAction( GEOMOp::OpSortChildren, "POP_SORT_CHILD_ITEMS" );
1080 createGeomAction( GEOMOp::OpShowAllDimensions, "POP_SHOW_ALL_DIMENSIONS" );
1081 createGeomAction( GEOMOp::OpHideAllDimensions, "POP_HIDE_ALL_DIMENSIONS" );
1083 // Create actions for increase/decrease transparency shortcuts
1084 createGeomAction( GEOMOp::OpIncrTransparency, "", "", 0, false,
1085 "Geometry:Increase transparency");
1086 createGeomAction( GEOMOp::OpDecrTransparency, "", "", 0, false,
1087 "Geometry:Decrease transparency");
1089 // Create actions for increase/decrease number of isolines
1090 createGeomAction( GEOMOp::OpIncrNbIsos, "", "", 0, false,
1091 "Geometry:Increase number of isolines");
1092 createGeomAction( GEOMOp::OpDecrNbIsos, "", "", 0, false,
1093 "Geometry:Decrease number of isolines");
1095 // Import/Export XAO
1096 createGeomAction( GEOMOp::OpExportXAO, "EXPORTXAO" );
1097 createGeomAction( GEOMOp::OpImportXAO, "IMPORTXAO" );
1099 //createGeomAction( GEOMOp::OpPipeTShape, "PIPETSHAPE" );
1100 //createGeomAction( GEOMOp::OpDividedDisk, "DIVIDEDDISK" );
1101 //createGeomAction( GEOMOp::OpDividedCylinder, "DIVIDEDCYLINDER" );
1102 //createGeomAction( GEOMOp::OpSmoothingSurface, "SMOOTHINGSURFACE" );
1103 //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@//
1105 // ---- create menus --------------------------
1107 int fileId = createMenu( tr( "MEN_FILE" ), -1, -1 );
1108 createMenu( separator(), fileId, 10 );
1109 createMenu( GEOMOp::OpImport, fileId, 10 );
1110 createMenu( GEOMOp::OpExport, fileId, 10 );
1111 int impexpId = createMenu( tr( "MEN_IMPORTEXPORT" ), fileId, -1, 10 );
1112 createMenu( GEOMOp::OpExportXAO, impexpId, -1 );
1113 createMenu( GEOMOp::OpImportXAO, impexpId, -1 );
1114 createMenu( separator(), fileId, -1 );
1116 int editId = createMenu( tr( "MEN_EDIT" ), -1, -1 );
1117 createMenu( GEOMOp::OpDelete, editId, -1 );
1119 int newEntId = createMenu( tr( "MEN_NEW_ENTITY" ), -1, -1, 10 );
1121 int basicId = createMenu( tr( "MEN_BASIC" ), newEntId, -1 );
1122 createMenu( GEOMOp::OpPoint, basicId, -1 );
1123 createMenu( GEOMOp::OpLine, basicId, -1 );
1124 createMenu( GEOMOp::OpCircle, basicId, -1 );
1125 createMenu( GEOMOp::OpEllipse, basicId, -1 );
1126 createMenu( GEOMOp::OpArc, basicId, -1 );
1127 createMenu( GEOMOp::OpCurve, basicId, -1 );
1128 createMenu( GEOMOp::Op2dSketcher, basicId, -1 );
1129 createMenu( GEOMOp::Op3dSketcher, basicId, -1 );
1130 createMenu( GEOMOp::OpIsoline, basicId, -1 );
1131 createMenu( separator(), basicId, -1 );
1132 createMenu( GEOMOp::OpVector, basicId, -1 );
1133 createMenu( GEOMOp::OpPlane, basicId, -1 );
1134 createMenu( GEOMOp::OpLCS, basicId, -1 );
1135 createMenu( GEOMOp::OpOriginAndVectors, basicId, -1 );
1137 int primId = createMenu( tr( "MEN_PRIMITIVES" ), newEntId, -1 );
1138 createMenu( GEOMOp::OpBox, primId, -1 );
1139 createMenu( GEOMOp::OpCylinder, primId, -1 );
1140 createMenu( GEOMOp::OpSphere, primId, -1 );
1141 createMenu( GEOMOp::OpTorus, primId, -1 );
1142 createMenu( GEOMOp::OpCone, primId, -1 );
1143 createMenu( GEOMOp::OpRectangle, primId, -1 );
1144 createMenu( GEOMOp::OpDisk, primId, -1 );
1145 //createMenu( GEOMOp::OpPipeTShape,primId, -1 );
1147 int genId = createMenu( tr( "MEN_GENERATION" ), newEntId, -1 );
1148 createMenu( GEOMOp::OpPrism, genId, -1 );
1149 createMenu( GEOMOp::OpRevolution, genId, -1 );
1150 createMenu( GEOMOp::OpFilling, genId, -1 );
1151 createMenu( GEOMOp::OpPipe, genId, -1 );
1152 #if OCC_VERSION_LARGE > 0x06050300
1153 createMenu( GEOMOp::OpPipePath, genId, -1 );
1156 //int advId = createMenu( tr( "MEN_ADVANCED" ), newEntId, -1 );
1157 //createMenu( GEOMOp::OpSmoothingSurface, advId, -1 );
1158 //@@ 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 @@//
1160 createMenu( separator(), newEntId, -1 );
1162 int groupId = createMenu( tr( "MEN_GROUP" ), newEntId, -1 );
1163 createMenu( GEOMOp::OpGroupCreate, groupId, -1 );
1164 createMenu( GEOMOp::OpGroupEdit, groupId, -1 );
1165 createMenu( GEOMOp::OpGroupUnion, groupId, -1 );
1166 createMenu( GEOMOp::OpGroupIntersect, groupId, -1 );
1167 createMenu( GEOMOp::OpGroupCut, groupId, -1 );
1169 createMenu( separator(), newEntId, -1 );
1171 int fieldId = createMenu( tr( "MEN_FIELD" ), newEntId, -1 );
1172 createMenu( GEOMOp::OpCreateField, fieldId, -1 );
1173 createMenu( GEOMOp::OpEditField, fieldId, -1 );
1175 createMenu( separator(), newEntId, -1 );
1177 int blocksId = createMenu( tr( "MEN_BLOCKS" ), newEntId, -1 );
1178 createMenu( GEOMOp::OpQuadFace, blocksId, -1 );
1179 createMenu( GEOMOp::OpHexaSolid, blocksId, -1 );
1180 //createMenu( GEOMOp::OpDividedDisk, blocksId, -1 );
1181 //createMenu( GEOMOp::OpDividedCylinder, blocksId, -1 );
1183 createMenu( separator(), newEntId, -1 );
1185 createMenu( GEOMOp::OpExplode, newEntId, -1 );
1187 int buildId = createMenu( tr( "MEN_BUILD" ), newEntId, -1 );
1188 createMenu( GEOMOp::OpEdge, buildId, -1 );
1189 createMenu( GEOMOp::OpWire, buildId, -1 );
1190 createMenu( GEOMOp::OpFace, buildId, -1 );
1191 createMenu( GEOMOp::OpShell, buildId, -1 );
1192 createMenu( GEOMOp::OpSolid, buildId, -1 );
1193 createMenu( GEOMOp::OpCompound, buildId, -1 );
1195 createMenu( separator(), newEntId, -1 );
1197 createMenu( GEOMOp::OpPictureImport, newEntId, -1 );
1199 createMenu( GEOMOp::OpFeatureDetect, newEntId, -1 );
1202 int operId = createMenu( tr( "MEN_OPERATIONS" ), -1, -1, 10 );
1204 int boolId = createMenu( tr( "MEN_BOOLEAN" ), operId, -1 );
1205 createMenu( GEOMOp::OpFuse, boolId, -1 );
1206 createMenu( GEOMOp::OpCommon, boolId, -1 );
1207 createMenu( GEOMOp::OpCut, boolId, -1 );
1208 createMenu( GEOMOp::OpSection, boolId, -1 );
1210 int transId = createMenu( tr( "MEN_TRANSFORMATION" ), operId, -1 );
1211 createMenu( GEOMOp::OpTranslate, transId, -1 );
1212 createMenu( GEOMOp::OpRotate, transId, -1 );
1213 createMenu( GEOMOp::OpChangeLoc, transId, -1 );
1214 createMenu( GEOMOp::OpMirror, transId, -1 );
1215 createMenu( GEOMOp::OpScale, transId, -1 );
1216 createMenu( GEOMOp::OpOffset, transId, -1 );
1217 createMenu( GEOMOp::OpProjection, transId, -1 );
1218 createMenu( separator(), transId, -1 );
1219 createMenu( GEOMOp::OpMultiTranslate, transId, -1 );
1220 createMenu( GEOMOp::OpMultiRotate, transId, -1 );
1222 int blockId = createMenu( tr( "MEN_BLOCKS" ), operId, -1 );
1223 createMenu( GEOMOp::OpMultiTransform, blockId, -1 );
1224 createMenu( GEOMOp::OpExplodeBlock, blockId, -1 );
1225 createMenu( GEOMOp::OpPropagate, blockId, -1 );
1227 createMenu( separator(), operId, -1 );
1229 createMenu( GEOMOp::OpPartition, operId, -1 );
1230 createMenu( GEOMOp::OpArchimede, operId, -1 );
1231 createMenu( GEOMOp::OpShapesOnShape, operId, -1 );
1232 createMenu( GEOMOp::OpSharedShapes, operId, -1 );
1234 createMenu( separator(), operId, -1 );
1236 createMenu( GEOMOp::OpFillet1d, operId, -1 );
1237 createMenu( GEOMOp::OpFillet2d, operId, -1 );
1238 createMenu( GEOMOp::OpFillet3d, operId, -1 );
1239 createMenu( GEOMOp::OpChamfer, operId, -1 );
1240 createMenu( GEOMOp::OpExtrudedBoss, operId, -1 );
1241 createMenu( GEOMOp::OpExtrudedCut, operId, -1 );
1242 #ifdef DEBUG_CURVE_CREATOR
1243 // for debug purposes, to be removed
1244 createMenu( separator(), operId, -1 );
1245 createMenu( GEOMOp::OpCurveCreator, operId, -1 );
1247 //createMenu( GEOMOp::OpClipping, operId, -1 );
1249 int repairId = createMenu( tr( "MEN_REPAIR" ), -1, -1, 10 );
1250 createMenu( GEOMOp::OpShapeProcess, repairId, -1 );
1251 createMenu( GEOMOp::OpSuppressFaces, repairId, -1 );
1252 createMenu( GEOMOp::OpCloseContour, repairId, -1 );
1253 createMenu( GEOMOp::OpRemoveIntWires, repairId, -1 );
1254 createMenu( GEOMOp::OpSuppressHoles, repairId, -1 );
1255 createMenu( GEOMOp::OpSewing, repairId, -1 );
1256 createMenu( GEOMOp::OpGlueFaces, repairId, -1 );
1257 createMenu( GEOMOp::OpGlueEdges, repairId, -1 );
1258 createMenu( GEOMOp::OpLimitTolerance, repairId, -1 );
1259 createMenu( GEOMOp::OpAddPointOnEdge, repairId, -1 );
1260 //createMenu( GEOMOp::OpFreeBoundaries, repairId, -1 );
1261 //createMenu( GEOMOp::OpFreeFaces, repairId, -1 );
1262 createMenu( GEOMOp::OpOrientation, repairId, -1 );
1263 createMenu( GEOMOp::OpRemoveWebs, repairId, -1 );
1264 createMenu( GEOMOp::OpRemoveExtraEdges, repairId, -1 );
1265 createMenu( GEOMOp::OpFuseEdges, repairId, -1 );
1266 createMenu( GEOMOp::OpUnionFaces, repairId, -1 );
1268 int measurId = createMenu( tr( "MEN_MEASURES" ), -1, -1, 10 );
1269 createMenu( GEOMOp::OpPointCoordinates, measurId, -1 );
1270 createMenu( GEOMOp::OpProperties, measurId, -1 );
1271 createMenu( separator(), measurId, -1 );
1272 createMenu( GEOMOp::OpCenterMass, measurId, -1 );
1273 createMenu( GEOMOp::OpInertia, measurId, -1 );
1274 createMenu( GEOMOp::OpNormale, measurId, -1 );
1275 createMenu( separator(), measurId, -1 );
1276 createMenu( GEOMOp::OpFreeBoundaries, measurId, -1 );
1277 createMenu( GEOMOp::OpFreeFaces, measurId, -1 );
1278 createMenu( separator(), measurId, -1 );
1280 int dimId = createMenu( tr( "MEN_DIMENSIONS" ), measurId, -1 );
1281 createMenu( GEOMOp::OpBoundingBox, dimId, -1 );
1282 createMenu( GEOMOp::OpMinDistance, dimId, -1 );
1283 createMenu( GEOMOp::OpAngle, dimId, -1 );
1284 createMenu( GEOMOp::OpManageDimensions, dimId, -1 );
1286 createMenu( separator(), measurId, -1 );
1287 createMenu( GEOMOp::OpTolerance, measurId, -1 );
1288 createMenu( separator(), measurId, -1 );
1289 createMenu( GEOMOp::OpWhatIs, measurId, -1 );
1290 createMenu( GEOMOp::OpCheckShape, measurId, -1 );
1291 createMenu( GEOMOp::OpCheckCompound, measurId, -1 );
1292 createMenu( GEOMOp::OpGetNonBlocks, measurId, -1 );
1293 createMenu( GEOMOp::OpCheckSelfInters, measurId, -1 );
1295 int toolsId = createMenu( tr( "MEN_TOOLS" ), -1, -1, 50 );
1296 #if defined(_DEBUG_) || defined(_DEBUG) // PAL16821
1297 createMenu( separator(), toolsId, -1 );
1298 createMenu( GEOMOp::OpCheckGeom, toolsId, -1 );
1301 createMenu( separator(), toolsId, -1 );
1302 createMenu( GEOMOp::OpMaterialsLibrary, toolsId, -1 );
1303 createMenu( separator(), toolsId, -1 );
1305 int viewId = createMenu( tr( "MEN_VIEW" ), -1, -1 );
1306 createMenu( separator(), viewId, -1 );
1308 int dispmodeId = createMenu( tr( "MEN_DISPLAY_MODE" ), viewId, -1 );
1309 createMenu( GEOMOp::OpDMWireframe, dispmodeId, -1 );
1310 createMenu( GEOMOp::OpDMShading, dispmodeId, -1 );
1311 createMenu( GEOMOp::OpDMShadingWithEdges, dispmodeId, -1 );
1312 createMenu( GEOMOp::OpDMTexture, dispmodeId, -1 );
1313 createMenu( separator(), dispmodeId, -1 );
1314 createMenu( GEOMOp::OpSwitchVectors, dispmodeId, -1 );
1316 createMenu( separator(), viewId, -1 );
1317 createMenu( GEOMOp::OpShowAll, viewId, -1 );
1318 createMenu( GEOMOp::OpHideAll, viewId, -1 );
1319 createMenu( separator(), viewId, -1 );
1320 createMenu( GEOMOp::OpPublishObject, viewId, -1 );
1321 createMenu( separator(), viewId, -1 );
1325 because of these items are accessible through object browser and viewers
1326 we have removed they from main menu
1328 createMenu( GEOMOp::OpShow, viewId, -1 );
1329 createMenu( GEOMOp::OpShowOnly, viewId, -1 );
1330 createMenu( GEOMOp::OpHide, viewId, -1 );
1333 // ---- create toolbars --------------------------
1335 int basicTbId = createTool( tr( "TOOL_BASIC" ) );
1336 createTool( GEOMOp::OpPoint, basicTbId );
1337 createTool( GEOMOp::OpLine, basicTbId );
1338 createTool( GEOMOp::OpCircle, basicTbId );
1339 createTool( GEOMOp::OpEllipse, basicTbId );
1340 createTool( GEOMOp::OpArc, basicTbId );
1341 createTool( GEOMOp::OpCurve, basicTbId );
1342 createTool( GEOMOp::OpVector, basicTbId );
1343 createTool( GEOMOp::Op2dSketcher, basicTbId ); //rnc
1344 createTool( GEOMOp::Op3dSketcher, basicTbId ); //rnc
1345 createTool( GEOMOp::OpIsoline, basicTbId );
1346 createTool( GEOMOp::OpPlane, basicTbId );
1347 createTool( GEOMOp::OpLCS, basicTbId );
1348 createTool( GEOMOp::OpOriginAndVectors, basicTbId );
1350 // int sketchTbId = createTool( tr( "TOOL_SKETCH" ) );
1351 // createTool( GEOMOp::Op2dSketcher, sketchTbId );
1352 // createTool( GEOMOp::Op3dSketcher, sketchTbId );
1354 int primTbId = createTool( tr( "TOOL_PRIMITIVES" ) );
1355 createTool( GEOMOp::OpBox, primTbId );
1356 createTool( GEOMOp::OpCylinder, primTbId );
1357 createTool( GEOMOp::OpSphere, primTbId );
1358 createTool( GEOMOp::OpTorus, primTbId );
1359 createTool( GEOMOp::OpCone, primTbId );
1360 createTool( GEOMOp::OpRectangle, primTbId );
1361 createTool( GEOMOp::OpDisk, primTbId );
1362 //createTool( GEOMOp::OpPipeTShape, primTbId ); //rnc
1364 //int blocksTbId = createTool( tr( "TOOL_BLOCKS" ) );
1365 //createTool( GEOMOp::OpDividedDisk, blocksTbId );
1366 //createTool( GEOMOp::OpDividedCylinder, blocksTbId );
1368 int boolTbId = createTool( tr( "TOOL_BOOLEAN" ) );
1369 createTool( GEOMOp::OpFuse, boolTbId );
1370 createTool( GEOMOp::OpCommon, boolTbId );
1371 createTool( GEOMOp::OpCut, boolTbId );
1372 createTool( GEOMOp::OpSection, boolTbId );
1374 int genTbId = createTool( tr( "TOOL_GENERATION" ) );
1375 createTool( GEOMOp::OpPrism, genTbId );
1376 createTool( GEOMOp::OpRevolution, genTbId );
1377 createTool( GEOMOp::OpFilling, genTbId );
1378 createTool( GEOMOp::OpPipe, genTbId );
1379 #if OCC_VERSION_LARGE > 0x06050300
1380 createTool( GEOMOp::OpPipePath, genTbId );
1383 int transTbId = createTool( tr( "TOOL_TRANSFORMATION" ) );
1384 createTool( GEOMOp::OpTranslate, transTbId );
1385 createTool( GEOMOp::OpRotate, transTbId );
1386 createTool( GEOMOp::OpChangeLoc, transTbId );
1387 createTool( GEOMOp::OpMirror, transTbId );
1388 createTool( GEOMOp::OpScale, transTbId );
1389 createTool( GEOMOp::OpOffset, transTbId );
1390 createTool( GEOMOp::OpProjection, transTbId );
1391 createTool( separator(), transTbId );
1392 createTool( GEOMOp::OpMultiTranslate, transTbId );
1393 createTool( GEOMOp::OpMultiRotate, transTbId );
1395 int operTbId = createTool( tr( "TOOL_OPERATIONS" ) );
1396 createTool( GEOMOp::OpExplode, operTbId );
1397 createTool( GEOMOp::OpPartition, operTbId );
1398 createTool( GEOMOp::OpArchimede, operTbId );
1399 createTool( GEOMOp::OpShapesOnShape, operTbId );
1400 createTool( GEOMOp::OpSharedShapes, operTbId );
1402 int featTbId = createTool( tr( "TOOL_FEATURES" ) );
1403 createTool( GEOMOp::OpFillet1d, featTbId );
1404 createTool( GEOMOp::OpFillet2d, featTbId );
1405 createTool( GEOMOp::OpFillet3d, featTbId );
1406 createTool( GEOMOp::OpChamfer, featTbId );
1407 createTool( GEOMOp::OpExtrudedBoss, featTbId );
1408 createTool( GEOMOp::OpExtrudedCut, featTbId );
1409 #ifdef DEBUG_CURVE_CREATOR
1410 // for debug purposes, to be removed
1411 createTool( GEOMOp::OpCurveCreator, featTbId );
1414 int buildTbId = createTool( tr( "TOOL_BUILD" ) );
1415 createTool( GEOMOp::OpEdge, buildTbId );
1416 createTool( GEOMOp::OpWire, buildTbId );
1417 createTool( GEOMOp::OpFace, buildTbId );
1418 createTool( GEOMOp::OpShell, buildTbId );
1419 createTool( GEOMOp::OpSolid, buildTbId );
1420 createTool( GEOMOp::OpCompound, buildTbId );
1422 int measureTbId = createTool( tr( "TOOL_MEASURES" ) );
1423 createTool( GEOMOp::OpPointCoordinates, measureTbId );
1424 createTool( GEOMOp::OpProperties, measureTbId );
1425 createTool( GEOMOp::OpCenterMass, measureTbId );
1426 createTool( GEOMOp::OpInertia, measureTbId );
1427 createTool( GEOMOp::OpNormale, measureTbId );
1428 createTool( separator(), measureTbId );
1429 createTool( GEOMOp::OpBoundingBox, measureTbId );
1430 createTool( GEOMOp::OpMinDistance, measureTbId );
1431 createTool( GEOMOp::OpAngle, measureTbId );
1432 createTool( GEOMOp::OpTolerance , measureTbId );
1433 createTool( separator(), measureTbId );
1434 createTool( GEOMOp::OpFreeBoundaries, measureTbId );
1435 createTool( GEOMOp::OpFreeFaces, measureTbId );
1436 createTool( separator(), measureTbId );
1437 createTool( GEOMOp::OpWhatIs, measureTbId );
1438 createTool( GEOMOp::OpCheckShape, measureTbId );
1439 createTool( GEOMOp::OpCheckCompound, measureTbId );
1440 createTool( GEOMOp::OpGetNonBlocks, measureTbId );
1441 createTool( GEOMOp::OpCheckSelfInters, measureTbId );
1443 int picturesTbId = createTool( tr( "TOOL_PICTURES" ) );
1444 createTool( GEOMOp::OpPictureImport, picturesTbId );
1446 createTool( GEOMOp::OpFeatureDetect, picturesTbId );
1449 int impexpTbId = createTool( tr( "TOOL_IMPORTEXPORT" ) );
1450 createTool( GEOMOp::OpExportXAO, impexpTbId );
1451 createTool( GEOMOp::OpImportXAO, impexpTbId );
1453 //int advancedTbId = createTool( tr( "TOOL_ADVANCED" ) );
1454 //createTool( GEOMOp::OpSmoothingSurface, advancedTbId );
1455 //@@ 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 @@//
1457 // ---- create popup menus --------------------------
1459 QString clientOCCorVTK = "(client='OCCViewer' or client='VTKViewer')";
1460 QString clientOCC = "(client='OCCViewer')";
1461 QString clientOCCorVTK_AndSomeVisible = clientOCCorVTK + " and selcount>0 and isVisible";
1462 QString clientOCC_AndSomeVisible = clientOCC + " and selcount>0 and isVisible";
1464 QString clientOCCorOB = "(client='ObjectBrowser' or client='OCCViewer')";
1465 QString clientOCCorVTKorOB = "(client='ObjectBrowser' or client='OCCViewer' or client='VTKViewer')";
1466 QString clientOCCorVTKorOB_AndSomeVisible = clientOCCorVTKorOB + " and selcount>0 and isVisible";
1467 QString clientOCCorOB_AndSomeVisible = clientOCCorOB + " and selcount>0 and isVisible";
1469 QString autoColorPrefix =
1470 "(client='ObjectBrowser' or client='OCCViewer') and type='Shape' and selcount=1 and isOCC=true";
1472 QtxPopupMgr* mgr = popupMgr();
1474 mgr->insert( action( GEOMOp::OpDelete ), -1, -1 ); // delete
1475 mgr->setRule( action( GEOMOp::OpDelete ), QString("$type in {'Shape' 'Group' 'Folder' 'Field' 'FieldStep'} and selcount>0"), QtxPopupMgr::VisibleRule );
1476 mgr->insert( action( GEOMOp::OpGroupCreatePopup ), -1, -1 ); // create group
1477 mgr->setRule( action( GEOMOp::OpGroupCreatePopup ), QString("type='Shape' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1478 mgr->insert( action( GEOMOp::OpEditFieldPopup ), -1, -1 ); // edit field
1479 mgr->setRule( action( GEOMOp::OpEditFieldPopup ), QString("(type='Field' or type='FieldStep') and isOCC=true"), QtxPopupMgr::VisibleRule );
1480 mgr->insert( action( GEOMOp::OpDiscloseChildren ), -1, -1 ); // disclose child items
1481 mgr->setRule( action( GEOMOp::OpDiscloseChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasConcealedChildren=true"), QtxPopupMgr::VisibleRule );
1483 mgr->insert( action( GEOMOp::OpConcealChildren ), -1, -1 ); // conceal child items
1484 mgr->setRule( action( GEOMOp::OpConcealChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasDisclosedChildren=true"), QtxPopupMgr::VisibleRule );
1485 mgr->insert( action( GEOMOp::OpGroupEdit ), -1, -1 ); // edit group
1486 mgr->setRule( action( GEOMOp::OpGroupEdit ), QString("client='ObjectBrowser' and type='Group' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1487 mgr->insert( separator(), -1, -1 ); // -----------
1489 #if OCC_VERSION_LARGE > 0x06050200
1490 //QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and (selcount>0) and isOCC=true and topLevel=false";
1491 QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and isFolder=false and (selcount>0) and isOCC=true";
1492 mgr->insert( action(GEOMOp::OpBringToFront ), -1, -1 ); // bring to front
1493 mgr->setRule(action(GEOMOp::OpBringToFront), bringRule + " and autoBringToFront = false", QtxPopupMgr::VisibleRule );
1494 mgr->setRule(action(GEOMOp::OpBringToFront), "topLevel=true", QtxPopupMgr::ToggleRule );
1495 mgr->insert( action(GEOMOp::OpClsBringToFront ), -1, -1 ); // clear bring to front
1496 mgr->setRule( action(GEOMOp::OpClsBringToFront ), clientOCC + " and autoBringToFront = false", QtxPopupMgr::VisibleRule );
1498 mgr->insert( separator(), -1, -1 ); // -----------
1499 dispmodeId = mgr->insert( tr( "MEN_DISPLAY_MODE" ), -1, -1 ); // display mode menu
1500 mgr->insert( action( GEOMOp::OpWireframe ), dispmodeId, -1 ); // wireframe
1501 mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1502 mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK + " and displaymode='Wireframe'", QtxPopupMgr::ToggleRule );
1503 mgr->insert( action( GEOMOp::OpShading ), dispmodeId, -1 ); // shading
1504 mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1505 mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK + " and displaymode='Shading'", QtxPopupMgr::ToggleRule );
1506 mgr->insert( action( GEOMOp::OpShadingWithEdges ), dispmodeId, -1 ); // shading with edges
1507 mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1508 mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK + " and displaymode='ShadingWithEdges'", QtxPopupMgr::ToggleRule );
1509 mgr->insert( action( GEOMOp::OpTexture ), dispmodeId, -1 ); // wireframe
1510 mgr->setRule( action( GEOMOp::OpTexture ), clientOCC_AndSomeVisible, QtxPopupMgr::VisibleRule );
1511 mgr->setRule( action( GEOMOp::OpTexture), clientOCC + " and displaymode='Texture'", QtxPopupMgr::ToggleRule );
1512 mgr->insert( separator(), dispmodeId, -1 );
1513 mgr->insert( action( GEOMOp::OpVectors ), dispmodeId, -1 ); // vectors
1514 mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1515 mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK + " and isVectorsMode", QtxPopupMgr::ToggleRule );
1516 mgr->insert( separator(), -1, -1 ); // -----------
1518 mgr->insert( action( GEOMOp::OpColor ), -1, -1 ); // color
1519 mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})" + "and isPhysicalMaterial=false", QtxPopupMgr::VisibleRule );
1520 mgr->insert( action( GEOMOp::OpTransparency ), -1, -1 ); // transparency
1521 mgr->setRule( action( GEOMOp::OpTransparency ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1522 mgr->insert( action( GEOMOp::OpIsos ), -1, -1 ); // isos
1523 mgr->setRule( action( GEOMOp::OpIsos ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1524 mgr->insert( action( GEOMOp::OpDeflection ), -1, -1 ); // deflection
1525 mgr->setRule( action( GEOMOp::OpDeflection ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1526 mgr->insert( action( GEOMOp::OpPointMarker ), -1, -1 ); // point marker
1527 //mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and $typeid in {%1}" ).arg(GEOM_POINT ), QtxPopupMgr::VisibleRule );
1528 mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and ( $typeid in {%1} or compoundOfVertices=true ) " ).arg(GEOM::VERTEX).arg(GEOM::COMPOUND), QtxPopupMgr::VisibleRule );
1530 // material properties
1531 mgr->insert( action( GEOMOp::OpMaterialProperties ), -1, -1 );
1532 mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1535 mgr->insert( action( GEOMOp::OpSetTexture ), -1, -1 );
1536 mgr->setRule( action( GEOMOp::OpSetTexture ), clientOCCorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1538 int lineW = mgr->insert( tr( "MEN_LINE_WIDTH" ), -1, -1 ); // line width menu
1539 mgr->insert( action( GEOMOp::OpEdgeWidth ), lineW, -1 ); // edge width
1540 mgr->setRule( action( GEOMOp::OpEdgeWidth ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1542 mgr->insert( action( GEOMOp::OpIsosWidth ), lineW, -1 ); // isos width
1543 mgr->setRule( action( GEOMOp::OpIsosWidth ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1545 mgr->insert( separator(), -1, -1 ); // -----------
1546 mgr->insert( action( GEOMOp::OpAutoColor ), -1, -1 ); // auto color
1547 mgr->setRule( action( GEOMOp::OpAutoColor ), autoColorPrefix + " and isAutoColor=false", QtxPopupMgr::VisibleRule );
1548 mgr->insert( action( GEOMOp::OpNoAutoColor ), -1, -1 ); // disable auto color
1549 mgr->setRule( action( GEOMOp::OpNoAutoColor ), autoColorPrefix + " and isAutoColor=true", QtxPopupMgr::VisibleRule );
1550 mgr->insert( separator(), -1, -1 ); // -----------
1552 QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ",
1553 onlyComponent = "((type='Component') and selcount=1)",
1554 rule = canDisplay + "and ((($type in {%1}) and( %2 )) or " + onlyComponent + ")",
1555 types = "'Shape' 'Group' 'FieldStep'";
1557 mgr->insert( action( GEOMOp::OpShow ), -1, -1 ); // display
1558 mgr->setRule( action( GEOMOp::OpShow ), rule.arg( types ).arg( "not isVisible" ), QtxPopupMgr::VisibleRule );
1560 mgr->insert( action( GEOMOp::OpHide ), -1, -1 ); // erase
1561 mgr->setRule( action( GEOMOp::OpHide ), rule.arg( types ).arg( "isVisible" ), QtxPopupMgr::VisibleRule );
1563 mgr->insert( action( GEOMOp::OpHideAll ), -1, -1 ); // erase All
1564 mgr->setRule( action( GEOMOp::OpHideAll ), clientOCCorVTK, QtxPopupMgr::VisibleRule );
1566 QString selectOnly = "(client='OCCViewer' or client='VTKViewer') and (selcount=0)";
1568 int selectonlyId = mgr->insert( tr("MEN_SELECT_ONLY"), -1, -1); //select only menu
1569 mgr->insert( action(GEOMOp::OpSelectVertex), selectonlyId, -1); //Vertex
1570 mgr->setRule(action(GEOMOp::OpSelectVertex), selectOnly, QtxPopupMgr::VisibleRule);
1571 mgr->setRule(action(GEOMOp::OpSelectVertex), selectOnly + " and selectionmode='VERTEX'", QtxPopupMgr::ToggleRule);
1572 mgr->insert( action(GEOMOp::OpSelectEdge), selectonlyId, -1); //Edge
1573 mgr->setRule(action(GEOMOp::OpSelectEdge), selectOnly, QtxPopupMgr::VisibleRule);
1574 mgr->setRule(action(GEOMOp::OpSelectEdge), selectOnly + " and selectionmode='EDGE'", QtxPopupMgr::ToggleRule);
1575 mgr->insert( action(GEOMOp::OpSelectWire), selectonlyId, -1); //Wire
1576 mgr->setRule(action(GEOMOp::OpSelectWire), selectOnly, QtxPopupMgr::VisibleRule);
1577 mgr->setRule(action(GEOMOp::OpSelectWire), selectOnly + " and selectionmode='WIRE'", QtxPopupMgr::ToggleRule);
1578 mgr->insert( action(GEOMOp::OpSelectFace), selectonlyId, -1); //Face
1579 mgr->setRule(action(GEOMOp::OpSelectFace), selectOnly, QtxPopupMgr::VisibleRule);
1580 mgr->setRule(action(GEOMOp::OpSelectFace), selectOnly + " and selectionmode='FACE'", QtxPopupMgr::ToggleRule);
1581 mgr->insert( action(GEOMOp::OpSelectShell), selectonlyId, -1); //Shell
1582 mgr->setRule(action(GEOMOp::OpSelectShell), selectOnly, QtxPopupMgr::VisibleRule);
1583 mgr->setRule(action(GEOMOp::OpSelectShell), selectOnly + " and selectionmode='SHELL'", QtxPopupMgr::ToggleRule);
1584 mgr->insert( action(GEOMOp::OpSelectSolid), selectonlyId, -1); //Solid
1585 mgr->setRule(action(GEOMOp::OpSelectSolid), selectOnly, QtxPopupMgr::VisibleRule);
1586 mgr->setRule(action(GEOMOp::OpSelectSolid), selectOnly + " and selectionmode='SOLID'", QtxPopupMgr::ToggleRule);
1587 mgr->insert( action(GEOMOp::OpSelectCompound), selectonlyId, -1); //Compound
1588 mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly, QtxPopupMgr::VisibleRule);
1589 mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly + " and selectionmode='COMPOUND'", QtxPopupMgr::ToggleRule);
1590 mgr->insert( separator(), selectonlyId, -1);
1591 mgr->insert( action(GEOMOp::OpSelectAll), selectonlyId, -1); //Clear selection filter
1592 mgr->setRule(action(GEOMOp::OpSelectAll), selectOnly, QtxPopupMgr::VisibleRule);
1593 mgr->setRule(action(GEOMOp::OpSelectAll), selectOnly + " and selectionmode='ALL'", QtxPopupMgr::ToggleRule);
1594 mgr->insert( action(GEOMOp::OpShowOnly ), -1, -1 ); // display only
1595 mgr->setRule(action(GEOMOp::OpShowOnly ), rule.arg( types ).arg( "true" ), QtxPopupMgr::VisibleRule );
1596 mgr->insert( action(GEOMOp::OpShowOnlyChildren ), -1, -1 ); // display only children
1597 mgr->setRule(action(GEOMOp::OpShowOnlyChildren ), (canDisplay + "and ($type in {%1}) and client='ObjectBrowser' and hasChildren=true").arg( types ), QtxPopupMgr::VisibleRule );
1599 QString aDimensionRule = "($component={'GEOM'}) and selcount=1 and isVisible and type='Shape' and %1";
1601 mgr->insert( separator(), -1, -1 ); // -----------
1602 mgr->insert( action( GEOMOp::OpShowAllDimensions ), -1, -1 ); // show all dimensions
1603 mgr->setRule( action( GEOMOp::OpShowAllDimensions ), aDimensionRule.arg( "hasHiddenDimensions" ), QtxPopupMgr::VisibleRule );
1604 mgr->insert( action( GEOMOp::OpHideAllDimensions ), -1, -1 ); // hide all dimensions
1605 mgr->setRule( action( GEOMOp::OpHideAllDimensions ), aDimensionRule.arg( "hasVisibleDimensions" ), QtxPopupMgr::VisibleRule );
1607 mgr->insert( separator(), -1, -1 ); // -----------
1608 mgr->insert( action( GEOMOp::OpUnpublishObject ), -1, -1 ); // Unpublish object
1609 mgr->setRule( action( GEOMOp::OpUnpublishObject ), QString("client='ObjectBrowser' and $type in {'Shape' 'Group' 'Field' 'FieldStep'} and selcount>0"), QtxPopupMgr::VisibleRule );
1611 mgr->insert( action( GEOMOp::OpPublishObject ), -1, -1 ); // Publish object
1612 mgr->setRule( action( GEOMOp::OpPublishObject ), QString("client='ObjectBrowser' and isComponent=true"), QtxPopupMgr::VisibleRule );
1614 mgr->insert( action( GEOMOp::OpReimport ), -1, -1 ); // delete
1615 mgr->setRule( action( GEOMOp::OpReimport ), QString("$imported in {'true'} and selcount>0"), QtxPopupMgr::VisibleRule );
1617 mgr->insert( separator(), -1, -1 ); // -----------
1618 mgr->insert( action( GEOMOp::OpCreateFolder ), -1, -1 ); // Create Folder
1619 mgr->setRule( action( GEOMOp::OpCreateFolder ), QString("client='ObjectBrowser' and $component={'GEOM'} and (isComponent=true or isFolder=true)"), QtxPopupMgr::VisibleRule );
1621 mgr->insert( separator(), -1, -1 ); // -----------
1622 mgr->insert( action( GEOMOp::OpSortChildren ), -1, -1 ); // Sort child items
1623 mgr->setRule( action( GEOMOp::OpSortChildren ), QString("client='ObjectBrowser' and $component={'GEOM'} and nbChildren>1"), QtxPopupMgr::VisibleRule );
1625 mgr->hide( mgr->actionId( action( myEraseAll ) ) );
1627 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1629 GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)resMgr->integerValue("Geometry", "toplevel_dm", 0));
1630 QColor c = resMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) );
1631 GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c));
1634 // create plugin actions and menus
1638 //=======================================================================
1639 // function : GeometryGUI::addPluginActions()
1641 //=======================================================================
1642 void GeometryGUI::addPluginActions()
1645 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1646 if (!resMgr) return;
1648 // Find names of a resource XML files ("GEOMActions.xml" and others);
1650 char* cenv = getenv("GEOM_PluginsList");
1652 PluginsXml.sprintf("%s", cenv);
1654 QStringList PluginsXmlList = PluginsXml.split(":", QString::SkipEmptyParts);
1655 if (PluginsXmlList.count() == 0) return;
1657 // get full names of xml files from PluginsXmlList
1658 QStringList xmlFiles;
1659 xmlFiles.append(QDir::home().filePath("CustomGeomPlugins.xml")); // may be inexistent
1660 for (int i = 0; i < PluginsXmlList.count(); i++) {
1661 PluginsXml = PluginsXmlList[ i ];
1663 // Find full path to the resource XML file
1664 QString xmlFile = resMgr->path("resources", "GEOM", PluginsXml + ".xml");
1665 if ( xmlFile.isEmpty() ) // try PLUGIN resources
1666 xmlFile = resMgr->path("resources", PluginsXml, PluginsXml + ".xml");
1667 if ( !xmlFile.isEmpty() )
1668 xmlFiles.append( xmlFile );
1671 // create "Advanced Operations" menu and corresponding toolbar
1672 //int advancedMenuId = createMenu(tr("MEN_ADVANCED"), -1, -1, 10);
1673 //int advancedTbarId = createTool(tr("TOOL_ADVANCED"));
1674 int id = GEOMOp::OpLastOperationID; // TODO?
1677 QString aNoAccessFiles;
1678 for (int i = 0; i < xmlFiles.count(); i++) {
1679 QString xmlFile = xmlFiles[ i ];
1681 QFile file (xmlFile);
1682 if (file.exists() && file.open(QIODevice::ReadOnly)) {
1685 GEOMGUI_XmlHandler* aXmlHandler = new GEOMGUI_XmlHandler();
1686 ASSERT(aXmlHandler);
1688 QXmlInputSource source (&file);
1689 QXmlSimpleReader reader;
1690 reader.setContentHandler(aXmlHandler);
1691 reader.setErrorHandler(aXmlHandler);
1692 bool ok = reader.parse(source);
1696 // bind action lib and label to its ID for activateOperation() method proper work
1697 myPluginLibs[aXmlHandler->myPluginData.myName] = aXmlHandler->myPluginData.myClientLib;
1699 QListIterator<GEOMGUI_ActionData> anActionsIter (aXmlHandler->myPluginData.myListOfActions);
1700 while (anActionsIter.hasNext()) {
1701 GEOMGUI_ActionData anActionData = anActionsIter.next();
1703 //QPixmap icon = resMgr->loadPixmap("GEOM", tr(anActionData.myIcon.toLatin1().constData()));
1704 QPixmap icon = resMgr->loadPixmap(aXmlHandler->myPluginData.myName,
1705 anActionData.myIcon.toLatin1().constData());
1707 // path to action in menu
1708 QStringList smenus = anActionData.myMenu.split( "/" );
1709 QString actionName = smenus.last();
1710 actionName = actionName.toUpper().prepend("MEN_");
1711 smenus.removeLast();
1713 // path to action in toolbar
1714 QStringList stools = anActionData.myTooltip.split( "/" );
1715 QString actionTool = stools.last();
1716 actionTool = actionTool.toUpper().prepend("TOP_");
1717 stools.removeLast();
1719 QString actionStat = anActionData.myStatusBar;
1720 actionStat = actionStat.toUpper().prepend("STB_");
1722 createAction(id, // ~ anActionData.myLabel
1723 tr(actionTool.toLatin1().constData()),
1725 tr(actionName.toLatin1().constData()),
1726 tr(actionStat.toLatin1().constData()),
1728 application()->desktop(),
1730 this, SLOT(OnGUIEvent()),
1731 QString() /*shortcutAction*/);
1734 foreach (QString subMenu, smenus) {
1735 subMenu = subMenu.toUpper().prepend("MEN_");
1736 menuId = createMenu(tr(subMenu.toLatin1().constData()), menuId, -1);
1738 //createMenu(id, pluginMenuId, -1);
1739 createMenu(id, menuId, -1);
1741 QString subTool = stools[0];
1742 subTool = subTool.toUpper().prepend("TOOL_");
1743 int toolId = createTool(tr(subTool.toLatin1().constData()));
1744 //createTool(id, advancedTbarId);
1745 createTool(id, toolId);
1747 // add action id to map
1748 PluginAction anAction (aXmlHandler->myPluginData.myClientLib, anActionData.myLabel);
1749 myPluginActions[id] = anAction;
1755 SUIT_MessageBox::critical(application()->desktop(),
1756 tr("INF_PARSE_ERROR"),
1757 tr(aXmlHandler->errorProtocol().toLatin1().data()));
1761 else if ( i > 0 ) { // 1st is ~/CustomGeomPlugins.xml
1762 if (aNoAccessFiles.isEmpty())
1763 aNoAccessFiles = xmlFile;
1765 aNoAccessFiles += ", " + xmlFile;
1767 } // end loop on xmlFiles
1769 if (!aNoAccessFiles.isEmpty()) {
1770 QString aMess = QObject::tr("PLUGIN_FILE_CANT_OPEN") + " " + aNoAccessFiles + "\n";
1771 aMess += QObject::tr("PLUGIN_FILE_CHECK_VARIABLE");
1772 SUIT_MessageBox::warning(application()->desktop(), tr("GEOM_WRN_WARNING"), aMess);
1776 //=======================================================================
1777 // function : GeometryGUI::activateModule()
1778 // purpose : Called when GEOM module is activated
1779 //=======================================================================
1780 bool GeometryGUI::activateModule( SUIT_Study* study )
1782 if ( CORBA::is_nil( myComponentGeom ) )
1785 bool res = SalomeApp_Module::activateModule( study );
1789 setMenuShown( true );
1790 setToolShown( true );
1792 // import Python module that manages GEOM plugins (need to be here because SalomePyQt API uses active module)
1793 PyGILState_STATE gstate = PyGILState_Ensure();
1794 PyObjWrapper pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
1795 if ( !pluginsmanager ) {
1799 PyObjWrapper result =
1800 PyObject_CallMethod(pluginsmanager, (char*)"initialize", (char*)"isss", 1, "geom",
1801 tr("MEN_NEW_ENTITY").toStdString().c_str(),
1802 tr("GEOM_PLUGINS_OTHER").toStdString().c_str());
1806 PyGILState_Release(gstate);
1807 // end of GEOM plugins loading
1809 connect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1810 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1812 // Reset actions accelerator keys
1813 action(GEOMOp::OpImport)->setEnabled( true ); // Import: CTRL + Key_I
1814 action(GEOMOp::OpExport)->setEnabled( true ); // Export: CTRL + Key_E
1815 action(GEOMOp::OpDelete)->setEnabled( true ); // Delete: Key_Delete
1817 GUIMap::Iterator it;
1818 for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1819 it.value()->activate( application()->desktop() );
1821 LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1823 connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
1824 connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( onAutoBringToFront() ));
1825 connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
1827 if ( !myCreationInfoWdg )
1828 myCreationInfoWdg = new GEOMGUI_CreationInfoWdg( getApp() );
1829 getApp()->insertDockWindow( myCreationInfoWdg->getWinID(), myCreationInfoWdg );
1830 getApp()->placeDockWindow( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
1832 SUIT_ViewManager* vm;
1833 ViewManagerList OCCViewManagers, VTKViewManagers;
1835 application()->viewManagers( OCCViewer_Viewer::Type(), OCCViewManagers );
1836 QListIterator<SUIT_ViewManager*> itOCC( OCCViewManagers );
1837 while ( itOCC.hasNext() && (vm = itOCC.next()) )
1838 myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
1840 application()->viewManagers( SVTK_Viewer::Type(), VTKViewManagers );
1841 QListIterator<SUIT_ViewManager*> itVTK( VTKViewManagers );
1842 while ( itVTK.hasNext() && (vm = itVTK.next()) )
1843 myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
1846 SALOME_ListIO selected;
1847 sm->selectedObjects( selected );
1848 sm->clearSelected();
1850 // disable OCC selectors
1851 getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
1852 QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1853 while ( itOCCSel.hasNext() )
1854 if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1855 sr->setEnabled(true);
1857 // disable VTK selectors
1858 getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
1859 QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1860 while ( itVTKSel.hasNext() )
1861 if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1862 sr->setEnabled(true);
1864 sm->setSelectedObjects( selected, true ); //NPAL 19674
1866 QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1868 connect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1870 // 0020836 (Basic vectors and origin)
1871 SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
1872 if ( aResourceMgr->booleanValue( "Geometry", "auto_create_base_objects", false ) ) {
1873 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
1875 _PTR(Study) studyDS = appStudy->studyDS();
1877 _PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
1878 if ( !aSComponent ) // create objects automatically only if there is no GEOM component
1879 createOriginAndBaseVectors();
1887 //=======================================================================
1888 // function : GeometryGUI::deactivateModule()
1889 // purpose : Called when GEOM module is deactivated
1890 //=======================================================================
1891 bool GeometryGUI::deactivateModule( SUIT_Study* study )
1893 QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1895 disconnect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1897 setMenuShown( false );
1898 setToolShown( false );
1900 disconnect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1901 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1903 LightApp_SelectionMgr* selMrg = getApp()->selectionMgr();
1905 disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
1906 disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
1907 getApp()->removeDockWindow( myCreationInfoWdg->getWinID() );
1908 myCreationInfoWdg = 0;
1910 EmitSignalCloseAllDialogs();
1912 GUIMap::Iterator it;
1913 for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1914 it.value()->deactivate();
1916 // Unset actions accelerator keys
1917 action(GEOMOp::OpImport)->setEnabled( false ); // Import: CTRL + Key_I
1918 action(GEOMOp::OpExport)->setEnabled( false ); // Export: CTRL + Key_E
1919 action(GEOMOp::OpDelete)->setEnabled( false ); // Delete: Key_Delete
1921 qDeleteAll(myOCCSelectors);
1922 myOCCSelectors.clear();
1923 selMrg->setEnabled( true, OCCViewer_Viewer::Type() );
1925 qDeleteAll(myVTKSelectors);
1926 myVTKSelectors.clear();
1927 selMrg->setEnabled( true, SVTK_Viewer::Type() );
1929 return SalomeApp_Module::deactivateModule( study );
1932 //=======================================================================
1933 // function : onWindowActivated()
1934 // purpose : update menu items' status - disable non-OCC-viewer-compatible actions
1935 //=======================================================================
1936 void GeometryGUI::onWindowActivated( SUIT_ViewWindow* win )
1941 const bool ViewOCC = ( win->getViewManager()->getType() == OCCViewer_Viewer::Type() );
1942 //const bool ViewVTK = ( win->getViewManager()->getType() == SVTK_Viewer::Type() );
1944 // disable non-OCC viewframe menu commands
1945 // action( GEOMOp::Op2dSketcher )->setEnabled( ViewOCC ); // SKETCHER
1946 action( GEOMOp::OpSuppressFaces )->setEnabled( ViewOCC ); // SuppressFace
1947 action( GEOMOp::OpSuppressHoles )->setEnabled( ViewOCC ); // SuppressHole
1948 action( GEOMOp::OpCloseContour )->setEnabled( ViewOCC ); // CloseContour
1949 action( GEOMOp::OpRemoveIntWires )->setEnabled( ViewOCC ); // RemoveInternalWires
1950 action( GEOMOp::OpAddPointOnEdge )->setEnabled( ViewOCC ); // AddPointOnEdge
1951 // action( GEOMOp::OpFreeBoundaries )->setEnabled( ViewOCC ); // Free boundaries
1953 action( GEOMOp::OpGroupCreate )->setEnabled( ViewOCC ); // Create Group
1954 action( GEOMOp::OpGroupEdit )->setEnabled( ViewOCC ); // Edit Group
1955 action( GEOMOp::OpCreateField )->setEnabled( ViewOCC ); // Create Field
1956 action( GEOMOp::OpEditField )->setEnabled( ViewOCC ); // Edit Field
1958 action( GEOMOp::OpMultiTransform )->setEnabled( ViewOCC ); // MENU BLOCKS - MULTI-TRANSFORMATION
1961 void GeometryGUI::windows( QMap<int, int>& mappa ) const
1963 mappa.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
1964 mappa.insert( SalomeApp_Application::WT_NoteBook, Qt::LeftDockWidgetArea );
1965 mappa.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
1966 if ( myCreationInfoWdg )
1967 mappa.insert( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
1970 void GeometryGUI::viewManagers( QStringList& lst ) const
1972 lst.append( OCCViewer_Viewer::Type() );
1975 void GeometryGUI::onViewManagerAdded( SUIT_ViewManager* vm )
1977 if ( vm && vm->getType() == OCCViewer_Viewer::Type() )
1979 qDebug( "connect" );
1980 connect( vm, SIGNAL( keyPress ( SUIT_ViewWindow*, QKeyEvent* ) ),
1981 this, SLOT( OnKeyPress( SUIT_ViewWindow*, QKeyEvent* ) ) );
1982 connect( vm, SIGNAL( mousePress( SUIT_ViewWindow*, QMouseEvent* ) ),
1983 this, SLOT( OnMousePress( SUIT_ViewWindow*, QMouseEvent* ) ) );
1984 connect( vm, SIGNAL( mouseMove ( SUIT_ViewWindow*, QMouseEvent* ) ),
1985 this, SLOT( OnMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) );
1986 connect( vm, SIGNAL( mouseRelease ( SUIT_ViewWindow*, QMouseEvent* ) ),
1987 this, SLOT( OnMouseRelease( SUIT_ViewWindow*, QMouseEvent* ) ) );
1989 LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1990 myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
1992 // disable OCC selectors
1993 getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
1994 QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1995 while ( itOCCSel.hasNext() )
1996 if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1997 sr->setEnabled(true);
1999 else if ( vm->getType() == SVTK_Viewer::Type() )
2001 LightApp_SelectionMgr* sm = getApp()->selectionMgr();
2002 myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
2004 // disable VTK selectors
2005 getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
2006 QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
2007 while ( itVTKSel.hasNext() )
2008 if ( LightApp_VTKSelector* sr = itVTKSel.next() )
2009 sr->setEnabled(true);
2013 void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm )
2015 SUIT_ViewModel* viewer = vm->getViewModel();
2016 if ( vm->getType() == OCCViewer_Viewer::Type() )
2018 QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
2019 while ( itOCCSel.hasNext() )
2020 if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
2021 if ( sr->viewer() == viewer )
2023 /*delete*/ myOCCSelectors.takeAt( myOCCSelectors.indexOf( sr ) );
2027 if ( vm->getType() == SVTK_Viewer::Type() )
2029 QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
2030 while ( itVTKSel.hasNext() )
2031 if ( LightApp_VTKSelector* sr = itVTKSel.next() )
2032 if ( sr->viewer() == viewer )
2034 /*delete*/ myVTKSelectors.takeAt( myVTKSelectors.indexOf( sr ) );
2040 //================================================================================
2042 * \brief Slot called when selection changed. Shows creation info of a selected object
2044 //================================================================================
2046 void GeometryGUI::updateCreationInfo()
2048 if ( myCreationInfoWdg )
2049 myCreationInfoWdg->clear();
2051 // Code below is commented to have myCreationInfoWdg filled as soon as it is shown again
2052 // if ( !myCreationInfoWdg->isVisible() )
2055 // look for a sole selected GEOM_Object
2056 GEOM::GEOM_BaseObject_var geomObj;
2058 SALOME_ListIO selected;
2059 getApp()->selectionMgr()->selectedObjects( selected );
2061 _PTR(Study) study = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() )->studyDS();
2062 SALOME_ListIteratorOfListIO selIt( selected );
2063 for ( ; selIt.More(); selIt.Next() )
2065 Handle(SALOME_InteractiveObject) io = selIt.Value();
2066 if ( !io->hasEntry() ) continue;
2067 _PTR(SObject) sobj = study->FindObjectID( io->getEntry() );
2068 if ( !sobj ) continue;
2069 CORBA::Object_var obj = GeometryGUI::ClientSObjectToObject( sobj );
2070 GEOM::GEOM_BaseObject_var gobj = GEOM::GEOM_BaseObject::_narrow( obj );
2071 if ( !gobj->_is_nil() )
2073 if ( !geomObj->_is_nil() )
2074 return; // several GEOM objects selected
2078 if ( geomObj->_is_nil() ) return;
2080 // pass creation info of geomObj to myCreationInfoWdg
2082 if ( myCreationInfoWdg ) {
2084 QString operationName;
2085 myCreationInfoWdg->setOperation( icon, operationName );
2089 GEOM::CreationInformation_var info = geomObj->GetCreationInformation();
2091 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
2092 QString name = info->operationName.in();
2093 if ( !name.isEmpty() ) {
2094 icon = resMgr->loadPixmap( "GEOM", tr( ("ICO_"+name).toLatin1().constData() ), false );
2095 operationName = tr( ("MEN_"+name).toLatin1().constData() );
2096 if ( operationName.startsWith( "MEN_" ))
2097 operationName = name; // no translation
2098 myCreationInfoWdg->setOperation( icon, operationName );
2100 for ( size_t i = 0; i < info->params.length(); ++i )
2101 myCreationInfoWdg->addParam( info->params[i].name.in(),
2102 info->params[i].value.in() );
2111 void GeometryGUI::onAutoBringToFront()
2113 bool isAutoBringToFront = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "auto_bring_to_front" );
2114 if( !isAutoBringToFront )
2117 SUIT_ViewWindow* SUIT_window = application()->desktop()->activeWindow();
2118 if ( !SUIT_window || SUIT_window->getViewManager()->getType() != OCCViewer_Viewer::Type() )
2121 SalomeApp_Study* appStudy = dynamic_cast< SalomeApp_Study* >( getApp()->activeStudy() );
2122 if (!appStudy) return;
2124 GEOM_Displayer displayer( appStudy );
2126 SALOME_View* window = displayer.GetActiveView();
2127 if ( !window ) return;
2129 int aMgrId = dynamic_cast< SUIT_ViewModel* >( window )->getViewManager()->getGlobalId();
2131 SALOME_ListIO selected;
2132 getApp()->selectionMgr()->selectedObjects( selected );
2133 if (!myTopLevelIOList.IsEmpty())
2135 for( SALOME_ListIteratorOfListIO It( myTopLevelIOList ); It.More(); It.Next() )
2137 Handle( SALOME_InteractiveObject ) io = It.Value();
2138 bool isSelected = false;
2139 for( SALOME_ListIteratorOfListIO It_sel( selected ); It_sel.More(); It_sel.Next() )
2141 Handle( SALOME_InteractiveObject ) sel_io = It_sel.Value();
2142 if( io->isSame( sel_io ) )
2145 if (!isSelected && appStudy->findObjectByEntry(io->getEntry()))
2147 appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), false );
2148 if ( window->isVisible( io ) ) displayer.Redisplay( io, false );
2153 myTopLevelIOList.Assign(selected);
2154 for( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() )
2156 Handle( SALOME_InteractiveObject ) io = It.Value();
2157 appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), true );
2158 if ( window->isVisible( io ) ) displayer.Redisplay( io, false );
2161 displayer.UpdateViewer();
2162 GeometryGUI::Modified();
2165 void GeometryGUI::updateFieldColorScale()
2167 if( SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) )
2169 GEOM_Displayer aDisplayer( aStudy );
2170 aDisplayer.UpdateColorScale();
2174 QString GeometryGUI::engineIOR() const
2176 if ( !CORBA::is_nil( GetGeomGen() ) )
2177 return QString( getApp()->orb()->object_to_string( GetGeomGen() ) );
2181 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
2182 Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture
2184 Handle(Graphic3d_HArray1OfBytes) GeometryGUI::getTexture
2186 (SalomeApp_Study* theStudy, int theId, int& theWidth, int& theHeight)
2188 theWidth = theHeight = 0;
2190 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
2191 Handle(TColStd_HArray1OfByte) aTexture;
2193 Handle(Graphic3d_HArray1OfBytes) aTexture;
2197 TextureMap aTextureMap = myTextureMap[ theStudy->studyDS()->StudyId() ];
2198 aTexture = aTextureMap[ theId ];
2199 if ( aTexture.IsNull() ) {
2200 GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGen()->GetIInsertOperations( theStudy->studyDS()->StudyId() );
2201 if ( !aInsOp->_is_nil() ) {
2202 CORBA::Long aWidth, aHeight;
2203 SALOMEDS::TMPFile_var aStream = aInsOp->GetTexture( theId, aWidth, aHeight );
2204 if ( aWidth > 0 && aHeight > 0 && aStream->length() > 0 ) {
2206 theHeight = aHeight;
2208 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
2209 aTexture = new TColStd_HArray1OfByte (1, aStream->length());
2211 aTexture = new Graphic3d_HArray1OfBytes (1, aStream->length());
2214 for (int i = 0; i < aStream->length(); i++)
2215 aTexture->SetValue( i+1, (Standard_Byte)aStream[i] );
2216 aTextureMap[ theId ] = aTexture;
2224 LightApp_Selection* GeometryGUI::createSelection() const
2226 return new GEOMGUI_Selection();
2229 void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
2231 SalomeApp_Module::contextMenuPopup( client, menu, title );
2233 getApp()->selectionMgr()->selectedObjects( lst );
2235 //Add submenu for predefined materials
2236 bool isPredefMat = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "predef_materials" );
2237 if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() > 0 ) {
2238 QtxPopupMgr* mgr = popupMgr();
2239 //get parrent for submenu
2240 QAction* act = mgr->action( mgr->actionId( action( GEOMOp::OpMaterialProperties ) ) );
2242 QMenu* oldMenu = act->menu() ;
2247 QMenu* matMenu = new QMenu();
2248 QSignalMapper* signalMapper = new QSignalMapper( matMenu );
2250 //Get current material model for the object
2252 LightApp_Application* anApp = dynamic_cast<LightApp_Application*>( getApp() );
2253 if ( anApp && anApp->activeViewManager() ) {
2254 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( anApp->activeStudy() );
2256 v = aStudy->getObjectProperty( anApp->activeViewManager()->getGlobalId(), lst.Last()->getEntry(), GEOM::propertyName( GEOM::Material ), QVariant() );
2259 QString curModel = "";
2260 if ( v.canConvert<QString>() ) curModel = v.toString();
2261 // get list of all predefined materials
2262 QStringList materials = Material_ResourceMgr::resourceMgr()->materials();
2264 foreach ( QString material, materials )
2266 QAction* menAct = matMenu->addAction( material );
2267 connect(menAct, SIGNAL( toggled( bool ) ), signalMapper, SLOT( map() ) );
2268 signalMapper->setMapping( menAct, material );
2269 menAct->setCheckable( true );
2270 // Set checked if this material is current
2271 Material_Model aModel;
2272 aModel.fromResources( material );
2273 if ( !found && aModel.toProperties() == curModel ) {
2274 menAct->setChecked( true );
2278 matMenu->insertAction( matMenu->addSeparator(), action( GEOMOp::OpPredefMaterCustom ) );
2279 matMenu->insertSeparator( action( GEOMOp::OpPredefMaterCustom ) );
2280 connect( signalMapper, SIGNAL( mapped( const QString & ) ),
2281 this, SLOT( OnSetMaterial( const QString & ) ) );
2282 act->setMenu( matMenu );
2286 if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() == 1 ) {
2287 Handle(SALOME_InteractiveObject) io = lst.First();
2288 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
2289 _PTR(Study) study = appStudy->studyDS();
2290 _PTR(SObject) obj = study->FindObjectID( io->getEntry() );
2292 QString aName = QString( obj->GetName().c_str() );
2293 aName.remove( QRegExp("\\s+$") );
2299 void GeometryGUI::OnSetMaterial(const QString& theName)
2301 OnGUIEvent( GEOMOp::OpPredefMaterial, QVariant( theName ) );
2305 void GeometryGUI::createPreferences()
2307 int tabId = addPreference( tr( "PREF_TAB_SETTINGS" ) );
2309 int genGroup = addPreference( tr( "PREF_GROUP_GENERAL" ), tabId );
2310 setPreferenceProperty( genGroup, "columns", 2 );
2312 int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), genGroup,
2313 LightApp_Preferences::Selector,
2314 "Geometry", "display_mode" );
2316 addPreference( tr( "PREF_SHADING_COLOR" ), genGroup,
2317 LightApp_Preferences::Color, "Geometry", "shading_color" );
2319 addPreference( tr( "PREF_EDGES_IN_SHADING" ), genGroup,
2320 LightApp_Preferences::Color, "Geometry", "edges_in_shading_color" );
2322 addPreference( tr( "PREF_WIREFRAME_COLOR" ), genGroup,
2323 LightApp_Preferences::Color, "Geometry", "wireframe_color" );
2325 addPreference( tr( "PREF_FREE_BOUND_COLOR" ), genGroup,
2326 LightApp_Preferences::Color, "Geometry", "free_bound_color" );
2328 addPreference( tr( "PREF_LINE_COLOR"), genGroup,
2329 LightApp_Preferences::Color, "Geometry", "line_color" );
2331 addPreference( tr( "PREF_POINT_COLOR"), genGroup,
2332 LightApp_Preferences::Color, "Geometry", "point_color" );
2334 addPreference( tr( "PREF_ISOS_COLOR" ), genGroup,
2335 LightApp_Preferences::Color, "Geometry", "isos_color" );
2337 addPreference( tr( "PREF_TOPLEVEL_COLOR" ), genGroup,
2338 LightApp_Preferences::Color, "Geometry", "toplevel_color" );
2340 int top_lev_dm = addPreference( tr( "PREF_TOPLEVEL_DM" ), genGroup,
2341 LightApp_Preferences::Selector, "Geometry", "toplevel_dm" );
2343 int step = addPreference( tr( "PREF_STEP_VALUE" ), genGroup,
2344 LightApp_Preferences::IntSpin, "Geometry", "SettingsGeomStep" );
2346 int defl = addPreference( tr( "PREF_DEFLECTION" ), genGroup,
2347 LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" );
2349 addPreference( tr( "PREF_PREDEF_MATERIALS" ), genGroup,
2350 LightApp_Preferences::Bool, "Geometry", "predef_materials" );
2352 int material = addPreference( tr( "PREF_MATERIAL" ), genGroup,
2353 LightApp_Preferences::Selector,
2354 "Geometry", "material" );
2356 addPreference( tr( "PREF_EDITGROUP_COLOR" ), genGroup,
2357 LightApp_Preferences::Color, "Geometry", "editgroup_color" );
2363 wd[iter++] = addPreference( tr( "PREF_EDGE_WIDTH" ), genGroup,
2364 LightApp_Preferences::IntSpin, "Geometry", "edge_width" );
2366 wd[iter++] = addPreference( tr( "PREF_ISOLINES_WIDTH" ), genGroup,
2367 LightApp_Preferences::IntSpin, "Geometry", "isolines_width" );
2369 wd[iter++] = addPreference( tr( "PREF_PREVIEW_EDGE_WIDTH" ), genGroup,
2370 LightApp_Preferences::IntSpin, "Geometry", "preview_edge_width" );
2372 wd[iter++] = addPreference( tr( "PREF_MEASURES_LINE_WIDTH" ), genGroup,
2373 LightApp_Preferences::IntSpin, "Geometry", "measures_line_width" );
2375 for (int i = 0; i < nb; i++) {
2376 setPreferenceProperty( wd[i], "min", 1 );
2377 setPreferenceProperty( wd[i], "max", 5 );
2380 addPreference( tr( "PREF_AUTO_BRING_TO_FRONT" ), genGroup,
2381 LightApp_Preferences::Bool, "Geometry", "auto_bring_to_front" );
2383 int aDimGroupId = addPreference( tr( "PREF_DIMENSIONS" ), tabId );
2384 setPreferenceProperty( aDimGroupId, "columns", 2 );
2386 addPreference( tr( "PREF_DIMENSIONS_COLOR" ), aDimGroupId,
2387 LightApp_Preferences::Color, "Geometry", "dimensions_color" );
2389 int aDimLineWidthId = addPreference( tr( "PREF_DIMENSIONS_LINE_WIDTH" ), aDimGroupId,
2390 LightApp_Preferences::IntSpin, "Geometry", "dimensions_line_width" );
2392 setPreferenceProperty( aDimLineWidthId, "min", 1 );
2393 setPreferenceProperty( aDimLineWidthId, "max", 5 );
2395 int aDimFontHeightId = addPreference( tr( "PREF_DIMENSIONS_FONT_HEIGHT" ), aDimGroupId,
2396 LightApp_Preferences::DblSpin, "Geometry", "dimensions_font_height" );
2398 setPreferenceProperty( aDimFontHeightId, "min", 1e-9 );
2399 setPreferenceProperty( aDimFontHeightId, "max", 1e+9 );
2400 setPreferenceProperty( aDimFontHeightId, "precision", 9 );
2402 int aDimArrLengthId = addPreference( tr( "PREF_DIMENSIONS_ARROW_LENGTH" ), aDimGroupId,
2403 LightApp_Preferences::DblSpin, "Geometry", "dimensions_arrow_length" );
2405 setPreferenceProperty( aDimArrLengthId, "min", 1e-9 );
2406 setPreferenceProperty( aDimArrLengthId, "max", 1e+9 );
2407 setPreferenceProperty( aDimArrLengthId, "precision", 9 );
2409 int aLengthUnitsId = addPreference( tr( "PREF_DIMENSIONS_LENGTH_UNITS" ), aDimGroupId,
2410 LightApp_Preferences::Selector, "Geometry", "dimensions_length_units" );
2412 int anAngUnitsId = addPreference( tr( "PREF_DIMENSIONS_ANGLE_UNITS" ), aDimGroupId,
2413 LightApp_Preferences::Selector, "Geometry", "dimensions_angle_units" );
2415 addPreference( tr( "PREF_DIMENSIONS_SHOW_UNITS" ), aDimGroupId,
2416 LightApp_Preferences::Bool, "Geometry", "dimensions_show_units" );
2418 QStringList aListOfLengthUnits;
2419 aListOfLengthUnits << "m";
2420 aListOfLengthUnits << "cm";
2421 aListOfLengthUnits << "mm";
2422 aListOfLengthUnits << "in.";
2423 aListOfLengthUnits << "ft.";
2425 QStringList aListOfAngUnits;
2426 aListOfAngUnits << "rad";
2427 aListOfAngUnits << "deg";
2429 setPreferenceProperty( aLengthUnitsId, "strings", aListOfLengthUnits );
2430 setPreferenceProperty( anAngUnitsId, "strings", aListOfAngUnits );
2432 int aDimDefFlyout = addPreference( tr( "PREF_DIMENSIONS_DEFAULT_FLYOUT" ), aDimGroupId,
2433 LightApp_Preferences::DblSpin, "Geometry", "dimensions_default_flyout" );
2435 setPreferenceProperty( aDimDefFlyout, "min", 1e-9 );
2436 setPreferenceProperty( aDimDefFlyout, "max", 1e+9 );
2437 setPreferenceProperty( aDimDefFlyout, "precision", 9 );
2439 int isoGroup = addPreference( tr( "PREF_ISOS" ), tabId );
2440 setPreferenceProperty( isoGroup, "columns", 2 );
2441 int isoU = addPreference( tr( "PREF_ISOS_U" ), isoGroup,
2442 LightApp_Preferences::IntSpin, "Geometry", "iso_number_u" );
2443 setPreferenceProperty( isoU, "min", 0 );
2444 setPreferenceProperty( isoU, "max", 100000 );
2445 int isoV = addPreference( tr( "PREF_ISOS_V" ), isoGroup,
2446 LightApp_Preferences::IntSpin, "Geometry", "iso_number_v" );
2447 setPreferenceProperty( isoV, "min", 0 );
2448 setPreferenceProperty( isoV, "max", 100000 );
2450 // Quantities with individual precision settings
2451 int precGroup = addPreference( tr( "GEOM_PREF_GROUP_PRECISION" ), tabId );
2452 setPreferenceProperty( precGroup, "columns", 2 );
2454 const int nbQuantities = 8;
2455 int prec[nbQuantities], ii = 0;
2456 prec[ii++] = addPreference( tr( "GEOM_PREF_length_precision" ), precGroup,
2457 LightApp_Preferences::IntSpin, "Geometry", "length_precision" );
2458 prec[ii++] = addPreference( tr( "GEOM_PREF_angle_precision" ), precGroup,
2459 LightApp_Preferences::IntSpin, "Geometry", "angle_precision" );
2460 prec[ii++] = addPreference( tr( "GEOM_PREF_len_tol_precision" ), precGroup,
2461 LightApp_Preferences::IntSpin, "Geometry", "len_tol_precision" );
2462 prec[ii++] = addPreference( tr( "GEOM_PREF_ang_tol_precision" ), precGroup,
2463 LightApp_Preferences::IntSpin, "Geometry", "ang_tol_precision" );
2464 prec[ii++] = addPreference( tr( "GEOM_PREF_weight_precision" ), precGroup,
2465 LightApp_Preferences::IntSpin, "Geometry", "weight_precision" );
2466 prec[ii++] = addPreference( tr( "GEOM_PREF_density_precision" ), precGroup,
2467 LightApp_Preferences::IntSpin, "Geometry", "density_precision" );
2468 prec[ii++] = addPreference( tr( "GEOM_PREF_parametric_precision" ), precGroup,
2469 LightApp_Preferences::IntSpin, "Geometry", "parametric_precision" );
2470 prec[ii ] = addPreference( tr( "GEOM_PREF_param_tol_precision" ), precGroup,
2471 LightApp_Preferences::IntSpin, "Geometry", "param_tol_precision" );
2473 // Set property for precision value for spinboxes
2474 for ( ii = 0; ii < nbQuantities; ii++ ){
2475 setPreferenceProperty( prec[ii], "min", -14 );
2476 setPreferenceProperty( prec[ii], "max", 14 );
2477 setPreferenceProperty( prec[ii], "precision", 2 );
2480 int VertexGroup = addPreference( tr( "PREF_GROUP_VERTEX" ), tabId );
2481 setPreferenceProperty( VertexGroup, "columns", 2 );
2483 int typeOfMarker = addPreference( tr( "PREF_TYPE_OF_MARKER" ), VertexGroup,
2484 LightApp_Preferences::Selector, "Geometry", "type_of_marker" );
2486 int markerScale = addPreference( tr( "PREF_MARKER_SCALE" ), VertexGroup,
2487 LightApp_Preferences::Selector, "Geometry", "marker_scale" );
2489 // Set property for default display mode
2490 QStringList aModesList;
2491 aModesList.append( tr("MEN_WIREFRAME") );
2492 aModesList.append( tr("MEN_SHADING") );
2493 aModesList.append( tr("MEN_SHADING_WITH_EDGES") );
2494 aModesList.append( tr("MEN_TEXTURE") );
2496 QList<QVariant> anIndexesList;
2497 anIndexesList.append(0);
2498 anIndexesList.append(1);
2499 anIndexesList.append(2);
2500 anIndexesList.append(3);
2502 setPreferenceProperty( dispmode, "strings", aModesList );
2503 setPreferenceProperty( dispmode, "indexes", anIndexesList );
2505 // Set property for top level display mode
2506 QStringList aTopModesList;
2507 aTopModesList.append( tr("MEN_SHOW_ADD_WACTOR") );
2508 aTopModesList.append( tr("MEN_KEEP_CURRENT_DM") );
2509 aTopModesList.append( tr("MEN_WIREFRAME") );
2510 aTopModesList.append( tr("MEN_SHADING") );
2511 aTopModesList.append( tr("MEN_SHADING_WITH_EDGES") );
2513 QList<QVariant> aTopIndexesList;
2514 aTopIndexesList.append(0);
2515 aTopIndexesList.append(1);
2516 aTopIndexesList.append(2);
2517 aTopIndexesList.append(3);
2518 aTopIndexesList.append(4);
2520 setPreferenceProperty( top_lev_dm, "strings", aTopModesList );
2521 setPreferenceProperty( top_lev_dm, "indexes", aTopIndexesList );
2523 // Set property for step value for spinboxes
2524 setPreferenceProperty( step, "min", 1 );
2525 setPreferenceProperty( step, "max", 10000 );
2526 setPreferenceProperty( step, "precision", 3 );
2528 // Set property for deflection value for spinboxes
2529 setPreferenceProperty( defl, "min", GEOM::minDeflection() );
2530 setPreferenceProperty( defl, "max", 1.0 );
2531 setPreferenceProperty( defl, "step", 1.0e-04 );
2532 setPreferenceProperty( defl, "precision", 6 );
2534 // Set property for default material
2535 setPreferenceProperty( material, "strings", Material_ResourceMgr::resourceMgr()->materials() );
2537 // Set property vertex marker type
2538 QList<QVariant> aMarkerTypeIndicesList;
2539 QList<QVariant> aMarkerTypeIconsList;
2541 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
2542 for ( int i = GEOM::MT_POINT; i < GEOM::MT_USER; i++ ) {
2543 QString icoFile = QString( "ICON_VERTEX_MARKER_%1" ).arg( i );
2544 QPixmap pixmap = resMgr->loadPixmap( "GEOM", tr( qPrintable( icoFile ) ) );
2545 aMarkerTypeIndicesList << (i-1);
2546 aMarkerTypeIconsList << pixmap;
2549 setPreferenceProperty( typeOfMarker, "indexes", aMarkerTypeIndicesList );
2550 setPreferenceProperty( typeOfMarker, "icons", aMarkerTypeIconsList );
2552 // Set property for vertex marker scale
2553 QList<QVariant> aMarkerScaleIndicesList;
2554 QStringList aMarkerScaleValuesList;
2556 for ( int iii = GEOM::MS_10; iii <= GEOM::MS_70; iii++ ) {
2557 aMarkerScaleIndicesList << iii;
2558 aMarkerScaleValuesList << QString::number( (iii-(int)GEOM::MS_10)*0.5 + 1.0 );
2561 setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList );
2562 setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
2564 // Scalar bar for field step presentation
2565 int scalarBarGroup = addPreference( tr( "PREF_GROUP_SCALAR_BAR" ), tabId );
2566 setPreferenceProperty( scalarBarGroup, "columns", 2 );
2568 int sbXPosition = addPreference( tr( "PREF_SCALAR_BAR_X_POSITION" ), scalarBarGroup,
2569 LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_x_position" );
2570 setPreferenceProperty( sbXPosition, "min", 0 );
2571 setPreferenceProperty( sbXPosition, "max", 1 );
2572 setPreferenceProperty( sbXPosition, "step", 0.05 );
2574 int sbYPosition = addPreference( tr( "PREF_SCALAR_BAR_Y_POSITION" ), scalarBarGroup,
2575 LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_y_position" );
2576 setPreferenceProperty( sbYPosition, "min", 0 );
2577 setPreferenceProperty( sbYPosition, "max", 1 );
2578 setPreferenceProperty( sbYPosition, "step", 0.05 );
2580 int sbWidth = addPreference( tr( "PREF_SCALAR_BAR_WIDTH" ), scalarBarGroup,
2581 LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_width" );
2582 setPreferenceProperty( sbWidth, "min", 0 );
2583 setPreferenceProperty( sbWidth, "max", 1 );
2584 setPreferenceProperty( sbWidth, "step", 0.05 );
2586 int sbHeight = addPreference( tr( "PREF_SCALAR_BAR_HEIGHT" ), scalarBarGroup,
2587 LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_height" );
2588 setPreferenceProperty( sbHeight, "min", 0 );
2589 setPreferenceProperty( sbHeight, "max", 1 );
2590 setPreferenceProperty( sbHeight, "step", 0.05 );
2592 int sbTextHeight = addPreference( tr( "PREF_SCALAR_BAR_TEXT_HEIGHT" ), scalarBarGroup,
2593 LightApp_Preferences::IntSpin, "Geometry", "scalar_bar_text_height" );
2594 setPreferenceProperty( sbTextHeight, "min", 6 );
2595 setPreferenceProperty( sbTextHeight, "max", 24 );
2596 setPreferenceProperty( sbTextHeight, "step", 1 );
2598 int sbNbIntervals = addPreference( tr( "PREF_SCALAR_BAR_NUMBER_OF_INTERVALS" ), scalarBarGroup,
2599 LightApp_Preferences::IntSpin, "Geometry", "scalar_bar_nb_intervals" );
2600 setPreferenceProperty( sbNbIntervals, "min", 2 );
2601 setPreferenceProperty( sbNbIntervals, "max", 64 );
2602 setPreferenceProperty( sbNbIntervals, "step", 1 );
2604 int originGroup = addPreference( tr( "PREF_GROUP_ORIGIN_AND_BASE_VECTORS" ), tabId );
2605 setPreferenceProperty( originGroup, "columns", 2 );
2607 int baseVectorsLength = addPreference( tr( "PREF_BASE_VECTORS_LENGTH" ), originGroup,
2608 LightApp_Preferences::DblSpin, "Geometry", "base_vectors_length" );
2609 setPreferenceProperty( baseVectorsLength, "min", 0.01 );
2610 setPreferenceProperty( baseVectorsLength, "max", 1000 );
2612 addPreference( tr( "PREF_AUTO_CREATE" ), originGroup,
2613 LightApp_Preferences::Bool, "Geometry", "auto_create_base_objects" );
2615 int operationsGroup = addPreference( tr( "PREF_GROUP_OPERATIONS" ), tabId );
2616 setPreferenceProperty( operationsGroup, "columns", 2 );
2618 addPreference( tr( "GEOM_PREVIEW" ), operationsGroup,
2619 LightApp_Preferences::Bool, "Geometry", "geom_preview" );
2622 void GeometryGUI::preferencesChanged( const QString& section, const QString& param )
2624 if (section == "Geometry") {
2625 SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
2626 if (param == QString("SettingsGeomStep")) {
2627 double spin_step = aResourceMgr->doubleValue(section, param, 100.);
2628 EmitSignalDefaultStepValueChanged(spin_step);
2630 else if (param == QString("toplevel_color")) {
2631 QColor c = aResourceMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) );
2632 GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c));
2634 else if (param == QString("toplevel_dm")) {
2635 GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)aResourceMgr->integerValue("Geometry", "toplevel_dm", 0));
2637 else if (param == QString("scalar_bar_x_position") ||
2638 param == QString("scalar_bar_y_position") ||
2639 param == QString("scalar_bar_width") ||
2640 param == QString("scalar_bar_height") ||
2641 param == QString("scalar_bar_text_height") ||
2642 param == QString("scalar_bar_nb_intervals")) {
2643 if( SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) )
2645 GEOM_Displayer aDisplayer( aStudy );
2646 bool anIsRedisplayFieldSteps = param == QString("scalar_bar_nb_intervals");
2647 aDisplayer.UpdateColorScale( anIsRedisplayFieldSteps, true );
2650 else if ( param == QString("dimensions_color") ||
2651 param == QString("dimensions_line_width") ||
2652 param == QString("dimensions_font_height") ||
2653 param == QString("dimensions_arrow_length") ||
2654 param == QString("dimensions_show_units") ||
2655 param == QString("dimensions_length_units") ||
2656 param == QString("dimensions_angle_units") )
2658 SalomeApp_Application* anApp = getApp();
2664 SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( anApp->activeStudy() );
2670 GEOM_Displayer aDisplayer( aStudy );
2672 ViewManagerList aVMs;
2673 anApp->viewManagers( OCCViewer_Viewer::Type(), aVMs );
2674 ViewManagerList::Iterator anIt = aVMs.begin();
2675 for ( ; anIt != aVMs.end(); ++anIt )
2677 SOCC_Viewer* aViewer = dynamic_cast<SOCC_Viewer*>( (*anIt)->getViewModel() );
2683 SALOME_ListIO aVisible;
2684 aViewer->GetVisible( aVisible );
2685 aDisplayer.Redisplay( aVisible, false, aViewer );
2688 aDisplayer.UpdateViewer();
2693 LightApp_Displayer* GeometryGUI::displayer()
2696 myDisplayer = new GEOM_Displayer( dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) );
2700 void GeometryGUI::setLocalSelectionMode(const int mode)
2702 myLocalSelectionMode = mode;
2705 int GeometryGUI::getLocalSelectionMode() const
2707 return myLocalSelectionMode;
2710 const char gSeparator = '_'; // character used to separate parameter names
2711 const char gDigitsSep = ':'; // character used to separate numeric parameter values (color = r:g:b)
2714 * \brief Store visual parameters
2716 * This method is called just before the study document is saved.
2717 * Store visual parameters in AttributeParameter attribute(s)
2719 void GeometryGUI::storeVisualParameters (int savePoint)
2721 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
2722 if ( !appStudy || !appStudy->studyDS() )
2724 _PTR(Study) studyDS = appStudy->studyDS();
2726 // componentName is used for encoding of entries when storing them in IParameters
2727 std::string componentName = myComponentGeom->ComponentDataType();
2728 //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
2729 //if (!aSComponent) return;
2732 _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
2733 componentName.c_str(),
2735 _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
2737 QSet<QString> anEntriesToStoreShared;
2738 QList<SUIT_ViewManager*> lst;
2739 QList<SUIT_ViewManager*>::Iterator it;
2741 // main cycle to store parameters of displayed objects
2743 getApp()->viewManagers(lst);
2744 for (it = lst.begin(); it != lst.end(); it++) {
2745 SUIT_ViewManager* vman = *it;
2746 QString vType = vman->getType();
2747 int aMgrId = vman->getGlobalId();
2748 // saving VTK actors properties
2749 QVector<SUIT_ViewWindow*> views = vman->getViews();
2750 for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++) {
2751 const ObjMap anObjects = appStudy->getObjectMap(aMgrId);
2752 ObjMap::ConstIterator o_it = anObjects.begin();
2753 for (; o_it != anObjects.end(); o_it++) {
2754 const PropMap aProps = o_it.value();
2756 //Check that object exists in the study
2757 _PTR(SObject) obj( studyDS->FindObjectID( o_it.key().toLatin1().data() ) );
2758 if ( !obj || !(aProps.count() > 0))
2760 // entry is "encoded" = it does NOT contain component adress, since it is a
2761 // subject to change on next component loading
2763 std::string entry = ip->encodeEntry(o_it.key().toLatin1().data(), componentName);
2765 _PTR(GenericAttribute) anAttr;
2766 if (!obj->FindAttribute(anAttr, "AttributeIOR"))
2769 // remember entry of object to store shared GEOM properties
2770 // (e.g. dimension properties).
2771 if ( vType == OCCViewer_Viewer::Type() )
2773 anEntriesToStoreShared.insert( o_it.key() );
2776 QString param, occParam = vType;
2777 occParam += GEOM::sectionSeparator();
2778 occParam += QString::number(aMgrId);
2779 occParam += GEOM::sectionSeparator();
2781 if (aProps.contains(GEOM::propertyName( GEOM::Visibility ))) {
2782 param = occParam + GEOM::propertyName( GEOM::Visibility );
2783 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Visibility )).toBool() ? "On" : "Off");
2786 if (aProps.contains(GEOM::propertyName( GEOM::DisplayMode ))) {
2787 param = occParam + GEOM::propertyName( GEOM::DisplayMode );
2788 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::DisplayMode )).toString().toStdString());
2791 if (aProps.contains(GEOM::propertyName( GEOM::Color ))) {
2792 QColor c = aProps.value(GEOM::propertyName( GEOM::Color )).value<QColor>();
2794 val << QString::number(c.redF());
2795 val << QString::number(c.greenF());
2796 val << QString::number(c.blueF());
2797 param = occParam + GEOM::propertyName( GEOM::Color );
2798 ip->setParameter(entry, param.toStdString(), val.join( GEOM::subSectionSeparator()).toStdString());
2801 if (aProps.contains(GEOM::propertyName( GEOM::Texture ))) {
2802 param = occParam + GEOM::propertyName( GEOM::Texture );
2803 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Texture )).toString().toStdString());
2806 if (vType == SVTK_Viewer::Type()) {
2807 if (aProps.contains(GEOM::propertyName( GEOM::Opacity ))) {
2808 param = occParam + GEOM::propertyName( GEOM::Opacity );
2809 ip->setParameter(entry, param.toStdString(), QString::number(1. - aProps.value(GEOM::propertyName( GEOM::Transparency )).toDouble()).toStdString());
2811 } else if (vType == SOCC_Viewer::Type()) {
2812 if (aProps.contains(GEOM::propertyName( GEOM::Transparency ))) {
2813 param = occParam + GEOM::propertyName( GEOM::Transparency );
2814 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Transparency )).toString().toStdString());
2817 if (aProps.contains(GEOM::propertyName( GEOM::TopLevel ))) {
2818 param = occParam + GEOM::propertyName( GEOM::TopLevel );
2819 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::TopLevel )).toString().toStdString());
2823 if (aProps.contains(GEOM::propertyName( GEOM::NbIsos ))) {
2824 param = occParam + GEOM::propertyName( GEOM::NbIsos );
2825 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::NbIsos )).toString().toStdString());
2828 if (aProps.contains(GEOM::propertyName( GEOM::EdgesDirection ))) {
2829 param = occParam + GEOM::propertyName( GEOM::EdgesDirection );
2830 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::EdgesDirection )).toString().toStdString());
2833 if (aProps.contains(GEOM::propertyName( GEOM::Deflection ))) {
2834 param = occParam + GEOM::propertyName( GEOM::Deflection );
2835 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Deflection )).toString().toStdString());
2838 //Marker type of the vertex - ONLY for the "Vertex" and "Compound of the Vertex"
2839 if (aProps.contains(GEOM::propertyName( GEOM::PointMarker ))) {
2840 param = occParam + GEOM::propertyName( GEOM::PointMarker );
2841 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::PointMarker )).toString().toStdString());
2844 if (aProps.contains(GEOM::propertyName( GEOM::Material ))) {
2845 param = occParam + GEOM::propertyName( GEOM::Material );
2846 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Material )).toString().toStdString());
2849 if (aProps.contains(GEOM::propertyName( GEOM::LineWidth ))) {
2850 param = occParam + GEOM::propertyName( GEOM::LineWidth );
2851 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::LineWidth )).toString().toStdString());
2854 if (aProps.contains(GEOM::propertyName( GEOM::IsosWidth ))) {
2855 param = occParam + GEOM::propertyName( GEOM::IsosWidth );
2856 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::IsosWidth )).toString().toStdString());
2858 } // object iterator
2860 } // for (viewManagers)
2862 // store dimension attributes of objects:
2863 // since the displayed object always persists in property map, we remember the object entries
2864 // on the passes when we store viewer related properties - to avoid extra iterations on GEOM component tree.
2865 QString aDimensionParam = OCCViewer_Viewer::Type() + GEOM::sectionSeparator() + GEOM::propertyName( GEOM::Dimensions );
2866 QSet<QString>::ConstIterator aEntryIt = anEntriesToStoreShared.constBegin();
2867 for ( ; aEntryIt != anEntriesToStoreShared.constEnd(); ++aEntryIt )
2869 std::string aStudyEntry = (*aEntryIt).toLatin1().data();
2870 std::string aStoreEntry = ip->encodeEntry( aStudyEntry, componentName);
2872 GEOMGUI_DimensionProperty aDimensions( appStudy, aStudyEntry );
2874 if ( aDimensions.GetNumber() == 0 )
2879 ip->setParameter( aStoreEntry, aDimensionParam.toStdString(), ((QString)aDimensions).toLatin1().data() );
2884 * \brief Restore visual parameters
2886 * This method is called after the study document is opened.
2887 * Restore visual parameters from AttributeParameter attribute(s)
2889 void GeometryGUI::restoreVisualParameters (int savePoint)
2891 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
2892 if (!appStudy || !appStudy->studyDS())
2894 _PTR(Study) studyDS = appStudy->studyDS();
2896 // componentName is used for encoding of entries when storing them in IParameters
2897 std::string componentName = myComponentGeom->ComponentDataType();
2898 //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
2899 //if (!aSComponent) return;
2902 _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
2903 componentName.c_str(),
2905 _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
2907 std::vector<std::string> entries = ip->getEntries();
2909 for (std::vector<std::string>::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt)
2911 // entry is a normal entry - it should be "decoded" (setting base adress of component)
2912 QString entry (ip->decodeEntry(*entIt).c_str());
2914 // Check that the entry corresponds to a real object in the Study
2915 // as the object may be deleted or modified after the visual state is saved.
2916 _PTR(SObject) so = studyDS->FindObjectID(entry.toLatin1().data());
2917 if (!so) continue; //Skip the not existent entry
2919 std::vector<std::string> paramNames = ip->getAllParameterNames( *entIt );
2920 std::vector<std::string> paramValues = ip->getAllParameterValues( *entIt );
2922 std::vector<std::string>::iterator namesIt = paramNames.begin();
2923 std::vector<std::string>::iterator valuesIt = paramValues.begin();
2925 // actors are stored in a map after displaying of them for
2926 // quicker access in the future: map < viewID to actor >
2927 NCollection_DataMap<int, GEOM_Actor* > vtkActors;
2928 NCollection_DataMap<int, Handle(GEOM_AISShape)> occActors;
2930 QString viewerTypStr;
2931 QString viewIndexStr;
2933 QVector<PropMap> aListOfMap;
2935 for (; namesIt != paramNames.end(); ++namesIt, ++valuesIt)
2937 // visual parameters are stored in strings as follows:
2938 // 1) ViewerType_ViewIndex_ParamName
2939 // 2) ViewerType_ParamName (shared for GEOM module)
2940 // '_' is used as separator and should not be used in viewer type or parameter names.
2941 QStringList lst = QString((*namesIt).c_str()).split( GEOM::sectionSeparator(), QString::SkipEmptyParts);
2943 bool isShared = lst.size() == 2;
2944 bool isViewer = lst.size() == 3;
2945 if ( !isShared && !isViewer )
2950 // shared visual parameters
2953 QString aParamNameStr( lst[1] );
2954 QString aValuesStr( (*valuesIt).c_str() );
2956 // shared dimension properties are stored as attribute
2957 if ( aParamNameStr == GEOM::propertyName( GEOM::Dimensions ) )
2959 GEOMGUI_DimensionProperty aDimensionProp( aValuesStr );
2960 aDimensionProp.SaveToAttribute( appStudy, entry.toLatin1().data() );
2966 // per view visual parameters
2967 viewerTypStr = lst[0];
2968 viewIndexStr = lst[1];
2969 QString paramNameStr = lst[2];
2972 viewIndex = viewIndexStr.toUInt(&ok);
2973 if (!ok) // bad conversion of view index to integer
2976 if ((viewIndex + 1) > aListOfMap.count()) {
2977 aListOfMap.resize(viewIndex + 1);
2980 QString val((*valuesIt).c_str());
2981 if (paramNameStr == GEOM::propertyName( GEOM::Visibility )) {
2982 aListOfMap[viewIndex].insert(GEOM::propertyName( GEOM::Visibility ), val == "On");
2983 } else if (paramNameStr == GEOM::propertyName( GEOM::Opacity )) {
2984 aListOfMap[viewIndex].insert(GEOM::propertyName( GEOM::Transparency ), 1. - val.toDouble());
2985 } else if (paramNameStr == GEOM::propertyName( GEOM::Transparency )) {
2986 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Transparency ), val.toDouble() );
2987 } else if (paramNameStr == GEOM::propertyName( GEOM::TopLevel )) {
2988 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::TopLevel ), val == "true" || val == "1");
2989 } else if (paramNameStr == GEOM::propertyName( GEOM::DisplayMode )) {
2990 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::DisplayMode ), val.toInt());
2991 } else if (paramNameStr == GEOM::propertyName( GEOM::NbIsos )) {
2992 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::NbIsos ), val);
2993 } else if (paramNameStr == GEOM::propertyName( GEOM::Color )) {
2994 QStringList rgb = val.split(GEOM::subSectionSeparator());
2995 if (rgb.count() == 3) {
2996 QColor c = QColor::fromRgbF(rgb[0].toDouble(), rgb[1].toDouble(), rgb[2].toDouble());
2997 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Color ), c);
2999 } else if (paramNameStr == GEOM::propertyName( GEOM::Texture )) {
3000 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Texture ), val );
3001 } else if (paramNameStr == GEOM::propertyName( GEOM::EdgesDirection )) {
3002 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::EdgesDirection ), val == "true" || val == "1");
3003 } else if (paramNameStr == GEOM::propertyName( GEOM::Deflection )) {
3004 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Deflection ), val.toDouble());
3005 } else if (paramNameStr == GEOM::propertyName( GEOM::PointMarker )) {
3006 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::PointMarker ), val);
3007 } else if (paramNameStr == GEOM::propertyName( GEOM::Material )) {
3008 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Material ), val);
3009 } else if (paramNameStr == GEOM::propertyName( GEOM::LineWidth )) {
3010 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::LineWidth ), val.toInt());
3011 } else if (paramNameStr == GEOM::propertyName( GEOM::IsosWidth )) {
3012 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::IsosWidth ), val.toInt());
3014 } // for names/parameters iterator
3016 QList<SUIT_ViewManager*> lst = getApp()->viewManagers();
3018 for (int index = 0; index < aListOfMap.count(); index++) {
3020 appStudy->setObjectPropMap(index, entry, aListOfMap[index]);
3022 //Get Visibility property of the current PropMap
3023 if (aListOfMap[index].value(GEOM::propertyName( GEOM::Visibility )) == 1) {
3024 SUIT_ViewManager* vman = lst.at(index);
3025 SUIT_ViewModel* vmodel = vman->getViewModel();
3026 displayer()->Display(entry, true, dynamic_cast<SALOME_View*>(vmodel));
3029 } // for entries iterator
3031 // update all VTK and OCC views
3032 QList<SUIT_ViewManager*> lst;
3033 getApp()->viewManagers(lst);
3034 for (QList<SUIT_ViewManager*>::Iterator it = lst.begin(); it != lst.end(); it++) {
3035 SUIT_ViewModel* vmodel = (*it)->getViewModel();
3038 if (vmodel->getType() == SVTK_Viewer::Type()) {
3039 SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) (*it)->getActiveView();
3040 vtkView->getRenderer()->ResetCameraClippingRange();
3043 else if (vmodel->getType() == SOCC_Viewer::Type()) {
3044 //SOCC_ViewWindow* occView = (SOCC_ViewWindow*) (*it)->getActiveView();
3045 SALOME_View* occVMod = dynamic_cast<SALOME_View*>(vmodel);
3052 void GeometryGUI::onViewAboutToShow()
3054 SUIT_ViewWindow* window = application()->desktop()->activeWindow();
3055 QAction* a = action( GEOMOp::OpSwitchVectors );
3057 a->setEnabled(true);
3058 bool vmode = window->property("VectorsMode").toBool();
3059 a->setText ( vmode == 1 ? tr( "MEN_VECTOR_MODE_OFF" ) : tr("MEN_VECTOR_MODE_ON") );
3061 a->setText ( tr("MEN_VECTOR_MODE_ON") );
3062 a->setEnabled(false);
3067 \brief Return action by id
3068 \param id identifier of the action
3071 QAction* GeometryGUI::getAction(const int id) {
3076 \brief GEOM module message handler
3078 This method can be re-implemented in the subclasses.
3079 This is a GEOM module message handler.
3081 \param msg the message received.
3083 void GeometryGUI::message(const QString& msg)
3086 QStringList data = msg.split("/");
3087 const int nbStrings = data.count();
3089 if (nbStrings > 0) {
3090 if (data[0] == "modified") {
3092 QString anIOR = nbStrings > 1 ? data[1] : QString();
3094 if ( anIOR.isEmpty() ) {
3098 // Get the geom object.
3099 GEOM::GEOM_Object_ptr anObj = GeometryGUI::GetObjectFromIOR (anIOR);
3101 // Clear the shape buffer
3102 GeometryGUI::ClearShapeBuffer (anObj);
3108 \brief Clears the shape buffer.
3110 This is a static method. It clears the shape buffer.
3112 \param theObj the object
3114 void GeometryGUI::ClearShapeBuffer( GEOM::GEOM_Object_ptr theObj )
3116 if ( CORBA::is_nil( theObj ) )
3119 CORBA::String_var IOR = SalomeApp_Application::orb()->object_to_string( theObj );
3120 TCollection_AsciiString asciiIOR( (char *)IOR.in() );
3121 GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
3123 SALOMEDSClient_StudyManager *aManager = SalomeApp_Application::studyMgr();
3128 _PTR(Study) aStudy = aManager->GetStudyByID(theObj->GetStudyID());
3133 _PTR(SObject) aSObj ( aStudy->FindObjectIOR( std::string( IOR ) ) );
3137 _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) );
3138 for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) {
3139 _PTR(GenericAttribute) anAttr;
3140 if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) {
3141 _PTR(AttributeIOR) anIOR ( anAttr );
3142 TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() );
3143 GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
3149 \brief Returns the object from IOR.
3151 This is a static method. It returns the object from its IOR.
3153 \param IOR object IOR
3154 \return GEOM object.
3156 GEOM::GEOM_Object_ptr GeometryGUI::GetObjectFromIOR( const QString& IOR )
3158 GEOM::GEOM_Object_var geomObj;
3159 if ( !IOR.isEmpty() ) {
3160 CORBA::Object_var corbaObj = SalomeApp_Application::orb()->string_to_object
3161 ( IOR.toLatin1().constData() );
3162 if ( !CORBA::is_nil( corbaObj ) )
3163 geomObj = GEOM::GEOM_Object::_narrow( corbaObj );
3165 return geomObj._retn();
3169 \brief Returns IOR of the object.
3171 This is a static method. It returns the object's IOR.
3173 \param object the GEOM object.
3174 \return object's IOR.
3176 QString GeometryGUI::GetIORFromObject( GEOM::GEOM_Object_ptr object )
3179 if ( !CORBA::is_nil( object ) ) {
3180 CORBA::String_var anIOR =
3181 SalomeApp_Application::orb()->object_to_string( object );
3188 \brief Check if this object is can't be renamed in place
3190 This method can be re-implemented in the subclasses.
3191 Return true in case if object isn't reference or component (module root).
3193 \param entry column id
3194 \return \c true if the item can be renamed by the user in place (e.g. in the Object browser)
3196 bool GeometryGUI::renameAllowed( const QString& entry) const {
3198 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
3199 SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
3200 SalomeApp_DataObject* obj = appStudy ? dynamic_cast<SalomeApp_DataObject*>(appStudy->findObjectByEntry(entry)) : 0;
3202 return (app && appStudy && obj && !appStudy->isComponent(entry) && !obj->isReference());
3206 Rename object by entry.
3207 \param entry entry of the object
3208 \param name new name of the object
3209 \brief Return \c true if rename operation finished successfully, \c false otherwise.
3211 bool GeometryGUI::renameObject( const QString& entry, const QString& name)
3213 bool result = false;
3215 SalomeApp_Application* app =
3216 dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication());
3217 SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
3222 _PTR(Study) aStudy = appStudy->studyDS();
3227 bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
3229 SUIT_MessageBox::warning ( app->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
3233 _PTR(SObject) obj ( aStudy->FindObjectID(qPrintable(entry)) );
3234 _PTR(GenericAttribute) anAttr;
3236 if ( obj->FindAttribute(anAttr, "AttributeName") ) {
3237 _PTR(AttributeName) aName (anAttr);
3239 aName->SetValue( name.toLatin1().data() ); // rename the SObject
3240 GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(obj));
3241 if (!CORBA::is_nil(anObj)) {
3242 anObj->SetName( name.toLatin1().data() ); // Rename the corresponding GEOM_Object
3250 void GeometryGUI::updateMaterials()
3252 LightApp_Preferences* pref = preferences();
3254 QStringList materials = Material_ResourceMgr::resourceMgr()->materials();
3255 QString currentMaterial = SUIT_Session::session()->resourceMgr()->stringValue( "Geometry", "material" );
3256 if ( !materials.contains( currentMaterial ) )
3257 // user material set as default in the preferences, might be removed
3258 SUIT_Session::session()->resourceMgr()->setValue( "Geometry", "material", QString( "Plastic" ) );
3260 QtxPreferenceItem* prefItem = pref->rootItem()->findItem( tr( "PREF_MATERIAL" ), true );
3262 setPreferenceProperty( prefItem->id(),
3263 "strings", materials );
3264 prefItem->retrieve();
3270 \brief Check if the module allows "drag" operation of its objects.
3272 Overloaded from LightApp_Module class.
3274 This function is a part of the general drag-n-drop mechanism.
3275 The goal of this function is to check data object passed as a parameter
3276 and decide if it can be dragged or no.
3278 \param what data object being tested for drag operation
3279 \return \c true if module allows dragging of the specified object
3280 \sa isDropAccepted(), dropObjects()
3282 bool GeometryGUI::isDraggable( const SUIT_DataObject* what ) const
3284 // we allow dragging object under root and object from folder
3285 int aLevel = what->level();
3286 bool anObjectInFolder = false;
3288 const SalomeApp_DataObject* dataObj = dynamic_cast<const SalomeApp_DataObject*>( what );
3290 _PTR(SObject) aSO = dataObj->object();
3292 _PTR(GenericAttribute) anAttr;
3293 _PTR(SObject) aFatherSO = aSO->GetStudy()->GetUseCaseBuilder()->GetFather( aSO );
3294 if ( aFatherSO && aFatherSO->FindAttribute(anAttr, "AttributeLocalID") ) {
3295 _PTR(AttributeLocalID) aLocalID( anAttr );
3296 anObjectInFolder = aLocalID->Value() == 999;
3301 return aLevel == 2 || anObjectInFolder;
3305 \brief Check if the module allows "drop" operation on the given object.
3307 Overloaded from LightApp_Module class.
3309 This function is a part of the general drag-n-drop mechanism.
3310 The goal of this function is to check data object passed as a parameter
3311 and decide if it can be used as a target for the "drop" operation.
3312 The processing of the drop operation itself is done in the dropObjects() function.
3314 \param where target data object
3315 \return \c true if module supports dropping on the \a where data object
3316 \sa isDraggable(), dropObjects()
3318 bool GeometryGUI::isDropAccepted( const SUIT_DataObject* where ) const
3320 // we allow dropping into folder and top-level GEOM object
3321 int aLevel = where->level();
3322 bool isFolder = false;
3324 const SalomeApp_DataObject* dataObj = dynamic_cast<const SalomeApp_DataObject*>( where );
3326 _PTR(SObject) aSO = dataObj->object();
3328 _PTR(GenericAttribute) anAttr;
3329 if ( aSO->FindAttribute(anAttr, "AttributeLocalID") ) {
3330 _PTR(AttributeLocalID) aLocalID( anAttr );
3331 isFolder = aLocalID->Value() == 999;
3336 return aLevel == 1 || isFolder;
3340 \brief Complete drag-n-drop operation.
3342 Overloaded from LightApp_Module class.
3344 This function is a part of the general drag-n-drop mechanism.
3345 Its goal is to handle dropping of the objects being dragged according
3346 to the chosen operation (move). The dropping is performed in the
3347 context of the parent data object \a where and the \a row (position in the
3348 children index) at which the data should be dropped. If \a row is equal to -1,
3349 this means that objects are added to the end of the children list.
3351 \param what objects being dropped
3352 \param where target data object
3353 \param row child index at which the drop operation is performed
3354 \param action drag-n-drop operation (Qt::DropAction) - move
3356 \sa isDraggable(), isDropAccepted()
3358 void GeometryGUI::dropObjects( const DataObjectList& what, SUIT_DataObject* where,
3359 const int row, Qt::DropAction action )
3361 if (action != Qt::CopyAction && action != Qt::MoveAction)
3362 return; // unsupported action
3364 // get parent object
3365 SalomeApp_DataObject* dataObj = dynamic_cast<SalomeApp_DataObject*>( where );
3366 if ( !dataObj ) return; // wrong parent
3367 _PTR(SObject) parentObj = dataObj->object();
3369 // Find the current Study and StudyBuilder
3370 _PTR(Study) aStudy = parentObj->GetStudy();
3371 _PTR(UseCaseBuilder) aUseCaseBuilder = aStudy->GetUseCaseBuilder();
3372 // collect all parents of the target node
3373 QStringList parentIDs;
3374 _PTR(SObject) parent = parentObj;
3375 while( !parent->IsNull() ) {
3376 parentIDs << parent->GetID().c_str();
3377 parent = aUseCaseBuilder->GetFather(parent);
3380 // collect objects being dropped
3381 GEOM::object_list_var objects = new GEOM::object_list();
3382 objects->length( what.count() );
3384 for ( int i = 0; i < what.count(); i++ ) {
3385 dataObj = dynamic_cast<SalomeApp_DataObject*>( what[i] );
3386 if ( !dataObj ) continue; // skip wrong objects
3387 _PTR(SObject) sobj = dataObj->object();
3388 // check that dropped object is not a parent of target object
3389 if ( parentIDs.contains( sobj->GetID().c_str() ) ) {
3390 return; // it's not allowed to move node into it's child
3392 objects[i] = _CAST(SObject, sobj)->GetSObject();
3395 objects->length( count );
3397 // call engine function
3398 GetGeomGen()->Move( objects.in(), // what
3399 _CAST(SObject, parentObj)->GetSObject(), // where
3402 // update Object browser
3403 getApp()->updateObjectBrowser( false );