X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Stream.cxx;h=63e983ec1d35109f89a4b77de997c7387b09dbf7;hb=fcece92742680e708f87352c32597ec2d84bfe2f;hp=2e951d99a8347df1fc4de2d3fad76a5557df6182;hpb=a461802565827e4d63ce4b834b32f5a29ddc73f2;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Stream.cxx b/src/HYDROData/HYDROData_Stream.cxx index 2e951d99..63e983ec 100644 --- a/src/HYDROData/HYDROData_Stream.cxx +++ b/src/HYDROData/HYDROData_Stream.cxx @@ -5,20 +5,70 @@ #include "HYDROData_PolylineXY.h" #include "HYDROData_Profile.h" -#include -#include -#include -#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include #include #include #include #include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include #include +//#define DEB_STREAM 1 +#ifdef DEB_STREAM +//#define DEB_HASINT 1 +//#define DEB_UPDATE 1 +#include +#include +#endif + #define PYTHON_STREAM_ID "KIND_STREAM" +typedef NCollection_DataMap HYDROData_DataMapOfRealOfHDProfile; + IMPLEMENT_STANDARD_HANDLE(HYDROData_Stream,HYDROData_NaturalObject) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Stream,HYDROData_NaturalObject) @@ -78,71 +128,181 @@ TopoDS_Shape HYDROData_Stream::GetShape3D() const return getShape3D(); } +Handle(Geom_BSplineCurve) HYDROData_Stream::buildInterpolationCurve( + const Handle(TColgp_HArray1OfPnt)& theArrayOfPnt ) +{ + Handle(Geom_BSplineCurve) aBSpline; + GeomAPI_Interpolate anInterpolator (theArrayOfPnt, Standard_False, 1.0e-5); + anInterpolator.Perform() ; + if (anInterpolator.IsDone()) + aBSpline = anInterpolator.Curve(); + return aBSpline; +} + void HYDROData_Stream::Update() { HYDROData_NaturalObject::Update(); Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); HYDROData_SequenceOfObjects aRefProfiles = GetProfiles(); - if ( aHydAxis.IsNull() || aRefProfiles.IsEmpty() ) + if ( aHydAxis.IsNull() || aRefProfiles.Length() < 2 ) return; - - TopoDS_Shell a2dShell; - BRep_Builder a2dShellBuilder; - a2dShellBuilder.MakeShell( a2dShell ); - + bool anIsFirst = true; gp_Pnt aPrevFirstPoint, aPrevLastPoint; - - // Construct the top presentation + Handle(TColgp_HArray1OfPnt) anArrayOfFPnt = new TColgp_HArray1OfPnt(1, aRefProfiles.Length()); + Handle(TColgp_HArray1OfPnt) anArrayOfLPnt = new TColgp_HArray1OfPnt(1, aRefProfiles.Length()); + TopTools_Array1OfShape anArrOfProfiles(1, aRefProfiles.Length()); + TopTools_Array1OfShape anArrOf2DProfiles(1, aRefProfiles.Length()); + + // Pre-processing HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles ); - for ( ; anIter.More(); anIter.Next() ) + for (int i=1 ; anIter.More(); anIter.Next(),i++ ) { Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast( anIter.Value() ); if ( aProfile.IsNull() ) - continue; - + continue; + const TopoDS_Shape& aProf3d = aProfile->GetShape3D(); gp_XY aPnt1, aPnt2; - if ( !aProfile->GetFirstPoint( aPnt1 ) || !aProfile->GetLastPoint( aPnt2 ) ) - continue; - - gp_Pnt aCurFirstPoint( aPnt1.X(), aPnt1.Y(), 0 ); - gp_Pnt aCurLastPoint( aPnt2.X(), aPnt2.Y(), 0 ); - - if ( anIsFirst ) - { - aPrevFirstPoint = aCurFirstPoint; - aPrevLastPoint = aCurLastPoint; - anIsFirst = false; + if ( !aProfile->GetLeftPoint( aPnt1 ) || !aProfile->GetRightPoint( aPnt2 ) ) continue; - } + anArrOfProfiles.SetValue(i,aProfile->GetShape3D());//aProfile->GetTopShape(); + anArrOf2DProfiles.SetValue(i,aProfile->GetTopShape()); + + gp_Pnt aCurFirstPoint( aPnt1.X(), aPnt1.Y(), 0 ), aCurFP; + gp_Pnt aCurLastPoint( aPnt2.X(), aPnt2.Y(), 0 ), aCurLP; + TopoDS_Vertex aV1, aV2; + TopExp::Vertices(TopoDS::Wire(aProf3d), aV1, aV2); + gp_Pnt aP1 = BRep_Tool::Pnt(aV1); + if(aP1.X() == aPnt1.X() && aP1.Y() == aPnt1.Y()) + aCurFP = aP1; + else + aCurLP = aP1; + aP1 = BRep_Tool::Pnt(aV2); + if(aP1.X() == aPnt2.X() && aP1.Y() == aPnt2.Y()) + aCurLP = aP1; + else + aCurFP = aP1; + anArrayOfFPnt->SetValue(i,aCurFP); + anArrayOfLPnt->SetValue(i,aCurLP); + } - BRepBuilderAPI_MakeEdge aFirstEdge( aPrevFirstPoint, aPrevLastPoint ); - BRepBuilderAPI_MakeEdge aSecondEdge( aPrevLastPoint, aCurLastPoint ); - BRepBuilderAPI_MakeEdge aThirdEdge( aCurLastPoint, aCurFirstPoint ); - BRepBuilderAPI_MakeEdge aFourthEdge( aCurFirstPoint, aPrevFirstPoint ); - BRepBuilderAPI_MakeWire aMakeWire( aFirstEdge.Edge(), aSecondEdge.Edge(), - aThirdEdge.Edge(), aFourthEdge.Edge() ); - - TopoDS_Wire aSectProfileWire = aMakeWire.Wire(); - - BRepBuilderAPI_MakeFace aMakeFace( aSectProfileWire, Standard_True ); - aMakeFace.Build(); - if( aMakeFace.IsDone() ) - { - a2dShellBuilder.Add( a2dShell, aMakeFace.Face() ); - } + // Construct of the 3D presentation + Handle(Geom_BSplineCurve) aBSpline = buildInterpolationCurve (anArrayOfFPnt); + if(aBSpline.IsNull()) + return; + TopoDS_Edge anEdgLeft, anEdgRight; + BRepBuilderAPI_MakeEdge aMakeEdge(aBSpline); + if(aMakeEdge.IsDone()) + anEdgLeft = aMakeEdge.Edge(); + if(anEdgLeft.IsNull()) + return; + aBSpline.Nullify(); + aBSpline = buildInterpolationCurve (anArrayOfLPnt); + if(aBSpline.IsNull()) + return; + aMakeEdge.Init(aBSpline); + if(aMakeEdge.IsDone()) + anEdgRight = aMakeEdge.Edge(); + if(anEdgRight.IsNull()) + return; + BRep_Builder aBB; + TopoDS_Compound aCmp; + aBB.MakeCompound(aCmp); + anIter.Init( aRefProfiles ); + for (int i=1 ; i < anArrOfProfiles.Length() +1; i++ ) + aBB.Add(aCmp, anArrOfProfiles.Value(i)); + aBB.Add(aCmp,anEdgLeft); + aBB.Add(aCmp,anEdgRight); + BRepCheck_Analyzer aCh(aCmp); + if(aCh.IsValid()) + SetShape3D(aCmp); +#ifdef DEB_UPDATE + else { + BRepTools::Write(aCmp, "str3d.brep"); + SetShape3D(aCmp); + } +#endif - aPrevFirstPoint = aCurFirstPoint; - aPrevLastPoint = aCurLastPoint; + // Construct the top presentation + for(int i=1;i<= anArrayOfLPnt->Length();i++) { + gp_Pnt aPnt = anArrayOfFPnt->Value(i); + aPnt.SetZ(.0); // make 2d + anArrayOfFPnt->SetValue(i, aPnt); + aPnt = anArrayOfLPnt->Value(i); + aPnt.SetZ(.0); + anArrayOfLPnt->SetValue(i, aPnt); + } + aBSpline.Nullify(); + aBSpline = buildInterpolationCurve (anArrayOfFPnt); + if(aBSpline.IsNull()) + return; + aMakeEdge.Init(aBSpline); + if(aMakeEdge.IsDone()) + anEdgLeft = aMakeEdge.Edge(); + aBSpline.Nullify(); + aBSpline = buildInterpolationCurve (anArrayOfLPnt); + if(aBSpline.IsNull()) + return; + aMakeEdge.Init(aBSpline); + if(aMakeEdge.IsDone()) + anEdgRight = aMakeEdge.Edge(); + if(anEdgRight.IsNull()) + return; + BRepBuilderAPI_MakeEdge aMakeEdge2(anArrayOfFPnt->Value(1),anArrayOfLPnt->Value(1)); + TopoDS_Edge aBotEdge, aTopEdge; + if(aMakeEdge2.IsDone()) + aBotEdge = aMakeEdge2.Edge(); + BRepBuilderAPI_MakeEdge aMakeEdge3(anArrayOfFPnt->Value(anArrayOfFPnt->Length()),anArrayOfLPnt->Value(anArrayOfLPnt->Length())); + if(aMakeEdge3.IsDone()) + aTopEdge = aMakeEdge3.Edge(); + + BRepBuilderAPI_MakeWire aMakeWire( aBotEdge, anEdgLeft, aTopEdge,anEdgRight); + TopoDS_Wire aSectProfileWire; + if(aMakeWire.IsDone()) + aSectProfileWire = aMakeWire.Wire(); + BRepBuilderAPI_MakeFace aMakeFace( aSectProfileWire, Standard_True ); + TopoDS_Face aFace; + aMakeFace.Build(); + if( aMakeFace.IsDone() ) + aFace = aMakeFace.Face(); + aCmp.Nullify(); + aBB.MakeCompound(aCmp); + aBB.Add(aCmp,aFace); + for(int i=1;i <= anArrOf2DProfiles.Length(); i++) + aBB.Add(aCmp,anArrOf2DProfiles.Value(i)); + aCh.Init(aCmp); + if(aCh.IsValid()) + SetTopShape(aCmp); +#ifdef DEB_UPDATE + else { + BRepTools::Write(aCmp, "str2d.brep"); + SetTopShape(aCmp); } +#endif + +} - SetTopShape( a2dShell ); +QColor HYDROData_Stream::DefaultFillingColor() +{ + return QColor( Qt::green ); +} + +QColor HYDROData_Stream::DefaultBorderColor() +{ + return QColor( Qt::transparent ); +} + +QColor HYDROData_Stream::getDefaultFillingColor() const +{ + return DefaultFillingColor(); +} - // Construct the 3D presentation - /// TODO +QColor HYDROData_Stream::getDefaultBorderColor() const +{ + return DefaultBorderColor(); } bool HYDROData_Stream::SetHydraulicAxis( const Handle(HYDROData_PolylineXY)& theAxis ) @@ -194,31 +354,136 @@ void HYDROData_Stream::RemoveHydraulicAxis() SetToUpdate( true ); } -bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProfile ) const +bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_PolylineXY)& theHydAxis, + const Handle(HYDROData_Profile)& theProfile, + const TopoDS_Face& thePlane, + Standard_Real& outPar) { - Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); - if ( theProfile.IsNull() || aHydAxis.IsNull() ) + if ( theProfile.IsNull() || theHydAxis.IsNull() ) return false; - TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() ); + TopoDS_Wire aHydraulicWire = TopoDS::Wire( theHydAxis->GetShape() ); //guide line TopoDS_Wire aProfileWire = TopoDS::Wire( theProfile->GetTopShape() ); if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() ) return false; - // TODO + BRepProj_Projection aProjector (aProfileWire, thePlane, gp::OZ().Direction()); + if(!aProjector.IsDone()) + return false; + TopoDS_Shape aPrjProfile = aProjector.Shape(); + if(aPrjProfile.IsNull()) + return false; + TopoDS_Vertex aV1, aV2; + if(aPrjProfile.ShapeType() == TopAbs_EDGE) + TopExp::Vertices(TopoDS::Edge(aPrjProfile), aV1, aV2); + else if(aPrjProfile.ShapeType() == TopAbs_WIRE) + TopExp::Vertices(TopoDS::Wire(aPrjProfile), aV1, aV2); + else if(aPrjProfile.ShapeType() == TopAbs_COMPOUND){ + TopExp_Explorer anExp(aPrjProfile, TopAbs_WIRE); + if(anExp.More()) { + TopExp::Vertices(TopoDS::Wire(anExp.Current()), aV1, aV2); + } else { + anExp.Init(aPrjProfile, TopAbs_EDGE); + if(anExp.More()) { + TopExp::Vertices(TopoDS::Edge(anExp.Current()), aV1, aV2); + } + } + } + if(aV1.IsNull() || aV2.IsNull()) + return false; + gp_Pnt aPnt1 = BRep_Tool::Pnt(aV1); + gp_Pnt aPnt2 = BRep_Tool::Pnt(aV2); + aPnt1.SetZ(0.0); + aPnt2.SetZ(0.0); + BRepBuilderAPI_MakeEdge aMk(aPnt1, aPnt2); + if(!aMk.IsDone()) + return false; + const TopoDS_Edge& anEdg2 = aMk.Edge();//Section edge + Standard_Integer aNum(0); + + TopExp_Explorer anExplo(aHydraulicWire, TopAbs_EDGE); + for(;anExplo.More();anExplo.Next()) aNum++; + // check for self-intersection + const Standard_Real SquareTolerance = Precision::Confusion()*Precision::Confusion(); + Standard_Boolean hasInt(false); + Standard_Real aSqDist(DBL_MAX); + Standard_Integer anIndx(0); + BRepExtrema_ExtCC aCC; + aCC.Initialize(anEdg2); + outPar = 0.0; + anExplo.Init(aHydraulicWire, TopAbs_EDGE); + for(Standard_Integer j=1;anExplo.More();anExplo.Next(),j++) { + const TopoDS_Edge& anEdg1 = TopoDS::Edge(anExplo.Current()); + if(anEdg1.IsNull()) + continue; + Standard_Boolean hasSol(false); + aCC.Perform(anEdg1); + if(aCC.IsDone()) { + // find minimal dist + for(Standard_Integer i=1; i<= aCC.NbExt();i++) + if(aCC.SquareDistance(i) < aSqDist) { + aSqDist = aCC.SquareDistance(i); + anIndx = i; + hasSol = true; + } + } + if(hasSol) { + if(aSqDist <= SquareTolerance) { // hasInt + const gp_Pnt& aPnt = aCC.PointOnE1(anIndx); + if(aNum > 1) { + TopExp::Vertices(anEdg1, aV1, aV2, Standard_True); + outPar += BRep_Tool::Pnt(aV1).Distance(aPnt); + } else { + Standard_Real aPar = aCC.ParameterOnE1(anIndx); + outPar = aPar; + } + hasInt = true; + break; + } else { + // no ints-n + if(aNum > 1) { + TopExp::Vertices(anEdg1, aV1, aV2); + outPar += BRep_Tool::Pnt(aV1).Distance(BRep_Tool::Pnt(aV2)); + } + } + } else if(aNum > 1) { + TopExp::Vertices(anEdg1, aV1, aV2); + outPar += BRep_Tool::Pnt(aV1).Distance(BRep_Tool::Pnt(aV2)); + } + } + if(hasInt) + return true; + return false; +} - return true; +bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProfile, const TopoDS_Face& thePlane, + Standard_Real& outPar ) const +{ + Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); + + return HasIntersection( aHydAxis, theProfile, thePlane, outPar ); } + bool HYDROData_Stream::AddProfile( const Handle(HYDROData_Profile)& theProfile ) { if ( theProfile.IsNull() ) - return false; + return false; - if ( HasReference( theProfile, DataTag_Profile ) || !HasIntersection( theProfile ) ) - return false; // Object is already in reference list or it has no intersection + Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); + if ( aHydAxis.IsNull() ) + return false; + + TopoDS_Face aPlane; + if(!BuildFace(aHydAxis, aPlane)) + return false; - insertProfileInToOrder( theProfile ); + 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 + + int aProfileIndex = insertParameter( aPar ); + insertProfileInToOrder( theProfile, aProfileIndex ); // Indicate model of the need to update the stream presentation SetToUpdate( true ); @@ -233,11 +498,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 ); @@ -250,11 +539,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() ) @@ -265,8 +558,28 @@ 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 +{ + if ( theHydAxis.IsNull() ) return false; + TopoDS_Wire aHydraulicWire = TopoDS::Wire( theHydAxis->GetShape() ); + if(aHydraulicWire.IsNull()) return false; + gp_Ax2 aX2(gp::XOY()); + gp_Ax3 aX3(aX2); + gp_Pln aPln(aX3); + Bnd_Box B; + BRepBndLib::Add(aHydraulicWire,B); + Standard_Real axmin,aymin,azmin,axmax,aymax,azmax; + B.Get(axmin,aymin,azmin,axmax,aymax,azmax); + BRepBuilderAPI_MakeFace aMkr(aPln, axmin-500., axmax+500., aymin-500., aymax+500.); // to be tuned later according max/ Profile deviation + if(!aMkr.IsDone() || aMkr.Shape().IsNull()) return false; + thePlane = TopoDS::Face(aMkr.Shape()); + return true; } void HYDROData_Stream::updateProfilesOrder() @@ -280,17 +593,200 @@ void HYDROData_Stream::updateProfilesOrder() Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); if ( aHydAxis.IsNull() ) + return; + + TopoDS_Face aPlane; + if ( !BuildFace( aHydAxis, aPlane ) ) return; + 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 ); - for ( ; anIter.More(); anIter.Next() ) + for (int i = 1 ; anIter.More(); anIter.Next(), i++ ) { Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast( anIter.Value() ); - if ( aProfile.IsNull() || !HasIntersection( aProfile ) ) +#ifdef DEB_HASINT + TopoDS_Wire aProfileWire = TopoDS::Wire( aProfile->GetTopShape() ); + aBB.Add( aCmp, aProfileWire ); +#endif + if ( aProfile.IsNull() || !HasIntersection( aProfile, aPlane, aPar ) ) continue; + + aDM.Bind( aPar, aProfile ); + aList.Append( aPar ); + } + + 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"); + BRepTools::Write(aCmp, "Prof.brep"); +#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; + } - insertProfileInToOrder( aProfile ); + 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; + + if ( aParamsArray->Length() == 1 ) + { + removeParametersArray(); + 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 ); +}