X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Document.cxx;h=93457716225fdd41c6166418d181343bae9f0950;hb=545854182f0363f61284d5abe34c3627d4f3b088;hp=eea22c6d30248c4d0de805a4093d64225e449ac2;hpb=f2cd9ebfca8f8f58c6e98e30d2ebb387488016cc;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Document.cxx b/src/HYDROData/HYDROData_Document.cxx index eea22c6d..93457716 100644 --- a/src/HYDROData/HYDROData_Document.cxx +++ b/src/HYDROData/HYDROData_Document.cxx @@ -1,13 +1,35 @@ +// 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 + #include #include #include @@ -23,6 +45,9 @@ static const int TAG_PROPS = 1; // general properties tag static const int TAG_PROPS_NEW_ID = 1; // general properties: tag for storage of the new object ID 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; @@ -178,6 +203,32 @@ void HYDROData_Document::Close() HYDROData_Application::GetApplication()->RemoveDocument(this); } +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& theFileName, const bool theIsMultiFile ) const { @@ -197,8 +248,16 @@ bool HYDROData_Document::DumpToPython( const QString& theFileName, bool aRes = true; + // Dump the local CS data to Python + UpdateLCSFields(); + QString aLCS = QString( "%1.SetLocalCS( %2, %3 )" ).arg( GetDocPyName() ).arg( myLX ).arg( myLY ); + 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_STRICKLER_TABLE ); aRes = aRes && dumpPartitionToPython( aFile, theIsMultiFile, aTreatedObjects, KIND_POLYLINEXY ); aRes = aRes && dumpPartitionToPython( aFile, theIsMultiFile, aTreatedObjects, KIND_BATHYMETRY ); aRes = aRes && dumpPartitionToPython( aFile, theIsMultiFile, aTreatedObjects, KIND_PROFILE ); @@ -208,6 +267,7 @@ bool HYDROData_Document::DumpToPython( const QString& theFileName, 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_LAND_COVER_MAP ); aRes = aRes && dumpPartitionToPython( aFile, theIsMultiFile, aTreatedObjects, KIND_CALCULATION ); // Dump code to close python fuction @@ -255,6 +315,7 @@ 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 ); @@ -632,12 +693,20 @@ HYDROData_Document::HYDROData_Document() myDoc->SetUndoLimit(UNDO_LIMIT); NewID(); // needed to have at least one attribute in initial document to avoid errors myTransactionsAfterSave = 0; + myLX = -1; + myLY = -1; + + myInterpolatorsFactory = 0; } HYDROData_Document::HYDROData_Document(const Handle(TDocStd_Document)& theDoc) { myDoc = theDoc; myTransactionsAfterSave = 0; + myLX = -1; + myLY = -1; + + myInterpolatorsFactory = 0; } HYDROData_Document::~HYDROData_Document() @@ -661,3 +730,141 @@ TDF_Label HYDROData_Document::LabelOfObjects() { return myDoc->Main().FindChild(TAG_OBJECTS); } + +TDF_Label HYDROData_Document::LabelOfLocalCS() const +{ + return myDoc->Main().FindChild(TAG_LOCAL_CS); +} + +void HYDROData_Document::GetLocalCS( double& theLX, double& theLY ) const +{ + TDF_Label aLocalCSLab = LabelOfLocalCS(); + + Handle( TDataXtd_Position ) aLocalCS; + if( aLocalCSLab.FindAttribute( TDataXtd_Position::GetID(), aLocalCS ) ) + { + gp_Pnt aLocalCS3d = aLocalCS->GetPosition(); + theLX = aLocalCS3d.X(); + theLY = aLocalCS3d.Y(); + } + else + { + theLX = DEFAULT_LOCAL_CS.X(); + theLY = DEFAULT_LOCAL_CS.Y(); + } +} + +void HYDROData_Document::SetLocalCS( double theLX, double theLY ) +{ + UpdateLCSFields(); + + // update the local CS data in attribute + TDF_Label aLocalCSLab = LabelOfLocalCS(); + Handle( TDataXtd_Position ) aLocalCS; + if( !aLocalCSLab.FindAttribute( TDataXtd_Position::GetID(), aLocalCS ) ) + aLocalCS = TDataXtd_Position::Set( aLocalCSLab ); + + gp_Pnt aLocalCS3d( theLX, theLY, 0 ); + aLocalCS->SetPosition( aLocalCS3d ); + + // calculate delta for coordinates + double aDX = myLX - theLX; + double aDY = myLY - theLY; + + // update the local CS data in internal fields + myLX = theLX; + myLY = theLY; + + //update all objects in the document + HYDROData_Iterator anIterator( this, KIND_UNKNOWN ); + for( ; anIterator.More(); anIterator.Next() ) + anIterator.Current()->UpdateLocalCS( aDX, aDY ); +} + +void HYDROData_Document::UpdateLCSFields() const +{ + if( myLX >= 0 && myLY >= 0 ) + return; + + double aLX, aLY; + GetLocalCS( aLX, aLY ); + HYDROData_Document* aThat = const_cast( this ); + aThat->myLX = aLX; + aThat->myLY = aLY; +} + +void HYDROData_Document::Transform( double& X, double& Y, bool IsToLocalCS ) const +{ + UpdateLCSFields(); + if( IsToLocalCS ) + { + X -= myLX; + Y -= myLY; + } + else + { + X += myLX; + Y += myLY; + } +} + +void HYDROData_Document::Transform( gp_Pnt& thePnt, bool IsToLocalCS ) const +{ + double X = thePnt.X(); + double Y = thePnt.Y(); + double Z = thePnt.Z(); + Transform( X, Y, IsToLocalCS ); + thePnt = gp_Pnt( X, Y, Z ); +} + +void HYDROData_Document::Transform( gp_XYZ& thePnt, bool IsToLocalCS ) const +{ + double X = thePnt.X(); + double Y = thePnt.Y(); + double Z = thePnt.Z(); + Transform( X, Y, IsToLocalCS ); + thePnt = gp_XYZ( X, Y, Z ); +} + +void HYDROData_Document::Transform( gp_XY& thePnt, bool IsToLocalCS ) const +{ + double X = thePnt.X(); + double Y = thePnt.Y(); + 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; +}