X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_Tool.cxx;h=6fa0a831763a9d609337a80d3af710112010d522;hb=5cae7e874afd2fc1b6f61023e8ebd33a933db3c7;hp=a159f81ae8dc8412df68844eb7d58b36fcc75272;hpb=0b4df27e9f347d6187dbf30bacf80b45c21813d4;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_Tool.cxx b/src/HYDROGUI/HYDROGUI_Tool.cxx index a159f81a..6fa0a831 100644 --- a/src/HYDROGUI/HYDROGUI_Tool.cxx +++ b/src/HYDROGUI/HYDROGUI_Tool.cxx @@ -23,25 +23,35 @@ #include "HYDROGUI_Tool.h" #include "HYDROGUI_DataModel.h" +#include "HYDROGUI_DataObject.h" #include "HYDROGUI_Module.h" #include "HYDROGUI_Prs.h" #include -#include #include +#include +#include + +#include #include #include #include +#include + #include #include +#include #include #include #include +#include +#include +#include #include // Definition of this id allows to use 'latin1' (Qt alias for 'ISO-8859-1') @@ -128,27 +138,52 @@ Handle(TCollection_HExtendedString) HYDROGUI_Tool::ToHExtString( const QString& return new TCollection_HExtendedString( ToExtString( src ) ); } -void HYDROGUI_Tool::LambertToDouble( const int theDegrees, - const int theMinutes, - const double theSeconds, - double& theCoord ) +int HYDROGUI_Tool::GetActiveStudyId() { - // ouv: check the case of negative degrees - theCoord = theDegrees * 3600 + theMinutes * 60 + theSeconds; + if( SUIT_Session* aSession = SUIT_Session::session() ) + if( SUIT_Application* anApp = aSession->activeApplication() ) + if( SUIT_Study* aStudy = anApp->activeStudy() ) + return aStudy->id(); + return 0; } -void HYDROGUI_Tool::DoubleToLambert( const double theCoord, - int& theDegrees, - int& theMinutes, - double& theSeconds ) +QString HYDROGUI_Tool::GetTempDir( const bool theToCreate ) { - // ouv: check the case of negative degrees - theDegrees = int( theCoord / 3600 ); + QString aRes; - double aRemainder = theCoord - theDegrees * 3600; - theMinutes = int( aRemainder / 60 ); + char* tmpdir = getenv ( "HYDRO_TMP_DIR" ); + if ( tmpdir ) + { + // try to create folder if it does not exist + QFileInfo fi( tmpdir ); + if ( !fi.exists() && theToCreate ) + { + if ( QDir().mkdir( tmpdir ) ) + QFile::setPermissions( tmpdir, (QFile::Permissions)0x4FFFF ); + QFileInfo fi( tmpdir ); + if ( !fi.exists() || !fi.isWritable() ) + tmpdir = 0; + } + } + if ( !tmpdir ) + tmpdir = getenv ( "TEMP" ); + if ( !tmpdir ) + tmpdir = getenv ( "TMP" ); + if ( !tmpdir ) + { +#ifdef WNT + tmpdir = "C:\\"; +#else + tmpdir = "/tmp"; +#endif + } + aRes = tmpdir; + + QFileInfo fi( aRes ); + if ( !fi.exists() || !fi.isWritable() ) + aRes = QString::null; - theSeconds = aRemainder - theMinutes * 60; + return aRes; } void HYDROGUI_Tool::SetActiveViewManager( HYDROGUI_Module* theModule, @@ -162,7 +197,6 @@ void HYDROGUI_Tool::SetActiveViewManager( HYDROGUI_Module* theModule, } void HYDROGUI_Tool::GetPrsSubObjects( HYDROGUI_Module* theModule, - const int theViewerId, // currently unused HYDROData_SequenceOfObjects& theSeq ) { Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( theModule->getStudyId() ); @@ -172,14 +206,29 @@ void HYDROGUI_Tool::GetPrsSubObjects( HYDROGUI_Module* theModule, HYDROData_Iterator anIterator( aDocument, KIND_IMAGE ); for( ; anIterator.More(); anIterator.Next() ) { - Handle(HYDROData_Image) anImageObj = - Handle(HYDROData_Image)::DownCast( anIterator.Current() ); - if( !anImageObj.IsNull() ) - theSeq.Append( anImageObj ); + Handle(HYDROData_Entity) anObject = anIterator.Current(); + if( !anObject.IsNull() ) + theSeq.Append( anObject ); + } + + anIterator = HYDROData_Iterator( aDocument, KIND_POLYLINE ); + for( ; anIterator.More(); anIterator.Next() ) + { + Handle(HYDROData_Entity) anObject = anIterator.Current(); + if( !anObject.IsNull() ) + theSeq.Append( anObject ); + } + + anIterator = HYDROData_Iterator( aDocument, KIND_IMMERSIBLE_ZONE ); + for( ; anIterator.More(); anIterator.Next() ) + { + Handle(HYDROData_Entity) anObject = anIterator.Current(); + if( !anObject.IsNull() ) + theSeq.Append( anObject ); } } -HYDROGUI_Prs* HYDROGUI_Tool::GetPresentation( const Handle(HYDROData_Object)& theObj, +HYDROGUI_Prs* HYDROGUI_Tool::GetPresentation( const Handle(HYDROData_Entity)& theObj, const GraphicsView_ObjectList& theObjects ) { if( !theObj.IsNull() ) @@ -189,8 +238,8 @@ HYDROGUI_Prs* HYDROGUI_Tool::GetPresentation( const Handle(HYDROData_Object)& th { if( HYDROGUI_Prs* aPrs = dynamic_cast( anIter.next() ) ) { - Handle(HYDROData_Object) anObj = aPrs->getObject(); - if( !anObj.IsNull() && anObj->Label() == theObj->Label() ) + Handle(HYDROData_Entity) anObj = aPrs->getObject(); + if( IsEqual( anObj, theObj ) ) return aPrs; } } @@ -221,19 +270,27 @@ HYDROData_SequenceOfObjects HYDROGUI_Tool::GetSelectedObjects( HYDROGUI_Module* SUIT_DataOwnerPtrList anOwners; aSelectionMgr->selected( anOwners ); + QStringList aCollectedNameList; // to avoid duplication foreach( SUIT_DataOwner* aSUITOwner, anOwners ) { if( LightApp_DataOwner* anOwner = dynamic_cast( aSUITOwner ) ) { - Handle(HYDROData_Object) anObject = aModel->objectByEntry( anOwner->entry(), KIND_UNKNOWN ); + Handle(HYDROData_Entity) anObject = aModel->objectByEntry( anOwner->entry() ); if( !anObject.IsNull() ) - aSeq.Append( anObject ); + { + QString aName = anObject->GetName(); + if( !aCollectedNameList.contains( aName ) ) + { + aSeq.Append( anObject ); + aCollectedNameList.append( aName ); + } + } } } return aSeq; } -Handle(HYDROData_Object) HYDROGUI_Tool::GetSelectedObject( HYDROGUI_Module* theModule ) +Handle(HYDROData_Entity) HYDROGUI_Tool::GetSelectedObject( HYDROGUI_Module* theModule ) { HYDROData_SequenceOfObjects aSeq = GetSelectedObjects( theModule ); if( !aSeq.IsEmpty() ) @@ -241,42 +298,219 @@ Handle(HYDROData_Object) HYDROGUI_Tool::GetSelectedObject( HYDROGUI_Module* theM return NULL; } -Handle(HYDROData_Object) HYDROGUI_Tool::FindObjectByName( HYDROGUI_Module* theModule, - const QString& theName, +ObjectKind HYDROGUI_Tool::GetSelectedPartition( HYDROGUI_Module* theModule ) +{ + HYDROGUI_DataModel* aModel = theModule->getDataModel(); + + SUIT_SelectionMgr* aSelectionMgr = theModule->getApp()->selectionMgr(); + SUIT_DataOwnerPtrList anOwners; + aSelectionMgr->selected( anOwners ); + + if( anOwners.size() != 1 ) + return KIND_UNKNOWN; + + if( LightApp_DataOwner* anOwner = dynamic_cast( anOwners.first().operator->() ) ) + { + QString anEntry = anOwner->entry(); + QString aPrefix = HYDROGUI_DataObject::entryPrefix(); + if( anEntry.left( aPrefix.length() ) == aPrefix ) + { + anEntry.remove( aPrefix ); + for( ObjectKind anObjectKind = KIND_UNKNOWN + 1; anObjectKind <= KIND_LAST; anObjectKind++ ) + if( HYDROGUI_DataModel::partitionName( anObjectKind ) == anEntry ) + return anObjectKind; + } + } + return KIND_UNKNOWN; +} + +Handle(HYDROData_Entity) HYDROGUI_Tool::FindObjectByName( HYDROGUI_Module* theModule, + const QString& theName, const ObjectKind theObjectKind ) { - Handle(HYDROData_Object) anObject; + Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( theModule->getStudyId() ); + return HYDROData_Tool::FindObjectByName( aDocument, theName, theObjectKind ); +} + +HYDROData_SequenceOfObjects HYDROGUI_Tool::FindObjectsByNames( HYDROGUI_Module* theModule, + const QStringList& theNames, + const ObjectKind theObjectKind ) +{ + Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( theModule->getStudyId() ); + return HYDROData_Tool::FindObjectsByNames( aDocument, theNames, theObjectKind ); +} + +QString HYDROGUI_Tool::GenerateObjectName( HYDROGUI_Module* theModule, + const QString& thePrefix, + const QStringList& theUsedNames ) +{ + Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( theModule->getStudyId() ); + return HYDROData_Tool::GenerateObjectName( aDocument, thePrefix, theUsedNames ); +} + +size_t HYDROGUI_Tool::GetActiveViewId( HYDROGUI_Module* theModule, + const QString& theViewId ) +{ + size_t aViewId = 0; + SUIT_ViewManager* aViewMgr = theModule->getApp()->activeViewManager(); + if( !aViewMgr || ( !theViewId.isEmpty() && aViewMgr->getType() != theViewId ) ) + return aViewId; + + if( SUIT_ViewModel* aViewer = aViewMgr->getViewModel() ) + aViewId = (size_t)aViewer; + return aViewId; +} + +size_t HYDROGUI_Tool::GetActiveGraphicsViewId( HYDROGUI_Module* theModule ) +{ + return GetActiveViewId( theModule, GraphicsView_Viewer::Type() ); +} + +size_t HYDROGUI_Tool::GetActiveOCCViewId( HYDROGUI_Module* theModule ) +{ + return GetActiveViewId( theModule, OCCViewer_Viewer::Type() ); +} + +QList getViewIdList( HYDROGUI_Module* theModule, + const QString& theViewId ) +{ + QList aList; + ViewManagerList aViewMgrs; + theModule->getApp()->viewManagers( theViewId, aViewMgrs ); + QListIterator anIter( aViewMgrs ); + while( anIter.hasNext() ) + { + if( SUIT_ViewManager* aViewMgr = anIter.next() ) + { + if( SUIT_ViewModel* aViewer = aViewMgr->getViewModel() ) + aList.append( (size_t)aViewer ); + } + } + return aList; +} + +QList HYDROGUI_Tool::GetGraphicsViewIdList( HYDROGUI_Module* theModule ) +{ + return getViewIdList( theModule, GraphicsView_Viewer::Type() ); +} + +QList HYDROGUI_Tool::GetOCCViewIdList( HYDROGUI_Module* theModule ) +{ + return getViewIdList( theModule, OCCViewer_Viewer::Type() ); +} + +void HYDROGUI_Tool::GetObjectReferences( const Handle(HYDROData_Image)& theImage, + HYDROData_SequenceOfObjects& theRefObjects, + QStringList& theRefNames ) +{ + if( theImage.IsNull() ) + return; + + for( int anIndex = 0, aNbRef = theImage->NbReferences(); anIndex < aNbRef; anIndex++ ) + { + Handle(HYDROData_Entity) aRefObj = theImage->Reference( anIndex ); + if( !aRefObj.IsNull() && !aRefObj->IsRemoved() ) + { + QString aName = aRefObj->GetName(); + if( !theRefNames.contains( aName ) ) + { + theRefObjects.Append( aRefObj ); + theRefNames.append( aRefObj->GetName() ); + if( aRefObj->GetKind() == KIND_IMAGE ) + { + Handle(HYDROData_Image) aRefImage = Handle(HYDROData_Image)::DownCast( aRefObj ); + if( !aRefImage.IsNull() ) + GetObjectReferences( aRefImage, theRefObjects, theRefNames ); + } + } + } + } +} + +void HYDROGUI_Tool::GetObjectBackReferences( HYDROGUI_Module* theModule, + const Handle(HYDROData_Entity)& theObj, + HYDROData_SequenceOfObjects& theBackRefObjects, + QStringList& theBackRefNames ) +{ + if( theObj.IsNull() ) + return; Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( theModule->getStudyId() ); if( aDocument.IsNull() ) - return anObject; + return; - HYDROData_Iterator anIter( aDocument, theObjectKind ); - for( ; anIter.More(); anIter.Next() ) + QString aName = theObj->GetName(); + + HYDROData_Iterator anIterator( aDocument, KIND_IMAGE ); + for( ; anIterator.More(); anIterator.Next() ) { - Handle(HYDROData_Object) anObjectRef = anIter.Current(); - if( !anObjectRef.IsNull() && anObjectRef->GetName() == theName ) + Handle(HYDROData_Image) anImage = Handle(HYDROData_Image)::DownCast( anIterator.Current() ); + if( !anImage.IsNull() ) { - anObject = anObjectRef; - break; + HYDROData_SequenceOfObjects aRefObjects; + QStringList aRefNames; + GetObjectReferences( anImage, aRefObjects, aRefNames ); + if( aRefNames.contains( aName ) ) + { + theBackRefObjects.Append( anImage ); + theBackRefNames.append( anImage->GetName() ); + } } } - return anObject; } -QString HYDROGUI_Tool::GenerateObjectName( HYDROGUI_Module* theModule, - const QString& thePrefix ) + +QDockWidget* HYDROGUI_Tool::WindowDock( QWidget* wid ) { - QString aName; - int anId = 1; - while( anId < 100 ) + if ( !wid ) + return 0; + + QDockWidget* dock = 0; + QWidget* w = wid->parentWidget(); + while ( w && !dock ) { - aName = QString( "%1_%2" ).arg( thePrefix ).arg( QString::number( anId++ ) ); + dock = ::qobject_cast( w ); + w = w->parentWidget(); + } + return dock; +} - // check that there are no other objects with the same name in the document - Handle(HYDROData_Object) anObject = FindObjectByName( theModule, aName, KIND_UNKNOWN ); - if( anObject.IsNull() ) - break; +QColor HYDROGUI_Tool::GenerateFillingColor( HYDROGUI_Module* theModule, + const QStringList& theZoneNames ) +{ + Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( theModule->getStudyId() ); + return GenerateFillingColor( aDocument, theZoneNames ); +} + +QColor HYDROGUI_Tool::GenerateFillingColor( const Handle(HYDROData_Document)& theDoc, + const QStringList& theZoneNames ) +{ + QColor aFillingColor( HYDROData_ImmersibleZone::DefaultFillingColor() ); + + int aCounter = 0; + int aR = 0, aG = 0, aB = 0; + QStringListIterator aZoneNameIter( theZoneNames ); + while( aZoneNameIter.hasNext() ) + { + const QString& aZoneName = aZoneNameIter.next(); + Handle(HYDROData_ImmersibleZone) aRefZone = + Handle(HYDROData_ImmersibleZone)::DownCast( + HYDROData_Tool::FindObjectByName( theDoc, aZoneName, KIND_IMMERSIBLE_ZONE ) ); + if( !aRefZone.IsNull() ) + { + QColor aRefColor = aRefZone->GetFillingColor(); + aR += aRefColor.red(); + aG += aRefColor.green(); + aB += aRefColor.blue(); + aCounter++; + } + } + + if( aCounter > 0 ) + { + aFillingColor = QColor( aR / aCounter, aG / aCounter, aB / aCounter ); } - return aName; + + return aFillingColor; } +