+void HYDROData_DTM::Bank::reserve( int theNbPoints )
+{
+ myPoints.reserve( theNbPoints );
+ myDirs.reserve( theNbPoints );
+}
+
+void HYDROData_DTM::Bank::push_back( const gp_Pnt& thePnt, const gp_Dir& theTangent )
+{
+ myPoints.push_back( thePnt );
+ myDirs.push_back( theTangent );
+}
+
+void HYDROData_DTM::Bank::clear()
+{
+ myPoints.clear();
+ myDirs.clear();
+}
+
+TopoDS_Edge HYDROData_DTM::Bank::createEdge3d() const
+{
+ size_t n = myPoints.size();
+ if( n<2 )
+ return TopoDS_Edge();
+
+ Handle_Geom_BSplineCurve aCurve;
+
+ Handle(TColgp_HArray1OfPnt) points = new TColgp_HArray1OfPnt( 1, (int)n );
+ TColgp_Array1OfVec tangents( 1, (int)n );
+ Handle(TColStd_HArray1OfBoolean) flags = new TColStd_HArray1OfBoolean( 1, (int)n );
+
+ for( size_t i = 1; i <= n; i++ )
+ {
+ gp_Pnt aPnt = myPoints[i-1];
+ gp_Vec aVec = myDirs[i-1];
+ points->SetValue( (int)i, aPnt );
+ tangents.SetValue( (int)i, aVec );
+ flags->SetValue( (int)i, Standard_True );
+ }
+
+ GeomAPI_Interpolate anInterpolator( points, Standard_False, Standard_False );
+ anInterpolator.Load( tangents, flags );
+ anInterpolator.Perform();
+ if( anInterpolator.IsDone() )
+ {
+ aCurve = anInterpolator.Curve();
+ return BRepBuilderAPI_MakeEdge( aCurve ).Edge();
+ }
+ else
+ return TopoDS_Edge();
+}
+