1 // Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // File : GeometryGUI.cxx
23 // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
25 #include <Standard_math.hxx> // E.A. must be included before Python.h to fix compilation on windows
27 #undef HAVE_FINITE // VSR: avoid compilation warning on Linux : "HAVE_FINITE" redefined
30 #include "GeometryGUI.h"
31 #include "GeometryGUI_Operations.h"
32 #include "GEOMPluginGUI.h"
33 #include "GEOMGUI_XmlHandler.h"
34 #include "GEOMGUI_OCCSelector.h"
35 #include "GEOMGUI_Selection.h"
36 #include "GEOMGUI_CreationInfoWdg.h"
37 #include "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() ) );
229 //=======================================================================
230 // function : GeometryGUI::~GeometryGUI()
231 // purpose : Destructor
232 //=======================================================================
233 GeometryGUI::~GeometryGUI()
235 while (!myOCCSelectors.isEmpty())
236 delete myOCCSelectors.takeFirst();
238 while (!myVTKSelectors.isEmpty())
239 delete myVTKSelectors.takeFirst();
241 qDeleteAll(myGUIMap);
244 //=======================================================================
245 // function : GeometryGUI::getLibrary()
246 // purpose : get or load GUI library by name [ internal ]
247 //=======================================================================
248 typedef GEOMGUI* (*LibraryGUI)( GeometryGUI* );
249 GEOMGUI* GeometryGUI::getLibrary( const QString& libraryName )
251 if ( !myGUIMap.contains( libraryName ) ) {
252 // try to load library if it is not loaded yet
254 QString dirs = getenv( "LD_LIBRARY_PATH" );
257 QString dirs = getenv( "PATH" );
260 if ( !dirs.isEmpty() ) {
261 QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries
262 QListIterator<QString> it( dirList ); it.toBack();
263 while ( it.hasPrevious() ) {
264 QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName );
266 OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() );
267 bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY );
269 MESSAGE( "Can't open library : " << aSharedLibrary.DlError() );
270 continue; // continue search further
272 OSD_Function osdF = aSharedLibrary.DlSymb( "GetLibGUI" );
273 if ( osdF != NULL ) {
274 LibraryGUI func = (GEOMGUI* (*) (GeometryGUI*))osdF;
275 GEOMGUI* libGUI = (*func)( this );
277 myGUIMap[ libraryName ] = libGUI;
278 break; // found and loaded!
285 return myGUIMap.contains( libraryName ) ? myGUIMap[ libraryName ] : 0;
288 //=======================================================================
289 // function : GeometryGUI::getPluginLibrary()
290 // purpose : get or load GUI Plugin library by name [ internal ]
291 //=======================================================================
292 typedef GEOMPluginGUI* (*PluginLibraryGUI)( GeometryGUI* );
293 GEOMPluginGUI* GeometryGUI::getPluginLibrary( const QString& libraryName )
295 if ( !myGUIMap.contains( libraryName ) ) {
296 // try to load library if it is not loaded yet
298 QString dirs = getenv( "LD_LIBRARY_PATH" );
301 QString dirs = getenv( "PATH" );
304 if ( !dirs.isEmpty() ) {
305 QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries
306 QListIterator<QString> it( dirList ); it.toBack();
307 while ( it.hasPrevious() ) {
308 QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName );
310 OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() );
311 bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY );
313 MESSAGE( "Can't open library : " << aSharedLibrary.DlError() );
314 continue; // continue search further
316 OSD_Function osdF = aSharedLibrary.DlSymb( "GetLibGUI" );
317 if ( osdF != NULL ) {
318 PluginLibraryGUI func = (GEOMPluginGUI* (*) (GeometryGUI*))osdF;
319 GEOMPluginGUI* libGUI = (*func)( this );
321 myGUIMap[ libraryName ] = libGUI;
322 break; // found and loaded!
329 return myGUIMap.contains( libraryName ) ? (GEOMPluginGUI*)myGUIMap[ libraryName ] : 0;
332 //=======================================================================
333 // function : GeometryGUI::ActiveWorkingPlane()
334 // purpose : Activate Working Plane View
335 //=======================================================================
336 void GeometryGUI::ActiveWorkingPlane()
338 gp_Dir DZ = myWorkingPlane.Direction();
339 gp_Dir DY = myWorkingPlane.YDirection();
341 SUIT_ViewWindow* window = application()->desktop()->activeWindow();
342 bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
343 bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
346 OCCViewer_ViewWindow* vw = dynamic_cast<OCCViewer_ViewWindow*>( window );
348 Handle(V3d_View) view3d = vw->getViewPort()->getView();
350 view3d->SetProj(DZ.X(), DZ.Y(), DZ.Z());
351 view3d->SetUp(DY.X(), DY.Y(), DY.Z());
355 else if ( ViewVTK ) {
356 SVTK_ViewWindow* vw = dynamic_cast<SVTK_ViewWindow*>( window );
358 vtkCamera* camera = vw->getRenderer()->GetActiveCamera();
360 camera->SetPosition(DZ.X(), DZ.Y(), DZ.Z());
361 camera->SetViewUp(DY.X(), DY.Y(), DY.Z());
362 camera->SetFocalPoint(0,0,0);
369 //=======================================================================
370 // function : GeometryGUI::SetActiveDialogBox()
371 // purpose : Set active dialog box
372 //=======================================================================
373 void GeometryGUI::SetActiveDialogBox( QDialog* aDlg )
375 myActiveDialogBox = (QDialog*)aDlg;
378 //=======================================================================
379 // function : GeometryGUI::EmitSignalDeactivateDialog()
380 // purpose : Emit a signal to deactivate the active dialog Box
381 //=======================================================================
382 void GeometryGUI::EmitSignalDeactivateDialog()
384 emit SignalDeactivateActiveDialog();
387 //=======================================================================
388 // function : GeometryGUI::EmitSignalCloseAllDialogs()
389 // purpose : Emit a signal to close all non modal dialogs box
390 //=======================================================================
391 void GeometryGUI::EmitSignalCloseAllDialogs()
393 emit SignalCloseAllDialogs();
396 //=======================================================================
397 // function : GeometryGUI::EmitSignalDefaultStepValueChanged()
398 // purpose : Emit a signal to inform that default real spin box step has
400 //=======================================================================
401 void GeometryGUI::EmitSignalDefaultStepValueChanged(double newVal)
403 emit SignalDefaultStepValueChanged(newVal);
406 //=======================================================================
407 // function : GeometryGUI::OnGUIEvent()
408 // purpose : common slot for all menu/toolbar actions
409 //=======================================================================
410 void GeometryGUI::OnGUIEvent()
412 const QObject* obj = sender();
413 if ( !obj || !obj->inherits( "QAction" ) )
415 int id = actionId((QAction*)obj);
420 //=======================================================================
421 // function : GeometryGUI::OnGUIEvent()
422 // purpose : manage all events on GUI [static]
423 //=======================================================================
424 void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
426 SUIT_Application* anApp = application();
428 SUIT_Desktop* desk = anApp->desktop();
430 // check type of the active viewframe
431 SUIT_ViewWindow* window = desk->activeWindow();
432 bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
433 bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
434 // if current viewframe is not of OCC and not of VTK type - return immediately
435 // fix for IPAL8958 - allow some commands to execute even when NO viewer is active (rename for example)
436 QList<int> NotViewerDependentCommands;
437 NotViewerDependentCommands << GEOMOp::OpDelete
439 << GEOMOp::OpShowOnly
440 << GEOMOp::OpShowOnlyChildren
441 << GEOMOp::OpDiscloseChildren
442 << GEOMOp::OpConcealChildren
443 << GEOMOp::OpUnpublishObject
444 << GEOMOp::OpPublishObject
445 << GEOMOp::OpPointMarker
446 << GEOMOp::OpCreateFolder
447 << GEOMOp::OpSortChildren;
448 if ( !ViewOCC && !ViewVTK && !NotViewerDependentCommands.contains( id ) ) {
449 // activate OCC viewer
450 getApp()->getViewManager(OCCViewer_Viewer::Type(), /*create=*/true);
453 // fix for IPAL9103, point 2
454 if ( CORBA::is_nil( GetGeomGen() ) ) {
455 SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_GET_ENGINE" ), tr( "GEOM_BUT_OK" ) );
460 // find corresponding GUI library
462 case GEOMOp::OpOriginAndVectors: // MENU BASIC - ORIGIN AND BASE VECTORS
463 createOriginAndBaseVectors(); // internal operation
465 case GEOMOp::OpImport: // MENU FILE - IMPORT
466 case GEOMOp::OpExport: // MENU FILE - EXPORT
467 case GEOMOp::OpSelectVertex: // POPUP MENU - SELECT ONLY - VERTEX
468 case GEOMOp::OpSelectEdge: // POPUP MENU - SELECT ONLY - EDGE
469 case GEOMOp::OpSelectWire: // POPUP MENU - SELECT ONLY - WIRE
470 case GEOMOp::OpSelectFace: // POPUP MENU - SELECT ONLY - FACE
471 case GEOMOp::OpSelectShell: // POPUP MENU - SELECT ONLY - SHELL
472 case GEOMOp::OpSelectSolid: // POPUP MENU - SELECT ONLY - SOLID
473 case GEOMOp::OpSelectCompound: // POPUP MENU - SELECT ONLY - COMPOUND
474 case GEOMOp::OpSelectAll: // POPUP MENU - SELECT ONLY - SELECT ALL
475 case GEOMOp::OpDelete: // MENU EDIT - DELETE
476 case GEOMOp::OpCheckGeom: // MENU TOOLS - CHECK GEOMETRY
477 case GEOMOp::OpMaterialsLibrary: // MENU TOOLS - MATERIALS LIBRARY
478 case GEOMOp::OpDeflection: // POPUP MENU - DEFLECTION COEFFICIENT
479 case GEOMOp::OpColor: // POPUP MENU - COLOR
480 case GEOMOp::OpSetTexture: // POPUP MENU - SETTEXTURE
481 case GEOMOp::OpTransparency: // POPUP MENU - TRANSPARENCY
482 case GEOMOp::OpIncrTransparency: // SHORTCUT - INCREASE TRANSPARENCY
483 case GEOMOp::OpDecrTransparency: // SHORTCUT - DECREASE TRANSPARENCY
484 case GEOMOp::OpIsos: // POPUP MENU - ISOS
485 case GEOMOp::OpIncrNbIsos: // SHORTCUT - INCREASE NB ISOS
486 case GEOMOp::OpDecrNbIsos: // SHORTCUT - DECREASE NB ISOS
487 case GEOMOp::OpAutoColor: // POPUP MENU - AUTO COLOR
488 case GEOMOp::OpNoAutoColor: // POPUP MENU - DISABLE AUTO COLOR
489 case GEOMOp::OpDiscloseChildren: // POPUP MENU - DISCLOSE CHILD ITEMS
490 case GEOMOp::OpConcealChildren: // POPUP MENU - CONCEAL CHILD ITEMS
491 case GEOMOp::OpUnpublishObject: // POPUP MENU - UNPUBLISH
492 case GEOMOp::OpPublishObject: // ROOT GEOM OBJECT - POPUP MENU - PUBLISH
493 case GEOMOp::OpPointMarker: // POPUP MENU - POINT MARKER
494 case GEOMOp::OpMaterialProperties: // POPUP MENU - MATERIAL PROPERTIES
495 case GEOMOp::OpPredefMaterial: // POPUP MENU - <SOME MATERIAL>
496 case GEOMOp::OpPredefMaterCustom: // POPUP MENU - MATERIAL PROPERTIES - CUSTOM...
497 case GEOMOp::OpEdgeWidth: // POPUP MENU - LINE WIDTH - EDGE WIDTH
498 case GEOMOp::OpIsosWidth: // POPUP MENU - LINE WIDTH - ISOS WIDTH
499 case GEOMOp::OpBringToFront: // POPUP MENU - BRING TO FRONT
500 case GEOMOp::OpClsBringToFront: //
501 case GEOMOp::OpCreateFolder: // POPUP MENU - CREATE FOLDER
502 case GEOMOp::OpSortChildren: // POPUP MENU - SORT CHILD ITEMS
503 libName = "GEOMToolsGUI";
505 case GEOMOp::OpDMWireframe: // MENU VIEW - WIREFRAME
506 case GEOMOp::OpDMShading: // MENU VIEW - SHADING
507 case GEOMOp::OpDMShadingWithEdges: // MENU VIEW - SHADING
508 case GEOMOp::OpDMTexture: // MENU VIEW - TEXTURE
509 case GEOMOp::OpShowAll: // MENU VIEW - SHOW ALL
510 case GEOMOp::OpShowOnly: // MENU VIEW - DISPLAY ONLY
511 case GEOMOp::OpShowOnlyChildren: // MENU VIEW - SHOW ONLY CHILDREN
512 case GEOMOp::OpHideAll: // MENU VIEW - ERASE ALL
513 case GEOMOp::OpHide: // MENU VIEW - ERASE
514 case GEOMOp::OpShow: // MENU VIEW - DISPLAY
515 case GEOMOp::OpSwitchVectors: // MENU VIEW - VECTOR MODE
516 case GEOMOp::OpWireframe: // POPUP MENU - WIREFRAME
517 case GEOMOp::OpShading: // POPUP MENU - SHADING
518 case GEOMOp::OpShadingWithEdges: // POPUP MENU - SHADING WITH EDGES
519 case GEOMOp::OpTexture: // POPUP MENU - TEXTURE
520 case GEOMOp::OpVectors: // POPUP MENU - VECTORS
521 libName = "DisplayGUI";
523 case GEOMOp::OpPoint: // MENU BASIC - POINT
524 case GEOMOp::OpLine: // MENU BASIC - LINE
525 case GEOMOp::OpCircle: // MENU BASIC - CIRCLE
526 case GEOMOp::OpEllipse: // MENU BASIC - ELLIPSE
527 case GEOMOp::OpArc: // MENU BASIC - ARC
528 case GEOMOp::OpVector: // MENU BASIC - VECTOR
529 case GEOMOp::OpPlane: // MENU BASIC - PLANE
530 case GEOMOp::OpCurve: // MENU BASIC - CURVE
531 case GEOMOp::OpLCS: // MENU BASIC - LOCAL COORDINATE SYSTEM
532 libName = "BasicGUI";
534 case GEOMOp::OpBox: // MENU PRIMITIVE - BOX
535 case GEOMOp::OpCylinder: // MENU PRIMITIVE - CYLINDER
536 case GEOMOp::OpSphere: // MENU PRIMITIVE - SPHERE
537 case GEOMOp::OpTorus: // MENU PRIMITIVE - TORUS
538 case GEOMOp::OpCone: // MENU PRIMITIVE - CONE
539 case GEOMOp::OpRectangle: // MENU PRIMITIVE - FACE
540 case GEOMOp::OpDisk: // MENU PRIMITIVE - DISK
541 libName = "PrimitiveGUI";
543 case GEOMOp::OpPrism: // MENU GENERATION - PRISM
544 case GEOMOp::OpRevolution: // MENU GENERATION - REVOLUTION
545 case GEOMOp::OpFilling: // MENU GENERATION - FILLING
546 case GEOMOp::OpPipe: // MENU GENERATION - PIPE
547 case GEOMOp::OpPipePath: // MENU GENERATION - RESTORE PATH
548 libName = "GenerationGUI";
550 case GEOMOp::Op2dSketcher: // MENU ENTITY - SKETCHER
551 case GEOMOp::Op3dSketcher: // MENU ENTITY - 3D SKETCHER
552 case GEOMOp::OpIsoline: // MENU BASIC - ISOLINE
553 case GEOMOp::OpExplode: // MENU ENTITY - EXPLODE
555 case GEOMOp::OpFeatureDetect: // MENU ENTITY - FEATURE DETECTION
557 case GEOMOp::OpPictureImport: // MENU ENTITY - IMPORT PICTURE IN VIEWER
558 case GEOMOp::OpCreateField: // MENU FIELD - CREATE FIELD
559 case GEOMOp::OpEditField: // MENU FIELD - EDIT FIELD
560 case GEOMOp::OpEditFieldPopup: // POPUP MENU - EDIT FIELD
561 libName = "EntityGUI";
563 case GEOMOp::OpEdge: // MENU BUILD - EDGE
564 case GEOMOp::OpWire: // MENU BUILD - WIRE
565 case GEOMOp::OpFace: // MENU BUILD - FACE
566 case GEOMOp::OpShell: // MENU BUILD - SHELL
567 case GEOMOp::OpSolid: // MENU BUILD - SOLID
568 case GEOMOp::OpCompound: // MENU BUILD - COMPUND
569 libName = "BuildGUI";
571 case GEOMOp::OpFuse: // MENU BOOLEAN - FUSE
572 case GEOMOp::OpCommon: // MENU BOOLEAN - COMMON
573 case GEOMOp::OpCut: // MENU BOOLEAN - CUT
574 case GEOMOp::OpSection: // MENU BOOLEAN - SECTION
575 libName = "BooleanGUI";
577 case GEOMOp::OpTranslate: // MENU TRANSFORMATION - TRANSLATION
578 case GEOMOp::OpRotate: // MENU TRANSFORMATION - ROTATION
579 case GEOMOp::OpChangeLoc: // MENU TRANSFORMATION - LOCATION
580 case GEOMOp::OpMirror: // MENU TRANSFORMATION - MIRROR
581 case GEOMOp::OpScale: // MENU TRANSFORMATION - SCALE
582 case GEOMOp::OpOffset: // MENU TRANSFORMATION - OFFSET
583 case GEOMOp::OpProjection: // MENU TRANSFORMATION - PROJECTION
584 case GEOMOp::OpMultiTranslate: // MENU TRANSFORMATION - MULTI-TRANSLATION
585 case GEOMOp::OpMultiRotate: // MENU TRANSFORMATION - MULTI-ROTATION
586 case GEOMOp::OpReimport: // CONTEXT(POPUP) MENU - RELOAD_IMPORTED
587 libName = "TransformationGUI";
589 case GEOMOp::OpPartition: // MENU OPERATION - PARTITION
590 case GEOMOp::OpArchimede: // MENU OPERATION - ARCHIMEDE
591 case GEOMOp::OpFillet3d: // MENU OPERATION - FILLET
592 case GEOMOp::OpChamfer: // MENU OPERATION - CHAMFER
593 case GEOMOp::OpClipping: // MENU OPERATION - CLIPPING RANGE
594 case GEOMOp::OpShapesOnShape: // MENU OPERATION - GET SHAPES ON SHAPE
595 case GEOMOp::OpFillet2d: // MENU OPERATION - FILLET 2D
596 case GEOMOp::OpFillet1d: // MENU OPERATION - FILLET 1D
597 case GEOMOp::OpSharedShapes: // MENU OPERATION - GET SHARED SHAPES
598 case GEOMOp::OpExtrudedBoss: // MENU OPERATION - EXTRUDED BOSS
599 case GEOMOp::OpExtrudedCut: // MENU OPERATION - EXTRUDED CUT
600 #ifdef DEBUG_CURVE_CREATOR
601 // for debug purposes, to be removed
602 case GEOMOp::OpCurveCreator: // MENU OPERATION - CURVE CREATOR
604 libName = "OperationGUI";
606 case GEOMOp::OpSewing: // MENU REPAIR - SEWING
607 case GEOMOp::OpSuppressFaces: // MENU REPAIR - SUPPRESS FACES
608 case GEOMOp::OpSuppressHoles: // MENU REPAIR - SUPPRESS HOLE
609 case GEOMOp::OpShapeProcess: // MENU REPAIR - SHAPE PROCESSING
610 case GEOMOp::OpCloseContour: // MENU REPAIR - CLOSE CONTOUR
611 case GEOMOp::OpRemoveIntWires: // MENU REPAIR - REMOVE INTERNAL WIRES
612 case GEOMOp::OpAddPointOnEdge: // MENU REPAIR - ADD POINT ON EDGE
613 case GEOMOp::OpFreeBoundaries: // MENU MEASURE - FREE BOUNDARIES
614 case GEOMOp::OpFreeFaces: // MENU MEASURE - FREE FACES
615 case GEOMOp::OpOrientation: // MENU REPAIR - CHANGE ORIENTATION
616 case GEOMOp::OpGlueFaces: // MENU REPAIR - GLUE FACES
617 case GEOMOp::OpGlueEdges: // MENU REPAIR - GLUE EDGES
618 case GEOMOp::OpLimitTolerance: // MENU REPAIR - LIMIT TOLERANCE
619 case GEOMOp::OpRemoveWebs: // MENU REPAIR - REMOVE INTERNAL FACES
620 case GEOMOp::OpRemoveExtraEdges: // MENU REPAIR - REMOVE EXTRA EDGES
621 case GEOMOp::OpFuseEdges: // MENU REPAIR - FUSE COLLINEAR EDGES
622 case GEOMOp::OpUnionFaces: // MENU REPAIR - UNION FACES
623 libName = "RepairGUI";
625 case GEOMOp::OpProperties: // MENU MEASURE - PROPERTIES
626 case GEOMOp::OpCenterMass: // MENU MEASURE - CDG
627 case GEOMOp::OpInertia: // MENU MEASURE - INERTIA
628 case GEOMOp::OpNormale: // MENU MEASURE - NORMALE
629 case GEOMOp::OpBoundingBox: // MENU MEASURE - BOUNDING BOX
630 case GEOMOp::OpMinDistance: // MENU MEASURE - MIN DISTANCE
631 case GEOMOp::OpAngle: // MENU MEASURE - ANGLE
632 case GEOMOp::OpTolerance: // MENU MEASURE - TOLERANCE
633 case GEOMOp::OpWhatIs: // MENU MEASURE - WHATIS
634 case GEOMOp::OpCheckShape: // MENU MEASURE - CHECK
635 case GEOMOp::OpCheckCompound: // MENU MEASURE - CHECK COMPOUND OF BLOCKS
636 case GEOMOp::OpGetNonBlocks: // MENU MEASURE - Get NON BLOCKS
637 case GEOMOp::OpPointCoordinates: // MENU MEASURE - POINT COORDINATES
638 case GEOMOp::OpCheckSelfInters: // MENU MEASURE - CHECK SELF INTERSECTIONS
639 case GEOMOp::OpManageDimensions: // MENU MEASURE - MANAGE DIMENSIONS
640 case GEOMOp::OpShowAllDimensions: // POPUP MENU - SHOW ALL DIMENSIONS
641 case GEOMOp::OpHideAllDimensions: // POPUP MENU - HIDE ALL DIMENSIONS
642 libName = "MeasureGUI";
644 case GEOMOp::OpGroupCreate: // MENU GROUP - CREATE
645 case GEOMOp::OpGroupCreatePopup: // POPUP MENU - CREATE GROUP
646 case GEOMOp::OpGroupEdit: // MENU GROUP - EDIT
647 case GEOMOp::OpGroupUnion: // MENU GROUP - UNION
648 case GEOMOp::OpGroupIntersect: // MENU GROUP - INTERSECT
649 case GEOMOp::OpGroupCut: // MENU GROUP - CUT
650 libName = "GroupGUI";
652 case GEOMOp::OpHexaSolid: // MENU BLOCKS - HEXAHEDRAL SOLID
653 case GEOMOp::OpMultiTransform: // MENU BLOCKS - MULTI-TRANSFORMATION
654 case GEOMOp::OpQuadFace: // MENU BLOCKS - QUADRANGLE FACE
655 case GEOMOp::OpPropagate: // MENU BLOCKS - PROPAGATE
656 case GEOMOp::OpExplodeBlock: // MENU BLOCKS - EXPLODE ON BLOCKS
657 libName = "BlocksGUI";
659 case GEOMOp::OpExportXAO: // MENU NEW ENTITY - IMPORTEXPORT - EXPORTXAO
660 case GEOMOp::OpImportXAO: // MENU NEW ENTITY - IMPORTEXPORT - IMPORTXAO
661 libName = "ImportExportGUI";
663 //case GEOMOp::OpAdvancedNoOp: // NO OPERATION (advanced operations base)
664 //case GEOMOp::OpPipeTShape: // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE
665 //case GEOMOp::OpPipeTShapeGroups: // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS
666 //case GEOMOp::OpDividedDisk: // MENU NEW ENTITY - ADVANCED - DIVIDEDDISK
667 //case GEOMOp::OpDividedCylinder: // MENU NEW ENTITY - ADVANCED - DIVIDEDCYLINDER
668 //case GEOMOp::OpSmoothingSurface: // MENU NEW ENTITY - ADVANCED - SMOOTHINGSURFACE
669 //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@//
670 //libName = "AdvancedGUI";
673 if (myPluginActions.contains(id)) {
674 libName = myPluginActions[id].first;
676 GEOMPluginGUI* library = 0;
677 if ( !libName.isEmpty() ) {
679 libName = QString( "lib" ) + libName + ".so";
681 libName = libName + ".dll";
683 library = getPluginLibrary( libName );
686 // call method of corresponding GUI library
688 //QString action ("%1");
689 //action = action.arg(id);
691 //if( !theParam.isValid() )
692 library->OnGUIEvent( myPluginActions[id].second, desk );
694 // library->OnGUIEvent( id, desk, theParam);
697 SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) );
699 updateCreationInfo();
705 GEOMGUI* library = 0;
706 if ( !libName.isEmpty() ) {
708 libName = QString( "lib" ) + libName + ".so";
710 libName = libName + ".dll";
712 library = getLibrary( libName );
715 // call method of corresponding GUI library
717 if( !theParam.isValid() )
718 library->OnGUIEvent( id, desk );
720 library->OnGUIEvent( id, desk, theParam);
723 SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) );
725 updateCreationInfo();
728 //=================================================================================
729 // function : GeometryGUI::activateOperation()
731 //=================================================================================
732 bool GeometryGUI::activateOperation( int actionId )
734 OnGUIEvent(actionId);
738 //=================================================================================
739 // function : GeometryGUI::activateOperation()
741 //=================================================================================
742 bool GeometryGUI::activateOperation( const QString& actionId )
746 int id = actionId.toInt(&isOk);
753 //=================================================================================
754 // function : GeometryGUI::activateOperation()
756 //=================================================================================
757 bool GeometryGUI::activateOperation( const QString& actionId, const QString& plugin )
761 QString pluginLib = plugin;
762 // TODO: if <plugin> is a plugin name, find plugin library name
763 if (myPluginLibs.contains(plugin))
764 pluginLib = myPluginLibs[plugin];
766 QMap<int, PluginAction>::iterator actionsIter = myPluginActions.begin();
767 for (; actionsIter != myPluginActions.end(); ++actionsIter) {
768 const PluginAction& anAction = actionsIter.value();
769 if (anAction.first == pluginLib && anAction.second == actionId) {
770 // activate operation
771 OnGUIEvent(actionsIter.key());
779 //=================================================================================
780 // function : GeometryGUI::OnKeyPress()
781 // purpose : Called when any key is pressed by user [static]
782 //=================================================================================
783 void GeometryGUI::OnKeyPress( SUIT_ViewWindow* w, QKeyEvent* e )
785 if ( !application() )
787 foreach ( GEOMGUI* lib, myGUIMap )
788 lib->OnKeyPress( e, application()->desktop(), w );
791 //=================================================================================
792 // function : GeometryGUI::OnMouseMove()
793 // purpose : Manages mouse move events [static]
794 //=================================================================================
795 void GeometryGUI::OnMouseMove( SUIT_ViewWindow* w, QMouseEvent* e )
797 if ( !application() )
799 foreach ( GEOMGUI* lib, myGUIMap )
800 lib->OnMouseMove( e, application()->desktop(), w );
803 //=================================================================================
804 // function : GeometryGUI::OnMouseRelease()
805 // purpose : Manages mouse release events [static]
806 //=================================================================================
807 void GeometryGUI::OnMouseRelease( SUIT_ViewWindow* w, QMouseEvent* e )
809 if ( !application() )
811 foreach ( GEOMGUI* lib, myGUIMap )
812 lib->OnMouseRelease( e, application()->desktop(), w );
815 //=================================================================================
816 // function : GeometryGUI::OnMousePress()
817 // purpose : Manage mouse press events [static]
818 //=================================================================================
819 void GeometryGUI::OnMousePress( SUIT_ViewWindow* w, QMouseEvent* e )
821 if ( !application() )
823 foreach ( GEOMGUI* lib, myGUIMap )
824 lib->OnMousePress( e, application()->desktop(), w );
827 //=======================================================================
828 // function : createGeomAction
830 //=======================================================================
831 void GeometryGUI::createGeomAction( const int id, const QString& label, const QString& icolabel,
832 const int accel, const bool toggle, const QString& shortcutAction )
834 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
835 QPixmap icon = icolabel.isEmpty() ? resMgr->loadPixmap( "GEOM", tr( (QString( "ICO_" )+label).toLatin1().constData() ), false )
836 : resMgr->loadPixmap( "GEOM", tr( icolabel.toLatin1().constData() ) );
838 tr( QString( "TOP_%1" ).arg( label ).toLatin1().constData() ),
840 tr( QString( "MEN_%1" ).arg( label ).toLatin1().constData() ),
841 tr( QString( "STB_%1" ).arg( label ).toLatin1().constData() ),
843 application()->desktop(),
845 this, SLOT( OnGUIEvent() ),
849 //=======================================================================
850 // function : createOriginAndBaseVectors
852 //=======================================================================
853 void GeometryGUI::createOriginAndBaseVectors()
855 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
856 bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
858 SUIT_MessageBox::warning ( application()->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
862 _PTR(Study) studyDS = appStudy->studyDS();
863 if ( studyDS && !CORBA::is_nil( GetGeomGen() ) ) {
864 GEOM::GEOM_IBasicOperations_var aBasicOperations = GetGeomGen()->GetIBasicOperations( studyDS->StudyId() );
865 if ( !aBasicOperations->_is_nil() ) {
866 SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
867 double aLength = aResourceMgr->doubleValue( "Geometry", "base_vectors_length", 1.0 );
868 GEOM::GEOM_Object_var anOrigin = aBasicOperations->MakePointXYZ( 0.0, 0.0, 0.0 );
869 GEOM::GEOM_Object_var anOX = aBasicOperations->MakeVectorDXDYDZ( aLength, 0.0, 0.0 );
870 GEOM::GEOM_Object_var anOY = aBasicOperations->MakeVectorDXDYDZ( 0.0, aLength, 0.0 );
871 GEOM::GEOM_Object_var anOZ = aBasicOperations->MakeVectorDXDYDZ( 0.0, 0.0, aLength );
873 SALOMEDS::Study_var aDSStudy = ClientStudyToStudy( studyDS );
874 GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOrigin, "O" );
875 GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOX, "OX" );
876 GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOY, "OY" );
877 GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOZ, "OZ" );
879 getApp()->updateObjectBrowser( true );
885 //=======================================================================
886 // function : GeometryGUI::initialize()
887 // purpose : Called when GEOM module is created
888 //=======================================================================
889 void GeometryGUI::initialize( CAM_Application* app )
891 SalomeApp_Module::initialize( app );
893 // ----- create actions --------------
895 createGeomAction( GEOMOp::OpImport, "IMPORT", "", Qt::ControlModifier + Qt::Key_I );
896 createGeomAction( GEOMOp::OpExport, "EXPORT", "", Qt::ControlModifier + Qt::Key_E );
898 createGeomAction( GEOMOp::OpDelete, "DELETE", "", Qt::Key_Delete );
900 createGeomAction( GEOMOp::OpPoint, "POINT" );
901 createGeomAction( GEOMOp::OpLine, "LINE" );
902 createGeomAction( GEOMOp::OpCircle, "CIRCLE" );
903 createGeomAction( GEOMOp::OpEllipse, "ELLIPSE" );
904 createGeomAction( GEOMOp::OpArc, "ARC" );
905 createGeomAction( GEOMOp::OpCurve, "CURVE" );
906 createGeomAction( GEOMOp::OpIsoline, "ISOLINE" );
907 createGeomAction( GEOMOp::OpVector, "VECTOR" );
908 createGeomAction( GEOMOp::OpPlane, "PLANE" );
909 createGeomAction( GEOMOp::OpLCS, "LOCAL_CS" );
910 createGeomAction( GEOMOp::OpOriginAndVectors, "ORIGIN_AND_VECTORS" );
912 createGeomAction( GEOMOp::OpBox, "BOX" );
913 createGeomAction( GEOMOp::OpCylinder, "CYLINDER" );
914 createGeomAction( GEOMOp::OpSphere, "SPHERE" );
915 createGeomAction( GEOMOp::OpTorus, "TORUS" );
916 createGeomAction( GEOMOp::OpCone, "CONE" );
917 createGeomAction( GEOMOp::OpRectangle, "RECTANGLE" );
918 createGeomAction( GEOMOp::OpDisk, "DISK" );
920 createGeomAction( GEOMOp::OpPrism, "EXTRUSION" );
921 createGeomAction( GEOMOp::OpRevolution, "REVOLUTION" );
922 createGeomAction( GEOMOp::OpFilling, "FILLING" );
923 createGeomAction( GEOMOp::OpPipe, "PIPE" );
924 createGeomAction( GEOMOp::OpPipePath, "PIPE_PATH" );
926 createGeomAction( GEOMOp::OpGroupCreate, "GROUP_CREATE" );
927 createGeomAction( GEOMOp::OpGroupEdit, "GROUP_EDIT" );
928 createGeomAction( GEOMOp::OpGroupUnion, "GROUP_UNION" );
929 createGeomAction( GEOMOp::OpGroupIntersect, "GROUP_INTERSECT" );
930 createGeomAction( GEOMOp::OpGroupCut, "GROUP_CUT" );
932 createGeomAction( GEOMOp::OpCreateField, "FIELD_CREATE" );
933 createGeomAction( GEOMOp::OpEditField, "FIELD_EDIT" );
935 createGeomAction( GEOMOp::OpReimport, "RELOAD_IMPORTED" );
937 createGeomAction( GEOMOp::OpQuadFace, "Q_FACE" );
938 createGeomAction( GEOMOp::OpHexaSolid, "HEX_SOLID" );
940 createGeomAction( GEOMOp::Op2dSketcher, "SKETCH" );
941 createGeomAction( GEOMOp::Op3dSketcher, "3DSKETCH" );
942 createGeomAction( GEOMOp::OpIsoline, "ISOLINE" );
943 createGeomAction( GEOMOp::OpExplode, "EXPLODE" );
945 createGeomAction( GEOMOp::OpFeatureDetect,"FEATURE_DETECTION" );
947 createGeomAction( GEOMOp::OpPictureImport,"PICTURE_IMPORT" );
949 createGeomAction( GEOMOp::OpEdge, "EDGE" );
950 createGeomAction( GEOMOp::OpWire, "WIRE" );
951 createGeomAction( GEOMOp::OpFace, "FACE" );
952 createGeomAction( GEOMOp::OpShell, "SHELL" );
953 createGeomAction( GEOMOp::OpSolid, "SOLID" );
954 createGeomAction( GEOMOp::OpCompound, "COMPOUND" );
956 createGeomAction( GEOMOp::OpFuse, "FUSE" );
957 createGeomAction( GEOMOp::OpCommon, "COMMON" );
958 createGeomAction( GEOMOp::OpCut, "CUT" );
959 createGeomAction( GEOMOp::OpSection, "SECTION" );
961 createGeomAction( GEOMOp::OpTranslate, "TRANSLATION" );
962 createGeomAction( GEOMOp::OpRotate, "ROTATION" );
963 createGeomAction( GEOMOp::OpChangeLoc, "MODIFY_LOCATION" );
964 createGeomAction( GEOMOp::OpMirror, "MIRROR" );
965 createGeomAction( GEOMOp::OpScale, "SCALE" );
966 createGeomAction( GEOMOp::OpOffset, "OFFSET" );
967 createGeomAction( GEOMOp::OpProjection, "PROJECTION" );
968 createGeomAction( GEOMOp::OpMultiTranslate, "MUL_TRANSLATION" );
969 createGeomAction( GEOMOp::OpMultiRotate, "MUL_ROTATION" );
971 createGeomAction( GEOMOp::OpPartition, "PARTITION" );
972 createGeomAction( GEOMOp::OpArchimede, "ARCHIMEDE" );
973 createGeomAction( GEOMOp::OpFillet3d, "FILLET" );
974 createGeomAction( GEOMOp::OpChamfer, "CHAMFER" );
975 //createGeomAction( GEOMOp::OpClipping, "CLIPPING" );
976 createGeomAction( GEOMOp::OpShapesOnShape, "GET_SHAPES_ON_SHAPE" );
977 createGeomAction( GEOMOp::OpSharedShapes, "GET_SHARED_SHAPES" );
978 createGeomAction( GEOMOp::OpExtrudedCut, "EXTRUDED_CUT" );
979 createGeomAction( GEOMOp::OpExtrudedBoss, "EXTRUDED_BOSS" );
980 #ifdef DEBUG_CURVE_CREATOR
981 // for debug purposes, to be removed
982 createGeomAction( GEOMOp::OpCurveCreator, "CURVE_CREATOR" );
984 createGeomAction( GEOMOp::OpFillet1d, "FILLET_1D" );
985 createGeomAction( GEOMOp::OpFillet2d, "FILLET_2D" );
987 createGeomAction( GEOMOp::OpMultiTransform, "MUL_TRANSFORM" );
988 createGeomAction( GEOMOp::OpExplodeBlock, "EXPLODE_BLOCKS" );
989 createGeomAction( GEOMOp::OpPropagate, "PROPAGATE" );
991 createGeomAction( GEOMOp::OpSewing, "SEWING" );
992 createGeomAction( GEOMOp::OpGlueFaces, "GLUE_FACES" );
993 createGeomAction( GEOMOp::OpGlueEdges, "GLUE_EDGES" );
994 createGeomAction( GEOMOp::OpLimitTolerance, "LIMIT_TOLERANCE" );
995 createGeomAction( GEOMOp::OpSuppressFaces, "SUPPRESS_FACES" );
996 createGeomAction( GEOMOp::OpSuppressHoles, "SUPPERSS_HOLES" );
997 createGeomAction( GEOMOp::OpShapeProcess, "SHAPE_PROCESS" );
998 createGeomAction( GEOMOp::OpCloseContour, "CLOSE_CONTOUR" );
999 createGeomAction( GEOMOp::OpRemoveIntWires, "SUPPRESS_INT_WIRES" );
1000 createGeomAction( GEOMOp::OpAddPointOnEdge, "POINT_ON_EDGE" );
1001 createGeomAction( GEOMOp::OpFreeBoundaries, "CHECK_FREE_BNDS" );
1002 createGeomAction( GEOMOp::OpFreeFaces, "CHECK_FREE_FACES" );
1003 createGeomAction( GEOMOp::OpOrientation, "CHANGE_ORIENTATION" );
1004 createGeomAction( GEOMOp::OpRemoveWebs, "REMOVE_WEBS" );
1005 createGeomAction( GEOMOp::OpRemoveExtraEdges, "REMOVE_EXTRA_EDGES" );
1006 createGeomAction( GEOMOp::OpFuseEdges, "FUSE_EDGES" );
1007 createGeomAction( GEOMOp::OpUnionFaces, "UNION_FACES" );
1009 createGeomAction( GEOMOp::OpPointCoordinates, "POINT_COORDS" );
1010 createGeomAction( GEOMOp::OpProperties, "BASIC_PROPS" );
1011 createGeomAction( GEOMOp::OpCenterMass, "MASS_CENTER" );
1012 createGeomAction( GEOMOp::OpInertia, "INERTIA" );
1013 createGeomAction( GEOMOp::OpNormale, "NORMALE" );
1014 createGeomAction( GEOMOp::OpBoundingBox, "BND_BOX" );
1015 createGeomAction( GEOMOp::OpMinDistance, "MIN_DIST" );
1016 createGeomAction( GEOMOp::OpAngle, "MEASURE_ANGLE" );
1017 createGeomAction( GEOMOp::OpManageDimensions, "MANAGE_DIMENSIONS" );
1019 createGeomAction( GEOMOp::OpTolerance, "TOLERANCE" );
1020 createGeomAction( GEOMOp::OpWhatIs, "WHAT_IS" );
1021 createGeomAction( GEOMOp::OpCheckShape, "CHECK" );
1022 createGeomAction( GEOMOp::OpCheckCompound, "CHECK_COMPOUND" );
1023 createGeomAction( GEOMOp::OpGetNonBlocks, "GET_NON_BLOCKS" );
1024 createGeomAction( GEOMOp::OpCheckSelfInters, "CHECK_SELF_INTERSECTIONS" );
1026 #ifdef _DEBUG_ // PAL16821
1027 createGeomAction( GEOMOp::OpCheckGeom, "CHECK_GEOMETRY" );
1030 createGeomAction( GEOMOp::OpMaterialsLibrary, "MATERIALS_LIBRARY" );
1031 createGeomAction( GEOMOp::OpDMWireframe, "WIREFRAME" );
1032 createGeomAction( GEOMOp::OpDMShading, "SHADING" );
1033 createGeomAction( GEOMOp::OpDMShadingWithEdges, "SHADING_WITH_EDGES" );
1034 createGeomAction( GEOMOp::OpDMTexture, "TEXTURE" );
1035 createGeomAction( GEOMOp::OpShowAll, "DISPLAY_ALL" );
1036 createGeomAction( GEOMOp::OpHideAll, "ERASE_ALL" );
1037 createGeomAction( GEOMOp::OpShow, "DISPLAY" );
1038 createGeomAction( GEOMOp::OpSwitchVectors, "VECTOR_MODE");
1039 createGeomAction( GEOMOp::OpSelectVertex, "VERTEX_SEL_ONLY" ,"", 0, true );
1040 createGeomAction( GEOMOp::OpSelectEdge, "EDGE_SEL_ONLY", "", 0, true );
1041 createGeomAction( GEOMOp::OpSelectWire, "WIRE_SEL_ONLY", "", 0, true );
1042 createGeomAction( GEOMOp::OpSelectFace, "FACE_SEL_ONLY", "", 0, true );
1043 createGeomAction( GEOMOp::OpSelectShell, "SHELL_SEL_ONLY", "", 0, true );
1044 createGeomAction( GEOMOp::OpSelectSolid, "SOLID_SEL_ONLY", "", 0, true );
1045 createGeomAction( GEOMOp::OpSelectCompound, "COMPOUND_SEL_ONLY", "", 0, true );
1046 createGeomAction( GEOMOp::OpSelectAll, "ALL_SEL_ONLY", "", 0, true );
1047 createGeomAction( GEOMOp::OpShowOnly, "DISPLAY_ONLY" );
1048 createGeomAction( GEOMOp::OpShowOnlyChildren, "SHOW_ONLY_CHILDREN" );
1049 createGeomAction( GEOMOp::OpBringToFront, "BRING_TO_FRONT", "", 0, true );
1050 createGeomAction( GEOMOp::OpClsBringToFront, "CLS_BRING_TO_FRONT" );
1051 createGeomAction( GEOMOp::OpHide, "ERASE" );
1053 createGeomAction( GEOMOp::OpWireframe, "POP_WIREFRAME", "", 0, true );
1054 createGeomAction( GEOMOp::OpShading, "POP_SHADING", "", 0, true );
1055 createGeomAction( GEOMOp::OpShadingWithEdges, "POP_SHADING_WITH_EDGES", "", 0, true );
1056 createGeomAction( GEOMOp::OpTexture, "POP_TEXTURE", "", 0, true );
1057 createGeomAction( GEOMOp::OpEdgeWidth, "EDGE_WIDTH");
1058 createGeomAction( GEOMOp::OpIsosWidth, "ISOS_WIDTH");
1059 createGeomAction( GEOMOp::OpVectors, "POP_VECTORS", "", 0, true );
1060 createGeomAction( GEOMOp::OpDeflection, "POP_DEFLECTION" );
1061 createGeomAction( GEOMOp::OpColor, "POP_COLOR" );
1062 createGeomAction( GEOMOp::OpSetTexture, "POP_SETTEXTURE" );
1063 createGeomAction( GEOMOp::OpTransparency, "POP_TRANSPARENCY" );
1064 createGeomAction( GEOMOp::OpIsos, "POP_ISOS" );
1065 createGeomAction( GEOMOp::OpAutoColor, "POP_AUTO_COLOR" );
1066 createGeomAction( GEOMOp::OpNoAutoColor, "POP_DISABLE_AUTO_COLOR" );
1067 createGeomAction( GEOMOp::OpGroupCreatePopup, "POP_CREATE_GROUP" );
1068 createGeomAction( GEOMOp::OpEditFieldPopup, "POP_EDIT_FIELD" );
1069 createGeomAction( GEOMOp::OpDiscloseChildren, "POP_DISCLOSE_CHILDREN" );
1070 createGeomAction( GEOMOp::OpConcealChildren, "POP_CONCEAL_CHILDREN" );
1071 createGeomAction( GEOMOp::OpUnpublishObject, "POP_UNPUBLISH_OBJ" );
1072 createGeomAction( GEOMOp::OpPublishObject, "POP_PUBLISH_OBJ" );
1073 createGeomAction( GEOMOp::OpPointMarker, "POP_POINT_MARKER" );
1074 createGeomAction( GEOMOp::OpMaterialProperties, "POP_MATERIAL_PROPERTIES" );
1075 createGeomAction( GEOMOp::OpPredefMaterCustom, "POP_PREDEF_MATER_CUSTOM" );
1076 createGeomAction( GEOMOp::OpCreateFolder, "POP_CREATE_FOLDER" );
1077 createGeomAction( GEOMOp::OpSortChildren, "POP_SORT_CHILD_ITEMS" );
1078 createGeomAction( GEOMOp::OpShowAllDimensions, "POP_SHOW_ALL_DIMENSIONS" );
1079 createGeomAction( GEOMOp::OpHideAllDimensions, "POP_HIDE_ALL_DIMENSIONS" );
1081 // Create actions for increase/decrease transparency shortcuts
1082 createGeomAction( GEOMOp::OpIncrTransparency, "", "", 0, false,
1083 "Geometry:Increase transparency");
1084 createGeomAction( GEOMOp::OpDecrTransparency, "", "", 0, false,
1085 "Geometry:Decrease transparency");
1087 // Create actions for increase/decrease number of isolines
1088 createGeomAction( GEOMOp::OpIncrNbIsos, "", "", 0, false,
1089 "Geometry:Increase number of isolines");
1090 createGeomAction( GEOMOp::OpDecrNbIsos, "", "", 0, false,
1091 "Geometry:Decrease number of isolines");
1093 // Import/Export XAO
1094 createGeomAction( GEOMOp::OpExportXAO, "EXPORTXAO" );
1095 createGeomAction( GEOMOp::OpImportXAO, "IMPORTXAO" );
1097 //createGeomAction( GEOMOp::OpPipeTShape, "PIPETSHAPE" );
1098 //createGeomAction( GEOMOp::OpDividedDisk, "DIVIDEDDISK" );
1099 //createGeomAction( GEOMOp::OpDividedCylinder, "DIVIDEDCYLINDER" );
1100 //createGeomAction( GEOMOp::OpSmoothingSurface, "SMOOTHINGSURFACE" );
1101 //@@ 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 @@//
1103 // ---- create menus --------------------------
1105 int fileId = createMenu( tr( "MEN_FILE" ), -1, -1 );
1106 createMenu( separator(), fileId, 10 );
1107 createMenu( GEOMOp::OpImport, fileId, 10 );
1108 createMenu( GEOMOp::OpExport, fileId, 10 );
1109 int impexpId = createMenu( tr( "MEN_IMPORTEXPORT" ), fileId, -1, 10 );
1110 createMenu( GEOMOp::OpExportXAO, impexpId, -1 );
1111 createMenu( GEOMOp::OpImportXAO, impexpId, -1 );
1112 createMenu( separator(), fileId, -1 );
1114 int editId = createMenu( tr( "MEN_EDIT" ), -1, -1 );
1115 createMenu( GEOMOp::OpDelete, editId, -1 );
1117 int newEntId = createMenu( tr( "MEN_NEW_ENTITY" ), -1, -1, 10 );
1119 int basicId = createMenu( tr( "MEN_BASIC" ), newEntId, -1 );
1120 createMenu( GEOMOp::OpPoint, basicId, -1 );
1121 createMenu( GEOMOp::OpLine, basicId, -1 );
1122 createMenu( GEOMOp::OpCircle, basicId, -1 );
1123 createMenu( GEOMOp::OpEllipse, basicId, -1 );
1124 createMenu( GEOMOp::OpArc, basicId, -1 );
1125 createMenu( GEOMOp::OpCurve, basicId, -1 );
1126 createMenu( GEOMOp::Op2dSketcher, basicId, -1 );
1127 createMenu( GEOMOp::Op3dSketcher, basicId, -1 );
1128 createMenu( GEOMOp::OpIsoline, basicId, -1 );
1129 createMenu( separator(), basicId, -1 );
1130 createMenu( GEOMOp::OpVector, basicId, -1 );
1131 createMenu( GEOMOp::OpPlane, basicId, -1 );
1132 createMenu( GEOMOp::OpLCS, basicId, -1 );
1133 createMenu( GEOMOp::OpOriginAndVectors, basicId, -1 );
1135 int primId = createMenu( tr( "MEN_PRIMITIVES" ), newEntId, -1 );
1136 createMenu( GEOMOp::OpBox, primId, -1 );
1137 createMenu( GEOMOp::OpCylinder, primId, -1 );
1138 createMenu( GEOMOp::OpSphere, primId, -1 );
1139 createMenu( GEOMOp::OpTorus, primId, -1 );
1140 createMenu( GEOMOp::OpCone, primId, -1 );
1141 createMenu( GEOMOp::OpRectangle, primId, -1 );
1142 createMenu( GEOMOp::OpDisk, primId, -1 );
1143 //createMenu( GEOMOp::OpPipeTShape,primId, -1 );
1145 int genId = createMenu( tr( "MEN_GENERATION" ), newEntId, -1 );
1146 createMenu( GEOMOp::OpPrism, genId, -1 );
1147 createMenu( GEOMOp::OpRevolution, genId, -1 );
1148 createMenu( GEOMOp::OpFilling, genId, -1 );
1149 createMenu( GEOMOp::OpPipe, genId, -1 );
1150 #if OCC_VERSION_LARGE > 0x06050300
1151 createMenu( GEOMOp::OpPipePath, genId, -1 );
1154 //int advId = createMenu( tr( "MEN_ADVANCED" ), newEntId, -1 );
1155 //createMenu( GEOMOp::OpSmoothingSurface, advId, -1 );
1156 //@@ 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 @@//
1158 createMenu( separator(), newEntId, -1 );
1160 int groupId = createMenu( tr( "MEN_GROUP" ), newEntId, -1 );
1161 createMenu( GEOMOp::OpGroupCreate, groupId, -1 );
1162 createMenu( GEOMOp::OpGroupEdit, groupId, -1 );
1163 createMenu( GEOMOp::OpGroupUnion, groupId, -1 );
1164 createMenu( GEOMOp::OpGroupIntersect, groupId, -1 );
1165 createMenu( GEOMOp::OpGroupCut, groupId, -1 );
1167 createMenu( separator(), newEntId, -1 );
1169 int fieldId = createMenu( tr( "MEN_FIELD" ), newEntId, -1 );
1170 createMenu( GEOMOp::OpCreateField, fieldId, -1 );
1171 createMenu( GEOMOp::OpEditField, fieldId, -1 );
1173 createMenu( separator(), newEntId, -1 );
1175 int blocksId = createMenu( tr( "MEN_BLOCKS" ), newEntId, -1 );
1176 createMenu( GEOMOp::OpQuadFace, blocksId, -1 );
1177 createMenu( GEOMOp::OpHexaSolid, blocksId, -1 );
1178 //createMenu( GEOMOp::OpDividedDisk, blocksId, -1 );
1179 //createMenu( GEOMOp::OpDividedCylinder, blocksId, -1 );
1181 createMenu( separator(), newEntId, -1 );
1183 createMenu( GEOMOp::OpExplode, newEntId, -1 );
1185 int buildId = createMenu( tr( "MEN_BUILD" ), newEntId, -1 );
1186 createMenu( GEOMOp::OpEdge, buildId, -1 );
1187 createMenu( GEOMOp::OpWire, buildId, -1 );
1188 createMenu( GEOMOp::OpFace, buildId, -1 );
1189 createMenu( GEOMOp::OpShell, buildId, -1 );
1190 createMenu( GEOMOp::OpSolid, buildId, -1 );
1191 createMenu( GEOMOp::OpCompound, buildId, -1 );
1193 createMenu( separator(), newEntId, -1 );
1195 createMenu( GEOMOp::OpPictureImport, newEntId, -1 );
1197 createMenu( GEOMOp::OpFeatureDetect, newEntId, -1 );
1200 int operId = createMenu( tr( "MEN_OPERATIONS" ), -1, -1, 10 );
1202 int boolId = createMenu( tr( "MEN_BOOLEAN" ), operId, -1 );
1203 createMenu( GEOMOp::OpFuse, boolId, -1 );
1204 createMenu( GEOMOp::OpCommon, boolId, -1 );
1205 createMenu( GEOMOp::OpCut, boolId, -1 );
1206 createMenu( GEOMOp::OpSection, boolId, -1 );
1208 int transId = createMenu( tr( "MEN_TRANSFORMATION" ), operId, -1 );
1209 createMenu( GEOMOp::OpTranslate, transId, -1 );
1210 createMenu( GEOMOp::OpRotate, transId, -1 );
1211 createMenu( GEOMOp::OpChangeLoc, transId, -1 );
1212 createMenu( GEOMOp::OpMirror, transId, -1 );
1213 createMenu( GEOMOp::OpScale, transId, -1 );
1214 createMenu( GEOMOp::OpOffset, transId, -1 );
1215 createMenu( GEOMOp::OpProjection, transId, -1 );
1216 createMenu( separator(), transId, -1 );
1217 createMenu( GEOMOp::OpMultiTranslate, transId, -1 );
1218 createMenu( GEOMOp::OpMultiRotate, transId, -1 );
1220 int blockId = createMenu( tr( "MEN_BLOCKS" ), operId, -1 );
1221 createMenu( GEOMOp::OpMultiTransform, blockId, -1 );
1222 createMenu( GEOMOp::OpExplodeBlock, blockId, -1 );
1223 createMenu( GEOMOp::OpPropagate, blockId, -1 );
1225 createMenu( separator(), operId, -1 );
1227 createMenu( GEOMOp::OpPartition, operId, -1 );
1228 createMenu( GEOMOp::OpArchimede, operId, -1 );
1229 createMenu( GEOMOp::OpShapesOnShape, operId, -1 );
1230 createMenu( GEOMOp::OpSharedShapes, operId, -1 );
1232 createMenu( separator(), operId, -1 );
1234 createMenu( GEOMOp::OpFillet1d, operId, -1 );
1235 createMenu( GEOMOp::OpFillet2d, operId, -1 );
1236 createMenu( GEOMOp::OpFillet3d, operId, -1 );
1237 createMenu( GEOMOp::OpChamfer, operId, -1 );
1238 createMenu( GEOMOp::OpExtrudedBoss, operId, -1 );
1239 createMenu( GEOMOp::OpExtrudedCut, operId, -1 );
1240 #ifdef DEBUG_CURVE_CREATOR
1241 // for debug purposes, to be removed
1242 createMenu( separator(), operId, -1 );
1243 createMenu( GEOMOp::OpCurveCreator, operId, -1 );
1245 //createMenu( GEOMOp::OpClipping, operId, -1 );
1247 int repairId = createMenu( tr( "MEN_REPAIR" ), -1, -1, 10 );
1248 createMenu( GEOMOp::OpShapeProcess, repairId, -1 );
1249 createMenu( GEOMOp::OpSuppressFaces, repairId, -1 );
1250 createMenu( GEOMOp::OpCloseContour, repairId, -1 );
1251 createMenu( GEOMOp::OpRemoveIntWires, repairId, -1 );
1252 createMenu( GEOMOp::OpSuppressHoles, repairId, -1 );
1253 createMenu( GEOMOp::OpSewing, repairId, -1 );
1254 createMenu( GEOMOp::OpGlueFaces, repairId, -1 );
1255 createMenu( GEOMOp::OpGlueEdges, repairId, -1 );
1256 createMenu( GEOMOp::OpLimitTolerance, repairId, -1 );
1257 createMenu( GEOMOp::OpAddPointOnEdge, repairId, -1 );
1258 //createMenu( GEOMOp::OpFreeBoundaries, repairId, -1 );
1259 //createMenu( GEOMOp::OpFreeFaces, repairId, -1 );
1260 createMenu( GEOMOp::OpOrientation, repairId, -1 );
1261 createMenu( GEOMOp::OpRemoveWebs, repairId, -1 );
1262 createMenu( GEOMOp::OpRemoveExtraEdges, repairId, -1 );
1263 createMenu( GEOMOp::OpFuseEdges, repairId, -1 );
1264 createMenu( GEOMOp::OpUnionFaces, repairId, -1 );
1266 int measurId = createMenu( tr( "MEN_MEASURES" ), -1, -1, 10 );
1267 createMenu( GEOMOp::OpPointCoordinates, measurId, -1 );
1268 createMenu( GEOMOp::OpProperties, measurId, -1 );
1269 createMenu( separator(), measurId, -1 );
1270 createMenu( GEOMOp::OpCenterMass, measurId, -1 );
1271 createMenu( GEOMOp::OpInertia, measurId, -1 );
1272 createMenu( GEOMOp::OpNormale, measurId, -1 );
1273 createMenu( separator(), measurId, -1 );
1274 createMenu( GEOMOp::OpFreeBoundaries, measurId, -1 );
1275 createMenu( GEOMOp::OpFreeFaces, measurId, -1 );
1276 createMenu( separator(), measurId, -1 );
1278 int dimId = createMenu( tr( "MEN_DIMENSIONS" ), measurId, -1 );
1279 createMenu( GEOMOp::OpBoundingBox, dimId, -1 );
1280 createMenu( GEOMOp::OpMinDistance, dimId, -1 );
1281 createMenu( GEOMOp::OpAngle, dimId, -1 );
1282 createMenu( GEOMOp::OpManageDimensions, dimId, -1 );
1284 createMenu( separator(), measurId, -1 );
1285 createMenu( GEOMOp::OpTolerance, measurId, -1 );
1286 createMenu( separator(), measurId, -1 );
1287 createMenu( GEOMOp::OpWhatIs, measurId, -1 );
1288 createMenu( GEOMOp::OpCheckShape, measurId, -1 );
1289 createMenu( GEOMOp::OpCheckCompound, measurId, -1 );
1290 createMenu( GEOMOp::OpGetNonBlocks, measurId, -1 );
1291 createMenu( GEOMOp::OpCheckSelfInters, measurId, -1 );
1293 int toolsId = createMenu( tr( "MEN_TOOLS" ), -1, -1, 50 );
1294 #if defined(_DEBUG_) || defined(_DEBUG) // PAL16821
1295 createMenu( separator(), toolsId, -1 );
1296 createMenu( GEOMOp::OpCheckGeom, toolsId, -1 );
1299 createMenu( separator(), toolsId, -1 );
1300 createMenu( GEOMOp::OpMaterialsLibrary, toolsId, -1 );
1301 createMenu( separator(), toolsId, -1 );
1303 int viewId = createMenu( tr( "MEN_VIEW" ), -1, -1 );
1304 createMenu( separator(), viewId, -1 );
1306 int dispmodeId = createMenu( tr( "MEN_DISPLAY_MODE" ), viewId, -1 );
1307 createMenu( GEOMOp::OpDMWireframe, dispmodeId, -1 );
1308 createMenu( GEOMOp::OpDMShading, dispmodeId, -1 );
1309 createMenu( GEOMOp::OpDMShadingWithEdges, dispmodeId, -1 );
1310 createMenu( GEOMOp::OpDMTexture, dispmodeId, -1 );
1311 createMenu( separator(), dispmodeId, -1 );
1312 createMenu( GEOMOp::OpSwitchVectors, dispmodeId, -1 );
1314 createMenu( separator(), viewId, -1 );
1315 createMenu( GEOMOp::OpShowAll, viewId, -1 );
1316 createMenu( GEOMOp::OpHideAll, viewId, -1 );
1317 createMenu( separator(), viewId, -1 );
1318 createMenu( GEOMOp::OpPublishObject, viewId, -1 );
1319 createMenu( separator(), viewId, -1 );
1323 because of these items are accessible through object browser and viewers
1324 we have removed they from main menu
1326 createMenu( GEOMOp::OpShow, viewId, -1 );
1327 createMenu( GEOMOp::OpShowOnly, viewId, -1 );
1328 createMenu( GEOMOp::OpHide, viewId, -1 );
1331 // ---- create toolbars --------------------------
1333 int basicTbId = createTool( tr( "TOOL_BASIC" ) );
1334 createTool( GEOMOp::OpPoint, basicTbId );
1335 createTool( GEOMOp::OpLine, basicTbId );
1336 createTool( GEOMOp::OpCircle, basicTbId );
1337 createTool( GEOMOp::OpEllipse, basicTbId );
1338 createTool( GEOMOp::OpArc, basicTbId );
1339 createTool( GEOMOp::OpCurve, basicTbId );
1340 createTool( GEOMOp::OpVector, basicTbId );
1341 createTool( GEOMOp::Op2dSketcher, basicTbId ); //rnc
1342 createTool( GEOMOp::Op3dSketcher, basicTbId ); //rnc
1343 createTool( GEOMOp::OpIsoline, basicTbId );
1344 createTool( GEOMOp::OpPlane, basicTbId );
1345 createTool( GEOMOp::OpLCS, basicTbId );
1346 createTool( GEOMOp::OpOriginAndVectors, basicTbId );
1348 // int sketchTbId = createTool( tr( "TOOL_SKETCH" ) );
1349 // createTool( GEOMOp::Op2dSketcher, sketchTbId );
1350 // createTool( GEOMOp::Op3dSketcher, sketchTbId );
1352 int primTbId = createTool( tr( "TOOL_PRIMITIVES" ) );
1353 createTool( GEOMOp::OpBox, primTbId );
1354 createTool( GEOMOp::OpCylinder, primTbId );
1355 createTool( GEOMOp::OpSphere, primTbId );
1356 createTool( GEOMOp::OpTorus, primTbId );
1357 createTool( GEOMOp::OpCone, primTbId );
1358 createTool( GEOMOp::OpRectangle, primTbId );
1359 createTool( GEOMOp::OpDisk, primTbId );
1360 //createTool( GEOMOp::OpPipeTShape, primTbId ); //rnc
1362 //int blocksTbId = createTool( tr( "TOOL_BLOCKS" ) );
1363 //createTool( GEOMOp::OpDividedDisk, blocksTbId );
1364 //createTool( GEOMOp::OpDividedCylinder, blocksTbId );
1366 int boolTbId = createTool( tr( "TOOL_BOOLEAN" ) );
1367 createTool( GEOMOp::OpFuse, boolTbId );
1368 createTool( GEOMOp::OpCommon, boolTbId );
1369 createTool( GEOMOp::OpCut, boolTbId );
1370 createTool( GEOMOp::OpSection, boolTbId );
1372 int genTbId = createTool( tr( "TOOL_GENERATION" ) );
1373 createTool( GEOMOp::OpPrism, genTbId );
1374 createTool( GEOMOp::OpRevolution, genTbId );
1375 createTool( GEOMOp::OpFilling, genTbId );
1376 createTool( GEOMOp::OpPipe, genTbId );
1377 #if OCC_VERSION_LARGE > 0x06050300
1378 createTool( GEOMOp::OpPipePath, genTbId );
1381 int transTbId = createTool( tr( "TOOL_TRANSFORMATION" ) );
1382 createTool( GEOMOp::OpTranslate, transTbId );
1383 createTool( GEOMOp::OpRotate, transTbId );
1384 createTool( GEOMOp::OpChangeLoc, transTbId );
1385 createTool( GEOMOp::OpMirror, transTbId );
1386 createTool( GEOMOp::OpScale, transTbId );
1387 createTool( GEOMOp::OpOffset, transTbId );
1388 createTool( GEOMOp::OpProjection, transTbId );
1389 createTool( separator(), transTbId );
1390 createTool( GEOMOp::OpMultiTranslate, transTbId );
1391 createTool( GEOMOp::OpMultiRotate, transTbId );
1393 int operTbId = createTool( tr( "TOOL_OPERATIONS" ) );
1394 createTool( GEOMOp::OpExplode, operTbId );
1395 createTool( GEOMOp::OpPartition, operTbId );
1396 createTool( GEOMOp::OpArchimede, operTbId );
1397 createTool( GEOMOp::OpShapesOnShape, operTbId );
1398 createTool( GEOMOp::OpSharedShapes, operTbId );
1400 int featTbId = createTool( tr( "TOOL_FEATURES" ) );
1401 createTool( GEOMOp::OpFillet1d, featTbId );
1402 createTool( GEOMOp::OpFillet2d, featTbId );
1403 createTool( GEOMOp::OpFillet3d, featTbId );
1404 createTool( GEOMOp::OpChamfer, featTbId );
1405 createTool( GEOMOp::OpExtrudedBoss, featTbId );
1406 createTool( GEOMOp::OpExtrudedCut, featTbId );
1407 #ifdef DEBUG_CURVE_CREATOR
1408 // for debug purposes, to be removed
1409 createTool( GEOMOp::OpCurveCreator, featTbId );
1412 int buildTbId = createTool( tr( "TOOL_BUILD" ) );
1413 createTool( GEOMOp::OpEdge, buildTbId );
1414 createTool( GEOMOp::OpWire, buildTbId );
1415 createTool( GEOMOp::OpFace, buildTbId );
1416 createTool( GEOMOp::OpShell, buildTbId );
1417 createTool( GEOMOp::OpSolid, buildTbId );
1418 createTool( GEOMOp::OpCompound, buildTbId );
1420 int measureTbId = createTool( tr( "TOOL_MEASURES" ) );
1421 createTool( GEOMOp::OpPointCoordinates, measureTbId );
1422 createTool( GEOMOp::OpProperties, measureTbId );
1423 createTool( GEOMOp::OpCenterMass, measureTbId );
1424 createTool( GEOMOp::OpInertia, measureTbId );
1425 createTool( GEOMOp::OpNormale, measureTbId );
1426 createTool( separator(), measureTbId );
1427 createTool( GEOMOp::OpBoundingBox, measureTbId );
1428 createTool( GEOMOp::OpMinDistance, measureTbId );
1429 createTool( GEOMOp::OpAngle, measureTbId );
1430 createTool( GEOMOp::OpTolerance , measureTbId );
1431 createTool( separator(), measureTbId );
1432 createTool( GEOMOp::OpFreeBoundaries, measureTbId );
1433 createTool( GEOMOp::OpFreeFaces, measureTbId );
1434 createTool( separator(), measureTbId );
1435 createTool( GEOMOp::OpWhatIs, measureTbId );
1436 createTool( GEOMOp::OpCheckShape, measureTbId );
1437 createTool( GEOMOp::OpCheckCompound, measureTbId );
1438 createTool( GEOMOp::OpGetNonBlocks, measureTbId );
1439 createTool( GEOMOp::OpCheckSelfInters, measureTbId );
1441 int picturesTbId = createTool( tr( "TOOL_PICTURES" ) );
1442 createTool( GEOMOp::OpPictureImport, picturesTbId );
1444 createTool( GEOMOp::OpFeatureDetect, picturesTbId );
1447 int impexpTbId = createTool( tr( "TOOL_IMPORTEXPORT" ) );
1448 createTool( GEOMOp::OpExportXAO, impexpTbId );
1449 createTool( GEOMOp::OpImportXAO, impexpTbId );
1451 //int advancedTbId = createTool( tr( "TOOL_ADVANCED" ) );
1452 //createTool( GEOMOp::OpSmoothingSurface, advancedTbId );
1453 //@@ 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 @@//
1455 // ---- create popup menus --------------------------
1457 QString clientOCCorVTK = "(client='OCCViewer' or client='VTKViewer')";
1458 QString clientOCC = "(client='OCCViewer')";
1459 QString clientOCCorVTK_AndSomeVisible = clientOCCorVTK + " and selcount>0 and isVisible";
1460 QString clientOCC_AndSomeVisible = clientOCC + " and selcount>0 and isVisible";
1462 QString clientOCCorOB = "(client='ObjectBrowser' or client='OCCViewer')";
1463 QString clientOCCorVTKorOB = "(client='ObjectBrowser' or client='OCCViewer' or client='VTKViewer')";
1464 QString clientOCCorVTKorOB_AndSomeVisible = clientOCCorVTKorOB + " and selcount>0 and isVisible";
1465 QString clientOCCorOB_AndSomeVisible = clientOCCorOB + " and selcount>0 and isVisible";
1467 QString autoColorPrefix =
1468 "(client='ObjectBrowser' or client='OCCViewer') and type='Shape' and selcount=1 and isOCC=true";
1470 QtxPopupMgr* mgr = popupMgr();
1472 mgr->insert( action( GEOMOp::OpDelete ), -1, -1 ); // delete
1473 mgr->setRule( action( GEOMOp::OpDelete ), QString("$type in {'Shape' 'Group' 'Folder' 'Field' 'FieldStep'} and selcount>0"), QtxPopupMgr::VisibleRule );
1474 mgr->insert( action( GEOMOp::OpGroupCreatePopup ), -1, -1 ); // create group
1475 mgr->setRule( action( GEOMOp::OpGroupCreatePopup ), QString("type='Shape' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1476 mgr->insert( action( GEOMOp::OpEditFieldPopup ), -1, -1 ); // edit field
1477 mgr->setRule( action( GEOMOp::OpEditFieldPopup ), QString("(type='Field' or type='FieldStep') and isOCC=true"), QtxPopupMgr::VisibleRule );
1478 mgr->insert( action( GEOMOp::OpDiscloseChildren ), -1, -1 ); // disclose child items
1479 mgr->setRule( action( GEOMOp::OpDiscloseChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasConcealedChildren=true"), QtxPopupMgr::VisibleRule );
1481 mgr->insert( action( GEOMOp::OpConcealChildren ), -1, -1 ); // conceal child items
1482 mgr->setRule( action( GEOMOp::OpConcealChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasDisclosedChildren=true"), QtxPopupMgr::VisibleRule );
1483 mgr->insert( action( GEOMOp::OpGroupEdit ), -1, -1 ); // edit group
1484 mgr->setRule( action( GEOMOp::OpGroupEdit ), QString("client='ObjectBrowser' and type='Group' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1485 mgr->insert( separator(), -1, -1 ); // -----------
1487 #if OCC_VERSION_LARGE > 0x06050200
1488 //QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and (selcount>0) and isOCC=true and topLevel=false";
1489 QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and isFolder=false and (selcount>0) and isOCC=true";
1490 mgr->insert( action(GEOMOp::OpBringToFront ), -1, -1 ); // bring to front
1491 mgr->setRule(action(GEOMOp::OpBringToFront), bringRule + " and autoBringToFront = false", QtxPopupMgr::VisibleRule );
1492 mgr->setRule(action(GEOMOp::OpBringToFront), "topLevel=true", QtxPopupMgr::ToggleRule );
1493 mgr->insert( action(GEOMOp::OpClsBringToFront ), -1, -1 ); // clear bring to front
1494 mgr->setRule( action(GEOMOp::OpClsBringToFront ), clientOCC + " and autoBringToFront = false", QtxPopupMgr::VisibleRule );
1496 mgr->insert( separator(), -1, -1 ); // -----------
1497 dispmodeId = mgr->insert( tr( "MEN_DISPLAY_MODE" ), -1, -1 ); // display mode menu
1498 mgr->insert( action( GEOMOp::OpWireframe ), dispmodeId, -1 ); // wireframe
1499 mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1500 mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK + " and displaymode='Wireframe'", QtxPopupMgr::ToggleRule );
1501 mgr->insert( action( GEOMOp::OpShading ), dispmodeId, -1 ); // shading
1502 mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1503 mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK + " and displaymode='Shading'", QtxPopupMgr::ToggleRule );
1504 mgr->insert( action( GEOMOp::OpShadingWithEdges ), dispmodeId, -1 ); // shading with edges
1505 mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1506 mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK + " and displaymode='ShadingWithEdges'", QtxPopupMgr::ToggleRule );
1507 mgr->insert( action( GEOMOp::OpTexture ), dispmodeId, -1 ); // wireframe
1508 mgr->setRule( action( GEOMOp::OpTexture ), clientOCC_AndSomeVisible, QtxPopupMgr::VisibleRule );
1509 mgr->setRule( action( GEOMOp::OpTexture), clientOCC + " and displaymode='Texture'", QtxPopupMgr::ToggleRule );
1510 mgr->insert( separator(), dispmodeId, -1 );
1511 mgr->insert( action( GEOMOp::OpVectors ), dispmodeId, -1 ); // vectors
1512 mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1513 mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK + " and isVectorsMode", QtxPopupMgr::ToggleRule );
1514 mgr->insert( separator(), -1, -1 ); // -----------
1516 mgr->insert( action( GEOMOp::OpColor ), -1, -1 ); // color
1517 mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})" + "and isPhysicalMaterial=false", QtxPopupMgr::VisibleRule );
1518 mgr->insert( action( GEOMOp::OpTransparency ), -1, -1 ); // transparency
1519 mgr->setRule( action( GEOMOp::OpTransparency ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1520 mgr->insert( action( GEOMOp::OpIsos ), -1, -1 ); // isos
1521 mgr->setRule( action( GEOMOp::OpIsos ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1522 mgr->insert( action( GEOMOp::OpDeflection ), -1, -1 ); // deflection
1523 mgr->setRule( action( GEOMOp::OpDeflection ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1524 mgr->insert( action( GEOMOp::OpPointMarker ), -1, -1 ); // point marker
1525 //mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and $typeid in {%1}" ).arg(GEOM_POINT ), QtxPopupMgr::VisibleRule );
1526 mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and ( $typeid in {%1} or compoundOfVertices=true ) " ).arg(GEOM::VERTEX).arg(GEOM::COMPOUND), QtxPopupMgr::VisibleRule );
1528 // material properties
1529 mgr->insert( action( GEOMOp::OpMaterialProperties ), -1, -1 );
1530 mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1533 mgr->insert( action( GEOMOp::OpSetTexture ), -1, -1 );
1534 mgr->setRule( action( GEOMOp::OpSetTexture ), clientOCCorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1536 int lineW = mgr->insert( tr( "MEN_LINE_WIDTH" ), -1, -1 ); // line width menu
1537 mgr->insert( action( GEOMOp::OpEdgeWidth ), lineW, -1 ); // edge width
1538 mgr->setRule( action( GEOMOp::OpEdgeWidth ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1540 mgr->insert( action( GEOMOp::OpIsosWidth ), lineW, -1 ); // isos width
1541 mgr->setRule( action( GEOMOp::OpIsosWidth ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1543 mgr->insert( separator(), -1, -1 ); // -----------
1544 mgr->insert( action( GEOMOp::OpAutoColor ), -1, -1 ); // auto color
1545 mgr->setRule( action( GEOMOp::OpAutoColor ), autoColorPrefix + " and isAutoColor=false", QtxPopupMgr::VisibleRule );
1546 mgr->insert( action( GEOMOp::OpNoAutoColor ), -1, -1 ); // disable auto color
1547 mgr->setRule( action( GEOMOp::OpNoAutoColor ), autoColorPrefix + " and isAutoColor=true", QtxPopupMgr::VisibleRule );
1548 mgr->insert( separator(), -1, -1 ); // -----------
1550 QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ",
1551 onlyComponent = "((type='Component') and selcount=1)",
1552 rule = canDisplay + "and ((($type in {%1}) and( %2 )) or " + onlyComponent + ")",
1553 types = "'Shape' 'Group' 'FieldStep'";
1555 mgr->insert( action( GEOMOp::OpShow ), -1, -1 ); // display
1556 mgr->setRule( action( GEOMOp::OpShow ), rule.arg( types ).arg( "not isVisible" ), QtxPopupMgr::VisibleRule );
1558 mgr->insert( action( GEOMOp::OpHide ), -1, -1 ); // erase
1559 mgr->setRule( action( GEOMOp::OpHide ), rule.arg( types ).arg( "isVisible" ), QtxPopupMgr::VisibleRule );
1561 mgr->insert( action( GEOMOp::OpHideAll ), -1, -1 ); // erase All
1562 mgr->setRule( action( GEOMOp::OpHideAll ), clientOCCorVTK, QtxPopupMgr::VisibleRule );
1564 QString selectOnly = "(client='OCCViewer' or client='VTKViewer') and (selcount=0)";
1566 int selectonlyId = mgr->insert( tr("MEN_SELECT_ONLY"), -1, -1); //select only menu
1567 mgr->insert( action(GEOMOp::OpSelectVertex), selectonlyId, -1); //Vertex
1568 mgr->setRule(action(GEOMOp::OpSelectVertex), selectOnly, QtxPopupMgr::VisibleRule);
1569 mgr->setRule(action(GEOMOp::OpSelectVertex), selectOnly + " and selectionmode='VERTEX'", QtxPopupMgr::ToggleRule);
1570 mgr->insert( action(GEOMOp::OpSelectEdge), selectonlyId, -1); //Edge
1571 mgr->setRule(action(GEOMOp::OpSelectEdge), selectOnly, QtxPopupMgr::VisibleRule);
1572 mgr->setRule(action(GEOMOp::OpSelectEdge), selectOnly + " and selectionmode='EDGE'", QtxPopupMgr::ToggleRule);
1573 mgr->insert( action(GEOMOp::OpSelectWire), selectonlyId, -1); //Wire
1574 mgr->setRule(action(GEOMOp::OpSelectWire), selectOnly, QtxPopupMgr::VisibleRule);
1575 mgr->setRule(action(GEOMOp::OpSelectWire), selectOnly + " and selectionmode='WIRE'", QtxPopupMgr::ToggleRule);
1576 mgr->insert( action(GEOMOp::OpSelectFace), selectonlyId, -1); //Face
1577 mgr->setRule(action(GEOMOp::OpSelectFace), selectOnly, QtxPopupMgr::VisibleRule);
1578 mgr->setRule(action(GEOMOp::OpSelectFace), selectOnly + " and selectionmode='FACE'", QtxPopupMgr::ToggleRule);
1579 mgr->insert( action(GEOMOp::OpSelectShell), selectonlyId, -1); //Shell
1580 mgr->setRule(action(GEOMOp::OpSelectShell), selectOnly, QtxPopupMgr::VisibleRule);
1581 mgr->setRule(action(GEOMOp::OpSelectShell), selectOnly + " and selectionmode='SHELL'", QtxPopupMgr::ToggleRule);
1582 mgr->insert( action(GEOMOp::OpSelectSolid), selectonlyId, -1); //Solid
1583 mgr->setRule(action(GEOMOp::OpSelectSolid), selectOnly, QtxPopupMgr::VisibleRule);
1584 mgr->setRule(action(GEOMOp::OpSelectSolid), selectOnly + " and selectionmode='SOLID'", QtxPopupMgr::ToggleRule);
1585 mgr->insert( action(GEOMOp::OpSelectCompound), selectonlyId, -1); //Compound
1586 mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly, QtxPopupMgr::VisibleRule);
1587 mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly + " and selectionmode='COMPOUND'", QtxPopupMgr::ToggleRule);
1588 mgr->insert( separator(), selectonlyId, -1);
1589 mgr->insert( action(GEOMOp::OpSelectAll), selectonlyId, -1); //Clear selection filter
1590 mgr->setRule(action(GEOMOp::OpSelectAll), selectOnly, QtxPopupMgr::VisibleRule);
1591 mgr->setRule(action(GEOMOp::OpSelectAll), selectOnly + " and selectionmode='ALL'", QtxPopupMgr::ToggleRule);
1592 mgr->insert( action(GEOMOp::OpShowOnly ), -1, -1 ); // display only
1593 mgr->setRule(action(GEOMOp::OpShowOnly ), rule.arg( types ).arg( "true" ), QtxPopupMgr::VisibleRule );
1594 mgr->insert( action(GEOMOp::OpShowOnlyChildren ), -1, -1 ); // display only children
1595 mgr->setRule(action(GEOMOp::OpShowOnlyChildren ), (canDisplay + "and ($type in {%1}) and client='ObjectBrowser' and hasChildren=true").arg( types ), QtxPopupMgr::VisibleRule );
1597 QString aDimensionRule = "($component={'GEOM'}) and selcount=1 and isVisible and type='Shape' and %1";
1599 mgr->insert( separator(), -1, -1 ); // -----------
1600 mgr->insert( action( GEOMOp::OpShowAllDimensions ), -1, -1 ); // show all dimensions
1601 mgr->setRule( action( GEOMOp::OpShowAllDimensions ), aDimensionRule.arg( "hasHiddenDimensions" ), QtxPopupMgr::VisibleRule );
1602 mgr->insert( action( GEOMOp::OpHideAllDimensions ), -1, -1 ); // hide all dimensions
1603 mgr->setRule( action( GEOMOp::OpHideAllDimensions ), aDimensionRule.arg( "hasVisibleDimensions" ), QtxPopupMgr::VisibleRule );
1605 mgr->insert( separator(), -1, -1 ); // -----------
1606 mgr->insert( action( GEOMOp::OpUnpublishObject ), -1, -1 ); // Unpublish object
1607 mgr->setRule( action( GEOMOp::OpUnpublishObject ), QString("client='ObjectBrowser' and $type in {'Shape' 'Group' 'Field' 'FieldStep'} and selcount>0"), QtxPopupMgr::VisibleRule );
1609 mgr->insert( action( GEOMOp::OpPublishObject ), -1, -1 ); // Publish object
1610 mgr->setRule( action( GEOMOp::OpPublishObject ), QString("client='ObjectBrowser' and isComponent=true"), QtxPopupMgr::VisibleRule );
1612 mgr->insert( action( GEOMOp::OpReimport ), -1, -1 ); // delete
1613 mgr->setRule( action( GEOMOp::OpReimport ), QString("$imported in {'true'} and selcount>0"), QtxPopupMgr::VisibleRule );
1615 mgr->insert( separator(), -1, -1 ); // -----------
1616 mgr->insert( action( GEOMOp::OpCreateFolder ), -1, -1 ); // Create Folder
1617 mgr->setRule( action( GEOMOp::OpCreateFolder ), QString("client='ObjectBrowser' and $component={'GEOM'} and (isComponent=true or isFolder=true)"), QtxPopupMgr::VisibleRule );
1619 mgr->insert( separator(), -1, -1 ); // -----------
1620 mgr->insert( action( GEOMOp::OpSortChildren ), -1, -1 ); // Sort child items
1621 mgr->setRule( action( GEOMOp::OpSortChildren ), QString("client='ObjectBrowser' and $component={'GEOM'} and nbChildren>1"), QtxPopupMgr::VisibleRule );
1623 mgr->hide( mgr->actionId( action( myEraseAll ) ) );
1625 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1627 GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)resMgr->integerValue("Geometry", "toplevel_dm", 0));
1628 QColor c = resMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) );
1629 GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c));
1632 // create plugin actions and menus
1636 //=======================================================================
1637 // function : GeometryGUI::addPluginActions()
1639 //=======================================================================
1640 void GeometryGUI::addPluginActions()
1643 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1644 if (!resMgr) return;
1646 // Find names of a resource XML files ("GEOMActions.xml" and others);
1648 char* cenv = getenv("GEOM_PluginsList");
1650 PluginsXml.sprintf("%s", cenv);
1652 QStringList PluginsXmlList = PluginsXml.split(":", QString::SkipEmptyParts);
1653 if (PluginsXmlList.count() == 0) return;
1655 // get full names of xml files from PluginsXmlList
1656 QStringList xmlFiles;
1657 xmlFiles.append(QDir::home().filePath("CustomGeomPlugins.xml")); // may be inexistent
1658 for (int i = 0; i < PluginsXmlList.count(); i++) {
1659 PluginsXml = PluginsXmlList[ i ];
1661 // Find full path to the resource XML file
1662 QString xmlFile = resMgr->path("resources", "GEOM", PluginsXml + ".xml");
1663 if ( xmlFile.isEmpty() ) // try PLUGIN resources
1664 xmlFile = resMgr->path("resources", PluginsXml, PluginsXml + ".xml");
1665 if ( !xmlFile.isEmpty() )
1666 xmlFiles.append( xmlFile );
1669 // create "Advanced Operations" menu and corresponding toolbar
1670 //int advancedMenuId = createMenu(tr("MEN_ADVANCED"), -1, -1, 10);
1671 //int advancedTbarId = createTool(tr("TOOL_ADVANCED"));
1672 int id = GEOMOp::OpLastOperationID; // TODO?
1675 QString aNoAccessFiles;
1676 for (int i = 0; i < xmlFiles.count(); i++) {
1677 QString xmlFile = xmlFiles[ i ];
1679 QFile file (xmlFile);
1680 if (file.exists() && file.open(QIODevice::ReadOnly)) {
1683 GEOMGUI_XmlHandler* aXmlHandler = new GEOMGUI_XmlHandler();
1684 ASSERT(aXmlHandler);
1686 QXmlInputSource source (&file);
1687 QXmlSimpleReader reader;
1688 reader.setContentHandler(aXmlHandler);
1689 reader.setErrorHandler(aXmlHandler);
1690 bool ok = reader.parse(source);
1694 // bind action lib and label to its ID for activateOperation() method proper work
1695 myPluginLibs[aXmlHandler->myPluginData.myName] = aXmlHandler->myPluginData.myClientLib;
1697 QListIterator<GEOMGUI_ActionData> anActionsIter (aXmlHandler->myPluginData.myListOfActions);
1698 while (anActionsIter.hasNext()) {
1699 GEOMGUI_ActionData anActionData = anActionsIter.next();
1701 //QPixmap icon = resMgr->loadPixmap("GEOM", tr(anActionData.myIcon.toLatin1().constData()));
1702 QPixmap icon = resMgr->loadPixmap(aXmlHandler->myPluginData.myName,
1703 anActionData.myIcon.toLatin1().constData());
1705 // path to action in menu
1706 QStringList smenus = anActionData.myMenu.split( "/" );
1707 QString actionName = smenus.last();
1708 actionName = actionName.toUpper().prepend("MEN_");
1709 smenus.removeLast();
1711 // path to action in toolbar
1712 QStringList stools = anActionData.myTooltip.split( "/" );
1713 QString actionTool = stools.last();
1714 actionTool = actionTool.toUpper().prepend("TOP_");
1715 stools.removeLast();
1717 QString actionStat = anActionData.myStatusBar;
1718 actionStat = actionStat.toUpper().prepend("STB_");
1720 createAction(id, // ~ anActionData.myLabel
1721 tr(actionTool.toLatin1().constData()),
1723 tr(actionName.toLatin1().constData()),
1724 tr(actionStat.toLatin1().constData()),
1726 application()->desktop(),
1728 this, SLOT(OnGUIEvent()),
1729 QString() /*shortcutAction*/);
1732 foreach (QString subMenu, smenus) {
1733 subMenu = subMenu.toUpper().prepend("MEN_");
1734 menuId = createMenu(tr(subMenu.toLatin1().constData()), menuId, -1);
1736 //createMenu(id, pluginMenuId, -1);
1737 createMenu(id, menuId, -1);
1739 QString subTool = stools[0];
1740 subTool = subTool.toUpper().prepend("TOOL_");
1741 int toolId = createTool(tr(subTool.toLatin1().constData()));
1742 //createTool(id, advancedTbarId);
1743 createTool(id, toolId);
1745 // add action id to map
1746 PluginAction anAction (aXmlHandler->myPluginData.myClientLib, anActionData.myLabel);
1747 myPluginActions[id] = anAction;
1753 SUIT_MessageBox::critical(application()->desktop(),
1754 tr("INF_PARSE_ERROR"),
1755 tr(aXmlHandler->errorProtocol().toLatin1().data()));
1759 else if ( i > 0 ) { // 1st is ~/CustomGeomPlugins.xml
1760 if (aNoAccessFiles.isEmpty())
1761 aNoAccessFiles = xmlFile;
1763 aNoAccessFiles += ", " + xmlFile;
1765 } // end loop on xmlFiles
1767 if (!aNoAccessFiles.isEmpty()) {
1768 QString aMess = QObject::tr("PLUGIN_FILE_CANT_OPEN") + " " + aNoAccessFiles + "\n";
1769 aMess += QObject::tr("PLUGIN_FILE_CHECK_VARIABLE");
1770 SUIT_MessageBox::warning(application()->desktop(), tr("GEOM_WRN_WARNING"), aMess);
1774 //=======================================================================
1775 // function : GeometryGUI::activateModule()
1776 // purpose : Called when GEOM module is activated
1777 //=======================================================================
1778 bool GeometryGUI::activateModule( SUIT_Study* study )
1780 if ( CORBA::is_nil( myComponentGeom ) )
1783 bool res = SalomeApp_Module::activateModule( study );
1787 setMenuShown( true );
1788 setToolShown( true );
1790 // import Python module that manages GEOM plugins (need to be here because SalomePyQt API uses active module)
1791 PyGILState_STATE gstate = PyGILState_Ensure();
1792 PyObjWrapper pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
1793 if ( !pluginsmanager ) {
1797 PyObjWrapper result =
1798 PyObject_CallMethod(pluginsmanager, (char*)"initialize", (char*)"isss", 1, "geom",
1799 tr("MEN_NEW_ENTITY").toStdString().c_str(),
1800 tr("GEOM_PLUGINS_OTHER").toStdString().c_str());
1804 PyGILState_Release(gstate);
1805 // end of GEOM plugins loading
1807 connect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1808 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1810 // Reset actions accelerator keys
1811 action(GEOMOp::OpImport)->setEnabled( true ); // Import: CTRL + Key_I
1812 action(GEOMOp::OpExport)->setEnabled( true ); // Export: CTRL + Key_E
1813 action(GEOMOp::OpDelete)->setEnabled( true ); // Delete: Key_Delete
1815 GUIMap::Iterator it;
1816 for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1817 it.value()->activate( application()->desktop() );
1819 LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1821 connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
1822 connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( onAutoBringToFront() ));
1823 connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
1825 if ( !myCreationInfoWdg )
1826 myCreationInfoWdg = new GEOMGUI_CreationInfoWdg( getApp() );
1827 getApp()->insertDockWindow( myCreationInfoWdg->getWinID(), myCreationInfoWdg );
1828 getApp()->placeDockWindow( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
1830 SUIT_ViewManager* vm;
1831 ViewManagerList OCCViewManagers, VTKViewManagers;
1833 application()->viewManagers( OCCViewer_Viewer::Type(), OCCViewManagers );
1834 QListIterator<SUIT_ViewManager*> itOCC( OCCViewManagers );
1835 while ( itOCC.hasNext() && (vm = itOCC.next()) )
1836 myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
1838 application()->viewManagers( SVTK_Viewer::Type(), VTKViewManagers );
1839 QListIterator<SUIT_ViewManager*> itVTK( VTKViewManagers );
1840 while ( itVTK.hasNext() && (vm = itVTK.next()) )
1841 myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
1844 SALOME_ListIO selected;
1845 sm->selectedObjects( selected );
1846 sm->clearSelected();
1848 // disable OCC selectors
1849 getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
1850 QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1851 while ( itOCCSel.hasNext() )
1852 if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1853 sr->setEnabled(true);
1855 // disable VTK selectors
1856 getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
1857 QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1858 while ( itVTKSel.hasNext() )
1859 if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1860 sr->setEnabled(true);
1862 sm->setSelectedObjects( selected, true ); //NPAL 19674
1864 QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1866 connect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1868 // 0020836 (Basic vectors and origin)
1869 SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
1870 if ( aResourceMgr->booleanValue( "Geometry", "auto_create_base_objects", false ) ) {
1871 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
1873 _PTR(Study) studyDS = appStudy->studyDS();
1875 _PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
1876 if ( !aSComponent ) // create objects automatically only if there is no GEOM component
1877 createOriginAndBaseVectors();
1885 //=======================================================================
1886 // function : GeometryGUI::deactivateModule()
1887 // purpose : Called when GEOM module is deactivated
1888 //=======================================================================
1889 bool GeometryGUI::deactivateModule( SUIT_Study* study )
1891 QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1893 disconnect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1895 setMenuShown( false );
1896 setToolShown( false );
1898 disconnect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1899 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1901 LightApp_SelectionMgr* selMrg = getApp()->selectionMgr();
1903 disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
1904 disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
1905 getApp()->removeDockWindow( myCreationInfoWdg->getWinID() );
1906 myCreationInfoWdg = 0;
1908 EmitSignalCloseAllDialogs();
1910 GUIMap::Iterator it;
1911 for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1912 it.value()->deactivate();
1914 // Unset actions accelerator keys
1915 action(GEOMOp::OpImport)->setEnabled( false ); // Import: CTRL + Key_I
1916 action(GEOMOp::OpExport)->setEnabled( false ); // Export: CTRL + Key_E
1917 action(GEOMOp::OpDelete)->setEnabled( false ); // Delete: Key_Delete
1919 qDeleteAll(myOCCSelectors);
1920 myOCCSelectors.clear();
1921 selMrg->setEnabled( true, OCCViewer_Viewer::Type() );
1923 qDeleteAll(myVTKSelectors);
1924 myVTKSelectors.clear();
1925 selMrg->setEnabled( true, SVTK_Viewer::Type() );
1927 return SalomeApp_Module::deactivateModule( study );
1930 //=======================================================================
1931 // function : onWindowActivated()
1932 // purpose : update menu items' status - disable non-OCC-viewer-compatible actions
1933 //=======================================================================
1934 void GeometryGUI::onWindowActivated( SUIT_ViewWindow* win )
1939 const bool ViewOCC = ( win->getViewManager()->getType() == OCCViewer_Viewer::Type() );
1940 //const bool ViewVTK = ( win->getViewManager()->getType() == SVTK_Viewer::Type() );
1942 // disable non-OCC viewframe menu commands
1943 // action( GEOMOp::Op2dSketcher )->setEnabled( ViewOCC ); // SKETCHER
1944 action( GEOMOp::OpSuppressFaces )->setEnabled( ViewOCC ); // SuppressFace
1945 action( GEOMOp::OpSuppressHoles )->setEnabled( ViewOCC ); // SuppressHole
1946 action( GEOMOp::OpCloseContour )->setEnabled( ViewOCC ); // CloseContour
1947 action( GEOMOp::OpRemoveIntWires )->setEnabled( ViewOCC ); // RemoveInternalWires
1948 action( GEOMOp::OpAddPointOnEdge )->setEnabled( ViewOCC ); // AddPointOnEdge
1949 // action( GEOMOp::OpFreeBoundaries )->setEnabled( ViewOCC ); // Free boundaries
1951 action( GEOMOp::OpGroupCreate )->setEnabled( ViewOCC ); // Create Group
1952 action( GEOMOp::OpGroupEdit )->setEnabled( ViewOCC ); // Edit Group
1953 action( GEOMOp::OpCreateField )->setEnabled( ViewOCC ); // Create Field
1954 action( GEOMOp::OpEditField )->setEnabled( ViewOCC ); // Edit Field
1956 action( GEOMOp::OpMultiTransform )->setEnabled( ViewOCC ); // MENU BLOCKS - MULTI-TRANSFORMATION
1959 void GeometryGUI::windows( QMap<int, int>& mappa ) const
1961 mappa.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
1962 mappa.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
1963 if ( myCreationInfoWdg )
1964 mappa.insert( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
1967 void GeometryGUI::viewManagers( QStringList& lst ) const
1969 lst.append( OCCViewer_Viewer::Type() );
1972 void GeometryGUI::onViewManagerAdded( SUIT_ViewManager* vm )
1974 if ( vm && vm->getType() == OCCViewer_Viewer::Type() )
1976 qDebug( "connect" );
1977 connect( vm, SIGNAL( keyPress ( SUIT_ViewWindow*, QKeyEvent* ) ),
1978 this, SLOT( OnKeyPress( SUIT_ViewWindow*, QKeyEvent* ) ) );
1979 connect( vm, SIGNAL( mousePress( SUIT_ViewWindow*, QMouseEvent* ) ),
1980 this, SLOT( OnMousePress( SUIT_ViewWindow*, QMouseEvent* ) ) );
1981 connect( vm, SIGNAL( mouseMove ( SUIT_ViewWindow*, QMouseEvent* ) ),
1982 this, SLOT( OnMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) );
1983 connect( vm, SIGNAL( mouseRelease ( SUIT_ViewWindow*, QMouseEvent* ) ),
1984 this, SLOT( OnMouseRelease( SUIT_ViewWindow*, QMouseEvent* ) ) );
1986 LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1987 myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
1989 // disable OCC selectors
1990 getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
1991 QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1992 while ( itOCCSel.hasNext() )
1993 if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1994 sr->setEnabled(true);
1996 else if ( vm->getType() == SVTK_Viewer::Type() )
1998 LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1999 myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
2001 // disable VTK selectors
2002 getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
2003 QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
2004 while ( itVTKSel.hasNext() )
2005 if ( LightApp_VTKSelector* sr = itVTKSel.next() )
2006 sr->setEnabled(true);
2010 void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm )
2012 SUIT_ViewModel* viewer = vm->getViewModel();
2013 if ( vm->getType() == OCCViewer_Viewer::Type() )
2015 QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
2016 while ( itOCCSel.hasNext() )
2017 if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
2018 if ( sr->viewer() == viewer )
2020 /*delete*/ myOCCSelectors.takeAt( myOCCSelectors.indexOf( sr ) );
2024 if ( vm->getType() == SVTK_Viewer::Type() )
2026 QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
2027 while ( itVTKSel.hasNext() )
2028 if ( LightApp_VTKSelector* sr = itVTKSel.next() )
2029 if ( sr->viewer() == viewer )
2031 /*delete*/ myVTKSelectors.takeAt( myVTKSelectors.indexOf( sr ) );
2037 //================================================================================
2039 * \brief Slot called when selection changed. Shows creation info of a selected object
2041 //================================================================================
2043 void GeometryGUI::updateCreationInfo()
2045 if ( myCreationInfoWdg )
2046 myCreationInfoWdg->clear();
2048 // Code below is commented to have myCreationInfoWdg filled as soon as it is shown again
2049 // if ( !myCreationInfoWdg->isVisible() )
2052 // look for a sole selected GEOM_Object
2053 GEOM::GEOM_BaseObject_var geomObj;
2055 SALOME_ListIO selected;
2056 getApp()->selectionMgr()->selectedObjects( selected );
2058 _PTR(Study) study = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() )->studyDS();
2059 SALOME_ListIteratorOfListIO selIt( selected );
2060 for ( ; selIt.More(); selIt.Next() )
2062 Handle(SALOME_InteractiveObject) io = selIt.Value();
2063 if ( !io->hasEntry() ) continue;
2064 _PTR(SObject) sobj = study->FindObjectID( io->getEntry() );
2065 if ( !sobj ) continue;
2066 CORBA::Object_var obj = GeometryGUI::ClientSObjectToObject( sobj );
2067 GEOM::GEOM_BaseObject_var gobj = GEOM::GEOM_BaseObject::_narrow( obj );
2068 if ( !gobj->_is_nil() )
2070 if ( !geomObj->_is_nil() )
2071 return; // several GEOM objects selected
2075 if ( geomObj->_is_nil() ) return;
2077 // pass creation info of geomObj to myCreationInfoWdg
2079 if ( myCreationInfoWdg ) {
2081 QString operationName;
2082 myCreationInfoWdg->setOperation( icon, operationName );
2086 GEOM::CreationInformation_var info = geomObj->GetCreationInformation();
2088 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
2089 QString name = info->operationName.in();
2090 if ( !name.isEmpty() ) {
2091 icon = resMgr->loadPixmap( "GEOM", tr( ("ICO_"+name).toLatin1().constData() ), false );
2092 operationName = tr( ("MEN_"+name).toLatin1().constData() );
2093 if ( operationName.startsWith( "MEN_" ))
2094 operationName = name; // no translation
2095 myCreationInfoWdg->setOperation( icon, operationName );
2097 for ( size_t i = 0; i < info->params.length(); ++i )
2098 myCreationInfoWdg->addParam( info->params[i].name.in(),
2099 info->params[i].value.in() );
2108 void GeometryGUI::onAutoBringToFront()
2110 bool isAutoBringToFront = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "auto_bring_to_front" );
2111 if( !isAutoBringToFront )
2114 SUIT_ViewWindow* SUIT_window = application()->desktop()->activeWindow();
2115 if ( !SUIT_window || SUIT_window->getViewManager()->getType() != OCCViewer_Viewer::Type() )
2118 SalomeApp_Study* appStudy = dynamic_cast< SalomeApp_Study* >( getApp()->activeStudy() );
2119 if (!appStudy) return;
2121 GEOM_Displayer displayer( appStudy );
2123 SALOME_View* window = displayer.GetActiveView();
2124 if ( !window ) return;
2126 int aMgrId = dynamic_cast< SUIT_ViewModel* >( window )->getViewManager()->getGlobalId();
2128 SALOME_ListIO selected;
2129 getApp()->selectionMgr()->selectedObjects( selected );
2130 if (!myTopLevelIOList.IsEmpty())
2132 for( SALOME_ListIteratorOfListIO It( myTopLevelIOList ); It.More(); It.Next() )
2134 Handle( SALOME_InteractiveObject ) io = It.Value();
2135 bool isSelected = false;
2136 for( SALOME_ListIteratorOfListIO It_sel( selected ); It_sel.More(); It_sel.Next() )
2138 Handle( SALOME_InteractiveObject ) sel_io = It_sel.Value();
2139 if( io->isSame( sel_io ) )
2142 if (!isSelected && appStudy->findObjectByEntry(io->getEntry()))
2144 appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), false );
2145 if ( window->isVisible( io ) ) displayer.Redisplay( io, false );
2150 myTopLevelIOList.Assign(selected);
2151 for( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() )
2153 Handle( SALOME_InteractiveObject ) io = It.Value();
2154 appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), true );
2155 if ( window->isVisible( io ) ) displayer.Redisplay( io, false );
2158 displayer.UpdateViewer();
2159 GeometryGUI::Modified();
2162 void GeometryGUI::updateFieldColorScale()
2164 if( SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) )
2166 GEOM_Displayer aDisplayer( aStudy );
2167 aDisplayer.UpdateColorScale();
2171 QString GeometryGUI::engineIOR() const
2173 if ( !CORBA::is_nil( GetGeomGen() ) )
2174 return QString( getApp()->orb()->object_to_string( GetGeomGen() ) );
2178 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
2179 Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture
2181 Handle(Graphic3d_HArray1OfBytes) GeometryGUI::getTexture
2183 (SalomeApp_Study* theStudy, int theId, int& theWidth, int& theHeight)
2185 theWidth = theHeight = 0;
2187 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
2188 Handle(TColStd_HArray1OfByte) aTexture;
2190 Handle(Graphic3d_HArray1OfBytes) aTexture;
2194 TextureMap aTextureMap = myTextureMap[ theStudy->studyDS()->StudyId() ];
2195 aTexture = aTextureMap[ theId ];
2196 if ( aTexture.IsNull() ) {
2197 GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGen()->GetIInsertOperations( theStudy->studyDS()->StudyId() );
2198 if ( !aInsOp->_is_nil() ) {
2199 CORBA::Long aWidth, aHeight;
2200 SALOMEDS::TMPFile_var aStream = aInsOp->GetTexture( theId, aWidth, aHeight );
2201 if ( aWidth > 0 && aHeight > 0 && aStream->length() > 0 ) {
2203 theHeight = aHeight;
2205 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
2206 aTexture = new TColStd_HArray1OfByte (1, aStream->length());
2208 aTexture = new Graphic3d_HArray1OfBytes (1, aStream->length());
2211 for (int i = 0; i < aStream->length(); i++)
2212 aTexture->SetValue( i+1, (Standard_Byte)aStream[i] );
2213 aTextureMap[ theId ] = aTexture;
2221 LightApp_Selection* GeometryGUI::createSelection() const
2223 return new GEOMGUI_Selection();
2226 void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
2228 SalomeApp_Module::contextMenuPopup( client, menu, title );
2230 getApp()->selectionMgr()->selectedObjects( lst );
2232 //Add submenu for predefined materials
2233 bool isPredefMat = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "predef_materials" );
2234 if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() > 0 ) {
2235 QtxPopupMgr* mgr = popupMgr();
2236 //get parrent for submenu
2237 QAction* act = mgr->action( mgr->actionId( action( GEOMOp::OpMaterialProperties ) ) );
2239 QMenu* oldMenu = act->menu() ;
2244 QMenu* matMenu = new QMenu();
2245 QSignalMapper* signalMapper = new QSignalMapper( matMenu );
2247 //Get current material model for the object
2249 LightApp_Application* anApp = dynamic_cast<LightApp_Application*>( getApp() );
2250 if ( anApp && anApp->activeViewManager() ) {
2251 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( anApp->activeStudy() );
2253 v = aStudy->getObjectProperty( anApp->activeViewManager()->getGlobalId(), lst.Last()->getEntry(), GEOM::propertyName( GEOM::Material ), QVariant() );
2256 QString curModel = "";
2257 if ( v.canConvert<QString>() ) curModel = v.toString();
2258 // get list of all predefined materials
2259 QStringList materials = Material_ResourceMgr::resourceMgr()->materials();
2261 foreach ( QString material, materials )
2263 QAction* menAct = matMenu->addAction( material );
2264 connect(menAct, SIGNAL( toggled( bool ) ), signalMapper, SLOT( map() ) );
2265 signalMapper->setMapping( menAct, material );
2266 menAct->setCheckable( true );
2267 // Set checked if this material is current
2268 Material_Model aModel;
2269 aModel.fromResources( material );
2270 if ( !found && aModel.toProperties() == curModel ) {
2271 menAct->setChecked( true );
2275 matMenu->insertAction( matMenu->addSeparator(), action( GEOMOp::OpPredefMaterCustom ) );
2276 matMenu->insertSeparator( action( GEOMOp::OpPredefMaterCustom ) );
2277 connect( signalMapper, SIGNAL( mapped( const QString & ) ),
2278 this, SLOT( OnSetMaterial( const QString & ) ) );
2279 act->setMenu( matMenu );
2283 if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() == 1 ) {
2284 Handle(SALOME_InteractiveObject) io = lst.First();
2285 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
2286 _PTR(Study) study = appStudy->studyDS();
2287 _PTR(SObject) obj = study->FindObjectID( io->getEntry() );
2289 QString aName = QString( obj->GetName().c_str() );
2290 aName.remove( QRegExp("\\s+$") );
2296 void GeometryGUI::OnSetMaterial(const QString& theName)
2298 OnGUIEvent( GEOMOp::OpPredefMaterial, QVariant( theName ) );
2302 void GeometryGUI::createPreferences()
2304 int tabId = addPreference( tr( "PREF_TAB_SETTINGS" ) );
2306 int genGroup = addPreference( tr( "PREF_GROUP_GENERAL" ), tabId );
2307 setPreferenceProperty( genGroup, "columns", 2 );
2309 int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), genGroup,
2310 LightApp_Preferences::Selector,
2311 "Geometry", "display_mode" );
2313 addPreference( tr( "PREF_SHADING_COLOR" ), genGroup,
2314 LightApp_Preferences::Color, "Geometry", "shading_color" );
2316 addPreference( tr( "PREF_EDGES_IN_SHADING" ), genGroup,
2317 LightApp_Preferences::Color, "Geometry", "edges_in_shading_color" );
2319 addPreference( tr( "PREF_WIREFRAME_COLOR" ), genGroup,
2320 LightApp_Preferences::Color, "Geometry", "wireframe_color" );
2322 addPreference( tr( "PREF_FREE_BOUND_COLOR" ), genGroup,
2323 LightApp_Preferences::Color, "Geometry", "free_bound_color" );
2325 addPreference( tr( "PREF_LINE_COLOR"), genGroup,
2326 LightApp_Preferences::Color, "Geometry", "line_color" );
2328 addPreference( tr( "PREF_POINT_COLOR"), genGroup,
2329 LightApp_Preferences::Color, "Geometry", "point_color" );
2331 addPreference( tr( "PREF_ISOS_COLOR" ), genGroup,
2332 LightApp_Preferences::Color, "Geometry", "isos_color" );
2334 addPreference( tr( "PREF_TOPLEVEL_COLOR" ), genGroup,
2335 LightApp_Preferences::Color, "Geometry", "toplevel_color" );
2337 int top_lev_dm = addPreference( tr( "PREF_TOPLEVEL_DM" ), genGroup,
2338 LightApp_Preferences::Selector, "Geometry", "toplevel_dm" );
2340 int step = addPreference( tr( "PREF_STEP_VALUE" ), genGroup,
2341 LightApp_Preferences::IntSpin, "Geometry", "SettingsGeomStep" );
2343 int defl = addPreference( tr( "PREF_DEFLECTION" ), genGroup,
2344 LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" );
2346 addPreference( tr( "PREF_PREDEF_MATERIALS" ), genGroup,
2347 LightApp_Preferences::Bool, "Geometry", "predef_materials" );
2349 int material = addPreference( tr( "PREF_MATERIAL" ), genGroup,
2350 LightApp_Preferences::Selector,
2351 "Geometry", "material" );
2353 addPreference( tr( "PREF_EDITGROUP_COLOR" ), genGroup,
2354 LightApp_Preferences::Color, "Geometry", "editgroup_color" );
2360 wd[iter++] = addPreference( tr( "PREF_EDGE_WIDTH" ), genGroup,
2361 LightApp_Preferences::IntSpin, "Geometry", "edge_width" );
2363 wd[iter++] = addPreference( tr( "PREF_ISOLINES_WIDTH" ), genGroup,
2364 LightApp_Preferences::IntSpin, "Geometry", "isolines_width" );
2366 wd[iter++] = addPreference( tr( "PREF_PREVIEW_EDGE_WIDTH" ), genGroup,
2367 LightApp_Preferences::IntSpin, "Geometry", "preview_edge_width" );
2369 wd[iter++] = addPreference( tr( "PREF_MEASURES_LINE_WIDTH" ), genGroup,
2370 LightApp_Preferences::IntSpin, "Geometry", "measures_line_width" );
2372 for (int i = 0; i < nb; i++) {
2373 setPreferenceProperty( wd[i], "min", 1 );
2374 setPreferenceProperty( wd[i], "max", 5 );
2377 addPreference( tr( "PREF_AUTO_BRING_TO_FRONT" ), genGroup,
2378 LightApp_Preferences::Bool, "Geometry", "auto_bring_to_front" );
2380 int aDimGroupId = addPreference( tr( "PREF_DIMENSIONS" ), tabId );
2381 setPreferenceProperty( aDimGroupId, "columns", 2 );
2383 addPreference( tr( "PREF_DIMENSIONS_COLOR" ), aDimGroupId,
2384 LightApp_Preferences::Color, "Geometry", "dimensions_color" );
2386 int aDimLineWidthId = addPreference( tr( "PREF_DIMENSIONS_LINE_WIDTH" ), aDimGroupId,
2387 LightApp_Preferences::IntSpin, "Geometry", "dimensions_line_width" );
2389 setPreferenceProperty( aDimLineWidthId, "min", 1 );
2390 setPreferenceProperty( aDimLineWidthId, "max", 5 );
2392 int aDimFontHeightId = addPreference( tr( "PREF_DIMENSIONS_FONT_HEIGHT" ), aDimGroupId,
2393 LightApp_Preferences::DblSpin, "Geometry", "dimensions_font_height" );
2395 setPreferenceProperty( aDimFontHeightId, "min", 1e-9 );
2396 setPreferenceProperty( aDimFontHeightId, "max", 1e+9 );
2397 setPreferenceProperty( aDimFontHeightId, "precision", 9 );
2399 int aDimArrLengthId = addPreference( tr( "PREF_DIMENSIONS_ARROW_LENGTH" ), aDimGroupId,
2400 LightApp_Preferences::DblSpin, "Geometry", "dimensions_arrow_length" );
2402 setPreferenceProperty( aDimArrLengthId, "min", 1e-9 );
2403 setPreferenceProperty( aDimArrLengthId, "max", 1e+9 );
2404 setPreferenceProperty( aDimArrLengthId, "precision", 9 );
2406 int aLengthUnitsId = addPreference( tr( "PREF_DIMENSIONS_LENGTH_UNITS" ), aDimGroupId,
2407 LightApp_Preferences::Selector, "Geometry", "dimensions_length_units" );
2409 int anAngUnitsId = addPreference( tr( "PREF_DIMENSIONS_ANGLE_UNITS" ), aDimGroupId,
2410 LightApp_Preferences::Selector, "Geometry", "dimensions_angle_units" );
2412 addPreference( tr( "PREF_DIMENSIONS_SHOW_UNITS" ), aDimGroupId,
2413 LightApp_Preferences::Bool, "Geometry", "dimensions_show_units" );
2415 QStringList aListOfLengthUnits;
2416 aListOfLengthUnits << "m";
2417 aListOfLengthUnits << "cm";
2418 aListOfLengthUnits << "mm";
2419 aListOfLengthUnits << "in.";
2420 aListOfLengthUnits << "ft.";
2422 QStringList aListOfAngUnits;
2423 aListOfAngUnits << "rad";
2424 aListOfAngUnits << "deg";
2426 setPreferenceProperty( aLengthUnitsId, "strings", aListOfLengthUnits );
2427 setPreferenceProperty( anAngUnitsId, "strings", aListOfAngUnits );
2429 int aDimDefFlyout = addPreference( tr( "PREF_DIMENSIONS_DEFAULT_FLYOUT" ), aDimGroupId,
2430 LightApp_Preferences::DblSpin, "Geometry", "dimensions_default_flyout" );
2432 setPreferenceProperty( aDimDefFlyout, "min", 1e-9 );
2433 setPreferenceProperty( aDimDefFlyout, "max", 1e+9 );
2434 setPreferenceProperty( aDimDefFlyout, "precision", 9 );
2436 int isoGroup = addPreference( tr( "PREF_ISOS" ), tabId );
2437 setPreferenceProperty( isoGroup, "columns", 2 );
2438 int isoU = addPreference( tr( "PREF_ISOS_U" ), isoGroup,
2439 LightApp_Preferences::IntSpin, "Geometry", "iso_number_u" );
2440 setPreferenceProperty( isoU, "min", 0 );
2441 setPreferenceProperty( isoU, "max", 100000 );
2442 int isoV = addPreference( tr( "PREF_ISOS_V" ), isoGroup,
2443 LightApp_Preferences::IntSpin, "Geometry", "iso_number_v" );
2444 setPreferenceProperty( isoV, "min", 0 );
2445 setPreferenceProperty( isoV, "max", 100000 );
2447 // Quantities with individual precision settings
2448 int precGroup = addPreference( tr( "GEOM_PREF_GROUP_PRECISION" ), tabId );
2449 setPreferenceProperty( precGroup, "columns", 2 );
2451 const int nbQuantities = 8;
2452 int prec[nbQuantities], ii = 0;
2453 prec[ii++] = addPreference( tr( "GEOM_PREF_length_precision" ), precGroup,
2454 LightApp_Preferences::IntSpin, "Geometry", "length_precision" );
2455 prec[ii++] = addPreference( tr( "GEOM_PREF_angle_precision" ), precGroup,
2456 LightApp_Preferences::IntSpin, "Geometry", "angle_precision" );
2457 prec[ii++] = addPreference( tr( "GEOM_PREF_len_tol_precision" ), precGroup,
2458 LightApp_Preferences::IntSpin, "Geometry", "len_tol_precision" );
2459 prec[ii++] = addPreference( tr( "GEOM_PREF_ang_tol_precision" ), precGroup,
2460 LightApp_Preferences::IntSpin, "Geometry", "ang_tol_precision" );
2461 prec[ii++] = addPreference( tr( "GEOM_PREF_weight_precision" ), precGroup,
2462 LightApp_Preferences::IntSpin, "Geometry", "weight_precision" );
2463 prec[ii++] = addPreference( tr( "GEOM_PREF_density_precision" ), precGroup,
2464 LightApp_Preferences::IntSpin, "Geometry", "density_precision" );
2465 prec[ii++] = addPreference( tr( "GEOM_PREF_parametric_precision" ), precGroup,
2466 LightApp_Preferences::IntSpin, "Geometry", "parametric_precision" );
2467 prec[ii ] = addPreference( tr( "GEOM_PREF_param_tol_precision" ), precGroup,
2468 LightApp_Preferences::IntSpin, "Geometry", "param_tol_precision" );
2470 // Set property for precision value for spinboxes
2471 for ( ii = 0; ii < nbQuantities; ii++ ){
2472 setPreferenceProperty( prec[ii], "min", -14 );
2473 setPreferenceProperty( prec[ii], "max", 14 );
2474 setPreferenceProperty( prec[ii], "precision", 2 );
2477 int VertexGroup = addPreference( tr( "PREF_GROUP_VERTEX" ), tabId );
2478 setPreferenceProperty( VertexGroup, "columns", 2 );
2480 int typeOfMarker = addPreference( tr( "PREF_TYPE_OF_MARKER" ), VertexGroup,
2481 LightApp_Preferences::Selector, "Geometry", "type_of_marker" );
2483 int markerScale = addPreference( tr( "PREF_MARKER_SCALE" ), VertexGroup,
2484 LightApp_Preferences::Selector, "Geometry", "marker_scale" );
2486 // Set property for default display mode
2487 QStringList aModesList;
2488 aModesList.append( tr("MEN_WIREFRAME") );
2489 aModesList.append( tr("MEN_SHADING") );
2490 aModesList.append( tr("MEN_SHADING_WITH_EDGES") );
2492 QList<QVariant> anIndexesList;
2493 anIndexesList.append(0);
2494 anIndexesList.append(1);
2495 anIndexesList.append(2);
2497 setPreferenceProperty( dispmode, "strings", aModesList );
2498 setPreferenceProperty( dispmode, "indexes", anIndexesList );
2500 // Set property for top level display mode
2501 QStringList aTopModesList;
2502 aTopModesList.append( tr("MEN_SHOW_ADD_WACTOR") );
2503 aTopModesList.append( tr("MEN_KEEP_CURRENT_DM") );
2504 aTopModesList.append( tr("MEN_WIREFRAME") );
2505 aTopModesList.append( tr("MEN_SHADING") );
2506 aTopModesList.append( tr("MEN_SHADING_WITH_EDGES") );
2508 QList<QVariant> aTopIndexesList;
2509 aTopIndexesList.append(0);
2510 aTopIndexesList.append(1);
2511 aTopIndexesList.append(2);
2512 aTopIndexesList.append(3);
2513 aTopIndexesList.append(4);
2515 setPreferenceProperty( top_lev_dm, "strings", aTopModesList );
2516 setPreferenceProperty( top_lev_dm, "indexes", aTopIndexesList );
2518 // Set property for step value for spinboxes
2519 setPreferenceProperty( step, "min", 1 );
2520 setPreferenceProperty( step, "max", 10000 );
2521 setPreferenceProperty( step, "precision", 3 );
2523 // Set property for deflection value for spinboxes
2524 setPreferenceProperty( defl, "min", GEOM::minDeflection() );
2525 setPreferenceProperty( defl, "max", 1.0 );
2526 setPreferenceProperty( defl, "step", 1.0e-04 );
2527 setPreferenceProperty( defl, "precision", 6 );
2529 // Set property for default material
2530 setPreferenceProperty( material, "strings", Material_ResourceMgr::resourceMgr()->materials() );
2532 // Set property vertex marker type
2533 QList<QVariant> aMarkerTypeIndicesList;
2534 QList<QVariant> aMarkerTypeIconsList;
2536 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
2537 for ( int i = GEOM::MT_POINT; i < GEOM::MT_USER; i++ ) {
2538 QString icoFile = QString( "ICON_VERTEX_MARKER_%1" ).arg( i );
2539 QPixmap pixmap = resMgr->loadPixmap( "GEOM", tr( qPrintable( icoFile ) ) );
2540 aMarkerTypeIndicesList << (i-1);
2541 aMarkerTypeIconsList << pixmap;
2544 setPreferenceProperty( typeOfMarker, "indexes", aMarkerTypeIndicesList );
2545 setPreferenceProperty( typeOfMarker, "icons", aMarkerTypeIconsList );
2547 // Set property for vertex marker scale
2548 QList<QVariant> aMarkerScaleIndicesList;
2549 QStringList aMarkerScaleValuesList;
2551 for ( int iii = GEOM::MS_10; iii <= GEOM::MS_70; iii++ ) {
2552 aMarkerScaleIndicesList << iii;
2553 aMarkerScaleValuesList << QString::number( (iii-(int)GEOM::MS_10)*0.5 + 1.0 );
2556 setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList );
2557 setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
2559 // Scalar bar for field step presentation
2560 int scalarBarGroup = addPreference( tr( "PREF_GROUP_SCALAR_BAR" ), tabId );
2561 setPreferenceProperty( scalarBarGroup, "columns", 2 );
2563 int sbXPosition = addPreference( tr( "PREF_SCALAR_BAR_X_POSITION" ), scalarBarGroup,
2564 LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_x_position" );
2565 setPreferenceProperty( sbXPosition, "min", 0 );
2566 setPreferenceProperty( sbXPosition, "max", 1 );
2567 setPreferenceProperty( sbXPosition, "step", 0.05 );
2569 int sbYPosition = addPreference( tr( "PREF_SCALAR_BAR_Y_POSITION" ), scalarBarGroup,
2570 LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_y_position" );
2571 setPreferenceProperty( sbYPosition, "min", 0 );
2572 setPreferenceProperty( sbYPosition, "max", 1 );
2573 setPreferenceProperty( sbYPosition, "step", 0.05 );
2575 int sbWidth = addPreference( tr( "PREF_SCALAR_BAR_WIDTH" ), scalarBarGroup,
2576 LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_width" );
2577 setPreferenceProperty( sbWidth, "min", 0 );
2578 setPreferenceProperty( sbWidth, "max", 1 );
2579 setPreferenceProperty( sbWidth, "step", 0.05 );
2581 int sbHeight = addPreference( tr( "PREF_SCALAR_BAR_HEIGHT" ), scalarBarGroup,
2582 LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_height" );
2583 setPreferenceProperty( sbHeight, "min", 0 );
2584 setPreferenceProperty( sbHeight, "max", 1 );
2585 setPreferenceProperty( sbHeight, "step", 0.05 );
2587 int sbTextHeight = addPreference( tr( "PREF_SCALAR_BAR_TEXT_HEIGHT" ), scalarBarGroup,
2588 LightApp_Preferences::IntSpin, "Geometry", "scalar_bar_text_height" );
2589 setPreferenceProperty( sbTextHeight, "min", 6 );
2590 setPreferenceProperty( sbTextHeight, "max", 24 );
2591 setPreferenceProperty( sbTextHeight, "step", 1 );
2593 int sbNbIntervals = addPreference( tr( "PREF_SCALAR_BAR_NUMBER_OF_INTERVALS" ), scalarBarGroup,
2594 LightApp_Preferences::IntSpin, "Geometry", "scalar_bar_nb_intervals" );
2595 setPreferenceProperty( sbNbIntervals, "min", 2 );
2596 setPreferenceProperty( sbNbIntervals, "max", 64 );
2597 setPreferenceProperty( sbNbIntervals, "step", 1 );
2599 int originGroup = addPreference( tr( "PREF_GROUP_ORIGIN_AND_BASE_VECTORS" ), tabId );
2600 setPreferenceProperty( originGroup, "columns", 2 );
2602 int baseVectorsLength = addPreference( tr( "PREF_BASE_VECTORS_LENGTH" ), originGroup,
2603 LightApp_Preferences::DblSpin, "Geometry", "base_vectors_length" );
2604 setPreferenceProperty( baseVectorsLength, "min", 0.01 );
2605 setPreferenceProperty( baseVectorsLength, "max", 1000 );
2607 addPreference( tr( "PREF_AUTO_CREATE" ), originGroup,
2608 LightApp_Preferences::Bool, "Geometry", "auto_create_base_objects" );
2610 int operationsGroup = addPreference( tr( "PREF_GROUP_OPERATIONS" ), tabId );
2611 setPreferenceProperty( operationsGroup, "columns", 2 );
2613 addPreference( tr( "GEOM_PREVIEW" ), operationsGroup,
2614 LightApp_Preferences::Bool, "Geometry", "geom_preview" );
2617 void GeometryGUI::preferencesChanged( const QString& section, const QString& param )
2619 if (section == "Geometry") {
2620 SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
2621 if (param == QString("SettingsGeomStep")) {
2622 double spin_step = aResourceMgr->doubleValue(section, param, 100.);
2623 EmitSignalDefaultStepValueChanged(spin_step);
2625 else if (param == QString("toplevel_color")) {
2626 QColor c = aResourceMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) );
2627 GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c));
2629 else if (param == QString("toplevel_dm")) {
2630 GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)aResourceMgr->integerValue("Geometry", "toplevel_dm", 0));
2632 else if (param == QString("scalar_bar_x_position") ||
2633 param == QString("scalar_bar_y_position") ||
2634 param == QString("scalar_bar_width") ||
2635 param == QString("scalar_bar_height") ||
2636 param == QString("scalar_bar_text_height") ||
2637 param == QString("scalar_bar_nb_intervals")) {
2638 if( SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) )
2640 GEOM_Displayer aDisplayer( aStudy );
2641 bool anIsRedisplayFieldSteps = param == QString("scalar_bar_nb_intervals");
2642 aDisplayer.UpdateColorScale( anIsRedisplayFieldSteps, true );
2645 else if ( param == QString("dimensions_color") ||
2646 param == QString("dimensions_line_width") ||
2647 param == QString("dimensions_font_height") ||
2648 param == QString("dimensions_arrow_length") ||
2649 param == QString("dimensions_show_units") ||
2650 param == QString("dimensions_length_units") ||
2651 param == QString("dimensions_angle_units") )
2653 SalomeApp_Application* anApp = getApp();
2659 SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( anApp->activeStudy() );
2665 GEOM_Displayer aDisplayer( aStudy );
2667 ViewManagerList aVMs;
2668 anApp->viewManagers( OCCViewer_Viewer::Type(), aVMs );
2669 ViewManagerList::Iterator anIt = aVMs.begin();
2670 for ( ; anIt != aVMs.end(); ++anIt )
2672 SOCC_Viewer* aViewer = dynamic_cast<SOCC_Viewer*>( (*anIt)->getViewModel() );
2678 SALOME_ListIO aVisible;
2679 aViewer->GetVisible( aVisible );
2680 aDisplayer.Redisplay( aVisible, false, aViewer );
2683 aDisplayer.UpdateViewer();
2688 LightApp_Displayer* GeometryGUI::displayer()
2691 myDisplayer = new GEOM_Displayer( dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) );
2695 void GeometryGUI::setLocalSelectionMode(const int mode)
2697 myLocalSelectionMode = mode;
2700 int GeometryGUI::getLocalSelectionMode() const
2702 return myLocalSelectionMode;
2705 const char gSeparator = '_'; // character used to separate parameter names
2706 const char gDigitsSep = ':'; // character used to separate numeric parameter values (color = r:g:b)
2709 * \brief Store visual parameters
2711 * This method is called just before the study document is saved.
2712 * Store visual parameters in AttributeParameter attribute(s)
2714 void GeometryGUI::storeVisualParameters (int savePoint)
2716 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
2717 if ( !appStudy || !appStudy->studyDS() )
2719 _PTR(Study) studyDS = appStudy->studyDS();
2721 // componentName is used for encoding of entries when storing them in IParameters
2722 std::string componentName = myComponentGeom->ComponentDataType();
2723 //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
2724 //if (!aSComponent) return;
2727 _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
2728 componentName.c_str(),
2730 _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
2732 QSet<QString> anEntriesToStoreShared;
2733 QList<SUIT_ViewManager*> lst;
2734 QList<SUIT_ViewManager*>::Iterator it;
2736 // main cycle to store parameters of displayed objects
2738 getApp()->viewManagers(lst);
2739 for (it = lst.begin(); it != lst.end(); it++) {
2740 SUIT_ViewManager* vman = *it;
2741 QString vType = vman->getType();
2742 int aMgrId = vman->getGlobalId();
2743 // saving VTK actors properties
2744 QVector<SUIT_ViewWindow*> views = vman->getViews();
2745 for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++) {
2746 const ObjMap anObjects = appStudy->getObjectMap(aMgrId);
2747 ObjMap::ConstIterator o_it = anObjects.begin();
2748 for (; o_it != anObjects.end(); o_it++) {
2749 const PropMap aProps = o_it.value();
2751 //Check that object exists in the study
2752 _PTR(SObject) obj( studyDS->FindObjectID( o_it.key().toLatin1().data() ) );
2753 if ( !obj || !(aProps.count() > 0))
2755 // entry is "encoded" = it does NOT contain component adress, since it is a
2756 // subject to change on next component loading
2758 std::string entry = ip->encodeEntry(o_it.key().toLatin1().data(), componentName);
2760 _PTR(GenericAttribute) anAttr;
2761 if (!obj->FindAttribute(anAttr, "AttributeIOR"))
2764 // remember entry of object to store shared GEOM properties
2765 // (e.g. dimension properties).
2766 if ( vType == OCCViewer_Viewer::Type() )
2768 anEntriesToStoreShared.insert( o_it.key() );
2771 QString param, occParam = vType;
2772 occParam += GEOM::sectionSeparator();
2773 occParam += QString::number(aMgrId);
2774 occParam += GEOM::sectionSeparator();
2776 if (aProps.contains(GEOM::propertyName( GEOM::Visibility ))) {
2777 param = occParam + GEOM::propertyName( GEOM::Visibility );
2778 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Visibility )).toBool() ? "On" : "Off");
2781 if (aProps.contains(GEOM::propertyName( GEOM::DisplayMode ))) {
2782 param = occParam + GEOM::propertyName( GEOM::DisplayMode );
2783 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::DisplayMode )).toString().toStdString());
2786 if (aProps.contains(GEOM::propertyName( GEOM::Color ))) {
2787 QColor c = aProps.value(GEOM::propertyName( GEOM::Color )).value<QColor>();
2789 val << QString::number(c.redF());
2790 val << QString::number(c.greenF());
2791 val << QString::number(c.blueF());
2792 param = occParam + GEOM::propertyName( GEOM::Color );
2793 ip->setParameter(entry, param.toStdString(), val.join( GEOM::subSectionSeparator()).toStdString());
2796 if (aProps.contains(GEOM::propertyName( GEOM::Texture ))) {
2797 param = occParam + GEOM::propertyName( GEOM::Texture );
2798 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Texture )).toString().toStdString());
2801 if (vType == SVTK_Viewer::Type()) {
2802 if (aProps.contains(GEOM::propertyName( GEOM::Opacity ))) {
2803 param = occParam + GEOM::propertyName( GEOM::Opacity );
2804 ip->setParameter(entry, param.toStdString(), QString::number(1. - aProps.value(GEOM::propertyName( GEOM::Transparency )).toDouble()).toStdString());
2806 } else if (vType == SOCC_Viewer::Type()) {
2807 if (aProps.contains(GEOM::propertyName( GEOM::Transparency ))) {
2808 param = occParam + GEOM::propertyName( GEOM::Transparency );
2809 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Transparency )).toString().toStdString());
2812 if (aProps.contains(GEOM::propertyName( GEOM::TopLevel ))) {
2813 param = occParam + GEOM::propertyName( GEOM::TopLevel );
2814 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::TopLevel )).toString().toStdString());
2818 if (aProps.contains(GEOM::propertyName( GEOM::NbIsos ))) {
2819 param = occParam + GEOM::propertyName( GEOM::NbIsos );
2820 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::NbIsos )).toString().toStdString());
2823 if (aProps.contains(GEOM::propertyName( GEOM::EdgesDirection ))) {
2824 param = occParam + GEOM::propertyName( GEOM::EdgesDirection );
2825 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::EdgesDirection )).toString().toStdString());
2828 if (aProps.contains(GEOM::propertyName( GEOM::Deflection ))) {
2829 param = occParam + GEOM::propertyName( GEOM::Deflection );
2830 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Deflection )).toString().toStdString());
2833 //Marker type of the vertex - ONLY for the "Vertex" and "Compound of the Vertex"
2834 if (aProps.contains(GEOM::propertyName( GEOM::PointMarker ))) {
2835 param = occParam + GEOM::propertyName( GEOM::PointMarker );
2836 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::PointMarker )).toString().toStdString());
2839 if (aProps.contains(GEOM::propertyName( GEOM::Material ))) {
2840 param = occParam + GEOM::propertyName( GEOM::Material );
2841 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Material )).toString().toStdString());
2844 if (aProps.contains(GEOM::propertyName( GEOM::LineWidth ))) {
2845 param = occParam + GEOM::propertyName( GEOM::LineWidth );
2846 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::LineWidth )).toString().toStdString());
2849 if (aProps.contains(GEOM::propertyName( GEOM::IsosWidth ))) {
2850 param = occParam + GEOM::propertyName( GEOM::IsosWidth );
2851 ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::IsosWidth )).toString().toStdString());
2853 } // object iterator
2855 } // for (viewManagers)
2857 // store dimension attributes of objects:
2858 // since the displayed object always persists in property map, we remember the object entries
2859 // on the passes when we store viewer related properties - to avoid extra iterations on GEOM component tree.
2860 QString aDimensionParam = OCCViewer_Viewer::Type() + GEOM::sectionSeparator() + GEOM::propertyName( GEOM::Dimensions );
2861 QSet<QString>::ConstIterator aEntryIt = anEntriesToStoreShared.constBegin();
2862 for ( ; aEntryIt != anEntriesToStoreShared.constEnd(); ++aEntryIt )
2864 std::string aStudyEntry = (*aEntryIt).toLatin1().data();
2865 std::string aStoreEntry = ip->encodeEntry( aStudyEntry, componentName);
2867 GEOMGUI_DimensionProperty aDimensions( appStudy, aStudyEntry );
2869 if ( aDimensions.GetNumber() == 0 )
2874 ip->setParameter( aStoreEntry, aDimensionParam.toStdString(), ((QString)aDimensions).toLatin1().data() );
2879 * \brief Restore visual parameters
2881 * This method is called after the study document is opened.
2882 * Restore visual parameters from AttributeParameter attribute(s)
2884 void GeometryGUI::restoreVisualParameters (int savePoint)
2886 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
2887 if (!appStudy || !appStudy->studyDS())
2889 _PTR(Study) studyDS = appStudy->studyDS();
2891 // componentName is used for encoding of entries when storing them in IParameters
2892 std::string componentName = myComponentGeom->ComponentDataType();
2893 //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
2894 //if (!aSComponent) return;
2897 _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
2898 componentName.c_str(),
2900 _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
2902 std::vector<std::string> entries = ip->getEntries();
2904 for (std::vector<std::string>::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt)
2906 // entry is a normal entry - it should be "decoded" (setting base adress of component)
2907 QString entry (ip->decodeEntry(*entIt).c_str());
2909 // Check that the entry corresponds to a real object in the Study
2910 // as the object may be deleted or modified after the visual state is saved.
2911 _PTR(SObject) so = studyDS->FindObjectID(entry.toLatin1().data());
2912 if (!so) continue; //Skip the not existent entry
2914 std::vector<std::string> paramNames = ip->getAllParameterNames( *entIt );
2915 std::vector<std::string> paramValues = ip->getAllParameterValues( *entIt );
2917 std::vector<std::string>::iterator namesIt = paramNames.begin();
2918 std::vector<std::string>::iterator valuesIt = paramValues.begin();
2920 // actors are stored in a map after displaying of them for
2921 // quicker access in the future: map < viewID to actor >
2922 NCollection_DataMap<int, GEOM_Actor* > vtkActors;
2923 NCollection_DataMap<int, Handle(GEOM_AISShape)> occActors;
2925 QString viewerTypStr;
2926 QString viewIndexStr;
2928 QVector<PropMap> aListOfMap;
2930 for (; namesIt != paramNames.end(); ++namesIt, ++valuesIt)
2932 // visual parameters are stored in strings as follows:
2933 // 1) ViewerType_ViewIndex_ParamName
2934 // 2) ViewerType_ParamName (shared for GEOM module)
2935 // '_' is used as separator and should not be used in viewer type or parameter names.
2936 QStringList lst = QString((*namesIt).c_str()).split( GEOM::sectionSeparator(), QString::SkipEmptyParts);
2938 bool isShared = lst.size() == 2;
2939 bool isViewer = lst.size() == 3;
2940 if ( !isShared && !isViewer )
2945 // shared visual parameters
2948 QString aParamNameStr( lst[1] );
2949 QString aValuesStr( (*valuesIt).c_str() );
2951 // shared dimension properties are stored as attribute
2952 if ( aParamNameStr == GEOM::propertyName( GEOM::Dimensions ) )
2954 GEOMGUI_DimensionProperty aDimensionProp( aValuesStr );
2955 aDimensionProp.SaveToAttribute( appStudy, entry.toLatin1().data() );
2961 // per view visual parameters
2962 viewerTypStr = lst[0];
2963 viewIndexStr = lst[1];
2964 QString paramNameStr = lst[2];
2967 viewIndex = viewIndexStr.toUInt(&ok);
2968 if (!ok) // bad conversion of view index to integer
2971 if ((viewIndex + 1) > aListOfMap.count()) {
2972 aListOfMap.resize(viewIndex + 1);
2975 QString val((*valuesIt).c_str());
2976 if (paramNameStr == GEOM::propertyName( GEOM::Visibility )) {
2977 aListOfMap[viewIndex].insert(GEOM::propertyName( GEOM::Visibility ), val == "On");
2978 } else if (paramNameStr == GEOM::propertyName( GEOM::Opacity )) {
2979 aListOfMap[viewIndex].insert(GEOM::propertyName( GEOM::Transparency ), 1. - val.toDouble());
2980 } else if (paramNameStr == GEOM::propertyName( GEOM::Transparency )) {
2981 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Transparency ), val.toDouble() );
2982 } else if (paramNameStr == GEOM::propertyName( GEOM::TopLevel )) {
2983 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::TopLevel ), val == "true" || val == "1");
2984 } else if (paramNameStr == GEOM::propertyName( GEOM::DisplayMode )) {
2985 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::DisplayMode ), val.toInt());
2986 } else if (paramNameStr == GEOM::propertyName( GEOM::NbIsos )) {
2987 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::NbIsos ), val);
2988 } else if (paramNameStr == GEOM::propertyName( GEOM::Color )) {
2989 QStringList rgb = val.split(GEOM::subSectionSeparator());
2990 if (rgb.count() == 3) {
2991 QColor c = QColor::fromRgbF(rgb[0].toDouble(), rgb[1].toDouble(), rgb[2].toDouble());
2992 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Color ), c);
2994 } else if (paramNameStr == GEOM::propertyName( GEOM::Texture )) {
2995 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Texture ), val );
2996 } else if (paramNameStr == GEOM::propertyName( GEOM::EdgesDirection )) {
2997 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::EdgesDirection ), val == "true" || val == "1");
2998 } else if (paramNameStr == GEOM::propertyName( GEOM::Deflection )) {
2999 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Deflection ), val.toDouble());
3000 } else if (paramNameStr == GEOM::propertyName( GEOM::PointMarker )) {
3001 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::PointMarker ), val);
3002 } else if (paramNameStr == GEOM::propertyName( GEOM::Material )) {
3003 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Material ), val);
3004 } else if (paramNameStr == GEOM::propertyName( GEOM::LineWidth )) {
3005 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::LineWidth ), val.toInt());
3006 } else if (paramNameStr == GEOM::propertyName( GEOM::IsosWidth )) {
3007 aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::IsosWidth ), val.toInt());
3009 } // for names/parameters iterator
3011 QList<SUIT_ViewManager*> lst = getApp()->viewManagers();
3013 for (int index = 0; index < aListOfMap.count(); index++) {
3015 appStudy->setObjectPropMap(index, entry, aListOfMap[index]);
3017 //Get Visibility property of the current PropMap
3018 if (aListOfMap[index].value(GEOM::propertyName( GEOM::Visibility )) == 1) {
3019 SUIT_ViewManager* vman = lst.at(index);
3020 SUIT_ViewModel* vmodel = vman->getViewModel();
3021 displayer()->Display(entry, true, dynamic_cast<SALOME_View*>(vmodel));
3024 } // for entries iterator
3026 // update all VTK and OCC views
3027 QList<SUIT_ViewManager*> lst;
3028 getApp()->viewManagers(lst);
3029 for (QList<SUIT_ViewManager*>::Iterator it = lst.begin(); it != lst.end(); it++) {
3030 SUIT_ViewModel* vmodel = (*it)->getViewModel();
3033 if (vmodel->getType() == SVTK_Viewer::Type()) {
3034 SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) (*it)->getActiveView();
3035 vtkView->getRenderer()->ResetCameraClippingRange();
3038 else if (vmodel->getType() == SOCC_Viewer::Type()) {
3039 //SOCC_ViewWindow* occView = (SOCC_ViewWindow*) (*it)->getActiveView();
3040 SALOME_View* occVMod = dynamic_cast<SALOME_View*>(vmodel);
3047 void GeometryGUI::onViewAboutToShow()
3049 SUIT_ViewWindow* window = application()->desktop()->activeWindow();
3050 QAction* a = action( GEOMOp::OpSwitchVectors );
3052 a->setEnabled(true);
3053 bool vmode = window->property("VectorsMode").toBool();
3054 a->setText ( vmode == 1 ? tr( "MEN_VECTOR_MODE_OFF" ) : tr("MEN_VECTOR_MODE_ON") );
3056 a->setText ( tr("MEN_VECTOR_MODE_ON") );
3057 a->setEnabled(false);
3062 \brief Return action by id
3063 \param id identifier of the action
3066 QAction* GeometryGUI::getAction(const int id) {
3071 \brief GEOM module message handler
3073 This method can be re-implemented in the subclasses.
3074 This is a GEOM module message handler.
3076 \param msg the message received.
3078 void GeometryGUI::message(const QString& msg)
3081 QStringList data = msg.split("/");
3082 const int nbStrings = data.count();
3084 if (nbStrings > 0) {
3085 if (data[0] == "modified") {
3087 QString anIOR = nbStrings > 1 ? data[1] : QString();
3089 if ( anIOR.isEmpty() ) {
3093 // Get the geom object.
3094 GEOM::GEOM_Object_ptr anObj = GeometryGUI::GetObjectFromIOR (anIOR);
3096 // Clear the shape buffer
3097 GeometryGUI::ClearShapeBuffer (anObj);
3103 \brief Clears the shape buffer.
3105 This is a static method. It clears the shape buffer.
3107 \param theObj the object
3109 void GeometryGUI::ClearShapeBuffer( GEOM::GEOM_Object_ptr theObj )
3111 if ( CORBA::is_nil( theObj ) )
3114 CORBA::String_var IOR = SalomeApp_Application::orb()->object_to_string( theObj );
3115 TCollection_AsciiString asciiIOR( (char *)IOR.in() );
3116 GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
3118 SALOMEDSClient_StudyManager *aManager = SalomeApp_Application::studyMgr();
3123 _PTR(Study) aStudy = aManager->GetStudyByID(theObj->GetStudyID());
3128 _PTR(SObject) aSObj ( aStudy->FindObjectIOR( std::string( IOR ) ) );
3132 _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) );
3133 for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) {
3134 _PTR(GenericAttribute) anAttr;
3135 if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) {
3136 _PTR(AttributeIOR) anIOR ( anAttr );
3137 TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() );
3138 GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
3144 \brief Returns the object from IOR.
3146 This is a static method. It returns the object from its IOR.
3148 \param IOR object IOR
3149 \return GEOM object.
3151 GEOM::GEOM_Object_ptr GeometryGUI::GetObjectFromIOR( const QString& IOR )
3153 GEOM::GEOM_Object_var geomObj;
3154 if ( !IOR.isEmpty() ) {
3155 CORBA::Object_var corbaObj = SalomeApp_Application::orb()->string_to_object
3156 ( IOR.toLatin1().constData() );
3157 if ( !CORBA::is_nil( corbaObj ) )
3158 geomObj = GEOM::GEOM_Object::_narrow( corbaObj );
3160 return geomObj._retn();
3164 \brief Returns IOR of the object.
3166 This is a static method. It returns the object's IOR.
3168 \param object the GEOM object.
3169 \return object's IOR.
3171 QString GeometryGUI::GetIORFromObject( GEOM::GEOM_Object_ptr object )
3174 if ( !CORBA::is_nil( object ) ) {
3175 CORBA::String_var anIOR =
3176 SalomeApp_Application::orb()->object_to_string( object );
3183 \brief Check if this object is can't be renamed in place
3185 This method can be re-implemented in the subclasses.
3186 Return true in case if object isn't reference or component (module root).
3188 \param entry column id
3189 \return \c true if the item can be renamed by the user in place (e.g. in the Object browser)
3191 bool GeometryGUI::renameAllowed( const QString& entry) const {
3193 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
3194 SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
3195 SalomeApp_DataObject* obj = appStudy ? dynamic_cast<SalomeApp_DataObject*>(appStudy->findObjectByEntry(entry)) : 0;
3197 return (app && appStudy && obj && !appStudy->isComponent(entry) && !obj->isReference());
3201 Rename object by entry.
3202 \param entry entry of the object
3203 \param name new name of the object
3204 \brief Return \c true if rename operation finished successfully, \c false otherwise.
3206 bool GeometryGUI::renameObject( const QString& entry, const QString& name)
3208 bool result = false;
3210 SalomeApp_Application* app =
3211 dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication());
3212 SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
3217 _PTR(Study) aStudy = appStudy->studyDS();
3222 bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
3224 SUIT_MessageBox::warning ( app->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
3228 _PTR(SObject) obj ( aStudy->FindObjectID(qPrintable(entry)) );
3229 _PTR(GenericAttribute) anAttr;
3231 if ( obj->FindAttribute(anAttr, "AttributeName") ) {
3232 _PTR(AttributeName) aName (anAttr);
3234 aName->SetValue( name.toLatin1().data() ); // rename the SObject
3235 GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(obj));
3236 if (!CORBA::is_nil(anObj)) {
3237 anObj->SetName( name.toLatin1().data() ); // Rename the corresponding GEOM_Object
3245 void GeometryGUI::updateMaterials()
3247 LightApp_Preferences* pref = preferences();
3249 QStringList materials = Material_ResourceMgr::resourceMgr()->materials();
3250 QString currentMaterial = SUIT_Session::session()->resourceMgr()->stringValue( "Geometry", "material" );
3251 if ( !materials.contains( currentMaterial ) )
3252 // user material set as default in the preferences, might be removed
3253 SUIT_Session::session()->resourceMgr()->setValue( "Geometry", "material", QString( "Plastic" ) );
3255 QtxPreferenceItem* prefItem = pref->rootItem()->findItem( tr( "PREF_MATERIAL" ), true );
3257 setPreferenceProperty( prefItem->id(),
3258 "strings", materials );
3259 prefItem->retrieve();
3265 \brief Check if the module allows "drag" operation of its objects.
3267 Overloaded from LightApp_Module class.
3269 This function is a part of the general drag-n-drop mechanism.
3270 The goal of this function is to check data object passed as a parameter
3271 and decide if it can be dragged or no.
3273 \param what data object being tested for drag operation
3274 \return \c true if module allows dragging of the specified object
3275 \sa isDropAccepted(), dropObjects()
3277 bool GeometryGUI::isDraggable( const SUIT_DataObject* what ) const
3279 // we allow dragging object under root and object from folder
3280 int aLevel = what->level();
3281 bool anObjectInFolder = false;
3283 const SalomeApp_DataObject* dataObj = dynamic_cast<const SalomeApp_DataObject*>( what );
3285 _PTR(SObject) aSO = dataObj->object();
3287 _PTR(GenericAttribute) anAttr;
3288 _PTR(SObject) aFatherSO = aSO->GetStudy()->GetUseCaseBuilder()->GetFather( aSO );
3289 if ( aFatherSO && aFatherSO->FindAttribute(anAttr, "AttributeLocalID") ) {
3290 _PTR(AttributeLocalID) aLocalID( anAttr );
3291 anObjectInFolder = aLocalID->Value() == 999;
3296 return aLevel == 2 || anObjectInFolder;
3300 \brief Check if the module allows "drop" operation on the given object.
3302 Overloaded from LightApp_Module class.
3304 This function is a part of the general drag-n-drop mechanism.
3305 The goal of this function is to check data object passed as a parameter
3306 and decide if it can be used as a target for the "drop" operation.
3307 The processing of the drop operation itself is done in the dropObjects() function.
3309 \param where target data object
3310 \return \c true if module supports dropping on the \a where data object
3311 \sa isDraggable(), dropObjects()
3313 bool GeometryGUI::isDropAccepted( const SUIT_DataObject* where ) const
3315 // we allow dropping into folder and top-level GEOM object
3316 int aLevel = where->level();
3317 bool isFolder = false;
3319 const SalomeApp_DataObject* dataObj = dynamic_cast<const SalomeApp_DataObject*>( where );
3321 _PTR(SObject) aSO = dataObj->object();
3323 _PTR(GenericAttribute) anAttr;
3324 if ( aSO->FindAttribute(anAttr, "AttributeLocalID") ) {
3325 _PTR(AttributeLocalID) aLocalID( anAttr );
3326 isFolder = aLocalID->Value() == 999;
3331 return aLevel == 1 || isFolder;
3335 \brief Complete drag-n-drop operation.
3337 Overloaded from LightApp_Module class.
3339 This function is a part of the general drag-n-drop mechanism.
3340 Its goal is to handle dropping of the objects being dragged according
3341 to the chosen operation (move). The dropping is performed in the
3342 context of the parent data object \a where and the \a row (position in the
3343 children index) at which the data should be dropped. If \a row is equal to -1,
3344 this means that objects are added to the end of the children list.
3346 \param what objects being dropped
3347 \param where target data object
3348 \param row child index at which the drop operation is performed
3349 \param action drag-n-drop operation (Qt::DropAction) - move
3351 \sa isDraggable(), isDropAccepted()
3353 void GeometryGUI::dropObjects( const DataObjectList& what, SUIT_DataObject* where,
3354 const int row, Qt::DropAction action )
3356 if (action != Qt::CopyAction && action != Qt::MoveAction)
3357 return; // unsupported action
3359 // get parent object
3360 SalomeApp_DataObject* dataObj = dynamic_cast<SalomeApp_DataObject*>( where );
3361 if ( !dataObj ) return; // wrong parent
3362 _PTR(SObject) parentObj = dataObj->object();
3364 // Find the current Study and StudyBuilder
3365 _PTR(Study) aStudy = parentObj->GetStudy();
3366 _PTR(UseCaseBuilder) aUseCaseBuilder = aStudy->GetUseCaseBuilder();
3367 // collect all parents of the target node
3368 QStringList parentIDs;
3369 _PTR(SObject) parent = parentObj;
3370 while( !parent->IsNull() ) {
3371 parentIDs << parent->GetID().c_str();
3372 parent = aUseCaseBuilder->GetFather(parent);
3375 // collect objects being dropped
3376 GEOM::object_list_var objects = new GEOM::object_list();
3377 objects->length( what.count() );
3379 for ( int i = 0; i < what.count(); i++ ) {
3380 dataObj = dynamic_cast<SalomeApp_DataObject*>( what[i] );
3381 if ( !dataObj ) continue; // skip wrong objects
3382 _PTR(SObject) sobj = dataObj->object();
3383 // check that dropped object is not a parent of target object
3384 if ( parentIDs.contains( sobj->GetID().c_str() ) ) {
3385 return; // it's not allowed to move node into it's child
3387 objects[i] = _CAST(SObject, sobj)->GetSObject();
3390 objects->length( count );
3392 // call engine function
3393 GetGeomGen()->Move( objects.in(), // what
3394 _CAST(SObject, parentObj)->GetSObject(), // where
3397 // update Object browser
3398 getApp()->updateObjectBrowser( false );