X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_Tool.cxx;h=6cc4ae17009cd18d049be5fbea233d8d5a6b88b0;hb=36005df362d7bee6db949b079960cec90333aed2;hp=da585626e88ea249033e48cd03d9a717521a974d;hpb=98e31f4b1094b875c49a8702548d8abeb7bef812;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_Tool.cxx b/src/HYDROGUI/HYDROGUI_Tool.cxx index da585626..6cc4ae17 100644 --- a/src/HYDROGUI/HYDROGUI_Tool.cxx +++ b/src/HYDROGUI/HYDROGUI_Tool.cxx @@ -1,12 +1,8 @@ -// Copyright (C) 2007-2013 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 -// +// Copyright (C) 2014-2015 EDF-R&D // 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 @@ -31,7 +27,9 @@ #include #include #include +#include +#include #include #include @@ -57,6 +55,8 @@ #include +#include + #include #include #include @@ -66,6 +66,8 @@ // encoding instead of default 'System' #define USE_LATIN1_ENCODING +// #define DEB_GROUPS 1 + QString HYDROGUI_Tool::ToQString( const TCollection_AsciiString& src ) { #ifdef USE_LATIN1_ENCODING @@ -182,7 +184,7 @@ QString HYDROGUI_Tool::GetTempDir( const bool theToCreate ) #ifdef WNT tmpdir = "C:\\"; #else - tmpdir = "/tmp"; + tmpdir = strdup( "/tmp" ); #endif } aRes = tmpdir; @@ -204,6 +206,55 @@ void HYDROGUI_Tool::SetActiveViewManager( HYDROGUI_Module* theModule, aWorkstack->setActiveWindow( aViewWindow ); } +bool HYDROGUI_Tool::IsObjectHasPresentation( const Handle(HYDROData_Entity)& theObject, + const QString& theViewerType ) +{ + if ( theObject.IsNull() ) + return false; + + ObjectKind anObjectKind = theObject->GetKind(); + if ( theViewerType.isEmpty() || theViewerType == OCCViewer_Viewer::Type() ) + { + if ( anObjectKind == KIND_IMAGE || + anObjectKind == KIND_POLYLINEXY || + anObjectKind == KIND_POLYLINE || + anObjectKind == KIND_IMMERSIBLE_ZONE || + anObjectKind == KIND_REGION || + anObjectKind == KIND_ZONE || + anObjectKind == KIND_OBSTACLE || + anObjectKind == KIND_PROFILE || + anObjectKind == KIND_STREAM || + anObjectKind == KIND_CHANNEL || + anObjectKind == KIND_DIGUE || + anObjectKind == KIND_DUMMY_3D || + anObjectKind == KIND_BATHYMETRY || + anObjectKind == KIND_LAND_COVER_MAP +#ifdef DEB_GROUPS + || anObjectKind == KIND_SHAPES_GROUP || + anObjectKind == KIND_SPLITTED_GROUP +#endif + ) + { + return true; + } + } + + if ( theViewerType.isEmpty() || theViewerType == SVTK_Viewer::Type() ) + { + if ( anObjectKind == KIND_BATHYMETRY ) + return true; + } + + if ( theViewerType.isEmpty() || theViewerType == GraphicsView_Viewer::Type() ) + { + if ( anObjectKind == KIND_IMAGE || + anObjectKind == KIND_POLYLINEXY ) + return true; + } + + return false; +} + void HYDROGUI_Tool::GetPrsSubObjects( HYDROGUI_Module* theModule, HYDROData_SequenceOfObjects& theSeq ) { @@ -214,21 +265,10 @@ void HYDROGUI_Tool::GetPrsSubObjects( HYDROGUI_Module* theModule, for( ; anIterator.More(); anIterator.Next() ) { Handle(HYDROData_Entity) anObject = anIterator.Current(); - if( !anObject.IsNull() && ( - ( anObject->GetKind() == KIND_IMAGE ) || - ( anObject->GetKind() == KIND_POLYLINEXY ) || - ( anObject->GetKind() == KIND_POLYLINE ) || - ( anObject->GetKind() == KIND_IMMERSIBLE_ZONE ) || - ( anObject->GetKind() == KIND_REGION ) || - ( anObject->GetKind() == KIND_BATHYMETRY ) || - ( anObject->GetKind() == KIND_ZONE ) || - ( anObject->GetKind() == KIND_OBSTACLE ) || - ( anObject->GetKind() == KIND_PROFILE ) || - ( anObject->GetKind() == KIND_STREAM ) || - ( anObject->GetKind() == KIND_CHANNEL ) ) ) - { - theSeq.Append( anObject ); - } + if ( !IsObjectHasPresentation( anObject ) ) + continue; + + theSeq.Append( anObject ); } } } @@ -349,7 +389,8 @@ ObjectKind HYDROGUI_Tool::GetSelectedPartition( HYDROGUI_Module* theModule ) return KIND_UNKNOWN; } -QStringList HYDROGUI_Tool::GetSelectedGeomObjects( HYDROGUI_Module* theModule ) +QStringList HYDROGUI_Tool::GetSelectedGeomObjects( HYDROGUI_Module* theModule, + QList theTypes ) { QStringList anEntryList; @@ -380,7 +421,8 @@ QStringList HYDROGUI_Tool::GetSelectedGeomObjects( HYDROGUI_Module* theModule ) GEOM::GEOM_Object_var aGeomObj = GEOMBase::GetObjectFromIOR( aSObject->GetIOR().c_str() ); - if ( !aGeomObj->_is_nil() && aGeomObj->IsShape() ) { + if ( !aGeomObj->_is_nil() && aGeomObj->IsShape() && + theTypes.contains( aGeomObj->GetShapeType() ) ) { anEntryList << anEntry; } } @@ -395,16 +437,26 @@ Handle(HYDROData_Entity) HYDROGUI_Tool::FindObjectByName( HYDROGUI_Module* theMo const QString& theName, const ObjectKind theObjectKind ) { + Handle(HYDROData_Entity) aResObj; + Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( theModule->getStudyId() ); - return HYDROData_Tool::FindObjectByName( aDocument, theName, theObjectKind ); + if ( !aDocument.IsNull() ) + aResObj = aDocument->FindObjectByName( theName, theObjectKind ); + + return aResObj; } HYDROData_SequenceOfObjects HYDROGUI_Tool::FindObjectsByNames( HYDROGUI_Module* theModule, const QStringList& theNames, const ObjectKind theObjectKind ) { + HYDROData_SequenceOfObjects aResSeq; + Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( theModule->getStudyId() ); - return HYDROData_Tool::FindObjectsByNames( aDocument, theNames, theObjectKind ); + if ( !aDocument.IsNull() ) + aResSeq = aDocument->FindObjectsByNames( theNames, theObjectKind ); + + return aResSeq; } QString HYDROGUI_Tool::GenerateObjectName( HYDROGUI_Module* theModule, @@ -610,7 +662,7 @@ QColor HYDROGUI_Tool::GenerateFillingColor( HYDROGUI_Module* theModule, QColor HYDROGUI_Tool::GenerateFillingColor( const Handle(HYDROData_Document)& theDoc, const QStringList& theZoneNames ) { - QColor aFillingColor( HYDROData_ImmersibleZone::DefaultFillingColor() ); + QColor aFillingColor( Qt::darkBlue ); int aCounter = 0; int aR = 0, aG = 0, aB = 0; @@ -619,8 +671,7 @@ QColor HYDROGUI_Tool::GenerateFillingColor( const Handle(HYDROData_Document)& th { const QString& aZoneName = aZoneNameIter.next(); Handle(HYDROData_ImmersibleZone) aRefZone = - Handle(HYDROData_ImmersibleZone)::DownCast( - HYDROData_Tool::FindObjectByName( theDoc, aZoneName, KIND_IMMERSIBLE_ZONE ) ); + Handle(HYDROData_ImmersibleZone)::DownCast( theDoc->FindObjectByName( aZoneName, KIND_IMMERSIBLE_ZONE ) ); if( !aRefZone.IsNull() ) { QColor aRefColor = aRefZone->GetFillingColor(); @@ -640,22 +691,122 @@ QColor HYDROGUI_Tool::GenerateFillingColor( const Handle(HYDROData_Document)& th } QStringList HYDROGUI_Tool::FindExistingObjectsNames( const Handle(HYDROData_Document)& theDoc, - const ObjectKind theObjectKind ) + const ObjectKind theObjectKind, + bool isCheckValidProfile ) { QStringList aNames; HYDROData_Iterator anIter( theDoc, theObjectKind ); for ( ; anIter.More(); anIter.Next() ) { Handle(HYDROData_Entity) anObject = anIter.Current(); - if( !anObject.IsNull() ) { - aNames.append( anObject->GetName() ); + + bool isOK = !anObject.IsNull(); + + if( isOK && isCheckValidProfile ) + { + Handle_HYDROData_Profile aProfile = Handle_HYDROData_Profile::DownCast( anObject ); + if( !aProfile.IsNull() && !aProfile->IsValid() ) + isOK = false; } + + if( isOK ) + aNames.append( anObject->GetName() ); } return aNames; } -QString HYDROGUI_Tool::GetCoordinateString( const double theNumber ) +QString HYDROGUI_Tool::GetCoordinateString( const double theNumber, bool isInLocale ) +{ + if( isInLocale ) + { + static QLocale aLocale( QLocale::English, QLocale::France ); + return aLocale.toString( theNumber, 'f', 2 ); + } + else + return QString::number( theNumber, 'f', 2 ); +} + +Handle(Image_PixMap) HYDROGUI_Tool::Pixmap( const QImage& theImage ) { - return QString::number( theNumber, 'f', 2 ); -} \ No newline at end of file + Handle(Image_PixMap) pix; + if ( theImage.isNull() || theImage.format() == QImage::Format_Invalid ) + return pix; + + Handle(Image_PixMap) tmpPix = new Image_PixMap(); + tmpPix->SetTopDown( false ); + QImage anImage = theImage.mirrored(); + if ( !anImage.hasAlphaChannel() && anImage.allGray() ) + { + tmpPix->InitTrash( Image_PixMap::ImgGray, anImage.width(), anImage.height(), anImage.width() ); + for ( int r = 0; r < anImage.height(); r++ ) + { + Standard_Byte* aRowData = tmpPix->ChangeRow( anImage.height() - r - 1 ); + for ( int p = 0; p < anImage.width(); p++ ) + aRowData[p] = qRed( anImage.pixel( p, r ) ); + } + } + else + { + Image_PixMap::ImgFormat aFormat; + if ( anImage.hasAlphaChannel() ) + { + if ( anImage.format() != QImage::Format_ARGB32 ) + anImage = anImage.convertToFormat( QImage::Format_ARGB32 ); + aFormat = Image_PixMap::ImgRGBA; + } + else + { + if ( anImage.format() != QImage::Format_RGB888 ) + anImage = anImage.convertToFormat( QImage::Format_RGB888 ); + aFormat = Image_PixMap::ImgRGB; + } + + tmpPix->InitWrapper( aFormat, (Standard_Byte*)anImage.bits(), anImage.width(), anImage.height(), anImage.bytesPerLine() ); + } + + if ( !tmpPix.IsNull() ) + { + pix = new Image_PixMap(); + pix->InitCopy( *tmpPix.operator->() ); + pix->SetTopDown( tmpPix->IsTopDown() ); + } + + return pix; +} + +void HYDROGUI_Tool::DeleteGeomObjects( HYDROGUI_Module* theModule, const QStringList& theEntries ) +{ + QStringList anEntryList; + + // Get active SalomeApp_Study + SalomeApp_Study* aStudy = NULL; + if ( theModule && theModule->getApp() ) { + aStudy = dynamic_cast( theModule->getApp()->activeStudy() ); + } + if ( !aStudy ) { + return; + } + + // Get GEOM engine + GEOM::GEOM_Gen_var aGeomEngine = GeometryGUI::GetGeomGen(); + if ( aGeomEngine->_is_nil() ) { + return; + } + + // Delete GEOM objects + _PTR(StudyBuilder) aStudyBuilder( aStudy->studyDS()->NewBuilder() ); + foreach ( const QString anEntry, theEntries ) { + _PTR(SObject) aSObject( aStudy->studyDS()->FindObjectID( qPrintable(anEntry) ) ); + if ( aSObject ) { + GEOM::GEOM_Object_var aGeomObj = + GEOMBase::GetObjectFromIOR( aSObject->GetIOR().c_str() ); + + if ( !aGeomObj->_is_nil() ) { + aGeomEngine->RemoveObject( aGeomObj ); + } + + aStudyBuilder->RemoveObject( aSObject ); + } + } +}