From f69c6f07782392fb5e8c95aa917b1bfaa8f4b012 Mon Sep 17 00:00:00 2001 From: adv Date: Fri, 6 Dec 2013 12:26:42 +0000 Subject: [PATCH] Insert single profiles in to the stream order. --- src/HYDROData/HYDROData_Stream.cxx | 232 +++++++++++++++++++++++++---- src/HYDROData/HYDROData_Stream.h | 17 ++- 2 files changed, 219 insertions(+), 30 deletions(-) diff --git a/src/HYDROData/HYDROData_Stream.cxx b/src/HYDROData/HYDROData_Stream.cxx index 7f1bce4a..6a95bd0a 100644 --- a/src/HYDROData/HYDROData_Stream.cxx +++ b/src/HYDROData/HYDROData_Stream.cxx @@ -10,6 +10,8 @@ #include #include +#include + #include #include #include @@ -236,8 +238,6 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProf if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() ) return false; - // TODO - //return true; // temporary BRepProj_Projection aProjector (aProfileWire, thePlane, gp::OZ().Direction()); if(!aProjector.IsDone()) return false; @@ -327,21 +327,26 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProf return false; } + bool HYDROData_Stream::AddProfile( const Handle(HYDROData_Profile)& theProfile ) { if ( theProfile.IsNull() ) - return false; + return false; + Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); if ( aHydAxis.IsNull() ) - return false; + return false; + TopoDS_Face aPlane; if(!BuildFace(aHydAxis, aPlane)) return false; + Standard_Real aPar(.0); if ( HasReference( theProfile, DataTag_Profile ) || !HasIntersection( theProfile, aPlane, aPar ) ) return false; // Object is already in reference list or it has no intersection - insertProfileInToOrder( theProfile ); + int aProfileIndex = insertParameter( aPar ); + insertProfileInToOrder( theProfile, aProfileIndex ); // Indicate model of the need to update the stream presentation SetToUpdate( true ); @@ -356,11 +361,35 @@ HYDROData_SequenceOfObjects HYDROData_Stream::GetProfiles() const bool HYDROData_Stream::RemoveProfile( const Handle(HYDROData_Profile)& theProfile ) { - if ( theProfile.IsNull() || !HasReference( theProfile, DataTag_Profile ) ) + if ( theProfile.IsNull() ) + return false; + + int aProfileIndex = -1; + + HYDROData_SequenceOfObjects aRefProfiles = GetProfiles(); + HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles ); + for ( int i = 0 ; anIter.More(); anIter.Next(), ++i ) + { + Handle(HYDROData_Profile) aProfile = + Handle(HYDROData_Profile)::DownCast( anIter.Value() ); + if ( aProfile.IsNull() ) + continue; + + if ( IsEqual( theProfile, aProfile ) ) + { + aProfileIndex = i; + break; + } + } + + if ( aProfileIndex == -1 ) return false; RemoveReferenceObject( theProfile->Label(), DataTag_Profile ); + // Remove parameter for removed profile + removeParameter( aProfileIndex ); + // Indicate model of the need to update the stream presentation SetToUpdate( true ); @@ -373,11 +402,15 @@ void HYDROData_Stream::RemoveProfiles() ClearReferenceObjects( DataTag_Profile ); + // Remove the parameters array + removeParametersArray(); + // Indicate model of the need to update the stream presentation SetToUpdate( anIsToUpdate ); } -void HYDROData_Stream::insertProfileInToOrder( const Handle(HYDROData_Profile)& theProfile ) +void HYDROData_Stream::insertProfileInToOrder( const Handle(HYDROData_Profile)& theProfile, + const int theBeforeIndex ) { Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); if ( theProfile.IsNull() || aHydAxis.IsNull() ) @@ -388,8 +421,10 @@ void HYDROData_Stream::insertProfileInToOrder( const Handle(HYDROData_Profile)& if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() ) return; - // TODO - AddReferenceObject( theProfile, DataTag_Profile ); // temporary for testing only + if ( theBeforeIndex == -1 ) + AddReferenceObject( theProfile, DataTag_Profile ); + else + InsertReferenceObject( theProfile, DataTag_Profile, theBeforeIndex ); } bool HYDROData_Stream::BuildFace( const Handle(HYDROData_PolylineXY)& theHydAxis, TopoDS_Face& thePlane) const @@ -409,6 +444,7 @@ bool HYDROData_Stream::BuildFace( const Handle(HYDROData_PolylineXY)& theHydAxis thePlane = TopoDS::Face(aMkr.Shape()); return true; } + void HYDROData_Stream::updateProfilesOrder() { HYDROData_SequenceOfObjects aRefProfiles = GetProfiles(); @@ -421,15 +457,19 @@ void HYDROData_Stream::updateProfilesOrder() Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); if ( aHydAxis.IsNull() ) return; + TopoDS_Face aPlane; - if(!BuildFace(aHydAxis, aPlane)) + if ( !BuildFace( aHydAxis, aPlane ) ) return; - Standard_Real aPar(.0); + + Standard_Real aPar( .0 ); + #ifdef DEB_HASINT BRep_Builder aBB; TopoDS_Compound aCmp; aBB.MakeCompound(aCmp); #endif + HYDROData_DataMapOfRealOfHDProfile aDM; TColStd_ListOfReal aList; HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles ); @@ -439,33 +479,43 @@ void HYDROData_Stream::updateProfilesOrder() Handle(HYDROData_Profile)::DownCast( anIter.Value() ); #ifdef DEB_HASINT TopoDS_Wire aProfileWire = TopoDS::Wire( aProfile->GetTopShape() ); - aBB.Add( aCmp, aProfileWire); + aBB.Add( aCmp, aProfileWire ); #endif if ( aProfile.IsNull() || !HasIntersection( aProfile, aPlane, aPar ) ) continue; - aDM.Bind(aPar, aProfile); - aList.Append(aPar); - //insertProfileInToOrder( aProfile ); + + aDM.Bind( aPar, aProfile ); + aList.Append( aPar ); } - // sorting - if(aList.Extent() > 1) { - TColStd_Array1OfReal anArr(1, aList.Extent()); - TColStd_ListIteratorOfListOfReal it(aList); - for (int j=1;it.More();it.Next(), j++) - anArr(j) = it.Value(); - TCollection_CompareOfReal Compar; - SortTools_QuickSortOfReal::Sort( anArr, Compar); - for (int j = 1; j <= anArr.Length(); j++) { - const Standard_Real aKey = anArr(j); - const Handle(HYDROData_Profile)& aProfile = aDM.Find(aKey); - insertProfileInToOrder( aProfile ); - } - } else if(aList.Extent() == 1) { + + if ( aList.IsEmpty() ) + return; + + TColStd_Array1OfReal anArr( 1, aList.Extent() ); + + TColStd_ListIteratorOfListOfReal it( aList ); + for ( int j = 1; it.More(); it.Next(), j++ ) + anArr( j ) = it.Value(); + + // sorting + if ( aList.Extent() > 1 ) + { + TCollection_CompareOfReal Compar; + SortTools_QuickSortOfReal::Sort( anArr, Compar ); + + for (int j = 1; j <= anArr.Length(); j++) { + const Standard_Real aKey = anArr(j); + const Handle(HYDROData_Profile)& aProfile = aDM.Find(aKey); + insertProfileInToOrder( aProfile ); + } + } else if ( aList.Extent() == 1 ) { const Standard_Real aKey = aList.Last(); const Handle(HYDROData_Profile)& aProfile = aDM.Find(aKey); insertProfileInToOrder( aProfile ); } + setParametersArray( anArr ); + #ifdef DEB_HASINT TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() ); BRepTools::Write(aHydraulicWire, "Path.brep"); @@ -473,3 +523,127 @@ void HYDROData_Stream::updateProfilesOrder() #endif } +void HYDROData_Stream::setParametersArray( const TColStd_Array1OfReal& theArray ) +{ + if ( theArray.Length() == 0 ) + { + removeParametersArray(); + return; + } + + TDF_Label aLabel = myLab.FindChild( DataTag_ParamsArray ); + + Handle(TDataStd_RealArray) aParamsArray = + TDataStd_RealArray::Set( aLabel, theArray.Lower(), theArray.Upper() ); + + for ( int i = theArray.Lower(), n = theArray.Upper(); i <= n; ++i ) + { + const Standard_Real& aParam = theArray( i ); + aParamsArray->SetValue( i, aParam ); + } +} + +TColStd_Array1OfReal* HYDROData_Stream::getParametersArray() const +{ + TColStd_Array1OfReal* anArray = NULL; + + TDF_Label aLabel = myLab.FindChild( DataTag_ParamsArray, false ); + if ( !aLabel.IsNull() ) + { + Handle(TDataStd_RealArray) aParamsArray; + if ( aLabel.FindAttribute( TDataStd_RealArray::GetID(), aParamsArray ) ) + { + anArray = new TColStd_Array1OfReal( aParamsArray->Lower(), aParamsArray->Upper() ); + for ( int i = aParamsArray->Lower(), n = aParamsArray->Upper(); i <= n; ++i ) + { + const Standard_Real& aParam = aParamsArray->Value( i ); + anArray->SetValue( i, aParam ); + } + } + } + + return anArray; +} + +void HYDROData_Stream::removeParametersArray() +{ + TDF_Label aLabel = myLab.FindChild( DataTag_ParamsArray, false ); + if ( !aLabel.IsNull() ) + aLabel.ForgetAllAttributes(); +} + +int HYDROData_Stream::insertParameter( const Standard_Real& theParam ) +{ + int aResIndex = -1; + + TColStd_Array1OfReal* anArr = getParametersArray(); + if ( anArr ) + { + aResIndex = 0; + + TColStd_Array1OfReal aNewArr( anArr->Lower(), anArr->Upper() + 1 ); + + bool isInserted = false; + for ( int i = anArr->Lower(), j = i, n = anArr->Upper(); i <= n; ++i, ++j ) + { + const Standard_Real& aStoredParam = anArr->Value( i ); + if ( !isInserted ) + { + if ( theParam > aStoredParam ) + { + aResIndex++; + } + else + { + aNewArr( j ) = theParam; + isInserted = true; + ++j; + } + } + + aNewArr( j ) = aStoredParam; + } + + if ( !isInserted ) + { + aResIndex = -1; + aNewArr( aNewArr.Upper() ) = theParam; + } + + setParametersArray( aNewArr ); + delete anArr; + } + else + { + TColStd_Array1OfReal aNewArr( 1, 1 ); + aNewArr.SetValue( 1, theParam ); + setParametersArray( aNewArr ); + } + + return aResIndex; +} + +void HYDROData_Stream::removeParameter( const int& theIndex ) +{ + TDF_Label aLabel = myLab.FindChild( DataTag_ParamsArray, false ); + if ( aLabel.IsNull() ) + return; + + Handle(TDataStd_RealArray) aParamsArray; + if ( !aLabel.FindAttribute( TDataStd_RealArray::GetID(), aParamsArray ) ) + return; + + TColStd_Array1OfReal aNewArr( aParamsArray->Lower(), aParamsArray->Upper() - 1 ); + + for ( int i = aParamsArray->Lower(), j = i, k = 0, n = aParamsArray->Upper(); i <= n; ++i, ++k ) + { + const Standard_Real& aStoredParam = aParamsArray->Value( i ); + if ( k == theIndex ) + continue; + + aNewArr.SetValue( j, aStoredParam ); + ++j; + } + + setParametersArray( aNewArr ); +} diff --git a/src/HYDROData/HYDROData_Stream.h b/src/HYDROData/HYDROData_Stream.h index a8a08ff2..d0f62028 100644 --- a/src/HYDROData/HYDROData_Stream.h +++ b/src/HYDROData/HYDROData_Stream.h @@ -8,6 +8,7 @@ DEFINE_STANDARD_HANDLE(HYDROData_Stream, HYDROData_NaturalObject) class Handle(HYDROData_PolylineXY); class Handle(HYDROData_Profile); +class TColStd_Array1OfReal; /**\class HYDROData_Stream * \brief @@ -24,6 +25,7 @@ protected: DataTag_First = HYDROData_NaturalObject::DataTag_First + 100, ///< first tag, to reserve DataTag_HydraulicAxis, ///< reference hydraulic axis DataTag_Profile, ///< reference profiles + DataTag_ParamsArray ///< parameters array }; public: @@ -119,7 +121,8 @@ protected: /** * Insert one profile in to the stream profiles order. */ - void insertProfileInToOrder( const Handle(HYDROData_Profile)& theProfile ); + void insertProfileInToOrder( const Handle(HYDROData_Profile)& theProfile, + const int theBeforeIndex = -1 ); /** * Fully recompute the order of all profiles in accordance with reference hydraulic axis. @@ -127,6 +130,18 @@ protected: */ void updateProfilesOrder(); +private: + + void setParametersArray( const TColStd_Array1OfReal& theArray ); + + TColStd_Array1OfReal* getParametersArray() const; + + void removeParametersArray(); + + int insertParameter( const Standard_Real& theParam ); + + void removeParameter( const int& theIndex ); + protected: friend class HYDROData_Iterator; -- 2.30.2