X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMGUI%2FGeometryGUI.cxx;h=77eb58b35d5693f470752501edc7c2e7a070a21b;hb=0989b7fd033d3a3f90ad2fedc01efa33eb856711;hp=47aeffbf8d88257676c1a8efb8d9ead0172f3863;hpb=ef5ed77d707e6ad392684ff83d213296781ffd07;p=modules%2Fgeom.git diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx old mode 100644 new mode 100755 index 47aeffbf8..77eb58b35 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -39,6 +39,8 @@ #include "GEOM_Displayer.h" #include "GEOM_AISShape.hxx" #include "GEOMUtils_XmlHandler.hxx" +#include "GEOMGUI_AnnotationMgr.h" +#include "GEOMGUI_TextTreeSelector.h" #include "GEOM_Actor.h" @@ -86,7 +88,6 @@ #include -#include #include // External includes @@ -137,7 +138,7 @@ extern "C" { } } -GeometryGUI::StudyTextureMap GeometryGUI::myTextureMap; +GeometryGUI::TextureMap GeometryGUI::myTextureMap; GEOM::GEOM_Gen_var GeometryGUI::myComponentGeom = GEOM::GEOM_Gen::_nil(); @@ -171,23 +172,21 @@ CORBA::Object_var GeometryGUI::ClientSObjectToObject (_PTR(SObject) theSObject) anObj = anORB->string_to_object(aValue.c_str()); } } catch(...) { - INFOS("ClientSObjectToObject - Unknown exception was occured!!!"); + INFOS("ClientSObjectToObject - Unknown exception has occurred!!!"); } return anObj._retn(); } //======================================================================= -// function : ClientStudyToStudy +// function : GetStudy // purpose : //======================================================================= -SALOMEDS::Study_var GeometryGUI::ClientStudyToStudy (_PTR(Study) theStudy) +SALOMEDS::Study_var GeometryGUI::getStudyServant() { SALOME_NamingService *aNamingService = SalomeApp_Application::namingService(); - CORBA::Object_var aSMObject = aNamingService->Resolve("/myStudyManager"); - SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow(aSMObject); - int aStudyID = theStudy->StudyId(); - SALOMEDS::Study_var aDSStudy = aStudyManager->GetStudyByID(aStudyID); - return aDSStudy._retn(); + CORBA::Object_var aStudyObject = aNamingService->Resolve("/Study"); + SALOMEDS::Study_var aStudy = SALOMEDS::Study::_narrow(aStudyObject); + return aStudy._retn(); } void GeometryGUI::Modified (bool theIsUpdateActions) @@ -227,8 +226,9 @@ GeometryGUI::GeometryGUI() : myCreationInfoWdg = 0; myTextTreeWdg = 0; + myAnnotationMgr = 0; - connect( Material_ResourceMgr::resourceMgr(), SIGNAL( changed() ), this, SLOT( updateMaterials() ) ); + connect( Material_ResourceMgr::resourceMgr(), SIGNAL( changed() ), this, SLOT( updateMaterials() ), Qt::UniqueConnection ); Q_INIT_RESOURCE( GEOMGUI ); } @@ -257,13 +257,19 @@ GEOMGUI* GeometryGUI::getLibrary( 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 +#if defined(WIN32) QString dirs = getenv( "PATH" ); +#elif defined(__APPLE__) + QString dirs = getenv( "DYLD_LIBRARY_PATH" ); +#else + QString dirs = getenv( "LD_LIBRARY_PATH" ); +#endif +#if defined(WIN32) QString sep = ";"; +#else + QString sep = ":"; #endif + if ( !dirs.isEmpty() ) { QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries QListIterator it( dirList ); it.toBack(); @@ -301,13 +307,20 @@ 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 + +#if defined(WIN32) QString dirs = getenv( "PATH" ); +#elif defined(__APPLE__) + QString dirs = getenv( "DYLD_LIBRARY_PATH" ); +#else + QString dirs = getenv( "LD_LIBRARY_PATH" ); +#endif +#if defined(WIN32) QString sep = ";"; +#else + QString sep = ":"; #endif + if ( !dirs.isEmpty() ) { QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries QListIterator it( dirList ); it.toBack(); @@ -373,6 +386,26 @@ void GeometryGUI::ActiveWorkingPlane() } } +//======================================================================= +// function : GeometryGUI::SetActiveDialogBox() +// purpose : Set active dialog box +//======================================================================= +GEOMGUI_AnnotationMgr* GeometryGUI::GetAnnotationMgr() +{ + if ( !myAnnotationMgr ) + myAnnotationMgr = new GEOMGUI_AnnotationMgr( getApp() ); + return myAnnotationMgr; +} + +//======================================================================= +// function : GeometryGUI::SetActiveDialogBox() +// purpose : Set active dialog box +//======================================================================= +GEOMGUI_TextTreeWdg* GeometryGUI::GetTextTreeWdg() const +{ + return myTextTreeWdg; +} + //======================================================================= // function : GeometryGUI::SetActiveDialogBox() // purpose : Set active dialog box @@ -588,7 +621,7 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpFace: // MENU BUILD - FACE case GEOMOp::OpShell: // MENU BUILD - SHELL case GEOMOp::OpSolid: // MENU BUILD - SOLID - case GEOMOp::OpCompound: // MENU BUILD - COMPUND + case GEOMOp::OpCompound: // MENU BUILD - COMPOUND libName = "BuildGUI"; break; case GEOMOp::OpFuse: // MENU BOOLEAN - FUSE @@ -615,7 +648,6 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpArchimede: // MENU OPERATION - ARCHIMEDE case GEOMOp::OpFillet3d: // MENU OPERATION - FILLET case GEOMOp::OpChamfer: // MENU OPERATION - CHAMFER - case GEOMOp::OpClipping: // MENU OPERATION - CLIPPING RANGE case GEOMOp::OpShapesOnShape: // MENU OPERATION - GET SHAPES ON SHAPE case GEOMOp::OpFillet2d: // MENU OPERATION - FILLET 2D case GEOMOp::OpFillet1d: // MENU OPERATION - FILLET 1D @@ -662,11 +694,16 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) case GEOMOp::OpCheckSelfInters: // MENU MEASURE - CHECK SELF INTERSECTIONS case GEOMOp::OpFastCheckInters: // MENU MEASURE - FAST CHECK INTERSECTIONS case GEOMOp::OpManageDimensions: // MENU MEASURE - MANAGE DIMENSIONS + case GEOMOp::OpAnnotation: // MENU MEASURE - ANNOTATION + case GEOMOp::OpEditAnnotation: // POPUP MENU - EDIT ANNOTATION + case GEOMOp::OpDeleteAnnotation: // POPUP MENU - DELETE ANNOTATION #ifndef DISABLE_PLOT2DVIEWER case GEOMOp::OpShapeStatistics: // MENU MEASURE - SHAPE STATISTICS #endif case GEOMOp::OpShowAllDimensions: // POPUP MENU - SHOW ALL DIMENSIONS case GEOMOp::OpHideAllDimensions: // POPUP MENU - HIDE ALL DIMENSIONS + case GEOMOp::OpShowAllAnnotations: // POPUP MENU - SHOW ALL ANNOTATIONS + case GEOMOp::OpHideAllAnnotations: // POPUP MENU - HIDE ALL ANNOTATIONS libName = "MeasureGUI"; break; case GEOMOp::OpGroupCreate: // MENU GROUP - CREATE @@ -699,10 +736,12 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) GEOMPluginGUI* library = 0; if ( !libName.isEmpty() ) { -#ifndef WIN32 - libName = QString( "lib" ) + libName + ".so"; -#else +#if defined(WIN32) libName = libName + ".dll"; +#elif defined(__APPLE__) + libName = QString( "lib" ) + libName + ".dylib"; +#else + libName = QString( "lib" ) + libName + ".so"; #endif library = getPluginLibrary( libName ); } @@ -728,10 +767,12 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) GEOMGUI* library = 0; if ( !libName.isEmpty() ) { -#ifndef WIN32 - libName = QString( "lib" ) + libName + ".so"; -#else +#if defined(WIN32) libName = libName + ".dll"; +#elif defined(__APPLE__) + libName = QString( "lib" ) + libName + ".dylib"; +#else + libName = QString( "lib" ) + libName + ".so"; #endif library = getLibrary( libName ); } @@ -883,9 +924,8 @@ void GeometryGUI::createOriginAndBaseVectors() return; } if ( appStudy ) { - _PTR(Study) studyDS = appStudy->studyDS(); - if ( studyDS && !CORBA::is_nil( GetGeomGen() ) ) { - GEOM::GEOM_IBasicOperations_var aBasicOperations = GetGeomGen()->GetIBasicOperations( studyDS->StudyId() ); + if ( !CORBA::is_nil( GetGeomGen() ) ) { + GEOM::GEOM_IBasicOperations_var aBasicOperations = GetGeomGen()->GetIBasicOperations(); if ( !aBasicOperations->_is_nil() ) { SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr(); double aLength = aResourceMgr->doubleValue( "Geometry", "base_vectors_length", 1.0 ); @@ -894,11 +934,10 @@ void GeometryGUI::createOriginAndBaseVectors() GEOM::GEOM_Object_var anOY = aBasicOperations->MakeVectorDXDYDZ( 0.0, aLength, 0.0 ); GEOM::GEOM_Object_var anOZ = aBasicOperations->MakeVectorDXDYDZ( 0.0, 0.0, aLength ); - SALOMEDS::Study_var aDSStudy = ClientStudyToStudy( studyDS ); - GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOrigin, "O" ); - GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOX, "OX" ); - GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOY, "OY" ); - GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOZ, "OZ" ); + GetGeomGen()->PublishInStudy( SALOMEDS::SObject::_nil(), anOrigin, "O" ); + GetGeomGen()->PublishInStudy( SALOMEDS::SObject::_nil(), anOX, "OX" ); + GetGeomGen()->PublishInStudy( SALOMEDS::SObject::_nil(), anOY, "OY" ); + GetGeomGen()->PublishInStudy( SALOMEDS::SObject::_nil(), anOZ, "OZ" ); anOrigin->UnRegister(); anOX->UnRegister(); anOY->UnRegister(); @@ -1002,7 +1041,6 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpArchimede, "ARCHIMEDE" ); createGeomAction( GEOMOp::OpFillet3d, "FILLET" ); createGeomAction( GEOMOp::OpChamfer, "CHAMFER" ); - //createGeomAction( GEOMOp::OpClipping, "CLIPPING" ); createGeomAction( GEOMOp::OpShapesOnShape, "GET_SHAPES_ON_SHAPE" ); createGeomAction( GEOMOp::OpSharedShapes, "GET_SHARED_SHAPES" ); createGeomAction( GEOMOp::OpTransferData, "TRANSFER_DATA" ); @@ -1044,6 +1082,9 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpMinDistance, "MIN_DIST" ); createGeomAction( GEOMOp::OpAngle, "MEASURE_ANGLE" ); createGeomAction( GEOMOp::OpManageDimensions, "MANAGE_DIMENSIONS" ); + createGeomAction( GEOMOp::OpAnnotation, "ANNOTATION" ); + createGeomAction( GEOMOp::OpEditAnnotation, "EDIT_ANNOTATION" ); + createGeomAction( GEOMOp::OpDeleteAnnotation, "DELETE_ANNOTATION" ); createGeomAction( GEOMOp::OpTolerance, "TOLERANCE" ); createGeomAction( GEOMOp::OpWhatIs, "WHAT_IS" ); @@ -1117,9 +1158,11 @@ void GeometryGUI::initialize( CAM_Application* app ) #ifndef DISABLE_GRAPHICSVIEW createGeomAction( GEOMOp::OpShowDependencyTree, "POP_SHOW_DEPENDENCY_TREE" ); #endif - createGeomAction( GEOMOp::OpReduceStudy, "POP_REDUCE_STUDY" ); - createGeomAction( GEOMOp::OpShowAllDimensions, "POP_SHOW_ALL_DIMENSIONS" ); - createGeomAction( GEOMOp::OpHideAllDimensions, "POP_HIDE_ALL_DIMENSIONS" ); + createGeomAction( GEOMOp::OpReduceStudy, "POP_REDUCE_STUDY" ); + createGeomAction( GEOMOp::OpShowAllDimensions, "POP_SHOW_ALL_DIMENSIONS" ); + createGeomAction( GEOMOp::OpHideAllDimensions, "POP_HIDE_ALL_DIMENSIONS" ); + createGeomAction( GEOMOp::OpShowAllAnnotations, "POP_SHOW_ALL_ANNOTATIONS" ); + createGeomAction( GEOMOp::OpHideAllAnnotations, "POP_HIDE_ALL_ANNOTATIONS" ); // Create actions for increase/decrease transparency shortcuts createGeomAction( GEOMOp::OpIncrTransparency, "", "", 0, false, @@ -1141,7 +1184,7 @@ void GeometryGUI::initialize( CAM_Application* app ) // ---- create menus -------------------------- - int fileId = createMenu( tr( "MEN_FILE" ), -1, -1 ); + /*int fileId =*/ createMenu( tr( "MEN_FILE" ), -1, -1 ); int editId = createMenu( tr( "MEN_EDIT" ), -1, -1 ); createMenu( GEOMOp::OpDelete, editId, -1 ); @@ -1274,7 +1317,6 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( GEOMOp::OpChamfer, operId, -1 ); createMenu( GEOMOp::OpExtrudedBoss, operId, -1 ); createMenu( GEOMOp::OpExtrudedCut, operId, -1 ); - //createMenu( GEOMOp::OpClipping, operId, -1 ); int repairId = createMenu( tr( "MEN_REPAIR" ), -1, -1, 10 ); createMenu( GEOMOp::OpShapeProcess, repairId, -1 ); @@ -1313,6 +1355,8 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( GEOMOp::OpAngle, dimId, -1 ); createMenu( GEOMOp::OpManageDimensions, dimId, -1 ); + createMenu( GEOMOp::OpAnnotation, measurId, -1 ); + createMenu( separator(), measurId, -1 ); createMenu( GEOMOp::OpTolerance, measurId, -1 ); createMenu( separator(), measurId, -1 ); @@ -1469,6 +1513,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createTool( GEOMOp::OpBoundingBox, measureTbId ); createTool( GEOMOp::OpMinDistance, measureTbId ); createTool( GEOMOp::OpAngle, measureTbId ); + createTool( GEOMOp::OpAnnotation, measureTbId ); createTool( GEOMOp::OpTolerance , measureTbId ); createTool( separator(), measureTbId ); createTool( GEOMOp::OpFreeBoundaries, measureTbId ); @@ -1589,6 +1634,12 @@ void GeometryGUI::initialize( CAM_Application* app ) mgr->setRule( action( GEOMOp::OpNoAutoColor ), autoColorPrefix + " and isAutoColor=true", QtxPopupMgr::VisibleRule ); mgr->insert( separator(), -1, -1 ); // ----------- + mgr->insert( action( GEOMOp::OpEditAnnotation ), -1, -1 ); // edit annotation + mgr->setRule( action( GEOMOp::OpEditAnnotation ), clientOCC + " and annotationsCount=1", QtxPopupMgr::VisibleRule ); + mgr->insert( action( GEOMOp::OpDeleteAnnotation ), -1, -1 ); // delete annotation + mgr->setRule( action( GEOMOp::OpDeleteAnnotation ), clientOCC + " and annotationsCount>0", QtxPopupMgr::VisibleRule ); + mgr->insert( separator(), -1, -1 ); // ----------- + 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 + ")", @@ -1643,6 +1694,10 @@ void GeometryGUI::initialize( CAM_Application* app ) 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( action( GEOMOp::OpShowAllAnnotations ), -1, -1 ); // show all annotations + mgr->setRule( action( GEOMOp::OpShowAllAnnotations ), aDimensionRule.arg( "hasHiddenAnnotations" ), QtxPopupMgr::VisibleRule ); + mgr->insert( action( GEOMOp::OpHideAllAnnotations ), -1, -1 ); // hide all annotations + mgr->setRule( action( GEOMOp::OpHideAllAnnotations ), aDimensionRule.arg( "hasVisibleAnnotations" ), QtxPopupMgr::VisibleRule ); mgr->insert( separator(), -1, -1 ); // ----------- mgr->insert( action( GEOMOp::OpUnpublishObject ), -1, -1 ); // Unpublish object @@ -1804,7 +1859,7 @@ bool GeometryGUI::activateModule( SUIT_Study* study ) // end of GEOM plugins loading connect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ), - this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) ); + this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); // Reset actions accelerator keys action(GEOMOp::OpDelete)->setEnabled( true ); // Delete: Key_Delete @@ -1815,17 +1870,20 @@ 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() )); + connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ), Qt::UniqueConnection ); + connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( onAutoBringToFront() ), Qt::UniqueConnection ); + connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ), Qt::UniqueConnection ); if ( !myCreationInfoWdg ) myCreationInfoWdg = new GEOMGUI_CreationInfoWdg( getApp() ); getApp()->insertDockWindow( myCreationInfoWdg->getWinID(), myCreationInfoWdg ); getApp()->placeDockWindow( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea ); - if ( !myTextTreeWdg ) + if ( !myTextTreeWdg ) { myTextTreeWdg = new GEOMGUI_TextTreeWdg( getApp() ); + new GEOMGUI_TextTreeSelector( myTextTreeWdg, GetAnnotationMgr(), getApp()->selectionMgr() ); + } + getApp()->insertDockWindow( myTextTreeWdg->getWinID(), myTextTreeWdg ); getApp()->placeDockWindow( myTextTreeWdg->getWinID(), Qt::LeftDockWidgetArea ); @@ -1851,7 +1909,7 @@ bool GeometryGUI::activateModule( SUIT_Study* study ) QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId ); if ( viewMenu ) - connect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) ); + connect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ), Qt::UniqueConnection ); // 0020836 (Basic vectors and origin) SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr(); @@ -1890,7 +1948,7 @@ bool GeometryGUI::deactivateModule( SUIT_Study* study ) LightApp_SelectionMgr* selMrg = getApp()->selectionMgr(); disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() )); - disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() )); + //disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() )); if ( myCreationInfoWdg ) { getApp()->removeDockWindow( myCreationInfoWdg->getWinID() ); myCreationInfoWdg = 0; @@ -2031,6 +2089,10 @@ void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm ) break; } } + SOCC_Viewer* aSOCCView = dynamic_cast(viewer); + if ( aSOCCView ) { + GetAnnotationMgr()->RemoveView( aSOCCView ); + } } //================================================================================ @@ -2101,7 +2163,7 @@ void GeometryGUI::onAutoBringToFront() SalomeApp_Study* appStudy = dynamic_cast< SalomeApp_Study* >( getApp()->activeStudy() ); if (!appStudy) return; - GEOM_Displayer displayer( appStudy ); + GEOM_Displayer displayer; SALOME_View* window = displayer.GetActiveView(); if ( !window ) return; @@ -2144,11 +2206,8 @@ void GeometryGUI::onAutoBringToFront() void GeometryGUI::updateFieldColorScale() { - if( SalomeApp_Study* aStudy = dynamic_cast( getApp()->activeStudy() ) ) - { - GEOM_Displayer aDisplayer( aStudy ); - aDisplayer.UpdateColorScale(); - } + GEOM_Displayer aDisplayer; + aDisplayer.UpdateColorScale(); } QString GeometryGUI::engineIOR() const @@ -2158,31 +2217,27 @@ QString GeometryGUI::engineIOR() const return ""; } -Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture - (SalomeApp_Study* theStudy, int theId, int& theWidth, int& theHeight) +Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture (int theId, int& theWidth, int& theHeight) { theWidth = theHeight = 0; Handle(TColStd_HArray1OfByte) aTexture; - if (theStudy) { - TextureMap aTextureMap = myTextureMap[ theStudy->studyDS()->StudyId() ]; - aTexture = aTextureMap[ theId ]; - if ( aTexture.IsNull() ) { - GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGen()->GetIInsertOperations( theStudy->studyDS()->StudyId() ); - if ( !aInsOp->_is_nil() ) { - CORBA::Long aWidth, aHeight; - SALOMEDS::TMPFile_var aStream = aInsOp->GetTexture( theId, aWidth, aHeight ); - if ( aWidth > 0 && aHeight > 0 && aStream->length() > 0 ) { - theWidth = aWidth; - theHeight = aHeight; - - aTexture = new TColStd_HArray1OfByte (1, aStream->length()); - - for (int i = 0; i < aStream->length(); i++) - aTexture->SetValue( i+1, (Standard_Byte)aStream[i] ); - aTextureMap[ theId ] = aTexture; - } + aTexture = myTextureMap[ theId ]; + if ( aTexture.IsNull() ) { + GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGen()->GetIInsertOperations(); + if ( !aInsOp->_is_nil() ) { + CORBA::Long aWidth, aHeight; + SALOMEDS::TMPFile_var aStream = aInsOp->GetTexture( theId, aWidth, aHeight ); + if ( aWidth > 0 && aHeight > 0 && aStream->length() > 0 ) { + theWidth = aWidth; + theHeight = aHeight; + + aTexture = new TColStd_HArray1OfByte (1, aStream->length()); + + for ( CORBA::ULong i = 0; i < aStream->length(); i++) + aTexture->SetValue( i+1, (Standard_Byte)aStream[i] ); + myTextureMap[ theId ] = aTexture; } } } @@ -2358,6 +2413,10 @@ void GeometryGUI::createPreferences() addPreference( tr( "PREF_AUTO_BRING_TO_FRONT" ), genGroup, LightApp_Preferences::Bool, "Geometry", "auto_bring_to_front" ); + // -------------------------------------------------------------------------- + // Dimensions (Measurements) preferences + // -------------------------------------------------------------------------- + int aDimGroupId = addPreference( tr( "PREF_DIMENSIONS" ), tabId ); setPreferenceProperty( aDimGroupId, "columns", 2 ); @@ -2381,7 +2440,7 @@ void GeometryGUI::createPreferences() resMgr->value("resources", "GEOM", aFontFile); aFontFile = aFontFile + QDir::separator() + "Y14.5M-2009.ttf"; // add enginier font into combobox - int fontID = QFontDatabase::addApplicationFont( aFontFile ); + /*int fontID =*/ QFontDatabase::addApplicationFont( aFontFile ); Handle(Font_SystemFont) sf = new Font_SystemFont( new TCollection_HAsciiString("Y14.5M-2009"), Font_FA_Regular, @@ -2441,6 +2500,53 @@ void GeometryGUI::createPreferences() addPreference( tr( "PREF_DIMENSIONS_USE_TEXT3D" ), aDimGroupId, LightApp_Preferences::Bool, "Geometry", "dimensions_use_text3d" ); + // -------------------------------------------------------------------------- + // Shape annotation preferences + // -------------------------------------------------------------------------- + + const int aShapeAnnGroupId = addPreference( tr( "PREF_SHAPE_ANNOTATIONS" ), tabId ); + setPreferenceProperty( aShapeAnnGroupId, "columns", 2 ); + + addPreference( tr( "PREF_SHAPE_ANNOTATIONS_FONT_COLOR" ), aShapeAnnGroupId, LightApp_Preferences::Color, "Geometry", "shape_annotation_font_color" ); + addPreference( tr( "PREF_SHAPE_ANNOTATIONS_LINE_COLOR" ), aShapeAnnGroupId, LightApp_Preferences::Color, "Geometry", "shape_annotation_line_color" ); + const int aShapeAnnFont = + addPreference( tr( "PREF_SHAPE_ANNOTATIONS_FONT" ), aShapeAnnGroupId, LightApp_Preferences::Font, "Geometry", "shape_annotation_font" ); + + int aShapeAnnFontFeatures = QtxFontEdit::Family | QtxFontEdit::Size | QtxFontEdit::Bold | QtxFontEdit::Italic; + setPreferenceProperty( aShapeAnnFont, "features", aShapeAnnFontFeatures ); + setPreferenceProperty( aShapeAnnFont, "mode", QtxFontEdit::Custom ); + setPreferenceProperty( aShapeAnnFont, "fonts", anOCCFonts ); + + const int aShapeAnnLineWidth = + addPreference( tr( "PREF_SHAPE_ANNOTATIONS_LINE_WIDTH" ), aShapeAnnGroupId, LightApp_Preferences::IntSpin, "Geometry", "shape_annotation_line_width" ); + + setPreferenceProperty( aShapeAnnLineWidth, "min", 1 ); + setPreferenceProperty( aShapeAnnLineWidth, "max", 5 ); + + addPreference( tr( "PREF_SHAPE_ANNOTATIONS_AUTOHIDE" ), aShapeAnnGroupId, LightApp_Preferences::Bool, "Geometry", "shape_annotation_autohide" ); + + const int aShapeAnnLineStyle = + addPreference( tr( "PREF_SHAPE_ANNOTATIONS_LINE_STYLE" ), aShapeAnnGroupId, LightApp_Preferences::Selector, "Geometry", "shape_annotation_line_style" ); + + QStringList aLineStyleList; + aLineStyleList.append( tr("PREF_SHAPE_ANNOTATIONS_LINESTYLE_SOLID") ); + aLineStyleList.append( tr("PREF_SHAPE_ANNOTATIONS_LINESTYLE_DASH") ); + aLineStyleList.append( tr("PREF_SHAPE_ANNOTATIONS_LINESTYLE_DOT") ); + aLineStyleList.append( tr("PREF_SHAPE_ANNOTATIONS_LINESTYLE_DOTDASH") ); + + QList aLineStyleIds; + aLineStyleIds.append(0); + aLineStyleIds.append(1); + aLineStyleIds.append(2); + aLineStyleIds.append(3); + + setPreferenceProperty( aShapeAnnLineStyle, "strings", aLineStyleList ); + setPreferenceProperty( aShapeAnnLineStyle, "indexes", aLineStyleIds ); + + // -------------------------------------------------------------------------- + // Isoline drawing preferences + // -------------------------------------------------------------------------- + int isoGroup = addPreference( tr( "PREF_ISOS" ), tabId ); setPreferenceProperty( isoGroup, "columns", 2 ); int isoU = addPreference( tr( "PREF_ISOS_U" ), isoGroup, @@ -2699,21 +2805,23 @@ void GeometryGUI::preferencesChanged( const QString& section, const QString& par 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 ); - } + updateFieldColorScale(); } - else if ( param == QString("dimensions_color") || - param == QString("dimensions_line_width") || - param == QString("dimensions_font") || - param == QString("dimensions_arrow_length") || - param == QString("dimensions_show_units") || - param == QString("dimensions_length_units") || - param == QString("dimensions_angle_units") || - param == QString("dimensions_use_text3d") || + else if ( param == QString("dimensions_color") || + param == QString("dimensions_line_width") || + param == QString("dimensions_font") || + param == QString("dimensions_arrow_length") || + param == QString("dimensions_show_units") || + param == QString("dimensions_length_units") || + param == QString("dimensions_angle_units") || + param == QString("dimensions_use_text3d") || + param == QString("shape_annotation_font_color") || + param == QString("shape_annotation_line_color") || + param == QString("shape_annotation_font") || + param == QString("shape_annotation_line_width") || + param == QString("shape_annotation_autohide") || + param == QString("shape_annotation_line_style") || + param == QString("shape_annotation_line_style") || param == QString("label_color") ) { SalomeApp_Application* anApp = getApp(); @@ -2722,13 +2830,7 @@ void GeometryGUI::preferencesChanged( const QString& section, const QString& par return; } - SalomeApp_Study* aStudy = dynamic_cast( anApp->activeStudy() ); - if ( !aStudy ) - { - return; - } - - GEOM_Displayer aDisplayer( aStudy ); + GEOM_Displayer aDisplayer; ViewManagerList aVMs; anApp->viewManagers( OCCViewer_Viewer::Type(), aVMs ); @@ -2743,6 +2845,20 @@ void GeometryGUI::preferencesChanged( const QString& section, const QString& par SALOME_ListIO aVisible; aViewer->GetVisible( aVisible ); + + GEOMGUI_AnnotationMgr* anAnnotationMgr = GetAnnotationMgr(); + if ( anAnnotationMgr ) { + SALOME_ListIteratorOfListIO anIter( aVisible ); + while ( anIter.More() ) { + if ( anAnnotationMgr->isAnnotationEntry( anIter.Value()->getEntry() ) ) { + aVisible.Remove( anIter ); + } + else { + anIter.Next(); + } + } + } + aDisplayer.Redisplay( aVisible, false, aViewer ); } if ( param == QString( "label_color" ) ) { @@ -2771,7 +2887,7 @@ void GeometryGUI::preferencesChanged( const QString& section, const QString& par LightApp_Displayer* GeometryGUI::displayer() { if ( !myDisplayer ) - myDisplayer = new GEOM_Displayer( dynamic_cast( getApp()->activeStudy() ) ); + myDisplayer = new GEOM_Displayer(); return myDisplayer; } @@ -2799,6 +2915,7 @@ void GeometryGUI::storeVisualParameters (int savePoint) SalomeApp_Study* appStudy = dynamic_cast(application()->activeStudy()); if ( !appStudy || !appStudy->studyDS() ) return; + _PTR(Study) studyDS = appStudy->studyDS(); // componentName is used for encoding of entries when storing them in IParameters @@ -2816,12 +2933,17 @@ void GeometryGUI::storeVisualParameters (int savePoint) QList lst; QList::Iterator it; + GEOMGUI_AnnotationMgr* aAnnotationMgr = GetAnnotationMgr(); + // main cycle to store parameters of displayed objects lst.clear(); getApp()->viewManagers(lst); for (it = lst.begin(); it != lst.end(); it++) { SUIT_ViewManager* vman = *it; QString vType = vman->getType(); + SUIT_ViewModel* vmodel = vman->getViewModel(); + SALOME_View* aView = dynamic_cast(vmodel); + int aMgrId = vman->getGlobalId(); // saving VTK actors properties QVector views = vman->getViews(); @@ -2835,7 +2957,7 @@ void GeometryGUI::storeVisualParameters (int savePoint) _PTR(SObject) obj( studyDS->FindObjectID( o_it.key().toLatin1().data() ) ); if ( !obj || !(aProps.count() > 0)) continue; - // entry is "encoded" = it does NOT contain component adress, since it is a + // entry is "encoded" = it does NOT contain component address, since it is a // subject to change on next component loading std::string entry = ip->encodeEntry(o_it.key().toLatin1().data(), componentName); @@ -2943,28 +3065,41 @@ void GeometryGUI::storeVisualParameters (int savePoint) param = occParam + GEOM::propertyName( GEOM::IsosWidth ); ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::IsosWidth )).toString().toStdString()); } + + if ( vType == SOCC_Viewer::Type() && aAnnotationMgr ) { + std::string anAnnotationInfo = GetAnnotationMgr()->getDisplayedIndicesInfo( + o_it.key().toLatin1().data(), dynamic_cast(aView) ).toStdString(); + if (!anAnnotationInfo.empty()) { + param = occParam + "ShapeAnnotationVisibleItems"; + ip->setParameter(entry, param.toStdString(), anAnnotationInfo); + } + } } // object iterator } // for (views) } // for (viewManagers) - // store dimension attributes of objects: + // store shape annotation and 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 ); + const QString aDimensionParam = OCCViewer_Viewer::Type() + GEOM::sectionSeparator() + GEOM::propertyName( GEOM::Dimensions ); + const QString aAnnotationParam = OCCViewer_Viewer::Type() + GEOM::sectionSeparator() + GEOM::propertyName( GEOM::ShapeAnnotations ); QSet::ConstIterator aEntryIt = anEntriesToStoreShared.constBegin(); for ( ; aEntryIt != anEntriesToStoreShared.constEnd(); ++aEntryIt ) { std::string aStudyEntry = (*aEntryIt).toLatin1().data(); - std::string aStoreEntry = ip->encodeEntry( aStudyEntry, componentName); + std::string aStoreEntry = ip->encodeEntry( aStudyEntry, componentName ); - GEOMGUI_DimensionProperty aDimensions( appStudy, aStudyEntry ); - - if ( aDimensions.GetNumber() == 0 ) - { - continue; + // store dimension parameters + GEOMGUI_DimensionProperty aDimensions( aStudyEntry ); + if ( aDimensions.GetNumber() != 0 ) { + ip->setParameter( aStoreEntry, aDimensionParam.toStdString(), ((QString)aDimensions).toLatin1().data() ); } - ip->setParameter( aStoreEntry, aDimensionParam.toStdString(), ((QString)aDimensions).toLatin1().data() ); + _PTR(SObject) aObj( studyDS->FindObjectID( aStudyEntry ) ); + const Handle(GEOMGUI_AnnotationAttrs) aShapeAnnAttr = GEOMGUI_AnnotationAttrs::FindAttributes( aObj ); + if ( !aShapeAnnAttr.IsNull() ) { + ip->setParameter( aStoreEntry, aAnnotationParam.toStdString(), aShapeAnnAttr->ExportAsPropertyString().toLatin1().data() ); + } } } @@ -2996,7 +3131,7 @@ void GeometryGUI::restoreVisualParameters (int savePoint) for (std::vector::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt) { - // entry is a normal entry - it should be "decoded" (setting base adress of component) + // entry is a normal entry - it should be "decoded" (setting base address of component) QString entry (ip->decodeEntry(*entIt).c_str()); // Check that the entry corresponds to a real object in the Study @@ -3045,7 +3180,14 @@ void GeometryGUI::restoreVisualParameters (int savePoint) if ( aParamNameStr == GEOM::propertyName( GEOM::Dimensions ) ) { GEOMGUI_DimensionProperty aDimensionProp( aValuesStr ); - aDimensionProp.SaveToAttribute( appStudy, entry.toLatin1().data() ); + aDimensionProp.SaveToAttribute( entry.toLatin1().data() ); + } + else if ( aParamNameStr == GEOM::propertyName( GEOM::ShapeAnnotations ) ) + { + Handle(GEOMGUI_AnnotationAttrs) anAttr = + GEOMGUI_AnnotationAttrs::FindOrCreateAttributes( so, appStudy ); + + anAttr->ImportFromPropertyString( aValuesStr ); } continue; @@ -3102,7 +3244,10 @@ void GeometryGUI::restoreVisualParameters (int savePoint) aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::LineWidth ), val.toInt()); } else if (paramNameStr == GEOM::propertyName( GEOM::IsosWidth )) { aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::IsosWidth ), val.toInt()); + } else if (paramNameStr == "ShapeAnnotationVisibleItems") { + aListOfMap[viewIndex].insert( "ShapeAnnotationVisibleItems", val); } + } // for names/parameters iterator QList lst = getApp()->viewManagers(); @@ -3114,7 +3259,16 @@ void GeometryGUI::restoreVisualParameters (int savePoint) if (aListOfMap[index].value(GEOM::propertyName( GEOM::Visibility )) == 1) { SUIT_ViewManager* vman = lst.at(index); SUIT_ViewModel* vmodel = vman->getViewModel(); - displayer()->Display(entry, true, dynamic_cast(vmodel)); + SALOME_View* aView = dynamic_cast(vmodel); + displayer()->Display(entry, true, aView); + + if ( vmodel->getType() == SOCC_Viewer::Type() ) { + PropMap& aProps = aListOfMap[index]; + if ( aProps.contains( "ShapeAnnotationVisibleItems" ) ) { + SOCC_Viewer* aSOCCView = dynamic_cast( aView ); + GetAnnotationMgr()->setDisplayedIndicesInfo( entry, aSOCCView, aProps["ShapeAnnotationVisibleItems"].toString() ); + } + } } } } // for entries iterator @@ -3138,6 +3292,10 @@ void GeometryGUI::restoreVisualParameters (int savePoint) occVMod->Repaint(); } } + + if ( myTextTreeWdg ) { + myTextTreeWdg->updateTree(); + } } // Compute current name mode of the viewer @@ -3146,7 +3304,7 @@ void UpdateNameMode( SalomeApp_Application* app ) bool isMode = false; SalomeApp_Study* aStudy = dynamic_cast< SalomeApp_Study* >( app->activeStudy() ); SUIT_ViewWindow* viewWindow = app->desktop()->activeWindow(); - GEOM_Displayer displayer( aStudy ); + GEOM_Displayer displayer; int aMgrId = viewWindow->getViewManager()->getGlobalId(); SALOME_View* window = displayer.GetActiveView(); @@ -3249,12 +3407,14 @@ void GeometryGUI::ClearShapeBuffer( GEOM::GEOM_Object_ptr theObj ) TCollection_AsciiString asciiIOR( (char *)IOR.in() ); GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR ); - SALOMEDSClient_StudyManager *aManager = SalomeApp_Application::studyMgr(); + SalomeApp_Application* app = + dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication()); + SalomeApp_Study* appStudy = app ? dynamic_cast( app->activeStudy() ) : 0; - if (!aManager) + if (!appStudy) return; - _PTR(Study) aStudy = aManager->GetStudyByID(theObj->GetStudyID()); + _PTR(Study) aStudy = appStudy->studyDS(); if ( !aStudy ) return; @@ -3365,11 +3525,12 @@ 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 + aName->SetValue( name.toUtf8().data() ); // rename the SObject GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(obj)); if (!CORBA::is_nil(anObj)) { - anObj->SetName( name.toLatin1().data() ); // Rename the corresponding GEOM_Object + anObj->SetName( name.toUtf8().data() ); // Rename the corresponding GEOM_Object emit SignalDependencyTreeRenameObject( anObj->GetEntry() ); + emit SignalTextTreeRenameObject( entry ); } result = true; } @@ -3420,7 +3581,7 @@ bool GeometryGUI::isDraggable( const SUIT_DataObject* what ) const _PTR(SObject) aSO = dataObj->object(); if ( aSO ) { _PTR(GenericAttribute) anAttr; - _PTR(SObject) aFatherSO = aSO->GetStudy()->GetUseCaseBuilder()->GetFather( aSO ); + _PTR(SObject) aFatherSO = SalomeApp_Application::getStudy()->GetUseCaseBuilder()->GetFather( aSO ); if ( aFatherSO && aFatherSO->FindAttribute(anAttr, "AttributeLocalID") ) { _PTR(AttributeLocalID) aLocalID( anAttr ); anObjectInFolder = aLocalID->Value() == 999; @@ -3497,7 +3658,7 @@ void GeometryGUI::dropObjects( const DataObjectList& what, SUIT_DataObject* wher _PTR(SObject) parentObj = dataObj->object(); // Find the current Study and StudyBuilder - _PTR(Study) aStudy = parentObj->GetStudy(); + _PTR(Study) aStudy = SalomeApp_Application::getStudy(); _PTR(UseCaseBuilder) aUseCaseBuilder = aStudy->GetUseCaseBuilder(); // collect all parents of the target node QStringList parentIDs; @@ -3537,3 +3698,8 @@ void GeometryGUI::emitDimensionsUpdated( QString entry ) { emit DimensionsUpdated( entry ); } + +void GeometryGUI::emitAnnotationsUpdated( QString entry ) +{ + emit SignalAnnotationsUpdated( entry ); +}