X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Profile.cxx;h=217c49c9981db2e5471b2412470258b21bfb8ca8;hb=545854182f0363f61284d5abe34c3627d4f3b088;hp=3a628a74c4b8e321e955cc780f3bca15a1e05bc6;hpb=4e8df20c41b5a3ff5ae4473026bebb4574c4b69b;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Profile.cxx b/src/HYDROData/HYDROData_Profile.cxx index 3a628a74..217c49c9 100755 --- a/src/HYDROData/HYDROData_Profile.cxx +++ b/src/HYDROData/HYDROData_Profile.cxx @@ -1,8 +1,4 @@ -// 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 -// +// 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 @@ -33,6 +29,11 @@ #include #include +#include + +#include + +#include #include #include #include @@ -40,8 +41,10 @@ #include #include +#include #include #include +#include #include #include @@ -53,7 +56,7 @@ IMPLEMENT_STANDARD_HANDLE(HYDROData_Profile, HYDROData_Object) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Profile, HYDROData_Object) HYDROData_Profile::HYDROData_Profile() -: HYDROData_Object() +: HYDROData_Object( Geom_3d ) { } @@ -160,43 +163,42 @@ TopoDS_Shape HYDROData_Profile::GetTopShape() const TopoDS_Shape HYDROData_Profile::GetShape3D() const { - return getShape3D(); + TopoDS_Shape aShape = HYDROData_Object::GetShape3D(); + if( aShape.IsNull() ) + aShape = CreateProfileWire( true ); + return aShape; } -void HYDROData_Profile::Update() +TopoDS_Shape HYDROData_Profile::CreateProfileWire( bool canUseDefaultPoints ) const { - HYDROData_Object::Update(); - TopoDS_Wire aWire; Handle(HYDROData_ProfileUZ) aProfile = GetProfileUZ( false ); if ( !aProfile.IsNull() ) { - ProfilePoints aProfilePoints = GetProfilePoints( false ); + ProfilePoints aProfilePoints = GetProfilePoints( false, canUseDefaultPoints ); HYDROData_IPolyline::SectionType aSectionType = aProfile->GetSectionType( 0 ); 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 @@ -227,19 +229,32 @@ void HYDROData_Profile::SetLeftPoint( const gp_XY& theGPoint, bool IsConvertFrom anArray->SetValue( 0, aLPoint.X() ); anArray->SetValue( 1, aLPoint.Y() ); - SetToUpdate( true ); + Changed( Geom_3d ); } -bool HYDROData_Profile::GetLeftPoint( gp_XY& thePoint, bool IsConvertToGlobal ) 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( myLab ); 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 ) ); @@ -266,19 +281,31 @@ void HYDROData_Profile::SetRightPoint( const gp_XY& theGPoint, bool IsConvertFro anArray->SetValue( 0, aLPoint.X() ); anArray->SetValue( 1, aLPoint.Y() ); - SetToUpdate( true ); + Changed( Geom_3d ); } -bool HYDROData_Profile::GetRightPoint( gp_XY& thePoint, bool IsConvertToGlobal ) 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( myLab ); 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 ) ); @@ -299,7 +326,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 @@ -332,7 +359,7 @@ void HYDROData_Profile::RemovePoints() if ( !aProfileUZ.IsNull() ) { aProfileUZ->RemoveSections(); - SetToUpdate( true ); + Changed( Geom_3d ); } } @@ -347,7 +374,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 @@ -389,13 +416,14 @@ void HYDROData_Profile::SetProfilePoints( const ProfilePoints& thePoints, bool I SetRightPoint( aLastPoint, false ); } -HYDROData_Profile::ProfilePoints HYDROData_Profile::GetProfilePoints( bool IsConvertToGlobal ) const +HYDROData_Profile::ProfilePoints HYDROData_Profile::GetProfilePoints + ( bool IsConvertToGlobal, bool CanUseDefaultLeftRight ) const { ProfilePoints aResPoints; gp_XY aFirstPoint, aLastPoint; - if ( !GetLeftPoint( aFirstPoint, IsConvertToGlobal ) || - !GetRightPoint( aLastPoint, IsConvertToGlobal ) ) + if ( !GetLeftPoint( aFirstPoint, IsConvertToGlobal, CanUseDefaultLeftRight ) || + !GetRightPoint( aLastPoint, IsConvertToGlobal, CanUseDefaultLeftRight ) ) return aResPoints; HYDROData_ProfileUZ::PointsList aParametricPoints = GetParametricPoints(); @@ -405,8 +433,8 @@ HYDROData_Profile::ProfilePoints HYDROData_Profile::GetProfilePoints( bool IsCon const HYDROData_ProfileUZ::Point& aFirstParPoint = aParametricPoints.First(); const HYDROData_ProfileUZ::Point& aLastParPoint = aParametricPoints.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() ) ); @@ -416,14 +444,11 @@ HYDROData_Profile::ProfilePoints HYDROData_Profile::GetProfilePoints( bool IsCon { const HYDROData_ProfileUZ::Point& aParPoint = aParametricPoints.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 ); @@ -502,7 +527,7 @@ int HYDROData_Profile::ImportFromFile( const Handle(HYDROData_Document)& theDoc, aProfile->SetFilePath( theFileName ); - aProfile->SetBorderColor( HYDROData_Profile::DefaultBorderColor() ); + aProfile->SetBorderColor( aProfile->DefaultBorderColor() ); } return aCreatedProfiles.Length(); @@ -718,3 +743,40 @@ HYDROData_Profile::ProfilePoint HYDROData_Profile::GetBottomPoint() const 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_Iterator anIt( TopoDS::Wire( GetShape3D() ) ); + 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; + } \ No newline at end of file