X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Profile.cxx;h=cf738b2c929e0b8d03ffd9177af4de4750fb387a;hb=e7e76450be3fadf6ad263f78e10ceb8cd1f70deb;hp=03c6ba856d899438800d28680cc2ddc9b5ee8e71;hpb=29527ae70e9cc00e9f7017f9ab4f7af4091dbf7f;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Profile.cxx b/src/HYDROData/HYDROData_Profile.cxx old mode 100755 new mode 100644 index 03c6ba85..cf738b2c --- a/src/HYDROData/HYDROData_Profile.cxx +++ b/src/HYDROData/HYDROData_Profile.cxx @@ -1,3 +1,20 @@ +// 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_Profile.h" @@ -6,21 +23,29 @@ #include "HYDROData_Tool.h" #include "HYDROData_PolylineXY.h" -#include - #include #include #include +#include + +#include + +#include #include #include #include +#include +#include +#include #include #include +#include #include #include +#include #include #include @@ -28,11 +53,10 @@ #include #include -IMPLEMENT_STANDARD_HANDLE(HYDROData_Profile, HYDROData_Object) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Profile, HYDROData_Object) HYDROData_Profile::HYDROData_Profile() -: HYDROData_Object() +: HYDROData_Object( Geom_3d ) { } @@ -40,11 +64,80 @@ HYDROData_Profile::~HYDROData_Profile() { } -QStringList HYDROData_Profile::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const +QStringList HYDROData_Profile::DumpToPython( const QString& thePyScriptPath, + MapOfTreatedObjects& theTreatedObjects ) const { QStringList aResList = dumpObjectCreation( theTreatedObjects ); + QString aProfileName = GetObjPyName(); + + //TCollection_AsciiString aFilePath = GetFilePath(); + //if ( !aFilePath.IsEmpty() ) + //{ + // aResList << QString( "%1.ImportFromFile( \"%2\" )" ) + // .arg( aName ).arg( aFilePath.ToCString() ); + //} - //TODO + bool anIsValidProfile = IsValid(); + + QStringList aPntsDefinition; + QString aPntsListName = HYDROData_Tool::GenerateNameForPython( theTreatedObjects, "profile_points" ); + + QString aGap = QString().fill( ' ', aPntsListName.length() + 5 ); + if ( anIsValidProfile ) + { + HYDROData_Profile::ProfilePoints aPointsList = GetProfilePoints( true ); + for ( int k = 1, aNbPoints = aPointsList.Size(); k <= aNbPoints; ++k ) + { + const ProfilePoint& aPoint = aPointsList.Value( k ); + aPntsDefinition << QString( aGap + "gp_XYZ( %1, %2, %3 )%4" ) + .arg( aPoint.X() ).arg( aPoint.Y() ).arg( aPoint.Z() ) + .arg( ( k < aNbPoints ? "," : "" ) ); + } + } + else + { + HYDROData_IPolyline::PointsList aPointsList = GetParametricPoints(); + for ( int k = 1, aNbPoints = aPointsList.Size(); k <= aNbPoints; ++k ) + { + const HYDROData_IPolyline::Point& aPoint = aPointsList.Value( k ); + aPntsDefinition << QString( aGap + "gp_XY( %1, %2 )%3" ) + .arg( aPoint.X() ).arg( aPoint.Y() ) + .arg( ( k < aNbPoints ? "," : "" ) ); + } + } + + if ( !aPntsDefinition.isEmpty() ) + { + QString& aFirstStr = aPntsDefinition.first(); + aFirstStr = aFirstStr.trimmed(); + aFirstStr.prepend( QString( "%1 = [ " ).arg( aPntsListName ) ); + + aPntsDefinition.last().append( " ];" ); + + aResList << aPntsDefinition; + + aResList << QString( "%1.%3( %2 )" ) + .arg( aProfileName ).arg( aPntsListName ) + .arg( anIsValidProfile ? "SetProfilePoints" : "SetParametricPoints" ); + + aResList << QString( "" ); + } + + // Set a polyline type if it is not default + Handle(HYDROData_ProfileUZ) aPrf = GetProfileUZ( false ); + if ( !aPrf.IsNull() ) + { + HYDROData_IPolyline::SectionType aSecType = aPrf->GetSectionType( 0 ); + if ( aSecType != HYDROData_IPolyline::SECTION_POLYLINE ) + { + aResList << QString( "%1.GetProfileUZ().SetSectionType( 0, %2 )" ) + .arg( aProfileName ).arg( "HYDROData_IPolyline.SECTION_SPLINE" ); + aResList << QString( "" ); + } + } + + aResList << QString( "%1.Update()" ).arg( aProfileName ); + aResList << QString( "" ); return aResList; } @@ -54,7 +147,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 ); @@ -69,114 +162,173 @@ TopoDS_Shape HYDROData_Profile::GetTopShape() const return aWire; } -TopoDS_Shape HYDROData_Profile::GetShape3D() const +TopoDS_Shape HYDROData_Profile::GetShape3D(bool forceRebuild, bool reverseXCoord) const { - return getShape3D(); + if (forceRebuild) + return CreateProfileWire( true, reverseXCoord ); + TopoDS_Shape aShape = HYDROData_Object::GetShape3D(); + if( aShape.IsNull() ) + aShape = CreateProfileWire( true, reverseXCoord ); + return aShape; } -void HYDROData_Profile::Update() +TopoDS_Shape HYDROData_Profile::CreateProfileWire( bool canUseDefaultPoints, bool reverseXCoord ) const { - HYDROData_Object::Update(); - TopoDS_Wire aWire; Handle(HYDROData_ProfileUZ) aProfile = GetProfileUZ( false ); if ( !aProfile.IsNull() ) { - ProfilePoints aProfilePoints = GetProfilePoints(); + ProfilePoints aProfilePoints = GetProfilePoints( false, canUseDefaultPoints ); HYDROData_IPolyline::SectionType aSectionType = aProfile->GetSectionType( 0 ); - + if (reverseXCoord) + { + for ( int i = 1; i <= aProfilePoints.Size() ; i++ ) + { + gp_XYZ& aPoint = aProfilePoints.ChangeValue(i); + aPoint.ChangeCoord(1) = -aPoint.X(); + } + } aWire = HYDROData_PolylineXY::BuildWire( aSectionType, false, aProfilePoints ); } - SetShape3D( aWire ); + return aWire; } -QColor HYDROData_Profile::DefaultFillingColor() +void HYDROData_Profile::Update() { - return QColor( Qt::transparent ); -} + HYDROData_Object::Update(); -QColor HYDROData_Profile::DefaultBorderColor() -{ - return QColor( Qt::black ); + TopoDS_Shape aShape = CreateProfileWire( true ); + SetShape3D( aShape ); } -QColor HYDROData_Profile::getDefaultFillingColor() const +QColor HYDROData_Profile::DefaultFillingColor() const { - return DefaultFillingColor(); + return QColor( Qt::transparent ); } -QColor HYDROData_Profile::getDefaultBorderColor() const +QColor HYDROData_Profile::DefaultBorderColor() const { - return DefaultBorderColor(); + return QColor( Qt::black ); } 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(); + 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->SetID(TDataStd_RealArray::GetID()); + } - anArray->SetValue( 0, thePoint.X() ); - anArray->SetValue( 1, thePoint.Y() ); + anArray->SetValue( 0, aLPoint.X() ); + anArray->SetValue( 1, aLPoint.Y() ); - SetToUpdate( true ); + Changed( Geom_3d ); } -bool HYDROData_Profile::GetLeftPoint( gp_XY& thePoint ) const +bool HYDROData_Profile::GetLeftPoint( gp_XY& thePoint, bool IsConvertToGlobal, + bool CanUseDefault ) const { + HYDROData_ProfileUZ::PointsList aParametricPoints = GetParametricPoints(); + if ( aParametricPoints.Length() < 2 ) + return false; + + thePoint = GetParametricPoints().First(); + + //thePoint.SetX( 0 ); + thePoint.SetY( 0 ); //default left point of not-georeferenced profile TDF_Label aLabel = myLab.FindChild( DataTag_FirstPoint, false ); if ( aLabel.IsNull() ) - return false; + { + return CanUseDefault; + } + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document(); Handle(TDataStd_RealArray) anArray; if ( !aLabel.FindAttribute( TDataStd_RealArray::GetID(), anArray ) ) - return false; + { + return CanUseDefault; + } 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(); + 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->SetID(TDataStd_RealArray::GetID()); + } - anArray->SetValue( 0, thePoint.X() ); - anArray->SetValue( 1, thePoint.Y() ); + anArray->SetValue( 0, aLPoint.X() ); + anArray->SetValue( 1, aLPoint.Y() ); - SetToUpdate( true ); + Changed( Geom_3d ); } -bool HYDROData_Profile::GetRightPoint( gp_XY& thePoint ) const +bool HYDROData_Profile::GetRightPoint( gp_XY& thePoint, bool IsConvertToGlobal, + bool CanUseDefault ) const { + HYDROData_ProfileUZ::PointsList aParametricPoints = GetParametricPoints(); + if ( aParametricPoints.Length() < 2 ) + return false; + + thePoint = GetParametricPoints().Last(); + thePoint.SetY( 0 ); + TDF_Label aLabel = myLab.FindChild( DataTag_LastPoint, false ); if ( aLabel.IsNull() ) - return false; + { + return CanUseDefault; + } + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document(); Handle(TDataStd_RealArray) anArray; if ( !aLabel.FindAttribute( TDataStd_RealArray::GetID(), anArray ) ) - return false; + { + return CanUseDefault; + } thePoint.SetX( anArray->Value( 0 ) ); thePoint.SetY( anArray->Value( 1 ) ); + if( IsConvertToGlobal ) + aDoc->Transform( thePoint, false ); + return true; } @@ -190,7 +342,7 @@ void HYDROData_Profile::Invalidate() if ( !aLastLabel.IsNull() ) aLastLabel.ForgetAllAttributes(); - SetToUpdate( true ); + Changed( Geom_3d ); } Handle(HYDROData_ProfileUZ) HYDROData_Profile::GetProfileUZ( const bool theIsCreate ) const @@ -223,7 +375,7 @@ void HYDROData_Profile::RemovePoints() if ( !aProfileUZ.IsNull() ) { aProfileUZ->RemoveSections(); - SetToUpdate( true ); + Changed( Geom_3d ); } } @@ -238,7 +390,7 @@ void HYDROData_Profile::SetParametricPoints( const HYDROData_ProfileUZ::PointsLi aProfileUZ->AddPoint( 0, aPoint ); } - SetToUpdate( true ); + Changed( Geom_3d ); } HYDROData_ProfileUZ::PointsList HYDROData_Profile::GetParametricPoints() const @@ -247,7 +399,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 ) @@ -255,10 +407,14 @@ void HYDROData_Profile::SetProfilePoints( const ProfilePoints& thePoints ) gp_XY aFirstPoint, aLastPoint; + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document(); 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 ) @@ -272,44 +428,51 @@ 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, bool CanUseDefaultLeftRight ) const { - ProfilePoints aResPoints; - gp_XY aFirstPoint, aLastPoint; - if ( !GetLeftPoint( aFirstPoint ) || !GetRightPoint( aLastPoint ) ) - return aResPoints; + if ( !GetLeftPoint( aFirstPoint, IsConvertToGlobal, CanUseDefaultLeftRight ) || + !GetRightPoint( aLastPoint, IsConvertToGlobal, CanUseDefaultLeftRight ) ) + return HYDROData_Profile::ProfilePoints(); HYDROData_ProfileUZ::PointsList aParametricPoints = GetParametricPoints(); - if ( aParametricPoints.Length() < 2 ) + + return CalculateProfilePoints(aParametricPoints, aFirstPoint, aLastPoint); +} + +HYDROData_Profile::ProfilePoints HYDROData_Profile::CalculateProfilePoints( + const HYDROData_ProfileUZ::PointsList& theParametricPoints, + const gp_XY& aFirstPoint, const gp_XY& aLastPoint) +{ + ProfilePoints aResPoints; + + if ( theParametricPoints.Length() < 2 ) return aResPoints; - const HYDROData_ProfileUZ::Point& aFirstParPoint = aParametricPoints.First(); - const HYDROData_ProfileUZ::Point& aLastParPoint = aParametricPoints.Last(); + const HYDROData_ProfileUZ::Point& aFirstParPoint = theParametricPoints.First(); + const HYDROData_ProfileUZ::Point& aLastParPoint = theParametricPoints.Last(); - double aGeoDistance = gp_Pnt2d( aFirstPoint ).Distance( aLastPoint ); - double aParCommonDist = gp_Pnt2d( aFirstParPoint.X(), 0 ).Distance( gp_Pnt2d( aLastParPoint.X(), 0 ) ); + double aFullLength = aLastPoint.X() - aFirstPoint.X(); + double aParFullLength = aLastParPoint.X() - aFirstParPoint.X(); // Add first point as is aResPoints.Append( ProfilePoint( aFirstPoint.X(), aFirstPoint.Y(), aFirstParPoint.Y() ) ); // Compute all other points - for ( int i = 2, n = aParametricPoints.Length(); i < n ; ++i ) + for ( int i = 2, n = theParametricPoints.Length(); i < n ; ++i ) { - const HYDROData_ProfileUZ::Point& aParPoint = aParametricPoints.Value( i ); + const HYDROData_ProfileUZ::Point& aParPoint = theParametricPoints.Value( i ); - double aParPointDist = gp_Pnt2d( aFirstParPoint.X(), 0 ).Distance( gp_Pnt2d( aParPoint.X(), 0 ) ); - - double aParLen = ( aParPointDist / aParCommonDist ) * aGeoDistance; + double aParPointDist = aParPoint.X() - aFirstParPoint.X(); + double aRatio = aParPointDist / aParFullLength; - double aRatio = aParLen / ( aGeoDistance - aParLen ); - - double aParX = ( aFirstPoint.X() + aRatio * aLastPoint.X() ) / ( 1 + aRatio ); - double aParY = ( aFirstPoint.Y() + aRatio * aLastPoint.Y() ) / ( 1 + aRatio ); + double aParX = aFirstPoint.X() * (1-aRatio) + aLastPoint.X() * aRatio; + double aParY = aFirstPoint.Y() * (1-aRatio) + aLastPoint.Y() * aRatio; ProfilePoint aCompPoint( aParX, aParY, aParPoint.Y() ); aResPoints.Append( aCompPoint ); @@ -323,7 +486,8 @@ HYDROData_Profile::ProfilePoints HYDROData_Profile::GetProfilePoints() const void HYDROData_Profile::SetFilePath( const TCollection_AsciiString& theFilePath ) { - TDataStd_AsciiString::Set( myLab.FindChild( DataTag_FilePath ), theFilePath ); + Handle(TDataStd_AsciiString) anAttr = TDataStd_AsciiString::Set( myLab.FindChild( DataTag_FilePath ), theFilePath ); + anAttr->SetID(TDataStd_AsciiString::GetID()); } TCollection_AsciiString HYDROData_Profile::GetFilePath() const @@ -337,9 +501,20 @@ TCollection_AsciiString HYDROData_Profile::GetFilePath() const return aRes; } +void HYDROData_Profile::SetProfileColor( const QColor& theColor ) +{ + SetColor( theColor, DataTag_ProfileColor ); +} + +bool HYDROData_Profile::GetProfileColor(QColor& outColor) const +{ + return GetColor( outColor, DataTag_ProfileColor ); +} + int HYDROData_Profile::ImportFromFile( const Handle(HYDROData_Document)& theDoc, const TCollection_AsciiString& theFileName, - NCollection_Sequence& theBadProfilesIds ) + NCollection_Sequence& theBadProfilesIds, + bool isToProject ) { if ( theDoc.IsNull() || theFileName.IsEmpty() ) return 0; @@ -362,7 +537,7 @@ int HYDROData_Profile::ImportFromFile( const Handle(HYDROData_Document)& theDoc, aNewProfile = Handle(HYDROData_Profile)::DownCast( theDoc->CreateObject( KIND_PROFILE ) ); bool anIsRead = false; - if ( aNewProfile->ImportFromFile( aFile, &anIsRead ) ) + if ( aNewProfile->ImportFromFile( aFile, isToProject, &anIsRead ) ) { aCreatedProfiles.Append( aNewProfile ); aNewProfile.Nullify(); @@ -388,17 +563,18 @@ int HYDROData_Profile::ImportFromFile( const Handle(HYDROData_Document)& theDoc, aProfile->SetFilePath( theFileName ); - aProfile->SetBorderColor( HYDROData_Profile::DefaultBorderColor() ); + aProfile->SetBorderColor( aProfile->DefaultBorderColor() ); } return aCreatedProfiles.Length(); } bool HYDROData_Profile::ImportFromFile( const TCollection_AsciiString& theFileName, - bool* theIsRead ) + bool isToProject, + bool* isNotEmpty ) { - if ( theIsRead ) - *theIsRead = false; + if( isNotEmpty ) + *isNotEmpty = false; // Try to open the file OSD_File aFile( theFileName ); @@ -409,7 +585,7 @@ bool HYDROData_Profile::ImportFromFile( const TCollection_AsciiString& theFileNa if ( !aFile.IsOpen() ) return false; - bool aRes = ImportFromFile( aFile, theIsRead ); + bool aRes = ImportFromFile( aFile, isToProject, isNotEmpty ); // Close the file aFile.Close(); @@ -424,10 +600,11 @@ bool HYDROData_Profile::ImportFromFile( const TCollection_AsciiString& theFileNa } bool HYDROData_Profile::ImportFromFile( OSD_File& theFile, - bool* theIsRead ) + bool isToProject, + bool* isNotEmpty ) { - if ( theIsRead ) - *theIsRead = false; + if( isNotEmpty ) + *isNotEmpty = false; if ( !theFile.IsOpen() ) return false; @@ -457,8 +634,8 @@ bool HYDROData_Profile::ImportFromFile( OSD_File& theFile, } // Set flag of read status to true - if ( theIsRead ) - *theIsRead = true; + if( isNotEmpty ) + *isNotEmpty = true; TCollection_AsciiString aValX = aLine.Token( " \t", 1 ); TCollection_AsciiString aValY = aLine.Token( " \t", 2 ); @@ -480,8 +657,8 @@ bool HYDROData_Profile::ImportFromFile( OSD_File& theFile, double aCoordX = aValX.RealValue(); double aCoordY = aValY.RealValue(); - if ( boost::math::isnan( aCoordX ) || boost::math::isinf( aCoordX ) || - boost::math::isnan( aCoordY ) || boost::math::isinf( aCoordY ) ) + if ( HYDROData_Tool::IsNan( aCoordX ) || HYDROData_Tool::IsInf( aCoordX ) || + HYDROData_Tool::IsNan( aCoordY ) || HYDROData_Tool::IsInf( aCoordY ) ) aRes = false; if ( anIsParametric ) @@ -507,7 +684,7 @@ bool HYDROData_Profile::ImportFromFile( OSD_File& theFile, } double aCoordZ = aValZ.RealValue(); - if ( boost::math::isnan( aCoordZ ) || boost::math::isinf( aCoordZ ) ) + if ( HYDROData_Tool::IsNan( aCoordZ ) || HYDROData_Tool::IsInf( aCoordZ ) ) aRes = false; ProfilePoint aPoint( aCoordX, aCoordY, aCoordZ ); @@ -526,7 +703,9 @@ bool HYDROData_Profile::ImportFromFile( OSD_File& theFile, } else if ( anIsGeoref ) { - SetProfilePoints( aPointsXYZ ); + if( isToProject ) + ProjectProfilePoints( aPointsXYZ ); + SetProfilePoints( aPointsXYZ, true ); } Update(); @@ -535,5 +714,129 @@ 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(bool IsConvertToGlobal) 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( IsConvertToGlobal ); + if ( aBottomIndex >= 1 && aBottomIndex <= aProfilePoints.Length() ) { + aBottom = aProfilePoints.Value( aBottomIndex ); + } + return aBottom; +} + + HYDROData_Profile::ProfilePoint HYDROData_Profile::GetMiddlePoint( bool CanUseDefault ) const + { + ProfilePoint aMiddlePoint; + + gp_XY aLeftPnt, aRightPnt; + if ( GetLeftPoint( aLeftPnt, true, CanUseDefault ) && GetRightPoint( aRightPnt, true, CanUseDefault ) ) { + gp_XYZ aPnt1( aLeftPnt.X(), aLeftPnt.Y(), 0. ); + gp_XYZ aPnt2( aRightPnt.X(), aRightPnt.Y(), 0. ); + gp_Pnt aMiddlePoint2d( 0.5 * ( aPnt1 + aPnt2 ) ); + + gp_Lin aMidLin( aMiddlePoint2d, gp::DZ() ); + TopoDS_Edge aMidEdge = BRepLib_MakeEdge( aMidLin ); + + TopoDS_Shape aProf = TopoDS::Wire( GetShape3D() ); + if (aProf.IsNull()) + return aMiddlePoint; + TopoDS_Iterator anIt( aProf ); + for ( ; anIt.More(); anIt.Next()) { + const TopoDS_Edge& anEdge = TopoDS::Edge( anIt.Value() ); + + /* + Standard_Real aStart, anEnd; + Handle(Geom_Curve) aCurve = BRep_Tool::Curve( anEdge, aStart, anEnd ); + gp_Pnt aMiddlePointOnCurve = aCurve->Value( ( aStart + anEnd ) / 2 ); + */ + + BRepExtrema_ExtCC ExtremaEE( aMidEdge, anEdge); + if (ExtremaEE.IsDone() && ExtremaEE.NbExt() != 0) { + for ( Standard_Integer i = 1; i <= ExtremaEE.NbExt(); i++ ) { + if ( ExtremaEE.SquareDistance(i) <= Precision::Confusion() ) { + aMiddlePoint = ExtremaEE.PointOnE1(i).XYZ(); + break; + } + } + } + } + } + + return aMiddlePoint; + } + +void HYDROData_Profile::ProjectProfilePoints( ProfilePoints& thePoints ) +{ + int low = thePoints.Lower(), up = thePoints.Upper(); + gp_Pnt aFirst = thePoints.Value( low ); + gp_Pnt aLast = thePoints.Value( up ); + gp_Vec d( aFirst, aLast ); + gp_Vec n( d.Y(), -d.X(), 0 ); + + Handle(Geom_Plane) aPlane = new Geom_Plane( aFirst, gp_Dir( n ) ); + for( int i=low; i<=up; i++ ) + { + gp_XYZ p = thePoints.Value( i ); + gp_Pnt pp = GeomAPI_ProjectPointOnSurf( p, aPlane ); + thePoints.SetValue( i, pp.XYZ() ); + } +}