From 637f41bd30ce380b1e9c4c100b394be08fdc5ef7 Mon Sep 17 00:00:00 2001 From: asl Date: Tue, 12 Aug 2014 06:06:55 +0000 Subject: [PATCH] refs #369: local CS for profiles --- src/HYDROData/HYDROData_Document.cxx | 8 +++ src/HYDROData/HYDROData_Document.h | 2 + src/HYDROData/HYDROData_Profile.cxx | 63 ++++++++++++++------ src/HYDROData/HYDROData_Profile.h | 13 ++-- src/HYDROData/HYDROData_Stream.cxx | 6 +- src/HYDROData/HYDROData_StreamAltitude.cxx | 13 ++-- src/HYDROGUI/HYDROGUI_GeoreferencementOp.cxx | 7 ++- 7 files changed, 74 insertions(+), 38 deletions(-) diff --git a/src/HYDROData/HYDROData_Document.cxx b/src/HYDROData/HYDROData_Document.cxx index 57cb0599..58e4f0e7 100644 --- a/src/HYDROData/HYDROData_Document.cxx +++ b/src/HYDROData/HYDROData_Document.cxx @@ -743,3 +743,11 @@ void HYDROData_Document::Transform( gp_XYZ& thePnt, bool IsToLocalCS ) const 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 ); +} diff --git a/src/HYDROData/HYDROData_Document.h b/src/HYDROData/HYDROData_Document.h index 1274fb9d..43eba79a 100644 --- a/src/HYDROData/HYDROData_Document.h +++ b/src/HYDROData/HYDROData_Document.h @@ -10,6 +10,7 @@ class QFile; class gp_Pnt2d; class gp_Pnt; class gp_XYZ; +class gp_XY; /** * Errors that could appear on document open/save actions. @@ -131,6 +132,7 @@ public: HYDRODATA_EXPORT void Transform( double& X, double& Y, bool IsToLocalCS ) const; HYDRODATA_EXPORT void Transform( gp_Pnt& thePnt, bool IsToLocalCS ) const; HYDRODATA_EXPORT void Transform( gp_XYZ& thePnt, bool IsToLocalCS ) const; + HYDRODATA_EXPORT void Transform( gp_XY& thePnt, bool IsToLocalCS ) const; public: diff --git a/src/HYDROData/HYDROData_Profile.cxx b/src/HYDROData/HYDROData_Profile.cxx index 76dfad84..0d4b5f45 100755 --- a/src/HYDROData/HYDROData_Profile.cxx +++ b/src/HYDROData/HYDROData_Profile.cxx @@ -60,7 +60,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 +122,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 +150,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 +181,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 +223,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 +262,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 +335,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 +343,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 +364,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 +619,7 @@ bool HYDROData_Profile::ImportFromFile( OSD_File& theFile, } else if ( anIsGeoref ) { - SetProfilePoints( aPointsXYZ ); + SetProfilePoints( aPointsXYZ, true ); } Update(); diff --git a/src/HYDROData/HYDROData_Profile.h b/src/HYDROData/HYDROData_Profile.h index 3c56846f..ae708f75 100644 --- a/src/HYDROData/HYDROData_Profile.h +++ b/src/HYDROData/HYDROData_Profile.h @@ -99,27 +99,27 @@ public: * Set first(left) point for profile. * \param thePoint the point */ - HYDRODATA_EXPORT void SetLeftPoint( const gp_XY& thePoint ); + HYDRODATA_EXPORT void SetLeftPoint( const gp_XY& thePoint, bool IsConvertFromGlobal = false ); /** * Returns first(left) point of profile. * \param thePoint[out] profile first point * \return true if point has been set */ - HYDRODATA_EXPORT bool GetLeftPoint( gp_XY& thePoint ) const; + HYDRODATA_EXPORT bool GetLeftPoint( gp_XY& thePoint, bool IsConvertToGlobal = false ) const; /** * Set last(right) point for profile. * \param thePoint the point */ - HYDRODATA_EXPORT void SetRightPoint( const gp_XY& thePoint ); + HYDRODATA_EXPORT void SetRightPoint( const gp_XY& thePoint, bool IsConvertFromGlobal = false ); /** * Returns last(right) point of profile. * \param thePoint[out] profile last point * \return true if point has been set */ - HYDRODATA_EXPORT bool GetRightPoint( gp_XY& thePoint ) const; + HYDRODATA_EXPORT bool GetRightPoint( gp_XY& thePoint, bool IsConvertToGlobal = false ) const; /** @@ -159,15 +159,14 @@ public: * First and last points will be automatically updated. * \param thePoints the list with new profile points */ - HYDRODATA_EXPORT void SetProfilePoints( const ProfilePoints& thePoints ); + HYDRODATA_EXPORT void SetProfilePoints( const ProfilePoints& thePoints, bool IsConvertFromGlobal = true ); /** * Returns profile points. * Empty sequence is returned if first or last point was not set. * \return profile points list */ - HYDRODATA_EXPORT ProfilePoints GetProfilePoints() const; - + HYDRODATA_EXPORT ProfilePoints GetProfilePoints( bool IsConvertToGlobal = false ) const; public: // Public methods to work with files. diff --git a/src/HYDROData/HYDROData_Stream.cxx b/src/HYDROData/HYDROData_Stream.cxx index 128239ea..b4d48d61 100644 --- a/src/HYDROData/HYDROData_Stream.cxx +++ b/src/HYDROData/HYDROData_Stream.cxx @@ -152,8 +152,8 @@ bool HYDROData_Stream::IsHas2dPrs() const } bool HYDROData_Stream::CreatePresentations( const Handle(HYDROData_PolylineXY)& theHydAxis, - const HYDROData_SequenceOfObjects& theProfiles, - PrsDefinition& thePrs ) + const HYDROData_SequenceOfObjects& theProfiles, + PrsDefinition& thePrs ) { if ( theHydAxis.IsNull() || theProfiles.Length() < 2 ) return false; @@ -175,7 +175,7 @@ bool HYDROData_Stream::CreatePresentations( const Handle(HYDROData_PolylineXY)& const TopoDS_Shape& aProf3d = aProfile->GetShape3D(); gp_XY aPnt1, aPnt2; - if ( !aProfile->GetLeftPoint( aPnt1 ) || !aProfile->GetRightPoint( aPnt2 ) ) + if ( !aProfile->GetLeftPoint( aPnt1, false ) || !aProfile->GetRightPoint( aPnt2, false ) ) continue; anArrOfProfiles.SetValue(i,aProfile->GetShape3D());//aProfile->GetTopShape(); diff --git a/src/HYDROData/HYDROData_StreamAltitude.cxx b/src/HYDROData/HYDROData_StreamAltitude.cxx index 11cd35e4..8c1f9f69 100644 --- a/src/HYDROData/HYDROData_StreamAltitude.cxx +++ b/src/HYDROData/HYDROData_StreamAltitude.cxx @@ -56,8 +56,8 @@ Standard_Real getAltitudeFromProfile( const Handle(HYDROData_Profile)& theProfil Standard_Real aResAlt = 0.0; gp_XY aFirstPoint, aLastPoint; - if ( !theProfile->GetLeftPoint( aFirstPoint ) || - !theProfile->GetRightPoint( aLastPoint ) ) + if ( !theProfile->GetLeftPoint( aFirstPoint, false ) || + !theProfile->GetRightPoint( aLastPoint, false ) ) return aResAlt; gp_Pnt aPnt1( aFirstPoint.X(), aFirstPoint.Y(), 0 ); @@ -73,7 +73,7 @@ Standard_Real getAltitudeFromProfile( const Handle(HYDROData_Profile)& theProfil gp_Pnt aPrevPoint; gp_Lin aPrevNormal; - HYDROData_Profile::ProfilePoints aProfilePoints = theProfile->GetProfilePoints(); + HYDROData_Profile::ProfilePoints aProfilePoints = theProfile->GetProfilePoints( false ); for ( int i = 1, n = aProfilePoints.Length(); i <= n; ++i ) { gp_Pnt aProfPoint( aProfilePoints.Value( i ) ); @@ -143,7 +143,8 @@ bool HYDROData_StreamAltitude::getBoundaryProfilesForPoint( continue; gp_XY aFirstPoint, aLastPoint; - if ( !aProfile->GetLeftPoint( aFirstPoint ) || !aProfile->GetRightPoint( aLastPoint ) ) + if ( !aProfile->GetLeftPoint( aFirstPoint, false ) || + !aProfile->GetRightPoint( aLastPoint, false ) ) continue; gp_Pnt aPnt1( aFirstPoint.X(), aFirstPoint.Y(), 0 ); @@ -258,7 +259,7 @@ double HYDROData_StreamAltitude::GetAltitudeForPoint( const gp_XY& thePoint ) co // Interpolate altitudes // Left profile line ( the segment between the firts and the last profile point ) - HYDROData_Profile::ProfilePoints aLeftProfilePoints = aLeftProfile->GetProfilePoints(); + HYDROData_Profile::ProfilePoints aLeftProfilePoints = aLeftProfile->GetProfilePoints( false ); gp_Pnt aLeftProfileP1( aLeftProfilePoints.First() ); aLeftProfileP1.SetZ( 0 ); gp_Pnt aLeftProfileP2( aLeftProfilePoints.Last() ); @@ -266,7 +267,7 @@ double HYDROData_StreamAltitude::GetAltitudeForPoint( const gp_XY& thePoint ) co gp_Vec aLeftProfileVec( aLeftProfileP1, aLeftProfileP2 ); Handle(Geom_Line) aLeftProfileLine = new Geom_Line( gp_Ax1( aLeftProfileP1, aLeftProfileVec ) ); // Right profile line - HYDROData_Profile::ProfilePoints aRightProfilePoints = aRightProfile->GetProfilePoints(); + HYDROData_Profile::ProfilePoints aRightProfilePoints = aRightProfile->GetProfilePoints( false ); gp_Pnt aRightProfileP1( aRightProfilePoints.First() ); aRightProfileP1.SetZ( 0 ); gp_Pnt aRightProfileP2( aRightProfilePoints.Last() ); diff --git a/src/HYDROGUI/HYDROGUI_GeoreferencementOp.cxx b/src/HYDROGUI/HYDROGUI_GeoreferencementOp.cxx index 3b67d475..9c7ef5c2 100644 --- a/src/HYDROGUI/HYDROGUI_GeoreferencementOp.cxx +++ b/src/HYDROGUI/HYDROGUI_GeoreferencementOp.cxx @@ -250,8 +250,8 @@ bool HYDROGUI_GeoreferencementOp::store( QString& theErrorMsg ) if ( !aProfile->IsValid() ) // Show the profile after it became valid aModule->setObjectVisible( HYDROGUI_Tool::GetActiveOCCViewId( aModule ), aProfile, true ); - aProfile->SetLeftPoint( gp_XY( aGeoData.Xg, aGeoData.Yg ) ); - aProfile->SetRightPoint( gp_XY( aGeoData.Xd, aGeoData.Yd ) ); + aProfile->SetLeftPoint( gp_XY( aGeoData.Xg, aGeoData.Yg ), false ); + aProfile->SetRightPoint( gp_XY( aGeoData.Xd, aGeoData.Yd ), false ); } else { aProfile->Invalidate(); aModule->setObjectVisible( HYDROGUI_Tool::GetActiveOCCViewId( aModule ), aProfile, false ); @@ -300,7 +300,8 @@ void HYDROGUI_GeoreferencementOp::setPanelData( HYDROGUI_GeoreferencementDlg::ProfileGeoData aGeoData( aProfile->GetName() ); gp_XY aFirstPoint, aLastPoint; - if ( aProfile->GetLeftPoint( aFirstPoint ) && aProfile->GetRightPoint( aLastPoint ) ) { + if ( aProfile->GetLeftPoint( aFirstPoint, false ) && + aProfile->GetRightPoint( aLastPoint, false ) ) { aGeoData = HYDROGUI_GeoreferencementDlg::ProfileGeoData( aGeoData.Name, aFirstPoint.X(), aFirstPoint.Y(), -- 2.39.2