X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_StricklerTable.cxx;h=6cf7c2ccf88ae4cdd923f3e31f14c37abcf39bf3;hb=f9d37ee66fa46871478d806faa54de237225d3c6;hp=903b915a4ad1621a8613987e4ee88c4517302e9d;hpb=e0ed73f9fe23d646ae3b99ee4446098f10f3cb55;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_StricklerTable.cxx b/src/HYDROData/HYDROData_StricklerTable.cxx index 903b915a..6cf7c2cc 100644 --- a/src/HYDROData/HYDROData_StricklerTable.cxx +++ b/src/HYDROData/HYDROData_StricklerTable.cxx @@ -17,12 +17,32 @@ // #include +#include +#include + #include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + IMPLEMENT_STANDARD_HANDLE( HYDROData_StricklerTable, HYDROData_Entity ) IMPLEMENT_STANDARD_RTTIEXT( HYDROData_StricklerTable, HYDROData_Entity ) HYDROData_StricklerTable::HYDROData_StricklerTable() +: HYDROData_Entity( Geom_No ) { } @@ -35,44 +55,189 @@ const ObjectKind HYDROData_StricklerTable::GetKind() const return KIND_STRICKLER_TABLE; } -bool HYDROData_StricklerTable::Import( const TCollection_AsciiString& theFileName ) +bool HYDROData_StricklerTable::Import( const QString& theFileName ) { - FILE* aFile = fopen( theFileName.ToCString(), "r" ); - if( !aFile ) + Handle(TDataStd_NamedData) aMap = Map(); + if( aMap.IsNull() ) + return false; + + QFile aFile( theFileName ); + if( !aFile.open( QFile::ReadOnly | QFile::Text ) ) return false; - const int aBufLen = 256; - char aBuf[aBufLen]; - while( !feof( aFile ) ) + aMap->ChangeReals( TDataStd_DataMapOfStringReal() ); + aMap->ChangeStrings( TDataStd_DataMapOfStringString() ); + aMap->ChangeIntegers( TColStd_DataMapOfStringInteger() ); + + QTextStream aStream( &aFile ); + int i=0; + while( !aStream.atEnd() ) { - fgets( aBuf, aBufLen, aFile ); - std::string aStr = aBuf; + QString aLine = aStream.readLine(); + if( i==0 ) + { + SetAttrName( aLine ); + } + else + { + int p1 = aLine.indexOf( '"' ); + int p2 = aLine.indexOf( '"', p1+1 ); + QString aType = aLine.mid( p1+1, p2-p1-1 ); + QStringList aParts = aLine.mid( p2+1 ).split( ' ', QString::SkipEmptyParts ); + double aCoeff = aParts[0].toDouble(); + int aColorInt = aParts[1].toInt( 0, 16 ); + QString anAttrValue = aParts.size()>2 ? aParts[2] : QString(); + + TCollection_ExtendedString aTypeExt = HYDROData_Tool::toExtString( aType ); + aMap->SetReal( aTypeExt, aCoeff ); + aMap->SetInteger( aTypeExt, aColorInt ); + aMap->SetString( aTypeExt, HYDROData_Tool::toExtString( anAttrValue ) ); + } + i++; } - return false; + aFile.close(); + + return true; } -bool HYDROData_StricklerTable::Export( const TCollection_AsciiString& theFileName ) +bool HYDROData_StricklerTable::Export( const QString& theFileName ) { - //TODO - return false; + Handle(TDataStd_NamedData) aMap = Map(); + if( aMap.IsNull() ) + return false; + + QFile aFile( theFileName ); + if( !aFile.open( QFile::WriteOnly | QFile::Text ) ) + return false; + + QTextStream aStream( &aFile ); + aStream.setCodec( "UTF-8" ); + aStream.setGenerateByteOrderMark( true ); + + aStream << GetAttrName() << "\n"; + + bool aRes = true; + QStringList aTypes = GetTypes(); + foreach( QString aType, aTypes ) + { + TCollection_ExtendedString aTypeExt = HYDROData_Tool::toExtString( aType ); + + aStream << "\"" << aType << "\" " << Get( aType, 0.0 ); + + QString aColor = QString::number( aMap->GetInteger( aTypeExt ), 16 ).toUpper(); + aColor = QString( 6-aColor.length(), '0' ) + aColor; + QString anAttrValue = HYDROData_Tool::toQString( aMap->GetString( aTypeExt ) ); + + aStream << " " << aColor; + if( !anAttrValue.isEmpty() ) + aStream << " " << anAttrValue; + aStream << "\n"; + } + + aFile.close(); + return aRes; } -double HYDROData_StricklerTable::Get( const TCollection_ExtendedString& theType, double theDefault ) const +double HYDROData_StricklerTable::Get( const QString& theType, double theDefault ) const { Handle( TDataStd_NamedData ) aMap = Map(); - if( aMap->HasReal( theType ) ) - return aMap->GetReal( theType ); + TCollection_ExtendedString aType = HYDROData_Tool::toExtString( theType ); + if( aMap->HasReal( aType ) ) + return aMap->GetReal( aType ); else return theDefault; } -void HYDROData_StricklerTable::Set( const TCollection_ExtendedString& theType, double theCoefficient ) +void HYDROData_StricklerTable::Set( const QString& theType, double theCoefficient ) { - Handle( TDataStd_NamedData ) aMap = Map(); - aMap->SetReal( theType, theCoefficient ); + Handle(TDataStd_NamedData) aMap = Map(); + aMap->SetReal( HYDROData_Tool::toExtString( theType ), theCoefficient ); +} + +void HYDROData_StricklerTable::GetCoefficientRange( double& theMin, double& theMax ) const +{ + theMin = 0; + theMax = 0; + + Handle(TDataStd_NamedData) aMap = Map(); + Standard_Boolean isFirst = Standard_True; + for ( TDataStd_DataMapIteratorOfDataMapOfStringReal it( aMap->GetRealsContainer() ); it.More(); it.Next() ) + { + Standard_Real aValue = it.Value(); + if ( theMin == 0 || aValue < theMin ) + { + theMin = aValue; + } + if ( theMax == 0 || aValue > theMax ) + { + theMax = aValue; + } + } +} + +QStringList HYDROData_StricklerTable::GetTypes() const +{ + QStringList aSeq; + Handle(TDataStd_NamedData) aMap = Map(); + if( !aMap.IsNull() ) + { + for( TDataStd_DataMapIteratorOfDataMapOfStringReal it( aMap->GetRealsContainer() ); it.More(); it.Next() ) + aSeq.append( HYDROData_Tool::toQString( it.Key() ) ); + } + aSeq.sort(); + return aSeq; +} + +bool HYDROData_StricklerTable::HasType( const QString& theType ) const +{ + Handle(TDataStd_NamedData) aMap = Map(); + + TCollection_ExtendedString aType = HYDROData_Tool::toExtString( theType ); + return !aMap.IsNull() && aMap->HasReal( aType ); +} + +void HYDROData_StricklerTable::Clear() +{ + Handle(TDataStd_NamedData) aMap = Map(); + if( !aMap.IsNull() ) + aMap->ChangeReals( TDataStd_DataMapOfStringReal() ); } -Handle( TDataStd_NamedData ) HYDROData_StricklerTable::Map() const +QStringList HYDROData_StricklerTable::DumpToPython( const QString& thePyScriptPath, + MapOfTreatedObjects& theTreatedObjects ) const +{ + QStringList aResList = dumpObjectCreation( theTreatedObjects ); + QString aPyName = GetObjPyName(); + + QString anAttrName = GetAttrName(); + aResList << QString( "%1.SetAttrName( \"%2\" )" ).arg( aPyName ).arg( anAttrName ); + + aResList << QString( "" ); + Handle(TDataStd_NamedData) aMap = Map(); + if( !aMap.IsNull() ) + { + for( TDataStd_DataMapIteratorOfDataMapOfStringReal it( aMap->GetRealsContainer() ); it.More(); it.Next() ) + { + QString aType = HYDROData_Tool::toQString( it.Key() ); + Standard_Real aValue = it.Value(); + aResList << QString( "%1.Set( u\"%2\", %3 )" ).arg( aPyName ).arg( aType ).arg( aValue ); + + QString anAttrValue = GetAttrValue( aType ); + aResList << QString( "%1.SetAttrValue( u\"%2\", \"%3\" )" ).arg( aPyName ).arg( aType ).arg( anAttrValue ); + + QColor aColor = GetColor( aType ); + aResList << QString( "%1.SetColor( u\"%2\", QColor( %3, %4, %5 ) )" ). + arg( aPyName ).arg( aType ).arg( aColor.red() ).arg( aColor.green() ).arg( aColor.blue() ); + aResList << QString(); + } + } + aResList << QString( "" ); + aResList << QString( "%1.Update()" ).arg( aPyName ); + + return aResList; +} + +Handle(TDataStd_NamedData) HYDROData_StricklerTable::Map() const { TDF_Label aLabel = myLab.FindChild( DataTag_Table ); Handle( TDataStd_NamedData ) aMap; @@ -80,3 +245,105 @@ Handle( TDataStd_NamedData ) HYDROData_StricklerTable::Map() const aMap = TDataStd_NamedData::Set( aLabel ); return aMap; } + +QString HYDROData_StricklerTable::GetAttrName() const +{ + Handle(TDataStd_AsciiString) aName; + if( myLab.FindChild( DataTag_AttrName ).FindAttribute(TDataStd_AsciiString::GetID(), aName)) { + TCollection_AsciiString aStr(aName->Get()); + return QString(aStr.ToCString()); + } + return QString();} + +bool HYDROData_StricklerTable::SetAttrName( const QString& theAttrName ) const +{ + HYDROData_Iterator anIt( HYDROData_Document::Document( myLab ), KIND_STRICKLER_TABLE ); + for( ; anIt.More(); anIt.Next() ) + { + Handle( HYDROData_StricklerTable ) aTable = + Handle( HYDROData_StricklerTable )::DownCast( anIt.Current() ); + if( aTable->Label()==myLab ) + continue; + + if( theAttrName==aTable->GetAttrName() ) + return false; + } + + TDataStd_AsciiString::Set( myLab.FindChild( DataTag_AttrName ), HYDROData_Tool::toExtString( theAttrName ) ); + return true; +} + +QString HYDROData_StricklerTable::GetAttrValue( const QString& theType ) const +{ + Handle( TDataStd_NamedData ) aMap = Map(); + TCollection_ExtendedString aType = HYDROData_Tool::toExtString( theType ); + if( aMap->HasString( aType ) ) + return HYDROData_Tool::toQString( aMap->GetString( aType ) ); + else + return ""; +} + +void HYDROData_StricklerTable::SetAttrValue( const QString& theType, const QString& theAttrValue ) const +{ + Handle( TDataStd_NamedData ) aMap = Map(); + TCollection_ExtendedString aType = HYDROData_Tool::toExtString( theType ); + aMap->SetString( aType, HYDROData_Tool::toExtString( theAttrValue ) ); +} + +QString HYDROData_StricklerTable::GetType( const QString& theAttrValue ) const +{ + if( theAttrValue.isEmpty() ) + return ""; + + Handle( TDataStd_NamedData ) aMap = Map(); + TCollection_ExtendedString anAttrValue = HYDROData_Tool::toExtString( theAttrValue ); + for( TDataStd_DataMapIteratorOfDataMapOfStringString it( aMap->GetStringsContainer() ); it.More(); it.Next() ) + { + if( it.Value() == anAttrValue ) + { + QString aType = HYDROData_Tool::toQString( it.Key() ); + return aType; + } + } + return ""; +} + +QColor HYDROData_StricklerTable::GetColor( const QString& theType ) const +{ + Handle( TDataStd_NamedData ) aMap = Map(); + TCollection_ExtendedString aType = HYDROData_Tool::toExtString( theType ); + if( aMap->HasInteger( aType ) ) + { + int aColorInt = aMap->GetInteger( aType ); + int b = aColorInt % 256; + int g = (aColorInt>>8) % 256; + int r = (aColorInt>>16) % 256; + return QColor( r, g, b ); + } + else + return QColor(); +} + +void HYDROData_StricklerTable::SetColor( const QString& theType, const QColor& theColor ) const +{ + Handle( TDataStd_NamedData ) aMap = Map(); + TCollection_ExtendedString aType = HYDROData_Tool::toExtString( theType ); + int r = theColor.red(); + int g = theColor.green(); + int b = theColor.blue(); + int aColorInt = ( r<<16 ) + ( g<<8 ) + b; + aMap->SetInteger( aType, aColorInt ); + + // synchronize the color for the same type in other maps + HYDROData_Iterator anIt( HYDROData_Document::Document( myLab ), KIND_STRICKLER_TABLE ); + for( ; anIt.More(); anIt.Next() ) + { + Handle( HYDROData_StricklerTable ) aTable = + Handle( HYDROData_StricklerTable )::DownCast( anIt.Current() ); + if( aTable->Label()==myLab ) + continue; + + if( aTable->HasType( theType ) ) + aTable->Map()->SetInteger( aType, aColorInt ); + } +}