X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Stream.cxx;h=63e983ec1d35109f89a4b77de997c7387b09dbf7;hb=fcece92742680e708f87352c32597ec2d84bfe2f;hp=ecdaab9f24c285da97bc0a741b545a837b5ca585;hpb=bef5b6259214f107ef442f9ee065158c0bd61c71;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Stream.cxx b/src/HYDROData/HYDROData_Stream.cxx index ecdaab9f..63e983ec 100644 --- a/src/HYDROData/HYDROData_Stream.cxx +++ b/src/HYDROData/HYDROData_Stream.cxx @@ -5,10 +5,18 @@ #include "HYDROData_PolylineXY.h" #include "HYDROData_Profile.h" -#include -#include -#include -#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include #include #include @@ -18,37 +26,49 @@ #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 -typedef NCollection_DataMap HYDROData_DataMapOfRealOfHDProfile; -//typedef HYDROData_DataMapOfRealOfHDProfile::Iterator HYDROData_DataMapIteratorOfDataMapOfRealOfHDProfile; -#include -#include -#include +#include +#include + +#include + #include + +#include +#include + +//#define DEB_STREAM 1 +#ifdef DEB_STREAM //#define DEB_HASINT 1 -#ifdef DEB_HASINT +//#define DEB_UPDATE 1 #include #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) @@ -108,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 ); +} - // Construct the 3D presentation - /// TODO +QColor HYDROData_Stream::DefaultBorderColor() +{ + return QColor( Qt::transparent ); +} + +QColor HYDROData_Stream::getDefaultFillingColor() const +{ + return DefaultFillingColor(); +} + +QColor HYDROData_Stream::getDefaultBorderColor() const +{ + return DefaultBorderColor(); } bool HYDROData_Stream::SetHydraulicAxis( const Handle(HYDROData_PolylineXY)& theAxis ) @@ -224,20 +354,19 @@ void HYDROData_Stream::RemoveHydraulicAxis() SetToUpdate( true ); } -bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProfile, const TopoDS_Face& thePlane, - Standard_Real& outPar ) 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() ); //guide line + TopoDS_Wire aHydraulicWire = TopoDS::Wire( theHydAxis->GetShape() ); //guide line TopoDS_Wire aProfileWire = TopoDS::Wire( theProfile->GetTopShape() ); if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() ) return false; - // TODO - //return true; // temporary BRepProj_Projection aProjector (aProfileWire, thePlane, gp::OZ().Direction()); if(!aProjector.IsDone()) return false; @@ -298,7 +427,7 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProf hasSol = true; } } - if(hasSol) { + if(hasSol) { if(aSqDist <= SquareTolerance) { // hasInt const gp_Pnt& aPnt = aCC.PointOnE1(anIndx); if(aNum > 1) { @@ -317,28 +446,44 @@ bool HYDROData_Stream::HasIntersection( const Handle(HYDROData_Profile)& theProf 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; } +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; + 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 ); @@ -353,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 ); @@ -370,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() ) @@ -385,8 +558,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 @@ -406,6 +581,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(); @@ -418,15 +594,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 ); @@ -436,33 +616,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"); @@ -470,3 +660,133 @@ 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; + + 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 ); +}