+ObjectKind HYDROData_Stream::getAltitudeObjectType() const
+{
+ return KIND_STREAM_ALTITUDE;
+}
+
+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 );
+}
+
+bool HYDROData_Stream::GenerateBottomPolyline()
+{
+ // Get the document
+ Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
+ if ( aDocument.IsNull() ) {
+ return false;
+ }
+
+ // Collect bottom points ( one bottom point from each profile of the stream )
+ HYDROData_Profile::ProfilePoints aBottomPoints;
+
+ HYDROData_SequenceOfObjects aSeqOfProfiles = GetProfiles();
+ for ( int i = 1, aNb = aSeqOfProfiles.Size(); i <= aNb; i++ ) {
+ const Handle(HYDROData_Profile) aProfile =
+ Handle(HYDROData_Profile)::DownCast( aSeqOfProfiles.Value( i ) );
+ if ( aProfile.IsNull() ) {
+ continue;
+ }
+
+ aBottomPoints.Append( aProfile->GetBottomPoint() );
+ }
+
+ int aNbBottomPoints = aBottomPoints.Size();
+
+ if ( aNbBottomPoints < 2 ) {
+ return false;
+ }
+
+ // Create bottom polyline object if the stream doesn't contain it yet
+ Handle(HYDROData_Polyline3D) aBottom = GetBottomPolyline();
+ if ( aBottom.IsNull() ) {
+ aBottom = Handle(HYDROData_Polyline3D)::DownCast( aDocument->CreateObject( KIND_POLYLINE ) );
+ QString aBaseName = GetName() + "_bottom";
+ QString aName = HYDROData_Tool::GenerateObjectName( aDocument, aBaseName, QStringList(), true );
+ aBottom->SetName( aName );
+
+ SetReferenceObject( aBottom, DataTag_BottomPolyline );
+ }
+
+ // Create 2D polyline if the bottom polyline doesn't contain it yet
+ Handle(HYDROData_PolylineXY) aPolylineXY = aBottom->GetPolylineXY();
+ if ( aPolylineXY.IsNull() ) {
+ aPolylineXY = Handle(HYDROData_PolylineXY)::DownCast( aDocument->CreateObject( KIND_POLYLINEXY ) );
+ QString aBaseName = GetName() + "_bottom_2d";
+ QString aName = HYDROData_Tool::GenerateObjectName( aDocument, aBaseName, QStringList(), true );
+ aPolylineXY->SetName( aName );
+ aBottom->SetPolylineXY( aPolylineXY, false );
+ }
+
+ aPolylineXY->RemoveSections();
+ aPolylineXY->AddSection( "", HYDROData_PolylineXY::SECTION_SPLINE, false );
+
+ // Create profile if the bottom polyline doesn't contain it yet
+ Handle(HYDROData_ProfileUZ) aProfileUZ = aBottom->GetProfileUZ();
+ if ( aProfileUZ.IsNull() ) {
+ Handle(HYDROData_Profile) aProfile =
+ Handle(HYDROData_Profile)::DownCast( aDocument->CreateObject( KIND_PROFILE ) );
+ QString aBaseName = GetName() + "_bottom_profile";
+ QString aName = HYDROData_Tool::GenerateObjectName( aDocument, aBaseName, QStringList(), true );
+ aProfile->SetName( aName );
+ aProfileUZ = aProfile->GetProfileUZ( true );
+ aBottom->SetProfileUZ( aProfileUZ );
+ }
+
+ aProfileUZ->RemoveSection( 0 );
+
+ aProfileUZ->CalculateAndAddPoints(aBottomPoints, aPolylineXY);
+
+ return true;
+}
+
+Handle(HYDROData_Polyline3D) HYDROData_Stream::GetBottomPolyline() const
+{
+ return Handle(HYDROData_Polyline3D)::DownCast(
+ GetReferenceObject( DataTag_BottomPolyline ) );
+}
+
+bool HYDROData_Stream::SetBottomPolyline( const Handle(HYDROData_Polyline3D)& theBottom )
+{
+ if ( theBottom.IsNull() ) {
+ return false;
+ }
+
+ SetReferenceObject( theBottom, DataTag_BottomPolyline );
+
+ return true;
+}
+
+bool HYDROData_Stream::Interpolate( HYDROData_IProfilesInterpolator* theInterpolator )
+{
+ // Get the document
+ Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
+ if ( aDocument.IsNull() ) {
+ return false;
+ }
+
+ if ( theInterpolator->GetCalculatedProfilesNumber() < 1 ) {
+ theInterpolator->Calculate();
+ }
+
+ if ( theInterpolator->GetErrorCode() != OK ) {
+ return false;
+ }
+
+ bool isOK = true;
+
+ for ( int aProfileInd = 0; aProfileInd < theInterpolator->GetCalculatedProfilesNumber(); aProfileInd++ ) {
+ // Get calculated point coordinates
+ HYDROData_Profile::ProfilePoints aResultPoints = theInterpolator->GetResultProfilePoints( aProfileInd );
+ if ( aResultPoints.IsEmpty() ) {
+ isOK = false;
+ continue;
+ }
+
+ // Create profile object
+ Handle(HYDROData_Profile) aProfile =
+ Handle(HYDROData_Profile)::DownCast( aDocument->CreateObject( KIND_PROFILE ) );
+ QString aBaseName = GetName() + "_interp_profile";
+ QString aName = HYDROData_Tool::GenerateObjectName( aDocument, aBaseName );
+ aProfile->SetName( aName );
+
+ // Fill the profile with points
+ aProfile->SetProfilePoints( aResultPoints );
+
+ // Add profile to the stream
+ bool isAdded = AddProfile( aProfile );
+ if ( !isAdded ) {
+ aProfile->Remove();
+ }
+ else
+ aProfile->Update();
+ }
+
+ if ( isOK )
+ Update();
+
+ return isOK;
+}
+
+void HYDROData_Stream::CopyTo( const Handle(HYDROData_Entity)& theDestination,
+ bool isGenerateNewName ) const
+{
+ // Get the document
+ Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
+ if ( aDocument.IsNull() ) {
+ return;
+ }
+
+ // Call base method
+ HYDROData_Entity::CopyTo( theDestination, isGenerateNewName );
+
+ Handle(HYDROData_Stream) aStreamCopy =
+ Handle(HYDROData_Stream)::DownCast( theDestination );
+
+ // Copy bottom polyline if exists
+ if ( !aStreamCopy.IsNull() ) {
+ const Handle(HYDROData_Polyline3D) aBottom = GetBottomPolyline();
+ if ( !aBottom.IsNull() ) {
+ aStreamCopy->ClearReferenceObjects( DataTag_BottomPolyline );
+ aStreamCopy->GenerateBottomPolyline();
+ const Handle(HYDROData_Polyline3D) aBottomCopy = aStreamCopy->GetBottomPolyline();
+ if ( !aBottomCopy.IsNull() && !aBottomCopy->GetPolylineXY().IsNull() ) {
+ aBottomCopy->GetPolylineXY()->Update();
+ aBottomCopy->Update();
+ }
+ }
+ }
+}
+
+bool HYDROData_Stream::CreatePresentations( const Handle(TColgp_HArray1OfPnt) theArrayOfFPnt,
+ const Handle(TColgp_HArray1OfPnt) theArrayOfLPnt,
+ const Handle(TopTools_HArray1OfShape) theArrOfProfiles,
+ const Handle(TopTools_HArray1OfShape) theArrOf2DProfiles,
+ PrsDefinition& thePrs )
+{
+ if ( theArrayOfFPnt.IsNull() || theArrayOfLPnt.IsNull() || theArrOfProfiles.IsNull() ) {
+ return false;
+ }
+
+ if ( theArrayOfFPnt->Length() != theArrayOfLPnt->Length() ) {
+ return false;
+ }
+
+ // Construct of the 3D presentation
+ Handle(Geom_BSplineCurve) aBSpline = buildInterpolationCurve (theArrayOfFPnt);
+ if(aBSpline.IsNull())
+ return false;
+
+ TopoDS_Edge anEdgLeft, anEdgRight;
+
+ BRepBuilderAPI_MakeEdge aMakeEdge(aBSpline);
+ if(aMakeEdge.IsDone())
+ anEdgLeft = aMakeEdge.Edge();
+
+ if(anEdgLeft.IsNull())
+ return false;
+
+ aBSpline.Nullify();
+ aBSpline = buildInterpolationCurve (theArrayOfLPnt);
+ if(aBSpline.IsNull())
+ return false;
+
+ aMakeEdge.Init(aBSpline);
+ if(aMakeEdge.IsDone())
+ anEdgRight = aMakeEdge.Edge();
+
+ if(anEdgRight.IsNull())
+ return false;
+
+ BRep_Builder aBB;
+ TopoDS_Compound aCmp;
+ aBB.MakeCompound(aCmp);
+ for (int i=1 ; i < theArrOfProfiles->Length() +1; i++ )
+ aBB.Add(aCmp, theArrOfProfiles->Value(i));
+
+ aBB.Add(aCmp,anEdgLeft);
+ aBB.Add(aCmp,anEdgRight);
+ BRepCheck_Analyzer aCh(aCmp);
+ if(aCh.IsValid())
+ thePrs.myPrs3D = aCmp;
+#ifdef DEB_UPDATE
+ else {
+ BRepTools::Write(aCmp, "str3d.brep");
+ thePrs.myPrs3D = aCmp;
+ }
+#endif
+
+ // Construct the top presentation
+ int aNbPoints = theArrayOfFPnt->Length();
+ Handle(TColgp_HArray1OfPnt) anArrayOfFPnt = new TColgp_HArray1OfPnt(1, aNbPoints);
+ Handle(TColgp_HArray1OfPnt) anArrayOfLPnt = new TColgp_HArray1OfPnt(1, aNbPoints);
+ for( int i=1; i <= aNbPoints; i++ ) {
+ gp_Pnt aPnt = theArrayOfFPnt->Value(i);
+ aPnt.SetZ(.0); // make 2d
+ anArrayOfFPnt->SetValue(i, aPnt);
+ aPnt = theArrayOfLPnt->Value(i);
+ aPnt.SetZ(.0);
+ anArrayOfLPnt->SetValue(i, aPnt);
+ }
+
+ aBSpline.Nullify();
+ aBSpline = buildInterpolationCurve (anArrayOfFPnt);
+ if(aBSpline.IsNull())
+ return false;
+
+ aMakeEdge.Init(aBSpline);
+ if(aMakeEdge.IsDone())
+ anEdgLeft = aMakeEdge.Edge();
+
+ aBSpline.Nullify();
+ aBSpline = buildInterpolationCurve (anArrayOfLPnt);
+ if(aBSpline.IsNull())
+ return false;
+
+ aMakeEdge.Init(aBSpline);
+ if(aMakeEdge.IsDone())
+ anEdgRight = aMakeEdge.Edge();
+ if(anEdgRight.IsNull())
+ return false;
+
+ 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();
+
+ // Make wire for 2D presentation with updating of corresponding edges
+ BRepBuilderAPI_MakeWire aMakeWire;
+
+ aMakeWire.Add( aBotEdge );
+ thePrs.myInlet = aMakeWire.Edge();
+
+ aMakeWire.Add( anEdgLeft );
+ thePrs.myLeftBank = aMakeWire.Edge();
+
+ aMakeWire.Add( aTopEdge );
+ thePrs.myOutlet = aMakeWire.Edge();
+
+ aMakeWire.Add( anEdgRight );
+ thePrs.myRightBank = aMakeWire.Edge();
+
+ 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();
+
+ TopoDS_Shape aPrs2D;
+
+ if ( !theArrOf2DProfiles.IsNull() ) {
+ aCmp.Nullify();
+ aBB.MakeCompound(aCmp);
+ aBB.Add(aCmp,aFace);
+ for(int i=1;i <= theArrOf2DProfiles->Length(); i++)
+ aBB.Add(aCmp, theArrOf2DProfiles->Value(i));
+
+ aPrs2D = aCmp;
+ } else {
+ aPrs2D = aFace;
+ }
+
+ aCh.Init(aPrs2D);
+ if(aCh.IsValid())
+ thePrs.myPrs2D = aPrs2D;
+#ifdef DEB_UPDATE
+ else {
+ BRepTools::Write(aPrs2D, "str2d.brep");
+ thePrs.myPrs2D = aPrs2D;
+ }
+#endif
+
+ return true;
+}
\ No newline at end of file