X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMGUI%2FGeometryGUI.cxx;h=c7e69aec226daf19ba5ee7a8b50e9a7ac759beaf;hb=6f000dfe28cad33bcf7053913e1a2f24b3fa3e33;hp=8b8d3a8729d8e09d2615e719c895fa83aa74aa4b;hpb=5f4c43d53a17d4262672136ab21dc0c355a7b93e;p=modules%2Fgeom.git diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index 8b8d3a872..c7e69aec2 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -29,11 +29,15 @@ #include "Python.h" #include "GeometryGUI.h" #include "GeometryGUI_Operations.h" +#include "GEOMPluginGUI.h" #include "GEOMGUI_OCCSelector.h" #include "GEOMGUI_Selection.h" +#include "GEOMGUI_CreationInfoWdg.h" +#include "GEOMGUI_DimensionProperty.h" #include "GEOM_Constants.h" #include "GEOM_Displayer.h" #include "GEOM_AISShape.hxx" +#include "GEOMUtils_XmlHandler.hxx" #include "GEOM_Actor.h" @@ -46,6 +50,8 @@ #include #include +#include + #include #include #include @@ -59,6 +65,8 @@ #include #include +#include + #include #include #include @@ -71,14 +79,17 @@ #include #include -#include #include #include +#include + #include // External includes +#include +#include #include #include #include @@ -96,20 +107,18 @@ #include #include -#if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1 #include -#else -#include -#endif #include #include #include -#include +#include +#include -#include "GEOMImpl_Types.hxx" +#include "GEOM_version.h" +#include "GEOMImpl_Types.hxx" // dangerous hxx (defines short-name macros) - include after all extern "C" { Standard_EXPORT CAM_Module* createModule() { @@ -190,7 +199,8 @@ void GeometryGUI::Modified (bool theIsUpdateActions) // purpose : Constructor //======================================================================= GeometryGUI::GeometryGUI() : - SalomeApp_Module( "GEOM" ) + SalomeApp_Module( "GEOM" ), + myTopLevelIOList() { if ( CORBA::is_nil( myComponentGeom ) ) { @@ -208,7 +218,11 @@ GeometryGUI::GeometryGUI() : myDisplayer = 0; myLocalSelectionMode = GEOM_ALLOBJECTS; + myCreationInfoWdg = 0; + connect( Material_ResourceMgr::resourceMgr(), SIGNAL( changed() ), this, SLOT( updateMaterials() ) ); + + Q_INIT_RESOURCE( GEOMGUI ); } //======================================================================= @@ -235,7 +249,7 @@ GEOMGUI* GeometryGUI::getLibrary( const QString& libraryName ) { if ( !myGUIMap.contains( libraryName ) ) { // try to load library if it is not loaded yet -#ifndef WNT +#ifndef WIN32 QString dirs = getenv( "LD_LIBRARY_PATH" ); QString sep = ":"; #else @@ -270,6 +284,50 @@ GEOMGUI* GeometryGUI::getLibrary( const QString& libraryName ) return myGUIMap.contains( libraryName ) ? myGUIMap[ libraryName ] : 0; } +//======================================================================= +// function : GeometryGUI::getPluginLibrary() +// purpose : get or load GUI Plugin library by name [ internal ] +//======================================================================= +typedef GEOMPluginGUI* (*PluginLibraryGUI)( GeometryGUI* ); +GEOMPluginGUI* GeometryGUI::getPluginLibrary( const QString& libraryName ) +{ + if ( !myGUIMap.contains( libraryName ) ) { + // try to load library if it is not loaded yet +#ifndef WIN32 + QString dirs = getenv( "LD_LIBRARY_PATH" ); + QString sep = ":"; +#else + QString dirs = getenv( "PATH" ); + QString sep = ";"; +#endif + if ( !dirs.isEmpty() ) { + QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries + QListIterator it( dirList ); it.toBack(); + while ( it.hasPrevious() ) { + QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName ); + if ( fi.exists() ) { + OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() ); + bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY ); + if ( !res ) { + MESSAGE( "Can't open library : " << aSharedLibrary.DlError() ); + continue; // continue search further + } + OSD_Function osdF = aSharedLibrary.DlSymb( "GetLibGUI" ); + if ( osdF != NULL ) { + PluginLibraryGUI func = (GEOMPluginGUI* (*) (GeometryGUI*))osdF; + GEOMPluginGUI* libGUI = (*func)( this ); + if ( libGUI ) { + myGUIMap[ libraryName ] = libGUI; + break; // found and loaded! + } + } + } + } + } + } + return myGUIMap.contains( libraryName ) ? (GEOMPluginGUI*)myGUIMap[ libraryName ] : 0; +} + //======================================================================= // function : GeometryGUI::ActiveWorkingPlane() // purpose : Activate Working Plane View @@ -372,6 +430,7 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) SUIT_ViewWindow* window = desk->activeWindow(); bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() ); bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() ); + bool ViewDep = ( window && window->getViewManager()->getType() == GraphicsView_Viewer::Type() ); // if current viewframe is not of OCC and not of VTK type - return immediately // fix for IPAL8958 - allow some commands to execute even when NO viewer is active (rename for example) QList NotViewerDependentCommands; @@ -383,9 +442,13 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) << GEOMOp::OpConcealChildren << GEOMOp::OpUnpublishObject << GEOMOp::OpPublishObject - << GEOMOp::OpPointMarker; - if ( !ViewOCC && !ViewVTK && !NotViewerDependentCommands.contains( id ) ) - return; + << GEOMOp::OpPointMarker + << GEOMOp::OpCreateFolder + << GEOMOp::OpSortChildren; + if ( !ViewOCC && !ViewVTK && !ViewDep && !NotViewerDependentCommands.contains( id ) ) { + // activate OCC viewer + getApp()->getViewManager(OCCViewer_Viewer::Type(), /*create=*/true); + } // fix for IPAL9103, point 2 if ( CORBA::is_nil( GetGeomGen() ) ) { @@ -399,8 +462,6 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpOriginAndVectors: // MENU BASIC - ORIGIN AND BASE VECTORS createOriginAndBaseVectors(); // internal operation return; - case GEOMOp::OpImport: // MENU FILE - IMPORT - case GEOMOp::OpExport: // MENU FILE - EXPORT case GEOMOp::OpSelectVertex: // POPUP MENU - SELECT ONLY - VERTEX case GEOMOp::OpSelectEdge: // POPUP MENU - SELECT ONLY - EDGE case GEOMOp::OpSelectWire: // POPUP MENU - SELECT ONLY - WIRE @@ -435,11 +496,16 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpIsosWidth: // POPUP MENU - LINE WIDTH - ISOS WIDTH case GEOMOp::OpBringToFront: // POPUP MENU - BRING TO FRONT case GEOMOp::OpClsBringToFront: // + case GEOMOp::OpCreateFolder: // POPUP MENU - CREATE FOLDER + case GEOMOp::OpSortChildren: // POPUP MENU - SORT CHILD ITEMS + case GEOMOp::OpShowDependencyTree: // POPUP MENU - SHOW DEPENDENCY TREE + case GEOMOp::OpReduceStudy: // POPUP MENU - REDUCE STUDY libName = "GEOMToolsGUI"; break; case GEOMOp::OpDMWireframe: // MENU VIEW - WIREFRAME case GEOMOp::OpDMShading: // MENU VIEW - SHADING case GEOMOp::OpDMShadingWithEdges: // MENU VIEW - SHADING + case GEOMOp::OpDMTexture: // MENU VIEW - TEXTURE case GEOMOp::OpShowAll: // MENU VIEW - SHOW ALL case GEOMOp::OpShowOnly: // MENU VIEW - DISPLAY ONLY case GEOMOp::OpShowOnlyChildren: // MENU VIEW - SHOW ONLY CHILDREN @@ -447,11 +513,13 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpHide: // MENU VIEW - ERASE case GEOMOp::OpShow: // MENU VIEW - DISPLAY case GEOMOp::OpSwitchVectors: // MENU VIEW - VECTOR MODE + case GEOMOp::OpSwitchVertices: // MENU VIEW - VERTICES MODE case GEOMOp::OpWireframe: // POPUP MENU - WIREFRAME case GEOMOp::OpShading: // POPUP MENU - SHADING case GEOMOp::OpShadingWithEdges: // POPUP MENU - SHADING WITH EDGES case GEOMOp::OpTexture: // POPUP MENU - TEXTURE case GEOMOp::OpVectors: // POPUP MENU - VECTORS + case GEOMOp::OpVertices: // POPUP MENU - VERTICES libName = "DisplayGUI"; break; case GEOMOp::OpPoint: // MENU BASIC - POINT @@ -483,11 +551,16 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) break; case GEOMOp::Op2dSketcher: // MENU ENTITY - SKETCHER case GEOMOp::Op3dSketcher: // MENU ENTITY - 3D SKETCHER + case GEOMOp::OpIsoline: // MENU BASIC - ISOLINE case GEOMOp::OpExplode: // MENU ENTITY - EXPLODE #ifdef WITH_OPENCV case GEOMOp::OpFeatureDetect: // MENU ENTITY - FEATURE DETECTION #endif case GEOMOp::OpPictureImport: // MENU ENTITY - IMPORT PICTURE IN VIEWER + case GEOMOp::OpCreateField: // MENU FIELD - CREATE FIELD + case GEOMOp::OpEditField: // MENU FIELD - EDIT FIELD + case GEOMOp::OpEditFieldPopup: // POPUP MENU - EDIT FIELD + case GEOMOp::Op2dPolylineEditor: // MENU BASIC - POLYLINE EDITOR libName = "EntityGUI"; break; case GEOMOp::OpEdge: // MENU BUILD - EDGE @@ -542,6 +615,7 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpGlueFaces: // MENU REPAIR - GLUE FACES case GEOMOp::OpGlueEdges: // MENU REPAIR - GLUE EDGES case GEOMOp::OpLimitTolerance: // MENU REPAIR - LIMIT TOLERANCE + case GEOMOp::OpRemoveWebs: // MENU REPAIR - REMOVE INTERNAL FACES case GEOMOp::OpRemoveExtraEdges: // MENU REPAIR - REMOVE EXTRA EDGES case GEOMOp::OpFuseEdges: // MENU REPAIR - FUSE COLLINEAR EDGES case GEOMOp::OpUnionFaces: // MENU REPAIR - UNION FACES @@ -561,6 +635,9 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpGetNonBlocks: // MENU MEASURE - Get NON BLOCKS case GEOMOp::OpPointCoordinates: // MENU MEASURE - POINT COORDINATES case GEOMOp::OpCheckSelfInters: // MENU MEASURE - CHECK SELF INTERSECTIONS + case GEOMOp::OpManageDimensions: // MENU MEASURE - MANAGE DIMENSIONS + case GEOMOp::OpShowAllDimensions: // POPUP MENU - SHOW ALL DIMENSIONS + case GEOMOp::OpHideAllDimensions: // POPUP MENU - HIDE ALL DIMENSIONS libName = "MeasureGUI"; break; case GEOMOp::OpGroupCreate: // MENU GROUP - CREATE @@ -578,22 +655,51 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpExplodeBlock: // MENU BLOCKS - EXPLODE ON BLOCKS libName = "BlocksGUI"; break; - case GEOMOp::OpAdvancedNoOp: // NO OPERATION (advanced operations base) - case GEOMOp::OpPipeTShape: // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE -// case GEOMOp::OpPipeTShapeGroups: // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS - case GEOMOp::OpDividedDisk: // MENU NEW ENTITY - ADVANCED - DIVIDEDDISK - case GEOMOp::OpDividedCylinder: // MENU NEW ENTITY - ADVANCED - DIVIDEDCYLINDER - case GEOMOp::OpSmoothingSurface: // MENU NEW ENTITY - ADVANCED - SMOOTHINGSURFACE - //@@ 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 @@// - libName = "AdvancedGUI"; - break; + //case GEOMOp::OpAdvancedNoOp: // NO OPERATION (advanced operations base) + //case GEOMOp::OpPipeTShape: // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE + //case GEOMOp::OpPipeTShapeGroups: // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS + //case GEOMOp::OpDividedDisk: // MENU NEW ENTITY - ADVANCED - DIVIDEDDISK + //case GEOMOp::OpDividedCylinder: // MENU NEW ENTITY - ADVANCED - DIVIDEDCYLINDER + //case GEOMOp::OpSmoothingSurface: // MENU NEW ENTITY - ADVANCED - SMOOTHINGSURFACE + //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@// + //libName = "AdvancedGUI"; + //break; default: + if (myPluginActions.contains(id)) { + libName = myPluginActions[id].first; + + GEOMPluginGUI* library = 0; + if ( !libName.isEmpty() ) { +#ifndef WIN32 + libName = QString( "lib" ) + libName + ".so"; +#else + libName = libName + ".dll"; +#endif + library = getPluginLibrary( libName ); + } + + // call method of corresponding GUI library + if ( library ) { + //QString action ("%1"); + //action = action.arg(id); + + //if( !theParam.isValid() ) + library->OnGUIEvent( myPluginActions[id].second, desk ); + //else + // library->OnGUIEvent( id, desk, theParam); + } + else + SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) ); + + updateCreationInfo(); + return; + } break; } GEOMGUI* library = 0; if ( !libName.isEmpty() ) { -#ifndef WNT +#ifndef WIN32 libName = QString( "lib" ) + libName + ".so"; #else libName = libName + ".dll"; @@ -610,6 +716,59 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) } else SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) ); + + updateCreationInfo(); +} + +//================================================================================= +// function : GeometryGUI::activateOperation() +// purpose : +//================================================================================= +bool GeometryGUI::activateOperation( int actionId ) +{ + OnGUIEvent(actionId); + return true; +} + +//================================================================================= +// function : GeometryGUI::activateOperation() +// purpose : +//================================================================================= +bool GeometryGUI::activateOperation( const QString& actionId ) +{ + bool isOk = false; + + int id = actionId.toInt(&isOk); + if (isOk) + OnGUIEvent(id); + + return isOk; +} + +//================================================================================= +// function : GeometryGUI::activateOperation() +// purpose : +//================================================================================= +bool GeometryGUI::activateOperation( const QString& actionId, const QString& plugin ) +{ + bool isOk = false; + + QString pluginLib = plugin; + // TODO: if is a plugin name, find plugin library name + if (myPluginLibs.contains(plugin)) + pluginLib = myPluginLibs[plugin]; + + QMap::iterator actionsIter = myPluginActions.begin(); + for (; actionsIter != myPluginActions.end(); ++actionsIter) { + const PluginAction& anAction = actionsIter.value(); + if (anAction.first == pluginLib && anAction.second == actionId) { + // activate operation + OnGUIEvent(actionsIter.key()); + isOk = true; + } + } + + return isOk; } //================================================================================= @@ -689,6 +848,11 @@ void GeometryGUI::createGeomAction( const int id, const QString& label, const QS void GeometryGUI::createOriginAndBaseVectors() { SalomeApp_Study* appStudy = dynamic_cast( application()->activeStudy() ); + bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked(); + if ( aLocked ) { + SUIT_MessageBox::warning ( application()->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") ); + return; + } if ( appStudy ) { _PTR(Study) studyDS = appStudy->studyDS(); if ( studyDS && !CORBA::is_nil( GetGeomGen() ) ) { @@ -707,7 +871,7 @@ void GeometryGUI::createOriginAndBaseVectors() GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOY, "OY" ); GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOZ, "OZ" ); - getApp()->updateObjectBrowser( false ); + getApp()->updateObjectBrowser( true ); } } } @@ -723,9 +887,6 @@ void GeometryGUI::initialize( CAM_Application* app ) // ----- create actions -------------- - createGeomAction( GEOMOp::OpImport, "IMPORT", "", Qt::ControlModifier + Qt::Key_I ); - createGeomAction( GEOMOp::OpExport, "EXPORT", "", Qt::ControlModifier + Qt::Key_E ); - createGeomAction( GEOMOp::OpDelete, "DELETE", "", Qt::Key_Delete ); createGeomAction( GEOMOp::OpPoint, "POINT" ); @@ -734,6 +895,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpEllipse, "ELLIPSE" ); createGeomAction( GEOMOp::OpArc, "ARC" ); createGeomAction( GEOMOp::OpCurve, "CURVE" ); + createGeomAction( GEOMOp::OpIsoline, "ISOLINE" ); createGeomAction( GEOMOp::OpVector, "VECTOR" ); createGeomAction( GEOMOp::OpPlane, "PLANE" ); createGeomAction( GEOMOp::OpLCS, "LOCAL_CS" ); @@ -759,6 +921,9 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpGroupIntersect, "GROUP_INTERSECT" ); createGeomAction( GEOMOp::OpGroupCut, "GROUP_CUT" ); + createGeomAction( GEOMOp::OpCreateField, "FIELD_CREATE" ); + createGeomAction( GEOMOp::OpEditField, "FIELD_EDIT" ); + createGeomAction( GEOMOp::OpReimport, "RELOAD_IMPORTED" ); createGeomAction( GEOMOp::OpQuadFace, "Q_FACE" ); @@ -766,11 +931,13 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::Op2dSketcher, "SKETCH" ); createGeomAction( GEOMOp::Op3dSketcher, "3DSKETCH" ); + createGeomAction( GEOMOp::OpIsoline, "ISOLINE" ); createGeomAction( GEOMOp::OpExplode, "EXPLODE" ); #ifdef WITH_OPENCV createGeomAction( GEOMOp::OpFeatureDetect,"FEATURE_DETECTION" ); #endif createGeomAction( GEOMOp::OpPictureImport,"PICTURE_IMPORT" ); + createGeomAction( GEOMOp::Op2dPolylineEditor, "CURVE_CREATOR" ); createGeomAction( GEOMOp::OpEdge, "EDGE" ); createGeomAction( GEOMOp::OpWire, "WIRE" ); @@ -823,6 +990,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpFreeBoundaries, "CHECK_FREE_BNDS" ); createGeomAction( GEOMOp::OpFreeFaces, "CHECK_FREE_FACES" ); createGeomAction( GEOMOp::OpOrientation, "CHANGE_ORIENTATION" ); + createGeomAction( GEOMOp::OpRemoveWebs, "REMOVE_WEBS" ); createGeomAction( GEOMOp::OpRemoveExtraEdges, "REMOVE_EXTRA_EDGES" ); createGeomAction( GEOMOp::OpFuseEdges, "FUSE_EDGES" ); createGeomAction( GEOMOp::OpUnionFaces, "UNION_FACES" ); @@ -835,6 +1003,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpBoundingBox, "BND_BOX" ); createGeomAction( GEOMOp::OpMinDistance, "MIN_DIST" ); createGeomAction( GEOMOp::OpAngle, "MEASURE_ANGLE" ); + createGeomAction( GEOMOp::OpManageDimensions, "MANAGE_DIMENSIONS" ); createGeomAction( GEOMOp::OpTolerance, "TOLERANCE" ); createGeomAction( GEOMOp::OpWhatIs, "WHAT_IS" ); @@ -851,10 +1020,12 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpDMWireframe, "WIREFRAME" ); createGeomAction( GEOMOp::OpDMShading, "SHADING" ); createGeomAction( GEOMOp::OpDMShadingWithEdges, "SHADING_WITH_EDGES" ); + createGeomAction( GEOMOp::OpDMTexture, "TEXTURE" ); createGeomAction( GEOMOp::OpShowAll, "DISPLAY_ALL" ); createGeomAction( GEOMOp::OpHideAll, "ERASE_ALL" ); createGeomAction( GEOMOp::OpShow, "DISPLAY" ); createGeomAction( GEOMOp::OpSwitchVectors, "VECTOR_MODE"); + createGeomAction( GEOMOp::OpSwitchVertices, "VERTICES_MODE"); createGeomAction( GEOMOp::OpSelectVertex, "VERTEX_SEL_ONLY" ,"", 0, true ); createGeomAction( GEOMOp::OpSelectEdge, "EDGE_SEL_ONLY", "", 0, true ); createGeomAction( GEOMOp::OpSelectWire, "WIRE_SEL_ONLY", "", 0, true ); @@ -876,6 +1047,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpEdgeWidth, "EDGE_WIDTH"); createGeomAction( GEOMOp::OpIsosWidth, "ISOS_WIDTH"); createGeomAction( GEOMOp::OpVectors, "POP_VECTORS", "", 0, true ); + createGeomAction( GEOMOp::OpVertices, "POP_VERTICES", "", 0, true ); createGeomAction( GEOMOp::OpDeflection, "POP_DEFLECTION" ); createGeomAction( GEOMOp::OpColor, "POP_COLOR" ); createGeomAction( GEOMOp::OpSetTexture, "POP_SETTEXTURE" ); @@ -884,6 +1056,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpAutoColor, "POP_AUTO_COLOR" ); createGeomAction( GEOMOp::OpNoAutoColor, "POP_DISABLE_AUTO_COLOR" ); createGeomAction( GEOMOp::OpGroupCreatePopup, "POP_CREATE_GROUP" ); + createGeomAction( GEOMOp::OpEditFieldPopup, "POP_EDIT_FIELD" ); createGeomAction( GEOMOp::OpDiscloseChildren, "POP_DISCLOSE_CHILDREN" ); createGeomAction( GEOMOp::OpConcealChildren, "POP_CONCEAL_CHILDREN" ); createGeomAction( GEOMOp::OpUnpublishObject, "POP_UNPUBLISH_OBJ" ); @@ -891,8 +1064,12 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpPointMarker, "POP_POINT_MARKER" ); createGeomAction( GEOMOp::OpMaterialProperties, "POP_MATERIAL_PROPERTIES" ); createGeomAction( GEOMOp::OpPredefMaterCustom, "POP_PREDEF_MATER_CUSTOM" ); - - createGeomAction( GEOMOp::OpPipeTShape, "PIPETSHAPE" ); + createGeomAction( GEOMOp::OpCreateFolder, "POP_CREATE_FOLDER" ); + createGeomAction( GEOMOp::OpSortChildren, "POP_SORT_CHILD_ITEMS" ); + createGeomAction( GEOMOp::OpShowDependencyTree, "POP_SHOW_DEPENDENCY_TREE" ); + createGeomAction( GEOMOp::OpReduceStudy, "POP_REDUCE_STUDY" ); + createGeomAction( GEOMOp::OpShowAllDimensions, "POP_SHOW_ALL_DIMENSIONS" ); + createGeomAction( GEOMOp::OpHideAllDimensions, "POP_HIDE_ALL_DIMENSIONS" ); // Create actions for increase/decrease transparency shortcuts createGeomAction( GEOMOp::OpIncrTransparency, "", "", 0, false, @@ -906,19 +1083,15 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpDecrNbIsos, "", "", 0, false, "Geometry:Decrease number of isolines"); -// createGeomAction( GEOMOp::OpPipeTShapeGroups, "PIPETSHAPEGROUPS" ); - createGeomAction( GEOMOp::OpDividedDisk, "DIVIDEDDISK" ); - createGeomAction( GEOMOp::OpDividedCylinder, "DIVIDEDCYLINDER" ); - createGeomAction( GEOMOp::OpSmoothingSurface, "SMOOTHINGSURFACE" ); + //createGeomAction( GEOMOp::OpPipeTShape, "PIPETSHAPE" ); + //createGeomAction( GEOMOp::OpDividedDisk, "DIVIDEDDISK" ); + //createGeomAction( GEOMOp::OpDividedCylinder, "DIVIDEDCYLINDER" ); + //createGeomAction( GEOMOp::OpSmoothingSurface, "SMOOTHINGSURFACE" ); //@@ 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 @@// // ---- create menus -------------------------- int fileId = createMenu( tr( "MEN_FILE" ), -1, -1 ); - createMenu( separator(), fileId, 10 ); - createMenu( GEOMOp::OpImport, fileId, 10 ); - createMenu( GEOMOp::OpExport, fileId, 10 ); - createMenu( separator(), fileId, -1 ); int editId = createMenu( tr( "MEN_EDIT" ), -1, -1 ); createMenu( GEOMOp::OpDelete, editId, -1 ); @@ -926,18 +1099,20 @@ void GeometryGUI::initialize( CAM_Application* app ) int newEntId = createMenu( tr( "MEN_NEW_ENTITY" ), -1, -1, 10 ); int basicId = createMenu( tr( "MEN_BASIC" ), newEntId, -1 ); - createMenu( GEOMOp::OpPoint, basicId, -1 ); - createMenu( GEOMOp::OpLine, basicId, -1 ); - createMenu( GEOMOp::OpCircle, basicId, -1 ); - createMenu( GEOMOp::OpEllipse, basicId, -1 ); - createMenu( GEOMOp::OpArc, basicId, -1 ); - createMenu( GEOMOp::OpCurve, basicId, -1 ); - createMenu( GEOMOp::Op2dSketcher, basicId, -1 ); - createMenu( GEOMOp::Op3dSketcher, basicId, -1 ); - createMenu( separator(), basicId, -1 ); - createMenu( GEOMOp::OpVector, basicId, -1 ); - createMenu( GEOMOp::OpPlane, basicId, -1 ); - createMenu( GEOMOp::OpLCS, basicId, -1 ); + createMenu( GEOMOp::OpPoint, basicId, -1 ); + createMenu( GEOMOp::OpLine, basicId, -1 ); + createMenu( GEOMOp::OpCircle, basicId, -1 ); + createMenu( GEOMOp::OpEllipse, basicId, -1 ); + createMenu( GEOMOp::OpArc, basicId, -1 ); + createMenu( GEOMOp::OpCurve, basicId, -1 ); + createMenu( GEOMOp::Op2dSketcher, basicId, -1 ); + createMenu( GEOMOp::Op2dPolylineEditor, basicId, -1 ); + createMenu( GEOMOp::Op3dSketcher, basicId, -1 ); + createMenu( GEOMOp::OpIsoline, basicId, -1 ); + createMenu( separator(), basicId, -1 ); + createMenu( GEOMOp::OpVector, basicId, -1 ); + createMenu( GEOMOp::OpPlane, basicId, -1 ); + createMenu( GEOMOp::OpLCS, basicId, -1 ); createMenu( GEOMOp::OpOriginAndVectors, basicId, -1 ); int primId = createMenu( tr( "MEN_PRIMITIVES" ), newEntId, -1 ); @@ -948,20 +1123,18 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( GEOMOp::OpCone, primId, -1 ); createMenu( GEOMOp::OpRectangle, primId, -1 ); createMenu( GEOMOp::OpDisk, primId, -1 ); - createMenu( GEOMOp::OpPipeTShape,primId, -1 ); + //createMenu( GEOMOp::OpPipeTShape,primId, -1 ); int genId = createMenu( tr( "MEN_GENERATION" ), newEntId, -1 ); createMenu( GEOMOp::OpPrism, genId, -1 ); createMenu( GEOMOp::OpRevolution, genId, -1 ); createMenu( GEOMOp::OpFilling, genId, -1 ); createMenu( GEOMOp::OpPipe, genId, -1 ); -#if OCC_VERSION_LARGE > 0x06050300 createMenu( GEOMOp::OpPipePath, genId, -1 ); -#endif - int advId = createMenu( tr( "MEN_ADVANCED" ), newEntId, -1 ); - createMenu( GEOMOp::OpSmoothingSurface, advId, -1 ); - //@@ 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 @@// + //int advId = createMenu( tr( "MEN_ADVANCED" ), newEntId, -1 ); + //createMenu( GEOMOp::OpSmoothingSurface, advId, -1 ); + //@@ 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 @@// createMenu( separator(), newEntId, -1 ); @@ -974,11 +1147,17 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( separator(), newEntId, -1 ); + int fieldId = createMenu( tr( "MEN_FIELD" ), newEntId, -1 ); + createMenu( GEOMOp::OpCreateField, fieldId, -1 ); + createMenu( GEOMOp::OpEditField, fieldId, -1 ); + + createMenu( separator(), newEntId, -1 ); + int blocksId = createMenu( tr( "MEN_BLOCKS" ), newEntId, -1 ); createMenu( GEOMOp::OpQuadFace, blocksId, -1 ); createMenu( GEOMOp::OpHexaSolid, blocksId, -1 ); - createMenu( GEOMOp::OpDividedDisk, blocksId, -1 ); - createMenu( GEOMOp::OpDividedCylinder, blocksId, -1 ); + //createMenu( GEOMOp::OpDividedDisk, blocksId, -1 ); + //createMenu( GEOMOp::OpDividedCylinder, blocksId, -1 ); createMenu( separator(), newEntId, -1 ); @@ -1055,6 +1234,7 @@ void GeometryGUI::initialize( CAM_Application* app ) //createMenu( GEOMOp::OpFreeBoundaries, repairId, -1 ); //createMenu( GEOMOp::OpFreeFaces, repairId, -1 ); createMenu( GEOMOp::OpOrientation, repairId, -1 ); + createMenu( GEOMOp::OpRemoveWebs, repairId, -1 ); createMenu( GEOMOp::OpRemoveExtraEdges, repairId, -1 ); createMenu( GEOMOp::OpFuseEdges, repairId, -1 ); createMenu( GEOMOp::OpUnionFaces, repairId, -1 ); @@ -1072,9 +1252,10 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( separator(), measurId, -1 ); int dimId = createMenu( tr( "MEN_DIMENSIONS" ), measurId, -1 ); - createMenu( GEOMOp::OpBoundingBox, dimId, -1 ); - createMenu( GEOMOp::OpMinDistance, dimId, -1 ); - createMenu( GEOMOp::OpAngle, dimId, -1 ); + createMenu( GEOMOp::OpBoundingBox, dimId, -1 ); + createMenu( GEOMOp::OpMinDistance, dimId, -1 ); + createMenu( GEOMOp::OpAngle, dimId, -1 ); + createMenu( GEOMOp::OpManageDimensions, dimId, -1 ); createMenu( separator(), measurId, -1 ); createMenu( GEOMOp::OpTolerance, measurId, -1 ); @@ -1090,7 +1271,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( separator(), toolsId, -1 ); createMenu( GEOMOp::OpCheckGeom, toolsId, -1 ); #endif - + createMenu( separator(), toolsId, -1 ); createMenu( GEOMOp::OpMaterialsLibrary, toolsId, -1 ); createMenu( separator(), toolsId, -1 ); @@ -1102,8 +1283,10 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( GEOMOp::OpDMWireframe, dispmodeId, -1 ); createMenu( GEOMOp::OpDMShading, dispmodeId, -1 ); createMenu( GEOMOp::OpDMShadingWithEdges, dispmodeId, -1 ); + createMenu( GEOMOp::OpDMTexture, dispmodeId, -1 ); createMenu( separator(), dispmodeId, -1 ); createMenu( GEOMOp::OpSwitchVectors, dispmodeId, -1 ); + createMenu( GEOMOp::OpSwitchVertices, dispmodeId, -1 ); createMenu( separator(), viewId, -1 ); createMenu( GEOMOp::OpShowAll, viewId, -1 ); @@ -1124,25 +1307,27 @@ void GeometryGUI::initialize( CAM_Application* app ) // ---- create toolbars -------------------------- - int basicTbId = createTool( tr( "TOOL_BASIC" ) ); - createTool( GEOMOp::OpPoint, basicTbId ); - createTool( GEOMOp::OpLine, basicTbId ); - createTool( GEOMOp::OpCircle, basicTbId ); - createTool( GEOMOp::OpEllipse, basicTbId ); - createTool( GEOMOp::OpArc, basicTbId ); - createTool( GEOMOp::OpCurve, basicTbId ); - createTool( GEOMOp::OpVector, basicTbId ); - createTool( GEOMOp::Op2dSketcher, basicTbId ); //rnc - createTool( GEOMOp::Op3dSketcher, basicTbId ); //rnc - createTool( GEOMOp::OpPlane, basicTbId ); - createTool( GEOMOp::OpLCS, basicTbId ); + int basicTbId = createTool( tr( "TOOL_BASIC" ), QString( "GEOMBasic" ) ); + createTool( GEOMOp::OpPoint, basicTbId ); + createTool( GEOMOp::OpLine, basicTbId ); + createTool( GEOMOp::OpCircle, basicTbId ); + createTool( GEOMOp::OpEllipse, basicTbId ); + createTool( GEOMOp::OpArc, basicTbId ); + createTool( GEOMOp::OpCurve, basicTbId ); + createTool( GEOMOp::OpVector, basicTbId ); + createTool( GEOMOp::Op2dSketcher, basicTbId ); //rnc + createTool( GEOMOp::Op2dPolylineEditor, basicTbId ); + createTool( GEOMOp::Op3dSketcher, basicTbId ); //rnc + createTool( GEOMOp::OpIsoline, basicTbId ); + createTool( GEOMOp::OpPlane, basicTbId ); + createTool( GEOMOp::OpLCS, basicTbId ); createTool( GEOMOp::OpOriginAndVectors, basicTbId ); -// int sketchTbId = createTool( tr( "TOOL_SKETCH" ) ); +// int sketchTbId = createTool( tr( "TOOL_SKETCH" ), QString( "GEOMSketch" ) ); // createTool( GEOMOp::Op2dSketcher, sketchTbId ); // createTool( GEOMOp::Op3dSketcher, sketchTbId ); - int primTbId = createTool( tr( "TOOL_PRIMITIVES" ) ); + int primTbId = createTool( tr( "TOOL_PRIMITIVES" ), QString( "GEOMPrimitives" ) ); createTool( GEOMOp::OpBox, primTbId ); createTool( GEOMOp::OpCylinder, primTbId ); createTool( GEOMOp::OpSphere, primTbId ); @@ -1150,31 +1335,26 @@ void GeometryGUI::initialize( CAM_Application* app ) createTool( GEOMOp::OpCone, primTbId ); createTool( GEOMOp::OpRectangle, primTbId ); createTool( GEOMOp::OpDisk, primTbId ); - createTool( GEOMOp::OpPipeTShape, primTbId ); //rnc + //createTool( GEOMOp::OpPipeTShape, primTbId ); //rnc - int blocksTbId = createTool( tr( "TOOL_BLOCKS" ) ); - createTool( GEOMOp::OpDividedDisk, blocksTbId ); - createTool( GEOMOp::OpDividedCylinder, blocksTbId ); + //int blocksTbId = createTool( tr( "TOOL_BLOCKS" ), QString( "GEOMBlocks" ) ); + //createTool( GEOMOp::OpDividedDisk, blocksTbId ); + //createTool( GEOMOp::OpDividedCylinder, blocksTbId ); -// int advancedTbId = createTool( tr( "TOOL_ADVANCED" ) ); //rnc -// createTool( GEOMOp::OpPipeTShape, advancedTbId ); - - int boolTbId = createTool( tr( "TOOL_BOOLEAN" ) ); + int boolTbId = createTool( tr( "TOOL_BOOLEAN" ), QString( "GEOMBooleanOperations" ) ); createTool( GEOMOp::OpFuse, boolTbId ); createTool( GEOMOp::OpCommon, boolTbId ); createTool( GEOMOp::OpCut, boolTbId ); createTool( GEOMOp::OpSection, boolTbId ); - int genTbId = createTool( tr( "TOOL_GENERATION" ) ); + int genTbId = createTool( tr( "TOOL_GENERATION" ), QString( "GEOMGeneration" ) ); createTool( GEOMOp::OpPrism, genTbId ); createTool( GEOMOp::OpRevolution, genTbId ); createTool( GEOMOp::OpFilling, genTbId ); createTool( GEOMOp::OpPipe, genTbId ); -#if OCC_VERSION_LARGE > 0x06050300 createTool( GEOMOp::OpPipePath, genTbId ); -#endif - int transTbId = createTool( tr( "TOOL_TRANSFORMATION" ) ); + int transTbId = createTool( tr( "TOOL_TRANSFORMATION" ), QString( "GEOMTransformation" ) ); createTool( GEOMOp::OpTranslate, transTbId ); createTool( GEOMOp::OpRotate, transTbId ); createTool( GEOMOp::OpChangeLoc, transTbId ); @@ -1186,14 +1366,14 @@ void GeometryGUI::initialize( CAM_Application* app ) createTool( GEOMOp::OpMultiTranslate, transTbId ); createTool( GEOMOp::OpMultiRotate, transTbId ); - int operTbId = createTool( tr( "TOOL_OPERATIONS" ) ); + int operTbId = createTool( tr( "TOOL_OPERATIONS" ), QString( "GEOMOperations" ) ); createTool( GEOMOp::OpExplode, operTbId ); createTool( GEOMOp::OpPartition, operTbId ); createTool( GEOMOp::OpArchimede, operTbId ); createTool( GEOMOp::OpShapesOnShape, operTbId ); createTool( GEOMOp::OpSharedShapes, operTbId ); - int featTbId = createTool( tr( "TOOL_FEATURES" ) ); + int featTbId = createTool( tr( "TOOL_FEATURES" ), QString( "GEOMModification" ) ); createTool( GEOMOp::OpFillet1d, featTbId ); createTool( GEOMOp::OpFillet2d, featTbId ); createTool( GEOMOp::OpFillet3d, featTbId ); @@ -1201,7 +1381,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createTool( GEOMOp::OpExtrudedBoss, featTbId ); createTool( GEOMOp::OpExtrudedCut, featTbId ); - int buildTbId = createTool( tr( "TOOL_BUILD" ) ); + int buildTbId = createTool( tr( "TOOL_BUILD" ), QString( "GEOMBuild" ) ); createTool( GEOMOp::OpEdge, buildTbId ); createTool( GEOMOp::OpWire, buildTbId ); createTool( GEOMOp::OpFace, buildTbId ); @@ -1209,7 +1389,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createTool( GEOMOp::OpSolid, buildTbId ); createTool( GEOMOp::OpCompound, buildTbId ); - int measureTbId = createTool( tr( "TOOL_MEASURES" ) ); + int measureTbId = createTool( tr( "TOOL_MEASURES" ), QString( "GEOMMeasures" ) ); createTool( GEOMOp::OpPointCoordinates, measureTbId ); createTool( GEOMOp::OpProperties, measureTbId ); createTool( GEOMOp::OpCenterMass, measureTbId ); @@ -1230,14 +1410,14 @@ void GeometryGUI::initialize( CAM_Application* app ) createTool( GEOMOp::OpGetNonBlocks, measureTbId ); createTool( GEOMOp::OpCheckSelfInters, measureTbId ); - int picturesTbId = createTool( tr( "TOOL_PICTURES" ) ); + int picturesTbId = createTool( tr( "TOOL_PICTURES" ), QString( "GEOMPictures" ) ); createTool( GEOMOp::OpPictureImport, picturesTbId ); - #ifdef WITH_OPENCV - createTool( GEOMOp::OpFeatureDetect, picturesTbId ); - #endif +#ifdef WITH_OPENCV + createTool( GEOMOp::OpFeatureDetect, picturesTbId ); +#endif - int advancedTbId = createTool( tr( "TOOL_ADVANCED" ) ); - createTool( GEOMOp::OpSmoothingSurface, advancedTbId ); + //int advancedTbId = createTool( tr( "TOOL_ADVANCED" ) ); + //createTool( GEOMOp::OpSmoothingSurface, advancedTbId ); //@@ 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 @@// // ---- create popup menus -------------------------- @@ -1258,27 +1438,27 @@ void GeometryGUI::initialize( CAM_Application* app ) QtxPopupMgr* mgr = popupMgr(); mgr->insert( action( GEOMOp::OpDelete ), -1, -1 ); // delete - mgr->setRule( action( GEOMOp::OpDelete ), QString("$type in {'Shape' 'Group'} and selcount>0"), QtxPopupMgr::VisibleRule ); + mgr->setRule( action( GEOMOp::OpDelete ), QString("$type in {'Shape' 'Group' 'Folder' 'Field' 'FieldStep'} and selcount>0"), QtxPopupMgr::VisibleRule ); mgr->insert( action( GEOMOp::OpGroupCreatePopup ), -1, -1 ); // create group mgr->setRule( action( GEOMOp::OpGroupCreatePopup ), QString("type='Shape' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule ); + mgr->insert( action( GEOMOp::OpEditFieldPopup ), -1, -1 ); // edit field + mgr->setRule( action( GEOMOp::OpEditFieldPopup ), QString("(type='Field' or type='FieldStep') and isOCC=true"), QtxPopupMgr::VisibleRule ); mgr->insert( action( GEOMOp::OpDiscloseChildren ), -1, -1 ); // disclose child items mgr->setRule( action( GEOMOp::OpDiscloseChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasConcealedChildren=true"), QtxPopupMgr::VisibleRule ); - mgr->insert( action( GEOMOp::OpConcealChildren ), -1, -1 ); // conceal shild items + mgr->insert( action( GEOMOp::OpConcealChildren ), -1, -1 ); // conceal child items mgr->setRule( action( GEOMOp::OpConcealChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasDisclosedChildren=true"), QtxPopupMgr::VisibleRule ); mgr->insert( action( GEOMOp::OpGroupEdit ), -1, -1 ); // edit group mgr->setRule( action( GEOMOp::OpGroupEdit ), QString("client='ObjectBrowser' and type='Group' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule ); mgr->insert( separator(), -1, -1 ); // ----------- -#if OCC_VERSION_LARGE > 0x06050200 //QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and (selcount>0) and isOCC=true and topLevel=false"; - QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and (selcount>0) and isOCC=true"; + QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and isFolder=false and (selcount>0) and isOCC=true"; mgr->insert( action(GEOMOp::OpBringToFront ), -1, -1 ); // bring to front - mgr->setRule(action(GEOMOp::OpBringToFront), bringRule, QtxPopupMgr::VisibleRule ); + mgr->setRule(action(GEOMOp::OpBringToFront), bringRule + " and autoBringToFront = false", QtxPopupMgr::VisibleRule ); mgr->setRule(action(GEOMOp::OpBringToFront), "topLevel=true", QtxPopupMgr::ToggleRule ); mgr->insert( action(GEOMOp::OpClsBringToFront ), -1, -1 ); // clear bring to front - mgr->setRule( action(GEOMOp::OpClsBringToFront ), clientOCC, QtxPopupMgr::VisibleRule ); -#endif + mgr->setRule( action(GEOMOp::OpClsBringToFront ), clientOCC + " and autoBringToFront = false", QtxPopupMgr::VisibleRule ); mgr->insert( separator(), -1, -1 ); // ----------- dispmodeId = mgr->insert( tr( "MEN_DISPLAY_MODE" ), -1, -1 ); // display mode menu mgr->insert( action( GEOMOp::OpWireframe ), dispmodeId, -1 ); // wireframe @@ -1297,8 +1477,11 @@ void GeometryGUI::initialize( CAM_Application* app ) mgr->insert( action( GEOMOp::OpVectors ), dispmodeId, -1 ); // vectors mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule ); mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK + " and isVectorsMode", QtxPopupMgr::ToggleRule ); + mgr->insert( action( GEOMOp::OpVertices ), dispmodeId, -1 ); // vertices + mgr->setRule( action( GEOMOp::OpVertices ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule ); + mgr->setRule( action( GEOMOp::OpVertices ), clientOCCorVTK + " and isVerticesMode", QtxPopupMgr::ToggleRule ); mgr->insert( separator(), -1, -1 ); // ----------- - + mgr->insert( action( GEOMOp::OpColor ), -1, -1 ); // color mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})" + "and isPhysicalMaterial=false", QtxPopupMgr::VisibleRule ); mgr->insert( action( GEOMOp::OpTransparency ), -1, -1 ); // transparency @@ -1308,11 +1491,10 @@ void GeometryGUI::initialize( CAM_Application* app ) mgr->insert( action( GEOMOp::OpDeflection ), -1, -1 ); // deflection mgr->setRule( action( GEOMOp::OpDeflection ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule ); mgr->insert( action( GEOMOp::OpPointMarker ), -1, -1 ); // point marker - //mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and $typeid in {%1}" ).arg(GEOM_POINT ), QtxPopupMgr::VisibleRule ); - mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and ( $typeid in {%1} or compoundOfVertices=true ) " ).arg(GEOM::VERTEX).arg(GEOM::COMPOUND), QtxPopupMgr::VisibleRule ); - + mgr->setRule( action( GEOMOp::OpPointMarker ), clientOCCorOB + " and $type in {'Shape' 'Group' 'Field' 'FieldStep'} and selcount>0 and isOCC=true", QtxPopupMgr::VisibleRule ); + // material properties - mgr->insert( action( GEOMOp::OpMaterialProperties ), -1, -1 ); + mgr->insert( action( GEOMOp::OpMaterialProperties ), -1, -1 ); mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule ); // texture @@ -1336,7 +1518,7 @@ void GeometryGUI::initialize( CAM_Application* app ) QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ", onlyComponent = "((type='Component') and selcount=1)", rule = canDisplay + "and ((($type in {%1}) and( %2 )) or " + onlyComponent + ")", - types = "'Shape' 'Group'"; + types = "'Shape' 'Group' 'FieldStep'"; mgr->insert( action( GEOMOp::OpShow ), -1, -1 ); // display mgr->setRule( action( GEOMOp::OpShow ), rule.arg( types ).arg( "not isVisible" ), QtxPopupMgr::VisibleRule ); @@ -1380,9 +1562,17 @@ void GeometryGUI::initialize( CAM_Application* app ) mgr->insert( action(GEOMOp::OpShowOnlyChildren ), -1, -1 ); // display only children mgr->setRule(action(GEOMOp::OpShowOnlyChildren ), (canDisplay + "and ($type in {%1}) and client='ObjectBrowser' and hasChildren=true").arg( types ), QtxPopupMgr::VisibleRule ); + QString aDimensionRule = "($component={'GEOM'}) and selcount=1 and isVisible and type='Shape' and %1"; + + mgr->insert( separator(), -1, -1 ); // ----------- + mgr->insert( action( GEOMOp::OpShowAllDimensions ), -1, -1 ); // show all dimensions + mgr->setRule( action( GEOMOp::OpShowAllDimensions ), aDimensionRule.arg( "hasHiddenDimensions" ), QtxPopupMgr::VisibleRule ); + mgr->insert( action( GEOMOp::OpHideAllDimensions ), -1, -1 ); // hide all dimensions + mgr->setRule( action( GEOMOp::OpHideAllDimensions ), aDimensionRule.arg( "hasVisibleDimensions" ), QtxPopupMgr::VisibleRule ); + mgr->insert( separator(), -1, -1 ); // ----------- mgr->insert( action( GEOMOp::OpUnpublishObject ), -1, -1 ); // Unpublish object - mgr->setRule( action( GEOMOp::OpUnpublishObject ), QString("client='ObjectBrowser' and $type in {'Shape' 'Group'} and selcount>0"), QtxPopupMgr::VisibleRule ); + mgr->setRule( action( GEOMOp::OpUnpublishObject ), QString("client='ObjectBrowser' and $type in {'Shape' 'Group' 'Field' 'FieldStep'} and selcount>0"), QtxPopupMgr::VisibleRule ); mgr->insert( action( GEOMOp::OpPublishObject ), -1, -1 ); // Publish object mgr->setRule( action( GEOMOp::OpPublishObject ), QString("client='ObjectBrowser' and isComponent=true"), QtxPopupMgr::VisibleRule ); @@ -1390,6 +1580,22 @@ void GeometryGUI::initialize( CAM_Application* app ) mgr->insert( action( GEOMOp::OpReimport ), -1, -1 ); // delete mgr->setRule( action( GEOMOp::OpReimport ), QString("$imported in {'true'} and selcount>0"), QtxPopupMgr::VisibleRule ); + mgr->insert( separator(), -1, -1 ); // ----------- + mgr->insert( action( GEOMOp::OpCreateFolder ), -1, -1 ); // Create Folder + mgr->setRule( action( GEOMOp::OpCreateFolder ), QString("client='ObjectBrowser' and $component={'GEOM'} and (isComponent=true or isFolder=true)"), QtxPopupMgr::VisibleRule ); + + mgr->insert( separator(), -1, -1 ); // ----------- + mgr->insert( action( GEOMOp::OpSortChildren ), -1, -1 ); // Sort child items + mgr->setRule( action( GEOMOp::OpSortChildren ), QString("client='ObjectBrowser' and $component={'GEOM'} and nbChildren>1"), QtxPopupMgr::VisibleRule ); + + mgr->insert( separator(), -1, -1 ); // ----------- + mgr->insert( action( GEOMOp::OpShowDependencyTree ), -1, -1 ); // Show dependency tree + mgr->setRule( action( GEOMOp::OpShowDependencyTree ), clientOCCorVTKorOB + " and selcount>0 and ($component={'GEOM'}) and type='Shape'", QtxPopupMgr::VisibleRule ); + + mgr->insert( separator(), -1, -1 ); // ----------- + mgr->insert( action( GEOMOp::OpReduceStudy ), -1, -1 ); // Reduce Study + mgr->setRule( action( GEOMOp::OpReduceStudy ), clientOCCorVTKorOB + " and selcount>0 and ($component={'GEOM'}) and type='Shape'", QtxPopupMgr::VisibleRule ); + mgr->hide( mgr->actionId( action( myEraseAll ) ) ); SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); @@ -1398,6 +1604,93 @@ void GeometryGUI::initialize( CAM_Application* app ) QColor c = resMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) ); GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c)); } + + // create plugin actions and menus + addPluginActions(); +} + +//======================================================================= +// function : GeometryGUI::addPluginActions() +// purpose : +//======================================================================= +void GeometryGUI::addPluginActions() +{ + // Resource manager + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + if (!resMgr) return; + + SalomeApp_Study* appStudy = dynamic_cast( application()->activeStudy() ); + if (!appStudy) return; + + // Find names of a resource XML files ("AdvancedGEOM.xml" and others); + + GEOMUtils::PluginInfo plugins = GEOMUtils::ReadPluginInfo(); + + int id = GEOMOp::OpLastOperationID; // TODO? + + // loop on plugins + GEOMUtils::PluginInfo::const_iterator it; + for ( it = plugins.begin(); it != plugins.end(); ++it ) { + // bind action lib and label to its ID for activateOperation() method proper work + GEOMUtils::PluginData pdata = (*it); + myPluginLibs[pdata.name.c_str()] = pdata.clientLib.c_str(); + std::list actions = (*it).actions; + std::list::const_iterator ait; + for ( ait = actions.begin(); ait != actions.end(); ++ait ) { + GEOMUtils::ActionData adata = (*ait); + // icon + QPixmap icon; + if ( !adata.icon.empty() ) + icon = resMgr->loadPixmap( pdata.name.c_str(), adata.icon.c_str() ); + // menu text (path) + QStringList smenus = QString( adata.menuText.c_str() ).split( "/" ); + QString actionName = smenus.last(); + actionName = actionName.toUpper().prepend( "MEN_" ); + smenus.removeLast(); + + // path to action in toolbar + QStringList stools = QString( adata.toolTip.c_str() ).split( "/" ); + QString actionTool = stools.last(); + actionTool = actionTool.toUpper().prepend( "TOP_" ); + stools.removeLast(); + + QString actionStat = adata.statusText.c_str(); + actionStat = actionStat.toUpper().prepend( "STB_" ); + + createAction( id, // ~ adata.label + tr( actionTool.toLatin1().constData() ), + icon, + tr( actionName.toLatin1().constData() ), + tr( actionStat.toLatin1().constData() ), + QKeySequence( tr( adata.accel.c_str() ) ), + application()->desktop(), + false /*toggle*/, + this, SLOT( OnGUIEvent() ), + QString() /*shortcutAction*/ ); + + int menuId = -1; + foreach ( QString subMenu, smenus ) { + QStringList subMenuList = subMenu.split( ":" ); + QString subMenuName = subMenuList[0].toUpper().prepend( "MEN_" ); + int subMenuGroup = subMenuList.size() > 1 ? subMenuList[1].toInt() : -1; + menuId = createMenu( tr( subMenuName.toLatin1().constData() ), menuId, -1, subMenuGroup ); + } + createMenu( id, menuId, -1 ); + + if ( !stools.isEmpty() ) { + QString subTool = stools[0]; + subTool = subTool.toUpper().prepend( "TOOL_" ); + int toolId = createTool( tr( subTool.toLatin1().constData() ) ); + createTool(id, toolId); + } + + // add action id to map + PluginAction anAction( pdata.clientLib.c_str(), adata.label.c_str() ); + myPluginActions[id] = anAction; + + id++; + } + } } //======================================================================= @@ -1418,17 +1711,17 @@ bool GeometryGUI::activateModule( SUIT_Study* study ) // import Python module that manages GEOM plugins (need to be here because SalomePyQt API uses active module) PyGILState_STATE gstate = PyGILState_Ensure(); - PyObject* pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager"); - if (pluginsmanager == NULL) + PyObjWrapper pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager"); + if ( !pluginsmanager ) { PyErr_Print(); + } else { - PyObject* result = + PyObjWrapper result = PyObject_CallMethod(pluginsmanager, (char*)"initialize", (char*)"isss", 1, "geom", tr("MEN_NEW_ENTITY").toStdString().c_str(), tr("GEOM_PLUGINS_OTHER").toStdString().c_str()); - if (result == NULL) + if ( !result ) PyErr_Print(); - Py_XDECREF(result); } PyGILState_Release(gstate); // end of GEOM plugins loading @@ -1437,8 +1730,6 @@ bool GeometryGUI::activateModule( SUIT_Study* study ) this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) ); // Reset actions accelerator keys - action(GEOMOp::OpImport)->setEnabled( true ); // Import: CTRL + Key_I - action(GEOMOp::OpExport)->setEnabled( true ); // Export: CTRL + Key_E action(GEOMOp::OpDelete)->setEnabled( true ); // Delete: Key_Delete GUIMap::Iterator it; @@ -1447,37 +1738,32 @@ bool GeometryGUI::activateModule( SUIT_Study* study ) LightApp_SelectionMgr* sm = getApp()->selectionMgr(); + connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() )); + connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( onAutoBringToFront() )); + connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() )); + + if ( !myCreationInfoWdg ) + myCreationInfoWdg = new GEOMGUI_CreationInfoWdg( getApp() ); + getApp()->insertDockWindow( myCreationInfoWdg->getWinID(), myCreationInfoWdg ); + getApp()->placeDockWindow( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea ); + + //NPAL 19674 + SALOME_ListIO selected; + sm->selectedObjects( selected ); + sm->clearSelected(); + SUIT_ViewManager* vm; ViewManagerList OCCViewManagers, VTKViewManagers; application()->viewManagers( OCCViewer_Viewer::Type(), OCCViewManagers ); QListIterator itOCC( OCCViewManagers ); while ( itOCC.hasNext() && (vm = itOCC.next()) ) - myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) ); + onViewManagerAdded(vm); application()->viewManagers( SVTK_Viewer::Type(), VTKViewManagers ); QListIterator itVTK( VTKViewManagers ); while ( itVTK.hasNext() && (vm = itVTK.next()) ) - myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast( vm->getViewModel() ), sm ) ); - - //NPAL 19674 - SALOME_ListIO selected; - sm->selectedObjects( selected ); - sm->clearSelected(); - - // disable OCC selectors - getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() ); - QListIterator itOCCSel( myOCCSelectors ); - while ( itOCCSel.hasNext() ) - if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() ) - sr->setEnabled(true); - - // disable VTK selectors - getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() ); - QListIterator itVTKSel( myVTKSelectors ); - while ( itVTKSel.hasNext() ) - if ( LightApp_VTKSelector* sr = itVTKSel.next() ) - sr->setEnabled(true); + onViewManagerAdded(vm); sm->setSelectedObjects( selected, true ); //NPAL 19674 @@ -1518,6 +1804,13 @@ bool GeometryGUI::deactivateModule( SUIT_Study* study ) disconnect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ), this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) ); + LightApp_SelectionMgr* selMrg = getApp()->selectionMgr(); + + disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() )); + disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() )); + getApp()->removeDockWindow( myCreationInfoWdg->getWinID() ); + myCreationInfoWdg = 0; + EmitSignalCloseAllDialogs(); GUIMap::Iterator it; @@ -1525,17 +1818,15 @@ bool GeometryGUI::deactivateModule( SUIT_Study* study ) it.value()->deactivate(); // Unset actions accelerator keys - action(GEOMOp::OpImport)->setEnabled( false ); // Import: CTRL + Key_I - action(GEOMOp::OpExport)->setEnabled( false ); // Export: CTRL + Key_E action(GEOMOp::OpDelete)->setEnabled( false ); // Delete: Key_Delete qDeleteAll(myOCCSelectors); myOCCSelectors.clear(); - getApp()->selectionMgr()->setEnabled( true, OCCViewer_Viewer::Type() ); + selMrg->setEnabled( true, OCCViewer_Viewer::Type() ); qDeleteAll(myVTKSelectors); myVTKSelectors.clear(); - getApp()->selectionMgr()->setEnabled( true, SVTK_Viewer::Type() ); + selMrg->setEnabled( true, SVTK_Viewer::Type() ); return SalomeApp_Module::deactivateModule( study ); } @@ -1563,6 +1854,8 @@ void GeometryGUI::onWindowActivated( SUIT_ViewWindow* win ) action( GEOMOp::OpGroupCreate )->setEnabled( ViewOCC ); // Create Group action( GEOMOp::OpGroupEdit )->setEnabled( ViewOCC ); // Edit Group + action( GEOMOp::OpCreateField )->setEnabled( ViewOCC ); // Create Field + action( GEOMOp::OpEditField )->setEnabled( ViewOCC ); // Edit Field action( GEOMOp::OpMultiTransform )->setEnabled( ViewOCC ); // MENU BLOCKS - MULTI-TRANSFORMATION } @@ -1570,7 +1863,10 @@ void GeometryGUI::onWindowActivated( SUIT_ViewWindow* win ) void GeometryGUI::windows( QMap& mappa ) const { mappa.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea ); + mappa.insert( SalomeApp_Application::WT_NoteBook, Qt::LeftDockWidgetArea ); mappa.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea ); + if ( myCreationInfoWdg ) + mappa.insert( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea ); } void GeometryGUI::viewManagers( QStringList& lst ) const @@ -1643,6 +1939,147 @@ void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm ) } } +//================================================================================ +/*! + * \brief Slot called when selection changed. Shows creation info of a selected object + */ +//================================================================================ + +void GeometryGUI::updateCreationInfo() +{ + if ( myCreationInfoWdg ) + myCreationInfoWdg->clear(); + + // Code below is commented to have myCreationInfoWdg filled as soon as it is shown again + // if ( !myCreationInfoWdg->isVisible() ) + // return; + + // look for a sole selected GEOM_Object + GEOM::GEOM_BaseObject_var geomObj; + + SALOME_ListIO selected; + getApp()->selectionMgr()->selectedObjects( selected ); + + _PTR(Study) study = dynamic_cast( getApp()->activeStudy() )->studyDS(); + SALOME_ListIteratorOfListIO selIt( selected ); + for ( ; selIt.More(); selIt.Next() ) + { + Handle(SALOME_InteractiveObject) io = selIt.Value(); + if ( !io->hasEntry() ) continue; + _PTR(SObject) sobj = study->FindObjectID( io->getEntry() ); + if ( !sobj ) continue; + CORBA::Object_var obj = GeometryGUI::ClientSObjectToObject( sobj ); + GEOM::GEOM_BaseObject_var gobj = GEOM::GEOM_BaseObject::_narrow( obj ); + if ( !gobj->_is_nil() ) + { + if ( !geomObj->_is_nil() ) + return; // several GEOM objects selected + geomObj = gobj; + } + } + if ( geomObj->_is_nil() ) return; + + // pass creation info of geomObj to myCreationInfoWdg + + if ( myCreationInfoWdg ) { + QPixmap icon; + QString operationName; + myCreationInfoWdg->setOperation( icon, operationName ); + + try { + OCC_CATCH_SIGNALS; + GEOM::CreationInformation_var info = geomObj->GetCreationInformation(); + if ( &info.in() ) { + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + QString name = info->operationName.in(); + if ( !name.isEmpty() ) { + + QString plugin_name; + for ( size_t i = 0; i < info->params.length(); ++i ) { + myCreationInfoWdg->addParam( info->params[i].name.in(), + info->params[i].value.in() ); + QString value = info->params[i].name.in(); + if( value == PLUGIN_NAME ) { + plugin_name = info->params[i].value.in(); + } + } + QString prefix = plugin_name.isEmpty() ? "GEOM" : plugin_name; + icon = resMgr->loadPixmap( prefix, tr( ("ICO_"+name).toLatin1().constData() ), false ); + operationName = tr( ("MEN_"+name).toLatin1().constData() ); + if ( operationName.startsWith( "MEN_" )) + operationName = name; // no translation + myCreationInfoWdg->setOperation( icon, operationName ); + } + } + } + catch (...) { + } + } +} + +void GeometryGUI::onAutoBringToFront() +{ + bool isAutoBringToFront = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "auto_bring_to_front", "false" ); + if( !isAutoBringToFront ) + return; + + SUIT_ViewWindow* SUIT_window = application()->desktop()->activeWindow(); + if ( !SUIT_window || SUIT_window->getViewManager()->getType() != OCCViewer_Viewer::Type() ) + return; + + SalomeApp_Study* appStudy = dynamic_cast< SalomeApp_Study* >( getApp()->activeStudy() ); + if (!appStudy) return; + + GEOM_Displayer displayer( appStudy ); + + SALOME_View* window = displayer.GetActiveView(); + if ( !window ) return; + + int aMgrId = dynamic_cast< SUIT_ViewModel* >( window )->getViewManager()->getGlobalId(); + + SALOME_ListIO selected; + getApp()->selectionMgr()->selectedObjects( selected ); + if (!myTopLevelIOList.IsEmpty()) + { + for( SALOME_ListIteratorOfListIO It( myTopLevelIOList ); It.More(); It.Next() ) + { + Handle( SALOME_InteractiveObject ) io = It.Value(); + bool isSelected = false; + for( SALOME_ListIteratorOfListIO It_sel( selected ); It_sel.More(); It_sel.Next() ) + { + Handle( SALOME_InteractiveObject ) sel_io = It_sel.Value(); + if( io->isSame( sel_io ) ) + isSelected = true; + } + if (!isSelected && appStudy->findObjectByEntry(io->getEntry())) + { + appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), false ); + if ( window->isVisible( io ) ) displayer.Redisplay( io, false ); + } + } + } + + myTopLevelIOList.Assign(selected); + for( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) + { + Handle( SALOME_InteractiveObject ) io = It.Value(); + appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), true ); + if ( window->isVisible( io ) ) displayer.Redisplay( io, false ); + } + + displayer.UpdateViewer(); + GeometryGUI::Modified(); +} + +void GeometryGUI::updateFieldColorScale() +{ + if( SalomeApp_Study* aStudy = dynamic_cast( getApp()->activeStudy() ) ) + { + GEOM_Displayer aDisplayer( aStudy ); + aDisplayer.UpdateColorScale(); + } +} + QString GeometryGUI::engineIOR() const { if ( !CORBA::is_nil( GetGeomGen() ) ) @@ -1650,20 +2087,12 @@ QString GeometryGUI::engineIOR() const return ""; } -#if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1 Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture -#else -Handle(Graphic3d_HArray1OfBytes) GeometryGUI::getTexture -#endif (SalomeApp_Study* theStudy, int theId, int& theWidth, int& theHeight) { theWidth = theHeight = 0; -#if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1 Handle(TColStd_HArray1OfByte) aTexture; -#else - Handle(Graphic3d_HArray1OfBytes) aTexture; -#endif if (theStudy) { TextureMap aTextureMap = myTextureMap[ theStudy->studyDS()->StudyId() ]; @@ -1677,11 +2106,7 @@ Handle(Graphic3d_HArray1OfBytes) GeometryGUI::getTexture theWidth = aWidth; theHeight = aHeight; -#if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1 aTexture = new TColStd_HArray1OfByte (1, aStream->length()); -#else - aTexture = new Graphic3d_HArray1OfBytes (1, aStream->length()); -#endif for (int i = 0; i < aStream->length(); i++) aTexture->SetValue( i+1, (Standard_Byte)aStream[i] ); @@ -1718,7 +2143,7 @@ void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& if( isPredefMat ){ QMenu* matMenu = new QMenu(); QSignalMapper* signalMapper = new QSignalMapper( matMenu ); - + //Get current material model for the object QVariant v; LightApp_Application* anApp = dynamic_cast( getApp() ); @@ -1733,19 +2158,19 @@ void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& // get list of all predefined materials QStringList materials = Material_ResourceMgr::resourceMgr()->materials(); bool found = false; - foreach ( QString material, materials ) + foreach ( QString material, materials ) { QAction* menAct = matMenu->addAction( material ); connect(menAct, SIGNAL( toggled( bool ) ), signalMapper, SLOT( map() ) ); signalMapper->setMapping( menAct, material ); menAct->setCheckable( true ); - // Set checked if this material is current + // Set checked if this material is current Material_Model aModel; aModel.fromResources( material ); - if ( !found && aModel.toProperties() == curModel ) { - menAct->setChecked( true ); - found = true; - } + if ( !found && aModel.toProperties() == curModel ) { + menAct->setChecked( true ); + found = true; + } } matMenu->insertAction( matMenu->addSeparator(), action( GEOMOp::OpPredefMaterCustom ) ); matMenu->insertSeparator( action( GEOMOp::OpPredefMaterCustom ) ); @@ -1812,18 +2237,18 @@ void GeometryGUI::createPreferences() int top_lev_dm = addPreference( tr( "PREF_TOPLEVEL_DM" ), genGroup, LightApp_Preferences::Selector, "Geometry", "toplevel_dm" ); - int step = addPreference( tr( "PREF_STEP_VALUE" ), genGroup, - LightApp_Preferences::IntSpin, "Geometry", "SettingsGeomStep" ); + int transparency = addPreference( tr( "PREF_TRANSPARENCY" ), genGroup, + LightApp_Preferences::IntSpin, "Geometry", "transparency" ); int defl = addPreference( tr( "PREF_DEFLECTION" ), genGroup, LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" ); addPreference( tr( "PREF_PREDEF_MATERIALS" ), genGroup, - LightApp_Preferences::Bool, "Geometry", "predef_materials" ); + LightApp_Preferences::Bool, "Geometry", "predef_materials" ); int material = addPreference( tr( "PREF_MATERIAL" ), genGroup, - LightApp_Preferences::Selector, - "Geometry", "material" ); + LightApp_Preferences::Selector, + "Geometry", "material" ); addPreference( tr( "PREF_EDITGROUP_COLOR" ), genGroup, LightApp_Preferences::Color, "Geometry", "editgroup_color" ); @@ -1848,15 +2273,77 @@ void GeometryGUI::createPreferences() setPreferenceProperty( wd[i], "min", 1 ); setPreferenceProperty( wd[i], "max", 5 ); } - + + int step = addPreference( tr( "PREF_STEP_VALUE" ), genGroup, + LightApp_Preferences::IntSpin, "Geometry", "SettingsGeomStep" ); + + addPreference( tr( "PREF_AUTO_BRING_TO_FRONT" ), genGroup, + LightApp_Preferences::Bool, "Geometry", "auto_bring_to_front" ); + + int aDimGroupId = addPreference( tr( "PREF_DIMENSIONS" ), tabId ); + setPreferenceProperty( aDimGroupId, "columns", 2 ); + + addPreference( tr( "PREF_DIMENSIONS_COLOR" ), aDimGroupId, + LightApp_Preferences::Color, "Geometry", "dimensions_color" ); + + int aDimLineWidthId = addPreference( tr( "PREF_DIMENSIONS_LINE_WIDTH" ), aDimGroupId, + LightApp_Preferences::IntSpin, "Geometry", "dimensions_line_width" ); + + setPreferenceProperty( aDimLineWidthId, "min", 1 ); + setPreferenceProperty( aDimLineWidthId, "max", 5 ); + + int aDimFontHeightId = addPreference( tr( "PREF_DIMENSIONS_FONT_HEIGHT" ), aDimGroupId, + LightApp_Preferences::DblSpin, "Geometry", "dimensions_font_height" ); + + setPreferenceProperty( aDimFontHeightId, "min", 1e-9 ); + setPreferenceProperty( aDimFontHeightId, "max", 1e+9 ); + setPreferenceProperty( aDimFontHeightId, "precision", 9 ); + + int aDimArrLengthId = addPreference( tr( "PREF_DIMENSIONS_ARROW_LENGTH" ), aDimGroupId, + LightApp_Preferences::DblSpin, "Geometry", "dimensions_arrow_length" ); + + setPreferenceProperty( aDimArrLengthId, "min", 1e-9 ); + setPreferenceProperty( aDimArrLengthId, "max", 1e+9 ); + setPreferenceProperty( aDimArrLengthId, "precision", 9 ); + + int aLengthUnitsId = addPreference( tr( "PREF_DIMENSIONS_LENGTH_UNITS" ), aDimGroupId, + LightApp_Preferences::Selector, "Geometry", "dimensions_length_units" ); + + int anAngUnitsId = addPreference( tr( "PREF_DIMENSIONS_ANGLE_UNITS" ), aDimGroupId, + LightApp_Preferences::Selector, "Geometry", "dimensions_angle_units" ); + + addPreference( tr( "PREF_DIMENSIONS_SHOW_UNITS" ), aDimGroupId, + LightApp_Preferences::Bool, "Geometry", "dimensions_show_units" ); + + QStringList aListOfLengthUnits; + aListOfLengthUnits << "m"; + aListOfLengthUnits << "cm"; + aListOfLengthUnits << "mm"; + aListOfLengthUnits << "in."; + aListOfLengthUnits << "ft."; + + QStringList aListOfAngUnits; + aListOfAngUnits << "rad"; + aListOfAngUnits << "deg"; + + setPreferenceProperty( aLengthUnitsId, "strings", aListOfLengthUnits ); + setPreferenceProperty( anAngUnitsId, "strings", aListOfAngUnits ); + + int aDimDefFlyout = addPreference( tr( "PREF_DIMENSIONS_DEFAULT_FLYOUT" ), aDimGroupId, + LightApp_Preferences::DblSpin, "Geometry", "dimensions_default_flyout" ); + + setPreferenceProperty( aDimDefFlyout, "min", 1e-9 ); + setPreferenceProperty( aDimDefFlyout, "max", 1e+9 ); + setPreferenceProperty( aDimDefFlyout, "precision", 9 ); + int isoGroup = addPreference( tr( "PREF_ISOS" ), tabId ); setPreferenceProperty( isoGroup, "columns", 2 ); int isoU = addPreference( tr( "PREF_ISOS_U" ), isoGroup, - LightApp_Preferences::IntSpin, "Geometry", "iso_number_u" ); + LightApp_Preferences::IntSpin, "Geometry", "iso_number_u" ); setPreferenceProperty( isoU, "min", 0 ); setPreferenceProperty( isoU, "max", 100000 ); int isoV = addPreference( tr( "PREF_ISOS_V" ), isoGroup, - LightApp_Preferences::IntSpin, "Geometry", "iso_number_v" ); + LightApp_Preferences::IntSpin, "Geometry", "iso_number_v" ); setPreferenceProperty( isoV, "min", 0 ); setPreferenceProperty( isoV, "max", 100000 ); @@ -1904,11 +2391,13 @@ void GeometryGUI::createPreferences() aModesList.append( tr("MEN_WIREFRAME") ); aModesList.append( tr("MEN_SHADING") ); aModesList.append( tr("MEN_SHADING_WITH_EDGES") ); + aModesList.append( tr("MEN_TEXTURE") ); QList anIndexesList; anIndexesList.append(0); anIndexesList.append(1); anIndexesList.append(2); + anIndexesList.append(3); setPreferenceProperty( dispmode, "strings", aModesList ); setPreferenceProperty( dispmode, "indexes", anIndexesList ); @@ -1936,6 +2425,10 @@ void GeometryGUI::createPreferences() setPreferenceProperty( step, "max", 10000 ); setPreferenceProperty( step, "precision", 3 ); + // Set property for trandparency value for spinboxes + setPreferenceProperty( transparency, "min", 0 ); + setPreferenceProperty( transparency, "max", 100 ); + // Set property for deflection value for spinboxes setPreferenceProperty( defl, "min", GEOM::minDeflection() ); setPreferenceProperty( defl, "max", 1.0 ); @@ -1944,7 +2437,7 @@ void GeometryGUI::createPreferences() // Set property for default material setPreferenceProperty( material, "strings", Material_ResourceMgr::resourceMgr()->materials() ); - + // Set property vertex marker type QList aMarkerTypeIndicesList; QList aMarkerTypeIconsList; @@ -1972,6 +2465,46 @@ void GeometryGUI::createPreferences() setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList ); setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList ); + // Scalar bar for field step presentation + int scalarBarGroup = addPreference( tr( "PREF_GROUP_SCALAR_BAR" ), tabId ); + setPreferenceProperty( scalarBarGroup, "columns", 2 ); + + int sbXPosition = addPreference( tr( "PREF_SCALAR_BAR_X_POSITION" ), scalarBarGroup, + LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_x_position" ); + setPreferenceProperty( sbXPosition, "min", 0 ); + setPreferenceProperty( sbXPosition, "max", 1 ); + setPreferenceProperty( sbXPosition, "step", 0.05 ); + + int sbYPosition = addPreference( tr( "PREF_SCALAR_BAR_Y_POSITION" ), scalarBarGroup, + LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_y_position" ); + setPreferenceProperty( sbYPosition, "min", 0 ); + setPreferenceProperty( sbYPosition, "max", 1 ); + setPreferenceProperty( sbYPosition, "step", 0.05 ); + + int sbWidth = addPreference( tr( "PREF_SCALAR_BAR_WIDTH" ), scalarBarGroup, + LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_width" ); + setPreferenceProperty( sbWidth, "min", 0 ); + setPreferenceProperty( sbWidth, "max", 1 ); + setPreferenceProperty( sbWidth, "step", 0.05 ); + + int sbHeight = addPreference( tr( "PREF_SCALAR_BAR_HEIGHT" ), scalarBarGroup, + LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_height" ); + setPreferenceProperty( sbHeight, "min", 0 ); + setPreferenceProperty( sbHeight, "max", 1 ); + setPreferenceProperty( sbHeight, "step", 0.05 ); + + int sbTextHeight = addPreference( tr( "PREF_SCALAR_BAR_TEXT_HEIGHT" ), scalarBarGroup, + LightApp_Preferences::IntSpin, "Geometry", "scalar_bar_text_height" ); + setPreferenceProperty( sbTextHeight, "min", 6 ); + setPreferenceProperty( sbTextHeight, "max", 24 ); + setPreferenceProperty( sbTextHeight, "step", 1 ); + + int sbNbIntervals = addPreference( tr( "PREF_SCALAR_BAR_NUMBER_OF_INTERVALS" ), scalarBarGroup, + LightApp_Preferences::IntSpin, "Geometry", "scalar_bar_nb_intervals" ); + setPreferenceProperty( sbNbIntervals, "min", 2 ); + setPreferenceProperty( sbNbIntervals, "max", 64 ); + setPreferenceProperty( sbNbIntervals, "step", 1 ); + int originGroup = addPreference( tr( "PREF_GROUP_ORIGIN_AND_BASE_VECTORS" ), tabId ); setPreferenceProperty( originGroup, "columns", 2 ); @@ -1988,6 +2521,54 @@ void GeometryGUI::createPreferences() addPreference( tr( "GEOM_PREVIEW" ), operationsGroup, LightApp_Preferences::Bool, "Geometry", "geom_preview" ); + + int DependencyViewId = addPreference( tr( "PREF_TAB_DEPENDENCY_VIEW" ) ); + + int treeGeneralGroup = addPreference( tr( "PREF_GROUP_GENERAL" ), DependencyViewId ); + + int hierarchy_type = addPreference( tr( "PREF_HIERARCHY_TYPE" ), treeGeneralGroup, + LightApp_Preferences::Selector, "Geometry", "dependency_tree_hierarchy_type" ); + + QStringList aHierarchyTypeList; + aHierarchyTypeList.append( tr("MEN_BOTH_ASCENDANTS_DESCENDANTS") ); + aHierarchyTypeList.append( tr("MEN_ONLY_ASCENDANTS") ); + aHierarchyTypeList.append( tr("MEN_ONLY_DESCENDANTS") ); + + QList aHierarchyTypeIndexesList; + aHierarchyTypeIndexesList.append(0); + aHierarchyTypeIndexesList.append(1); + aHierarchyTypeIndexesList.append(2); + + setPreferenceProperty( hierarchy_type, "strings", aHierarchyTypeList ); + setPreferenceProperty( hierarchy_type, "indexes", aHierarchyTypeIndexesList ); + + addPreference( tr( "GEOM_MOVE_POSSIBILITY" ), treeGeneralGroup, + LightApp_Preferences::Bool, "Geometry", "dependency_tree_move_nodes" ); + + int treeColorGroup = addPreference( tr( "PREF_GROUP_DEPENDENCY_VIEW_COLOR" ), DependencyViewId ); + + addPreference( tr( "PREF_DEPENDENCY_VIEW_BACKGROUND_COLOR"), treeColorGroup, + LightApp_Preferences::Color, "Geometry", "dependency_tree_background_color" ); + + addPreference( tr( "PREF_DEPENDENCY_VIEW_NODE_COLOR"), treeColorGroup, + LightApp_Preferences::Color, "Geometry", "dependency_tree_node_color" ); + addPreference( tr( "PREF_DEPENDENCY_VIEW_MAIN_NODE_COLOR"), treeColorGroup, + LightApp_Preferences::Color, "Geometry", "dependency_tree_main_node_color" ); + addPreference( tr( "PREF_DEPENDENCY_VIEW_UNPUBLISH_NODE_COLOR"), treeColorGroup, + LightApp_Preferences::Color, "Geometry", "dependency_tree_unpublish_node_color" ); + addPreference( tr( "PREF_DEPENDENCY_VIEW_SELECT_NODE_COLOR"), treeColorGroup, + LightApp_Preferences::Color, "Geometry", "dependency_tree_select_node_color" ); + + addPreference( tr( "PREF_DEPENDENCY_VIEW_ARROW_COLOR"), treeColorGroup, + LightApp_Preferences::Color, "Geometry", "dependency_tree_arrow_color" ); + addPreference( tr( "PREF_DEPENDENCY_VIEW_HIGHLIGHT_ARROW_COLOR"), treeColorGroup, + LightApp_Preferences::Color, "Geometry", "dependency_tree_highlight_arrow_color" ); + addPreference( tr( "PREF_DEPENDENCY_VIEW_SELECT_ARROW_COLOR"), treeColorGroup, + LightApp_Preferences::Color, "Geometry", "dependency_tree_select_arrow_color" ); + + + + } void GeometryGUI::preferencesChanged( const QString& section, const QString& param ) @@ -2005,6 +2586,61 @@ void GeometryGUI::preferencesChanged( const QString& section, const QString& par else if (param == QString("toplevel_dm")) { GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)aResourceMgr->integerValue("Geometry", "toplevel_dm", 0)); } + else if (param == QString("scalar_bar_x_position") || + param == QString("scalar_bar_y_position") || + param == QString("scalar_bar_width") || + param == QString("scalar_bar_height") || + param == QString("scalar_bar_text_height") || + param == QString("scalar_bar_nb_intervals")) { + if( SalomeApp_Study* aStudy = dynamic_cast( getApp()->activeStudy() ) ) + { + GEOM_Displayer aDisplayer( aStudy ); + bool anIsRedisplayFieldSteps = param == QString("scalar_bar_nb_intervals"); + aDisplayer.UpdateColorScale( anIsRedisplayFieldSteps, true ); + } + } + else if ( param == QString("dimensions_color") || + param == QString("dimensions_line_width") || + param == QString("dimensions_font_height") || + param == QString("dimensions_arrow_length") || + param == QString("dimensions_show_units") || + param == QString("dimensions_length_units") || + param == QString("dimensions_angle_units") ) + { + SalomeApp_Application* anApp = getApp(); + if ( !anApp ) + { + return; + } + + SalomeApp_Study* aStudy = dynamic_cast( anApp->activeStudy() ); + if ( !aStudy ) + { + return; + } + + GEOM_Displayer aDisplayer( aStudy ); + + ViewManagerList aVMs; + anApp->viewManagers( OCCViewer_Viewer::Type(), aVMs ); + ViewManagerList::Iterator anIt = aVMs.begin(); + for ( ; anIt != aVMs.end(); ++anIt ) + { + SOCC_Viewer* aViewer = dynamic_cast( (*anIt)->getViewModel() ); + if ( !aViewer ) + { + continue; + } + + SALOME_ListIO aVisible; + aViewer->GetVisible( aVisible ); + aDisplayer.Redisplay( aVisible, false, aViewer ); + } + + aDisplayer.UpdateViewer(); + } + else if ( param.startsWith( "dependency_tree") ) + emit SignalDependencyTreeParamChanged( section, param ); } } @@ -2052,6 +2688,7 @@ void GeometryGUI::storeVisualParameters (int savePoint) savePoint); _PTR(IParameters) ip = ClientFactory::getIParameters(ap); + QSet anEntriesToStoreShared; QList lst; QList::Iterator it; @@ -2065,10 +2702,10 @@ void GeometryGUI::storeVisualParameters (int savePoint) // saving VTK actors properties QVector views = vman->getViews(); for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++) { - const ObjMap anObjects = appStudy->getObjectMap(aMgrId); + const ObjMap& anObjects = appStudy->getObjectProperties(aMgrId); ObjMap::ConstIterator o_it = anObjects.begin(); for (; o_it != anObjects.end(); o_it++) { - const PropMap aProps = o_it.value(); + const PropMap& aProps = o_it.value(); //Check that object exists in the study _PTR(SObject) obj( studyDS->FindObjectID( o_it.key().toLatin1().data() ) ); @@ -2083,6 +2720,13 @@ void GeometryGUI::storeVisualParameters (int savePoint) if (!obj->FindAttribute(anAttr, "AttributeIOR")) continue; + // remember entry of object to store shared GEOM properties + // (e.g. dimension properties). + if ( vType == OCCViewer_Viewer::Type() ) + { + anEntriesToStoreShared.insert( o_it.key() ); + } + QString param, occParam = vType; occParam += GEOM::sectionSeparator(); occParam += QString::number(aMgrId); @@ -2100,13 +2744,18 @@ void GeometryGUI::storeVisualParameters (int savePoint) if (aProps.contains(GEOM::propertyName( GEOM::Color ))) { QColor c = aProps.value(GEOM::propertyName( GEOM::Color )).value(); - QStringList val; - val << QString::number(c.redF()); - val << QString::number(c.greenF()); - val << QString::number(c.blueF()); + QStringList val; + val << QString::number(c.redF()); + val << QString::number(c.greenF()); + val << QString::number(c.blueF()); param = occParam + GEOM::propertyName( GEOM::Color ); ip->setParameter(entry, param.toStdString(), val.join( GEOM::subSectionSeparator()).toStdString()); } + + if (aProps.contains(GEOM::propertyName( GEOM::Texture ))) { + param = occParam + GEOM::propertyName( GEOM::Texture ); + ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Texture )).toString().toStdString()); + } if (vType == SVTK_Viewer::Type()) { if (aProps.contains(GEOM::propertyName( GEOM::Opacity ))) { @@ -2135,6 +2784,11 @@ void GeometryGUI::storeVisualParameters (int savePoint) ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::EdgesDirection )).toString().toStdString()); } + if (aProps.contains(GEOM::propertyName( GEOM::Vertices ))) { + param = occParam + GEOM::propertyName( GEOM::Vertices ); + ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Vertices )).toString().toStdString()); + } + if (aProps.contains(GEOM::propertyName( GEOM::Deflection ))) { param = occParam + GEOM::propertyName( GEOM::Deflection ); ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Deflection )).toString().toStdString()); @@ -2163,6 +2817,26 @@ void GeometryGUI::storeVisualParameters (int savePoint) } // object iterator } // for (views) } // for (viewManagers) + + // store dimension attributes of objects: + // since the displayed object always persists in property map, we remember the object entries + // on the passes when we store viewer related properties - to avoid extra iterations on GEOM component tree. + QString aDimensionParam = OCCViewer_Viewer::Type() + GEOM::sectionSeparator() + GEOM::propertyName( GEOM::Dimensions ); + QSet::ConstIterator aEntryIt = anEntriesToStoreShared.constBegin(); + for ( ; aEntryIt != anEntriesToStoreShared.constEnd(); ++aEntryIt ) + { + std::string aStudyEntry = (*aEntryIt).toLatin1().data(); + std::string aStoreEntry = ip->encodeEntry( aStudyEntry, componentName); + + GEOMGUI_DimensionProperty aDimensions( appStudy, aStudyEntry ); + + if ( aDimensions.GetNumber() == 0 ) + { + continue; + } + + ip->setParameter( aStoreEntry, aDimensionParam.toStdString(), ((QString)aDimensions).toLatin1().data() ); + } } /*! @@ -2219,12 +2893,36 @@ void GeometryGUI::restoreVisualParameters (int savePoint) for (; namesIt != paramNames.end(); ++namesIt, ++valuesIt) { - // visual parameters are stored in strings as follows: ViewerType_ViewIndex_ParamName. + // visual parameters are stored in strings as follows: + // 1) ViewerType_ViewIndex_ParamName + // 2) ViewerType_ParamName (shared for GEOM module) // '_' is used as separator and should not be used in viewer type or parameter names. QStringList lst = QString((*namesIt).c_str()).split( GEOM::sectionSeparator(), QString::SkipEmptyParts); - if (lst.size() != 3) + + bool isShared = lst.size() == 2; + bool isViewer = lst.size() == 3; + if ( !isShared && !isViewer ) + { + continue; + } + + // shared visual parameters + if ( isShared ) + { + QString aParamNameStr( lst[1] ); + QString aValuesStr( (*valuesIt).c_str() ); + + // shared dimension properties are stored as attribute + if ( aParamNameStr == GEOM::propertyName( GEOM::Dimensions ) ) + { + GEOMGUI_DimensionProperty aDimensionProp( aValuesStr ); + aDimensionProp.SaveToAttribute( appStudy, entry.toLatin1().data() ); + } + continue; + } + // per view visual parameters viewerTypStr = lst[0]; viewIndexStr = lst[1]; QString paramNameStr = lst[2]; @@ -2246,7 +2944,7 @@ void GeometryGUI::restoreVisualParameters (int savePoint) } else if (paramNameStr == GEOM::propertyName( GEOM::Transparency )) { aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Transparency ), val.toDouble() ); } else if (paramNameStr == GEOM::propertyName( GEOM::TopLevel )) { - aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::TopLevel ), val == "true" || val == "1"); + aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::TopLevel ), val == "true" || val == "1"); } else if (paramNameStr == GEOM::propertyName( GEOM::DisplayMode )) { aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::DisplayMode ), val.toInt()); } else if (paramNameStr == GEOM::propertyName( GEOM::NbIsos )) { @@ -2257,8 +2955,12 @@ void GeometryGUI::restoreVisualParameters (int savePoint) QColor c = QColor::fromRgbF(rgb[0].toDouble(), rgb[1].toDouble(), rgb[2].toDouble()); aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Color ), c); } + } else if (paramNameStr == GEOM::propertyName( GEOM::Texture )) { + aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Texture ), val ); } else if (paramNameStr == GEOM::propertyName( GEOM::EdgesDirection )) { aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::EdgesDirection ), val == "true" || val == "1"); + } else if (paramNameStr == GEOM::propertyName( GEOM::Vertices )) { + aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Vertices ), val == "true" || val == "1"); } else if (paramNameStr == GEOM::propertyName( GEOM::Deflection )) { aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Deflection ), val.toDouble()); } else if (paramNameStr == GEOM::propertyName( GEOM::PointMarker )) { @@ -2275,8 +2977,7 @@ void GeometryGUI::restoreVisualParameters (int savePoint) QList lst = getApp()->viewManagers(); for (int index = 0; index < aListOfMap.count(); index++) { - - appStudy->setObjectPropMap(index, entry, aListOfMap[index]); + appStudy->setObjectProperties(index, entry, aListOfMap[index]); //Get Visibility property of the current PropMap if (aListOfMap[index].value(GEOM::propertyName( GEOM::Visibility )) == 1) { @@ -2312,13 +3013,19 @@ void GeometryGUI::onViewAboutToShow() { SUIT_ViewWindow* window = application()->desktop()->activeWindow(); QAction* a = action( GEOMOp::OpSwitchVectors ); + QAction* aVerticesAction = action( GEOMOp::OpSwitchVertices ); if ( window ) { a->setEnabled(true); bool vmode = window->property("VectorsMode").toBool(); a->setText ( vmode == 1 ? tr( "MEN_VECTOR_MODE_OFF" ) : tr("MEN_VECTOR_MODE_ON") ); + aVerticesAction->setEnabled(true); + vmode = window->property("VerticesMode").toBool(); + aVerticesAction->setText ( vmode == 1 ? tr( "MEN_VERTICES_MODE_OFF" ) : tr("MEN_VERTICES_MODE_ON") ); } else { a->setText ( tr("MEN_VECTOR_MODE_ON") ); a->setEnabled(false); + aVerticesAction->setText ( tr("MEN_VERTICES_MODE_ON") ); + aVerticesAction->setEnabled(false); } } @@ -2495,12 +3202,13 @@ bool GeometryGUI::renameObject( const QString& entry, const QString& name) if ( obj->FindAttribute(anAttr, "AttributeName") ) { _PTR(AttributeName) aName (anAttr); + aName->SetValue( name.toLatin1().data() ); // rename the SObject GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(obj)); if (!CORBA::is_nil(anObj)) { - aName->SetValue( name.toLatin1().data() ); // rename the SObject anObj->SetName( name.toLatin1().data() ); // Rename the corresponding GEOM_Object - result = true; + emit SignalDependencyTreeRenameObject( anObj->GetEntry() ); } + result = true; } } return result; @@ -2519,8 +3227,145 @@ void GeometryGUI::updateMaterials() QtxPreferenceItem* prefItem = pref->rootItem()->findItem( tr( "PREF_MATERIAL" ), true ); if ( prefItem ) { setPreferenceProperty( prefItem->id(), - "strings", materials ); + "strings", materials ); prefItem->retrieve(); } } } + +/*! + \brief Check if the module allows "drag" operation of its objects. + + Overloaded from LightApp_Module class. + + This function is a part of the general drag-n-drop mechanism. + The goal of this function is to check data object passed as a parameter + and decide if it can be dragged or no. + + \param what data object being tested for drag operation + \return \c true if module allows dragging of the specified object + \sa isDropAccepted(), dropObjects() +*/ +bool GeometryGUI::isDraggable( const SUIT_DataObject* what ) const +{ + // we allow dragging object under root and object from folder + int aLevel = what->level(); + bool anObjectInFolder = false; + if ( aLevel > 2 ) { + const SalomeApp_DataObject* dataObj = dynamic_cast( what ); + if ( dataObj ) { + _PTR(SObject) aSO = dataObj->object(); + if ( aSO ) { + _PTR(GenericAttribute) anAttr; + _PTR(SObject) aFatherSO = aSO->GetStudy()->GetUseCaseBuilder()->GetFather( aSO ); + if ( aFatherSO && aFatherSO->FindAttribute(anAttr, "AttributeLocalID") ) { + _PTR(AttributeLocalID) aLocalID( anAttr ); + anObjectInFolder = aLocalID->Value() == 999; + } + } + } + } + return aLevel == 2 || anObjectInFolder; +} + +/*! + \brief Check if the module allows "drop" operation on the given object. + + Overloaded from LightApp_Module class. + + This function is a part of the general drag-n-drop mechanism. + The goal of this function is to check data object passed as a parameter + and decide if it can be used as a target for the "drop" operation. + The processing of the drop operation itself is done in the dropObjects() function. + + \param where target data object + \return \c true if module supports dropping on the \a where data object + \sa isDraggable(), dropObjects() +*/ +bool GeometryGUI::isDropAccepted( const SUIT_DataObject* where ) const +{ + // we allow dropping into folder and top-level GEOM object + int aLevel = where->level(); + bool isFolder = false; + if ( aLevel > 1 ) { + const SalomeApp_DataObject* dataObj = dynamic_cast( where ); + if ( dataObj ) { + _PTR(SObject) aSO = dataObj->object(); + if ( aSO ) { + _PTR(GenericAttribute) anAttr; + if ( aSO->FindAttribute(anAttr, "AttributeLocalID") ) { + _PTR(AttributeLocalID) aLocalID( anAttr ); + isFolder = aLocalID->Value() == 999; + } + } + } + } + return aLevel == 1 || isFolder; +} + +/*! + \brief Complete drag-n-drop operation. + + Overloaded from LightApp_Module class. + + This function is a part of the general drag-n-drop mechanism. + Its goal is to handle dropping of the objects being dragged according + to the chosen operation (move). The dropping is performed in the + context of the parent data object \a where and the \a row (position in the + children index) at which the data should be dropped. If \a row is equal to -1, + this means that objects are added to the end of the children list. + + \param what objects being dropped + \param where target data object + \param row child index at which the drop operation is performed + \param action drag-n-drop operation (Qt::DropAction) - move + + \sa isDraggable(), isDropAccepted() +*/ +void GeometryGUI::dropObjects( const DataObjectList& what, SUIT_DataObject* where, + const int row, Qt::DropAction action ) +{ + if (action != Qt::CopyAction && action != Qt::MoveAction) + return; // unsupported action + + // get parent object + SalomeApp_DataObject* dataObj = dynamic_cast( where ); + if ( !dataObj ) return; // wrong parent + _PTR(SObject) parentObj = dataObj->object(); + + // Find the current Study and StudyBuilder + _PTR(Study) aStudy = parentObj->GetStudy(); + _PTR(UseCaseBuilder) aUseCaseBuilder = aStudy->GetUseCaseBuilder(); + // collect all parents of the target node + QStringList parentIDs; + _PTR(SObject) parent = parentObj; + while( !parent->IsNull() ) { + parentIDs << parent->GetID().c_str(); + parent = aUseCaseBuilder->GetFather(parent); + } + + // collect objects being dropped + GEOM::object_list_var objects = new GEOM::object_list(); + objects->length( what.count() ); + int count = 0; + for ( int i = 0; i < what.count(); i++ ) { + dataObj = dynamic_cast( what[i] ); + if ( !dataObj ) continue; // skip wrong objects + _PTR(SObject) sobj = dataObj->object(); + // check that dropped object is not a parent of target object + if ( parentIDs.contains( sobj->GetID().c_str() ) ) { + return; // it's not allowed to move node into it's child + } + objects[i] = _CAST(SObject, sobj)->GetSObject(); + count++; + } + objects->length( count ); + + // call engine function + GetGeomGen()->Move( objects.in(), // what + _CAST(SObject, parentObj)->GetSObject(), // where + row ); // row + + // update Object browser + getApp()->updateObjectBrowser( false ); +}