X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Profile.cxx;h=3a628a74c4b8e321e955cc780f3bca15a1e05bc6;hb=c7cf59e092fe050003d1e556715e3ac97acf6bd4;hp=76dfad84e4cbe97516c276d931b1c9133e19db9c;hpb=5aa347a5113696846e4c7a25884336bc415e75d9;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Profile.cxx b/src/HYDROData/HYDROData_Profile.cxx index 76dfad84..3a628a74 100755 --- a/src/HYDROData/HYDROData_Profile.cxx +++ b/src/HYDROData/HYDROData_Profile.cxx @@ -1,3 +1,24 @@ +// Copyright (C) 2007-2015 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 +// +// 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_Profile.h" @@ -60,7 +81,7 @@ QStringList HYDROData_Profile::DumpToPython( MapOfTreatedObjects& theTreatedObje QString aGap = QString().fill( ' ', aPntsListName.length() + 5 ); if ( anIsValidProfile ) { - HYDROData_Profile::ProfilePoints aPointsList = GetProfilePoints(); + HYDROData_Profile::ProfilePoints aPointsList = GetProfilePoints( true ); for ( int k = 1, aNbPoints = aPointsList.Size(); k <= aNbPoints; ++k ) { const ProfilePoint& aPoint = aPointsList.Value( k ); @@ -122,7 +143,7 @@ TopoDS_Shape HYDROData_Profile::GetTopShape() const TopoDS_Wire aWire; gp_XY aFirstPoint, aLastPoint; - if ( !GetLeftPoint( aFirstPoint ) || !GetRightPoint( aLastPoint ) ) + if ( !GetLeftPoint( aFirstPoint, false ) || !GetRightPoint( aLastPoint, false ) ) return aWire; gp_Pnt aPnt1( aFirstPoint.X(), aFirstPoint.Y(), 0 ); @@ -150,7 +171,7 @@ void HYDROData_Profile::Update() Handle(HYDROData_ProfileUZ) aProfile = GetProfileUZ( false ); if ( !aProfile.IsNull() ) { - ProfilePoints aProfilePoints = GetProfilePoints(); + ProfilePoints aProfilePoints = GetProfilePoints( false ); HYDROData_IPolyline::SectionType aSectionType = aProfile->GetSectionType( 0 ); aWire = HYDROData_PolylineXY::BuildWire( aSectionType, false, aProfilePoints ); @@ -181,33 +202,41 @@ QColor HYDROData_Profile::getDefaultBorderColor() const bool HYDROData_Profile::IsValid() const { gp_XY aFirstPoint, aLastPoint; - if ( !GetLeftPoint( aFirstPoint ) || !GetRightPoint( aLastPoint ) ) + if ( !GetLeftPoint( aFirstPoint, false ) || !GetRightPoint( aLastPoint, false ) ) return false; int aNbPoints = NbPoints(); return aNbPoints > 1; } -void HYDROData_Profile::SetLeftPoint( const gp_XY& thePoint ) +void HYDROData_Profile::SetLeftPoint( const gp_XY& theGPoint, bool IsConvertFromGlobal ) { TDF_Label aLabel = myLab.FindChild( DataTag_FirstPoint ); + if ( aLabel.IsNull() ) + return; + + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( Label() ); + gp_XY aLPoint = theGPoint; + if( IsConvertFromGlobal ) + aDoc->Transform( aLPoint, true ); Handle(TDataStd_RealArray) anArray; if ( !aLabel.FindAttribute( TDataStd_RealArray::GetID(), anArray ) ) anArray = TDataStd_RealArray::Set( aLabel, 0, 1 ); - anArray->SetValue( 0, thePoint.X() ); - anArray->SetValue( 1, thePoint.Y() ); + anArray->SetValue( 0, aLPoint.X() ); + anArray->SetValue( 1, aLPoint.Y() ); SetToUpdate( true ); } -bool HYDROData_Profile::GetLeftPoint( gp_XY& thePoint ) const +bool HYDROData_Profile::GetLeftPoint( gp_XY& thePoint, bool IsConvertToGlobal ) const { TDF_Label aLabel = myLab.FindChild( DataTag_FirstPoint, false ); if ( aLabel.IsNull() ) return false; + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( myLab ); Handle(TDataStd_RealArray) anArray; if ( !aLabel.FindAttribute( TDataStd_RealArray::GetID(), anArray ) ) return false; @@ -215,29 +244,38 @@ bool HYDROData_Profile::GetLeftPoint( gp_XY& thePoint ) const thePoint.SetX( anArray->Value( 0 ) ); thePoint.SetY( anArray->Value( 1 ) ); + if( IsConvertToGlobal ) + aDoc->Transform( thePoint, false ); + return true; } -void HYDROData_Profile::SetRightPoint( const gp_XY& thePoint ) +void HYDROData_Profile::SetRightPoint( const gp_XY& theGPoint, bool IsConvertFromGlobal ) { TDF_Label aLabel = myLab.FindChild( DataTag_LastPoint ); + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( Label() ); + gp_XY aLPoint = theGPoint; + if( IsConvertFromGlobal ) + aDoc->Transform( aLPoint, true ); + Handle(TDataStd_RealArray) anArray; if ( !aLabel.FindAttribute( TDataStd_RealArray::GetID(), anArray ) ) anArray = TDataStd_RealArray::Set( aLabel, 0, 1 ); - anArray->SetValue( 0, thePoint.X() ); - anArray->SetValue( 1, thePoint.Y() ); + anArray->SetValue( 0, aLPoint.X() ); + anArray->SetValue( 1, aLPoint.Y() ); SetToUpdate( true ); } -bool HYDROData_Profile::GetRightPoint( gp_XY& thePoint ) const +bool HYDROData_Profile::GetRightPoint( gp_XY& thePoint, bool IsConvertToGlobal ) const { TDF_Label aLabel = myLab.FindChild( DataTag_LastPoint, false ); if ( aLabel.IsNull() ) return false; + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( myLab ); Handle(TDataStd_RealArray) anArray; if ( !aLabel.FindAttribute( TDataStd_RealArray::GetID(), anArray ) ) return false; @@ -245,6 +283,9 @@ bool HYDROData_Profile::GetRightPoint( gp_XY& thePoint ) const thePoint.SetX( anArray->Value( 0 ) ); thePoint.SetY( anArray->Value( 1 ) ); + if( IsConvertToGlobal ) + aDoc->Transform( thePoint, false ); + return true; } @@ -315,7 +356,7 @@ HYDROData_ProfileUZ::PointsList HYDROData_Profile::GetParametricPoints() const return aProfileUZ.IsNull() ? HYDROData_ProfileUZ::PointsList() : aProfileUZ->GetPoints(); } -void HYDROData_Profile::SetProfilePoints( const ProfilePoints& thePoints ) +void HYDROData_Profile::SetProfilePoints( const ProfilePoints& thePoints, bool IsConvertFromGlobal ) { RemovePoints(); if ( thePoints.Length() < 2 ) @@ -323,10 +364,14 @@ void HYDROData_Profile::SetProfilePoints( const ProfilePoints& thePoints ) gp_XY aFirstPoint, aLastPoint; + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( Label() ); Handle(HYDROData_ProfileUZ) aProfileUZ = GetProfileUZ(); for ( int i = 1, n = thePoints.Length(); i <= n ; ++i ) { - const ProfilePoint& aPoint = thePoints.Value( i ); + ProfilePoint aPoint = thePoints.Value( i ); + if( IsConvertFromGlobal ) + aDoc->Transform( aPoint, true ); + gp_XY aPointXY( aPoint.X(), aPoint.Y() ); if ( i == 1 ) @@ -340,16 +385,17 @@ void HYDROData_Profile::SetProfilePoints( const ProfilePoints& thePoints ) aProfileUZ->AddPoint( 0, aParPoint ); } - SetLeftPoint( aFirstPoint ); - SetRightPoint( aLastPoint ); + SetLeftPoint( aFirstPoint, false );//already converted to local CS + SetRightPoint( aLastPoint, false ); } -HYDROData_Profile::ProfilePoints HYDROData_Profile::GetProfilePoints() const +HYDROData_Profile::ProfilePoints HYDROData_Profile::GetProfilePoints( bool IsConvertToGlobal ) const { ProfilePoints aResPoints; gp_XY aFirstPoint, aLastPoint; - if ( !GetLeftPoint( aFirstPoint ) || !GetRightPoint( aLastPoint ) ) + if ( !GetLeftPoint( aFirstPoint, IsConvertToGlobal ) || + !GetRightPoint( aLastPoint, IsConvertToGlobal ) ) return aResPoints; HYDROData_ProfileUZ::PointsList aParametricPoints = GetParametricPoints(); @@ -594,7 +640,7 @@ bool HYDROData_Profile::ImportFromFile( OSD_File& theFile, } else if ( anIsGeoref ) { - SetProfilePoints( aPointsXYZ ); + SetProfilePoints( aPointsXYZ, true ); } Update(); @@ -603,5 +649,72 @@ bool HYDROData_Profile::ImportFromFile( OSD_File& theFile, return aRes; } +void HYDROData_Profile::UpdateLocalCS( double theDx, double theDy ) +{ + gp_XY aDelta( theDx, theDy ); + gp_XY aPnt; + + GetLeftPoint( aPnt, false ); + aPnt += aDelta; + SetLeftPoint( aPnt, false ); + + GetRightPoint( aPnt, false ); + aPnt += aDelta; + SetRightPoint( aPnt, false ); +} + +HYDROData_Profile::ProfilePoint HYDROData_Profile::GetBottomPoint() const +{ + ProfilePoint aBottom; + + // Get parametric points + HYDROData_ProfileUZ::PointsList aParametricPoints = GetParametricPoints(); + if ( aParametricPoints.Length() < 1 ) { + return aBottom; + } + + // Calculate midvalue for U parameter + Standard_Real anUMidValue = aParametricPoints.First().X(); + Standard_Real anUMinValue = anUMidValue; + Standard_Real anUMaxValue = anUMidValue; + + for ( int i = 2, aNbPoints = aParametricPoints.Size(); i <= aNbPoints; i++ ) { + const HYDROData_IPolyline::Point& aParPoint = aParametricPoints.Value( i ); + Standard_Real anU = aParPoint.X(); + + if ( anU < anUMinValue ) { + anUMinValue = anU; + } else if ( anU > anUMaxValue ) { + anUMaxValue = anU; + } + } + anUMidValue = ( anUMinValue + anUMaxValue ) / 2; + + // Find index of the parametric point with minimal Z value + int aBottomIndex = 1; + HYDROData_IPolyline::Point aParBottom = aParametricPoints.First(); + + for ( int i = 2, aNbPoints = aParametricPoints.Size(); i <= aNbPoints; i++ ) { + const HYDROData_IPolyline::Point& aParPoint = aParametricPoints.Value( i ); + if ( aParPoint.Y() < aParBottom.Y() ) { + aBottomIndex = i; + aParBottom = aParPoint; + } else if ( aParPoint.Y() == aParBottom.Y() ) { + // Check which point is neares to the U = 0.5 + if ( fabs( aParPoint.X() - anUMidValue ) < fabs( aParBottom.X() - anUMidValue ) ) { + aBottomIndex = i; + aParBottom = aParPoint; + } + } + } + + // Find the corresponding profile point + ProfilePoints aProfilePoints = GetProfilePoints( false ); + if ( aBottomIndex >= 1 && aBottomIndex <= aProfilePoints.Length() ) { + aBottom = aProfilePoints.Value( aBottomIndex ); + } + + return aBottom; +}