X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Image.cxx;h=a957d7f9f97a78c51cc9b1e644ef2b87172871c5;hb=b86ee42a0010ef6bde30373a8741dd865d557dd3;hp=ef915a0045f10cc6d415c783a052ad44d4ff7318;hpb=63cfcd8fde33b237c06377b628b4e9e8027a425f;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Image.cxx b/src/HYDROData/HYDROData_Image.cxx index ef915a00..a957d7f9 100644 --- a/src/HYDROData/HYDROData_Image.cxx +++ b/src/HYDROData/HYDROData_Image.cxx @@ -1,9 +1,27 @@ +// 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, 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 +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include "HYDROData_Image.h" #include "HYDROData_Document.h" #include "HYDROData_Lambert93.h" #include "HYDROData_OperationsFactory.h" +#include "HYDROData_Tool.h" #include #include @@ -13,23 +31,32 @@ #include #include +#include +#include + +#ifdef WIN32 + #pragma warning ( disable: 4251 ) +#endif + #include #include #include #include +#include -#include +#ifdef WIN32 + #pragma warning ( default: 4251 ) +#endif -static const Standard_GUID GUID_SELF_SPLITTED("997995aa-5c19-40bf-9a60-ab4b70ad04d8"); +static const Standard_GUID GUID_SELF_SPLIT("997995aa-5c19-40bf-9a60-ab4b70ad04d8"); static const Standard_GUID GUID_HAS_LOCAL_POINTS("FD8841AA-FC44-42fa-B6A7-0F682CCC6F27"); static const Standard_GUID GUID_HAS_GLOBAL_POINTS("330D0E81-742D-4ea3-92D4-484877CFA7C1"); -IMPLEMENT_STANDARD_HANDLE(HYDROData_Image, HYDROData_Entity) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Image, HYDROData_Entity) HYDROData_Image::HYDROData_Image() -: HYDROData_Entity() +: HYDROData_Entity( Geom_2d ) { } @@ -37,7 +64,8 @@ HYDROData_Image::~HYDROData_Image() { } -QStringList HYDROData_Image::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const +QStringList HYDROData_Image::DumpToPython( const QString& thePyScriptPath, + MapOfTreatedObjects& theTreatedObjects ) const { QStringList aResList = dumpObjectCreation( theTreatedObjects ); QString anImageName = GetObjPyName(); @@ -46,25 +74,34 @@ QStringList HYDROData_Image::DumpToPython( MapOfTreatedObjects& theTreatedObject if ( !aFilePath.isEmpty() ) { aResList << QString( "" ); - aResList << QString( "%1.LoadImage( \"%2\" );" ) + aResList << QString( "if not(%1.LoadImage( \"%2\" )):" ) .arg( anImageName ).arg( aFilePath ); + aResList << QString( " raise ValueError('problem while loading image')" ); aResList << QString( "" ); // Dump transformation points for image - QString aGap = QString().fill( ' ', anImageName.size() + 16 ); - bool anIsByTwoPoints = IsByTwoPoints(); QPoint aLocalPointA, aLocalPointB, aLocalPointC; if ( GetLocalPoints( aLocalPointA, aLocalPointB, aLocalPointC ) ) { + QString aGap = QString().fill( ' ', anImageName.size() + 17 ); + aResList << QString( "%1.SetLocalPoints( QPoint( %2, %3 )," ) .arg( anImageName ).arg( aLocalPointA.x() ).arg( aLocalPointA.y() ); - aResList << QString( aGap + "QPoint( %1, %2 )," ) + aResList << QString( aGap + "QPoint( %1, %2 )" ) .arg( aLocalPointB.x() ).arg( aLocalPointB.y() ); - aResList << QString( aGap + "QPoint( %1, %2 ) );" ) - .arg( aLocalPointC.x() ).arg( aLocalPointC.y() ); + if ( !anIsByTwoPoints ) + { + aResList.last().append( "," ); + aResList << QString( aGap + "QPoint( %1, %2 ) )" ) + .arg( aLocalPointC.x() ).arg( aLocalPointC.y() ); + } + else + { + aResList.last().append( " )" ); + } aResList << QString( "" ); } @@ -72,19 +109,29 @@ QStringList HYDROData_Image::DumpToPython( MapOfTreatedObjects& theTreatedObject QPointF aTrsfPointA, aTrsfPointB, aTrsfPointC; if ( GetGlobalPoints( aTransformationMode, aTrsfPointA, aTrsfPointB, aTrsfPointC ) ) { + QString aGap = QString().fill( ' ', anImageName.size() + 18 ); + aResList << QString( "%1.SetGlobalPoints( %2," ) .arg( anImageName ).arg( aTransformationMode ); aResList << QString( aGap + "QPointF( %1, %2 )," ) - .arg( aTrsfPointA.x() ).arg( aTrsfPointA.y() ); - aResList << QString( aGap + "QPointF( %1, %2 )," ) - .arg( aTrsfPointB.x() ).arg( aTrsfPointB.y() ); - aResList << QString( aGap + "QPointF( %1, %2 ) );" ) - .arg( aTrsfPointC.x() ).arg( aTrsfPointC.y() ); + .arg( aTrsfPointA.x(), 0, 'f', 3 ).arg( aTrsfPointA.y(), 0, 'f', 3 ); + aResList << QString( aGap + "QPointF( %1, %2 )" ) + .arg( aTrsfPointB.x(), 0, 'f', 3 ).arg( aTrsfPointB.y(), 0, 'f', 3 ); + if ( !anIsByTwoPoints ) + { + aResList.last().append( "," ); + aResList << QString( aGap + "QPointF( %1, %2 ) )" ) + .arg( aTrsfPointC.x(), 0, 'f', 3 ).arg( aTrsfPointC.y(), 0, 'f', 3 ); + } + else + { + aResList.last().append( " )" ); + } if ( aTransformationMode == ReferenceImage ) { Handle(HYDROData_Image) aRefImg = GetTrsfReferenceImage(); - setPythonReferenceObject( theTreatedObjects, aResList, aRefImg, "SetTrsfReferenceImage" ); + setPythonReferenceObject( thePyScriptPath, theTreatedObjects, aResList, aRefImg, "SetTrsfReferenceImage" ); } } } @@ -97,7 +144,7 @@ QStringList HYDROData_Image::DumpToPython( MapOfTreatedObjects& theTreatedObject { aResList << QString( "" ); - aResList << QString( "%1.SetOperatorName( \"%2\" );" ) + aResList << QString( "%1.SetOperatorName( \"%2\" )" ) .arg( anImageName ).arg( anOperatorName ); ImageComposer_Operator* anImageOp = @@ -113,7 +160,7 @@ QStringList HYDROData_Image::DumpToPython( MapOfTreatedObjects& theTreatedObject aResList << anOpArgs; aResList << QString( "" ); - aResList << QString( "%1.SetArgs( %2 );" ) + aResList << QString( "%1.SetArgs( %2 )" ) .arg( anImageName ).arg( anOpArgsArrayName ); } } @@ -127,23 +174,20 @@ QStringList HYDROData_Image::DumpToPython( MapOfTreatedObjects& theTreatedObject for ( int i = 0; i < aNbReferences; ++i ) { Handle(HYDROData_Image) aRefImg = Handle(HYDROData_Image)::DownCast( Reference( i ) ); - setPythonReferenceObject( theTreatedObjects, aResList, aRefImg, "AppendReference" ); + setPythonReferenceObject( thePyScriptPath, theTreatedObjects, aResList, aRefImg, "AppendReference" ); } } - - // Necessary to update image in case of composed operator - aResList << QString( "" ); - aResList << QString( "%1.Update();" ).arg( anImageName ); } aResList << QString( "" ); + aResList << QString( "%1.Update()" ).arg( anImageName ); return aResList; } void HYDROData_Image::Update() { - bool anIsToUpdate = IsMustBeUpdated(); + bool anIsToUpdate = IsMustBeUpdated( Geom_2d ); HYDROData_Entity::Update(); @@ -194,7 +238,12 @@ void HYDROData_Image::Update() UpdateTrsf(); } - SetToUpdate( false ); + ClearChanged(); +} + +bool HYDROData_Image::IsHas2dPrs() const +{ + return true; } QVariant HYDROData_Image::GetDataVariant() @@ -257,13 +306,118 @@ void HYDROData_Image::SetImage(const QImage& theImage) SaveByteArray(0, aData, anImage.byteCount()); } - SetToUpdate( true ); + Changed( Geom_2d ); } bool HYDROData_Image::LoadImage( const QString& theFilePath ) { - QImage anImage( theFilePath ); + QFileInfo aFI(theFilePath); + QImage anImage; + HYDROData_Image::ECW_FileInfo* theECWInfo; + if (aFI.suffix().toLower() == "ecw") + { + theECWInfo = new HYDROData_Image::ECW_FileInfo; + HYDROData_Image::OpenECW(theFilePath.toLatin1().data(), anImage, theECWInfo); + } + else + anImage = QImage(theFilePath); SetImage( anImage ); + SetFilePath( theFilePath ); + return !anImage.isNull(); +} + +bool HYDROData_Image::OpenECW(char* theFileName, QImage& theImage, ECW_FileInfo* theECWInfo) +{ + NCSFileView *pNCSFileView; + NCSFileViewFileInfo *pNCSFileInfo; + NCSError eError = NCS_SUCCESS; + UINT32 band, nBands; + UINT32 XSize, YSize; + NCSecwInit(); + + eError = NCScbmOpenFileView(theFileName, &pNCSFileView, NULL); + if(eError != NCS_SUCCESS) + return false; + + eError = NCScbmGetViewFileInfo(pNCSFileView, &pNCSFileInfo); + if(eError != NCS_SUCCESS) + return false; + + XSize = pNCSFileInfo->nSizeX; + YSize = pNCSFileInfo->nSizeY; + nBands = pNCSFileInfo->nBands; + if (theECWInfo) + { + //ECW_CellUnits myCellSizeUnits; + CellSizeUnits aCellUnits = pNCSFileInfo->eCellSizeUnits; + if (aCellUnits == ECW_CELL_UNITS_METERS) + theECWInfo->myCellSizeUnits = ECW_CellUnits_Meters; + else if (aCellUnits == ECW_CELL_UNITS_DEGREES) + theECWInfo->myCellSizeUnits = ECW_CellUnits_Deg; + else if (aCellUnits == ECW_CELL_UNITS_FEET) + theECWInfo->myCellSizeUnits = ECW_CellUnits_Feet; + else + theECWInfo->myCellSizeUnits = ECW_CellUnits_Unknown; + theECWInfo->myCellIncrementX = pNCSFileInfo->fCellIncrementX; + theECWInfo->myCellIncrementY = pNCSFileInfo->fCellIncrementY; + theECWInfo->myOriginX = pNCSFileInfo->fOriginX; + theECWInfo->myOriginY = pNCSFileInfo->fOriginY; + theECWInfo->myXSize = pNCSFileInfo->nSizeX; + theECWInfo->myYSize = pNCSFileInfo->nSizeY; + } + + std::vector band_list(nBands); + for( band = 0; band < nBands; band++ ) + band_list[band] = band; + + eError = NCScbmSetFileView(pNCSFileView, nBands, &band_list[0], 0, 0, XSize - 1, YSize - 1, XSize, YSize); //view an image into the original size + + if(eError != NCS_SUCCESS) + { + NCScbmCloseFileView(pNCSFileView); + return false; + } + + UINT8 *pRGBTriplets; + pRGBTriplets = (UINT8 *) malloc(XSize*3); + + QImage anImage(XSize, YSize, QImage::Format_RGB32); + + for(UINT32 line = 0; line < YSize; line++) + { + NCSEcwReadStatus eStatus; + eStatus = NCScbmReadViewLineRGB(pNCSFileView, pRGBTriplets); + if(eStatus == NCSECW_READ_OK) + { + QRgb* crp = (QRgb*)anImage.scanLine(line); + for(UINT32 j = 0; j < XSize; j++) + { + QRgb val = qRgb((int)pRGBTriplets[j*3],(int)pRGBTriplets[j*3+1],(int)pRGBTriplets[j*3+2]); + memcpy((void*)(crp+j), &val, sizeof(QRgb)); + } + } + else + { + free(pRGBTriplets); + NCScbmCloseFileView(pNCSFileView); + return false; + } + } + + free(pRGBTriplets); + NCScbmCloseFileView(pNCSFileView); + theImage = anImage; + return true; +} + +bool HYDROData_Image::LoadImageECW( const QString& theFilePath ) +{ + QImage anImage; + if (HYDROData_Image::OpenECW(theFilePath.toLatin1().data(), anImage, NULL)) + { + SetImage( anImage ); + SetFilePath( theFilePath ); + } return !anImage.isNull(); } @@ -286,7 +440,7 @@ void HYDROData_Image::SetFilePath( const QString& theFilePath ) TCollection_AsciiString anAsciiStr( theFilePath.toStdString().c_str() ); TDataStd_AsciiString::Set( myLab.FindChild( DataTag_FilePath ), anAsciiStr ); - SetToUpdate( true ); + Changed( Geom_2d ); } QString HYDROData_Image::GetFilePath() const @@ -322,7 +476,7 @@ void HYDROData_Image::SetTrsf(const QTransform& theTrsf) anArray->SetValue(8, theTrsf.m32()); anArray->SetValue(9, theTrsf.m33()); - SetToUpdate( true ); + Changed( Geom_2d ); } QTransform HYDROData_Image::Trsf() const @@ -459,7 +613,7 @@ void HYDROData_Image::RemoveAllReferences() ClearReferences(); SetOperatorName( "" ); SetArgs( "" ); - SetIsSelfSplitted( false ); + SetIsSelfSplit( false ); } bool anIsByTwoPoints = IsByTwoPoints(); @@ -467,7 +621,7 @@ void HYDROData_Image::RemoveAllReferences() QImage anImage = Image(); if ( anImage.isNull() ) { - SetToUpdate( false ); + ClearChanged(); return; } @@ -488,7 +642,7 @@ void HYDROData_Image::RemoveAllReferences() SetGlobalPoints( ManualCartesian, aTrsfPointA, aTrsfPointB, aTrsfPointC ); - SetToUpdate( false ); + ClearChanged(); } void HYDROData_Image::SetLocalPoints( const QPoint& thePointA, @@ -512,7 +666,7 @@ void HYDROData_Image::SetLocalPoints( const QPoint& thePointA, if ( theIsUpdate ) UpdateTrsf(); - SetToUpdate( true ); + Changed( Geom_2d ); } bool HYDROData_Image::GetLocalPoints( QPoint& thePointA, @@ -567,7 +721,7 @@ void HYDROData_Image::SetGlobalPoints( const TransformationMode& theMode, if ( theIsUpdate ) UpdateTrsf(); - SetToUpdate( true ); + Changed( Geom_2d ); } bool HYDROData_Image::GetGlobalPoints( TransformationMode& theMode, @@ -623,8 +777,8 @@ bool HYDROData_Image::SetGlobalPointsFromFile( const QString& theFileName ) // Check the result if ( !isDoubleOk || - boost::math::isnan( aDoubleValue ) || - boost::math::isinf( aDoubleValue ) ) { + HYDROData_Tool::IsNan( aDoubleValue ) || + HYDROData_Tool::IsInf( aDoubleValue ) ) { continue; } @@ -719,7 +873,7 @@ bool HYDROData_Image::HasReferencePoints() const void HYDROData_Image::SetTrsfMode( const TransformationMode& theMode ) { TDataStd_Integer::Set( myLab.FindChild( DataTag_TrsfMode ), (int)theMode ); - SetToUpdate( true ); + Changed( Geom_2d ); } HYDROData_Image::TransformationMode HYDROData_Image::GetTrsfMode() const @@ -740,7 +894,7 @@ HYDROData_Image::TransformationMode HYDROData_Image::GetTrsfMode() const void HYDROData_Image::SetTrsfReferenceImage( const Handle(HYDROData_Image)& theRefImage ) { SetReferenceObject( theRefImage, DataTag_TrsfImage ); - SetToUpdate( true ); + Changed( Geom_2d ); } Handle(HYDROData_Image) HYDROData_Image::GetTrsfReferenceImage() const @@ -751,13 +905,13 @@ Handle(HYDROData_Image) HYDROData_Image::GetTrsfReferenceImage() const void HYDROData_Image::RemoveTrsfReferenceImage() { RemoveReferenceObject( DataTag_TrsfImage ); - SetToUpdate( true ); + Changed( Geom_2d ); } void HYDROData_Image::AppendReference( const Handle(HYDROData_Entity)& theReferenced ) { AddReferenceObject( theReferenced, 0 ); - SetToUpdate( true ); + Changed( Geom_2d ); } int HYDROData_Image::NbReferences() const @@ -774,26 +928,26 @@ void HYDROData_Image::ChangeReference( const int theIndex, Handle(HYDROData_Entity) theReferenced) { SetReferenceObject( theReferenced, 0, theIndex ); - SetToUpdate( true ); + Changed( Geom_2d ); } void HYDROData_Image::RemoveReference(const int theIndex) { RemoveReferenceObject( 0, theIndex ); - SetToUpdate( true ); + Changed( Geom_2d ); } void HYDROData_Image::ClearReferences() { ClearReferenceObjects( 0 ); - SetToUpdate( true ); + Changed( Geom_2d ); } void HYDROData_Image::SetOperatorName( const QString theOpName ) { TCollection_AsciiString anAsciiStr( theOpName.toStdString().c_str() ); TDataStd_AsciiString::Set( myLab.FindChild( DataTag_Operator ), anAsciiStr ); - SetToUpdate( true ); + Changed( Geom_2d ); } QString HYDROData_Image::OperatorName() const @@ -814,7 +968,7 @@ QString HYDROData_Image::OperatorName() const void HYDROData_Image::SetArgs(const QByteArray& theArgs) { SaveByteArray(DataTag_Operator, theArgs.constData(), theArgs.length()); - SetToUpdate( true ); + Changed( Geom_2d ); } QByteArray HYDROData_Image::Args() const @@ -826,19 +980,19 @@ QByteArray HYDROData_Image::Args() const return QByteArray(aData, aLen); } -void HYDROData_Image::SetIsSelfSplitted(bool theFlag) +void HYDROData_Image::SetIsSelfSplit(bool theFlag) { if (theFlag) { - TDataStd_UAttribute::Set(myLab, GUID_SELF_SPLITTED); + TDataStd_UAttribute::Set(myLab, GUID_SELF_SPLIT); } else { - myLab.ForgetAttribute(GUID_SELF_SPLITTED); + myLab.ForgetAttribute(GUID_SELF_SPLIT); } - SetToUpdate( true ); + Changed( Geom_2d ); } -bool HYDROData_Image::IsSelfSplitted() const +bool HYDROData_Image::IsSelfSplit() const { - return myLab.IsAttribute(GUID_SELF_SPLITTED); + return myLab.IsAttribute(GUID_SELF_SPLIT); } QPointF HYDROData_Image::generateThirdPoint( const QPointF& thePointA,