X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Document.cxx;h=6a8f7376402874535a0698799b981a0a1c76ccc6;hb=58bb6b7459bebeeb089c9ed486c4683a8bae7288;hp=5f95e02b3a6736a697daf18e2dccf05db5bb6426;hpb=e68ee0ae52fe3919888c91a0b5619bc3ce03c9c4;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Document.cxx b/src/HYDROData/HYDROData_Document.cxx index 5f95e02b..6a8f7376 100644 --- a/src/HYDROData/HYDROData_Document.cxx +++ b/src/HYDROData/HYDROData_Document.cxx @@ -1,9 +1,30 @@ +// 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 #include #include #include +#include +#include +#include +#include #include #include @@ -14,8 +35,8 @@ #include #include #include +#include -IMPLEMENT_STANDARD_HANDLE(HYDROData_Document,MMgt_TShared) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Document,MMgt_TShared) #define PYTHON_DOC_NAME "hydro_doc" @@ -27,12 +48,13 @@ static const int TAG_PROPS_NEW_ID = 1; // general properties: tag for storage of static const int TAG_OBJECTS = 2; // tag of the objects sub-tree static const int TAG_HISTORY = 3; // tag of the history sub-tree (Root for History) static const int TAG_LOCAL_CS = 4; // tag of local coordinate system information +static const int TAG_DEF_STRICKLER_COEFF = 5; // tag of default strickler coefficient static const gp_Pnt2d DEFAULT_LOCAL_CS( 0, 0 ); using namespace std; -typedef QMap MapOfOrdered; -typedef QMap MapOfUnordered; +typedef QMap MapOfOrdered; +typedef QMap MapOfUnordered; Handle(HYDROData_Document) HYDROData_Document::Document(const int theStudyID) { @@ -183,18 +205,44 @@ void HYDROData_Document::Close() HYDROData_Application::GetApplication()->RemoveDocument(this); } -bool HYDROData_Document::DumpToPython( const QString& theFileName, +double HYDROData_Document::GetDefaultStricklerCoefficient() const +{ + double aRes = 0; + TDF_Label aLabel = myDoc->Main().FindChild(TAG_DEF_STRICKLER_COEFF, Standard_False); + if ( !aLabel.IsNull() ) + { + Handle(TDataStd_Real) anAttr; + if ( aLabel.FindAttribute( TDataStd_Real::GetID(), anAttr ) ) + aRes = anAttr->Get(); + } + + return aRes; +} + +void HYDROData_Document::SetDefaultStricklerCoefficient( double theCoeff ) const +{ + TDF_Label aLabel = myDoc->Main().FindChild(TAG_DEF_STRICKLER_COEFF); + if ( !aLabel.IsNull() ) + { + Handle(TDataStd_Real) anAttr; + if ( !aLabel.FindAttribute( TDataStd_Real::GetID(), anAttr ) ) + aLabel.AddAttribute( anAttr = new TDataStd_Real() ); + anAttr->Set( theCoeff ); + } +} + +bool HYDROData_Document::DumpToPython( const QString& thePyScriptPath, const bool theIsMultiFile ) const { // Try to open the file - QFile aFile( theFileName ); - if ( !aFile.open( QIODevice::WriteOnly ) ) + QFile aFile( thePyScriptPath ); + if ( !aFile.open( QIODevice::WriteOnly | QFile::Text ) ) return false; MapOfTreatedObjects aTreatedObjects; // Dump header for python script - QStringList aHeaderDump = DumpToPython( aTreatedObjects, theIsMultiFile ); + QStringList aHeaderDump = DumpToPython( thePyScriptPath, aTreatedObjects, theIsMultiFile ); if ( aHeaderDump.isEmpty() ) return false; @@ -204,23 +252,25 @@ bool HYDROData_Document::DumpToPython( const QString& theFileName, // Dump the local CS data to Python UpdateLCSFields(); - QString aLCS = QString( "%1.SetLocalCS( %2, %3 )" ).arg( GetDocPyName() ).arg( myLX ).arg( myLY ); + QString aLCS = QString( "%1.SetLocalCS( %2, %3 )" ).arg( GetDocPyName() ).arg( myLX, 0, 'f', 3 ).arg( myLY, 0, 'f', 3 ); if( theIsMultiFile ) aLCS.prepend( " " ); HYDROData_Tool::WriteStringsToFile( aFile, QStringList() << aLCS ); // Dump all model objects to Python script - aRes = aRes && dumpPartitionToPython( aFile, theIsMultiFile, aTreatedObjects, KIND_IMAGE ); - aRes = aRes && dumpPartitionToPython( aFile, theIsMultiFile, aTreatedObjects, KIND_POLYLINEXY ); - aRes = aRes && dumpPartitionToPython( aFile, theIsMultiFile, aTreatedObjects, KIND_BATHYMETRY ); - aRes = aRes && dumpPartitionToPython( aFile, theIsMultiFile, aTreatedObjects, KIND_PROFILE ); - aRes = aRes && dumpPartitionToPython( aFile, theIsMultiFile, aTreatedObjects, KIND_POLYLINE ); - aRes = aRes && dumpPartitionToPython( aFile, theIsMultiFile, aTreatedObjects, KIND_IMMERSIBLE_ZONE ); - aRes = aRes && dumpPartitionToPython( aFile, theIsMultiFile, aTreatedObjects, KIND_STREAM ); - aRes = aRes && dumpPartitionToPython( aFile, theIsMultiFile, aTreatedObjects, KIND_CHANNEL ); - aRes = aRes && dumpPartitionToPython( aFile, theIsMultiFile, aTreatedObjects, KIND_DIGUE ); - aRes = aRes && dumpPartitionToPython( aFile, theIsMultiFile, aTreatedObjects, KIND_OBSTACLE ); - aRes = aRes && dumpPartitionToPython( aFile, theIsMultiFile, aTreatedObjects, KIND_CALCULATION ); + aRes = aRes && dumpPartitionToPython( aFile, thePyScriptPath, theIsMultiFile, aTreatedObjects, KIND_IMAGE ); + aRes = aRes && dumpPartitionToPython( aFile, thePyScriptPath, theIsMultiFile, aTreatedObjects, KIND_STRICKLER_TABLE ); + aRes = aRes && dumpPartitionToPython( aFile, thePyScriptPath, theIsMultiFile, aTreatedObjects, KIND_POLYLINEXY ); + aRes = aRes && dumpPartitionToPython( aFile, thePyScriptPath, theIsMultiFile, aTreatedObjects, KIND_BATHYMETRY ); + aRes = aRes && dumpPartitionToPython( aFile, thePyScriptPath, theIsMultiFile, aTreatedObjects, KIND_PROFILE ); + aRes = aRes && dumpPartitionToPython( aFile, thePyScriptPath, theIsMultiFile, aTreatedObjects, KIND_POLYLINE ); + aRes = aRes && dumpPartitionToPython( aFile, thePyScriptPath, theIsMultiFile, aTreatedObjects, KIND_IMMERSIBLE_ZONE ); + aRes = aRes && dumpPartitionToPython( aFile, thePyScriptPath, theIsMultiFile, aTreatedObjects, KIND_STREAM ); + aRes = aRes && dumpPartitionToPython( aFile, thePyScriptPath, theIsMultiFile, aTreatedObjects, KIND_CHANNEL ); + aRes = aRes && dumpPartitionToPython( aFile, thePyScriptPath, theIsMultiFile, aTreatedObjects, KIND_DIGUE ); + aRes = aRes && dumpPartitionToPython( aFile, thePyScriptPath, theIsMultiFile, aTreatedObjects, KIND_OBSTACLE ); + aRes = aRes && dumpPartitionToPython( aFile, thePyScriptPath, theIsMultiFile, aTreatedObjects, KIND_LAND_COVER_MAP ); + aRes = aRes && dumpPartitionToPython( aFile, thePyScriptPath, theIsMultiFile, aTreatedObjects, KIND_CALCULATION ); // Dump code to close python fuction if ( aRes && theIsMultiFile ) @@ -247,7 +297,8 @@ QString HYDROData_Document::GetDocPyName() const return aDocName; } -QStringList HYDROData_Document::DumpToPython( MapOfTreatedObjects& theTreatedObjects, +QStringList HYDROData_Document::DumpToPython( const QString& thePyScriptPath, + MapOfTreatedObjects& theTreatedObjects, const bool theIsMultiFile ) const { QString aDocName = GetDocPyName(); @@ -267,20 +318,22 @@ QStringList HYDROData_Document::DumpToPython( MapOfTreatedObjects& theTreatedObj if ( theIsMultiFile ) { + aResScript << QString( "import salome" ); aResScript << QString( "" ); aResScript << QString( "def RebuildData( theStudy ):" ); - aResScript << QString( " %1 = HYDROData_Document.Document( theStudy._get_StudyId() );" ).arg( aDocName ); + aResScript << QString( " %1 = HYDROData_Document.Document( theStudy._get_StudyId() )" ).arg( aDocName ); } else { aResScript << QString( "" ); - aResScript << QString( "%1 = HYDROData_Document.Document( theStudy._get_StudyId() );" ).arg( aDocName ); + aResScript << QString( "%1 = HYDROData_Document.Document( theStudy._get_StudyId() )" ).arg( aDocName ); } return aResScript; } bool HYDROData_Document::dumpPartitionToPython( QFile& theFile, + const QString& thePyScriptPath, const bool theIsMultiFile, MapOfTreatedObjects& theTreatedObjects, const ObjectKind& theObjectKind ) const @@ -305,7 +358,7 @@ bool HYDROData_Document::dumpPartitionToPython( QFile& theFile, theTreatedObjects.insert( anObjName, anObject ); - QStringList anObjDump = anObject->DumpToPython( theTreatedObjects ); + QStringList anObjDump = anObject->DumpToPython( thePyScriptPath, theTreatedObjects ); if ( theIsMultiFile ) { @@ -429,7 +482,7 @@ void HYDROData_Document::SetObjectsLayerOrder( const HYDROData_SequenceOfObjects } } -void HYDROData_Document::Show( const Handle_HYDROData_Entity& theObject ) +void HYDROData_Document::Show( const Handle(HYDROData_Entity)& theObject ) { HYDROData_SequenceOfObjects anOrder; anOrder.Append( theObject ); @@ -646,6 +699,8 @@ HYDROData_Document::HYDROData_Document() myTransactionsAfterSave = 0; myLX = -1; myLY = -1; + + myInterpolatorsFactory = 0; } HYDROData_Document::HYDROData_Document(const Handle(TDocStd_Document)& theDoc) @@ -654,6 +709,8 @@ HYDROData_Document::HYDROData_Document(const Handle(TDocStd_Document)& theDoc) myTransactionsAfterSave = 0; myLX = -1; myLY = -1; + + myInterpolatorsFactory = 0; } HYDROData_Document::~HYDROData_Document() @@ -773,6 +830,11 @@ void HYDROData_Document::Transform( gp_XYZ& thePnt, bool IsToLocalCS ) const thePnt = gp_XYZ( X, Y, Z ); } +void HYDROData_Document::Transform( double& X, double& Y, double& Z, bool IsToLocalCS ) const +{ + Transform( X, Y, IsToLocalCS ); +} + void HYDROData_Document::Transform( gp_XY& thePnt, bool IsToLocalCS ) const { double X = thePnt.X(); @@ -780,3 +842,74 @@ void HYDROData_Document::Transform( gp_XY& thePnt, bool IsToLocalCS ) const Transform( X, Y, IsToLocalCS ); thePnt = gp_XY( X, Y ); } + +HYDROData_InterpolatorsFactory* HYDROData_Document::GetInterpolatorsFactory() +{ + if ( !myInterpolatorsFactory ) { + myInterpolatorsFactory = new HYDROData_InterpolatorsFactory(); + } + + return myInterpolatorsFactory; +} + +HYDROData_IProfilesInterpolator* HYDROData_Document::GetInterpolator( const TCollection_AsciiString& theName ) const +{ + HYDROData_IProfilesInterpolator* anInterpolator = NULL; + + HYDROData_Document* aThat = const_cast( this ); + HYDROData_InterpolatorsFactory* aFactory = aThat->GetInterpolatorsFactory(); + if ( aFactory ) { + anInterpolator = aFactory->GetInterpolator( theName ); + } + + return anInterpolator; +} + +NCollection_Sequence HYDROData_Document::GetInterpolatorNames() const +{ + NCollection_Sequence aNames; + + HYDROData_Document* aThat = const_cast( this ); + HYDROData_InterpolatorsFactory* aFactory = aThat->GetInterpolatorsFactory(); + if ( aFactory ) { + aNames = aFactory->GetInterpolatorNames(); + } + + return aNames; +} + +QColor HYDROData_Document::GetAssociatedColor( const QString& theStricklerType, const Handle(HYDROData_StricklerTable)& theTable ) const +{ + if( !theTable.IsNull() && theTable->HasType( theStricklerType ) ) + return theTable->GetColor( theStricklerType ); + + HYDROData_Iterator anIt( this, KIND_STRICKLER_TABLE ); + for( ; anIt.More(); anIt.Next() ) + { + Handle(HYDROData_StricklerTable) aTable = Handle(HYDROData_StricklerTable)::DownCast( anIt.Current() ); + if( aTable->HasType( theStricklerType ) ) + return aTable->GetColor( theStricklerType ); + } + return QColor(); +} + +void HYDROData_Document::CollectQGISValues( const QString& theAttrName, + QStringList& theAttrValues, + QStringList& theStricklerTypes ) const +{ + HYDROData_Iterator It( this, KIND_STRICKLER_TABLE ); + for( ; It.More(); It.Next() ) + { + Handle(HYDROData_StricklerTable) aTable = Handle(HYDROData_StricklerTable)::DownCast( It.Current() ); + if( !aTable.IsNull() && aTable->GetAttrName()==theAttrName ) + { + theAttrValues.clear(); + theStricklerTypes = aTable->GetTypes(); + foreach( QString aType, theStricklerTypes ) + { + QString anAttrValue = aTable->GetAttrValue( aType ); + theAttrValues.append( anAttrValue ); + } + } + } +}