Salome HOME
#refs 522 (very draft) //import only
[modules/hydro.git] / src / HYDROData / HYDROData_Stream.cxx
index 9573c8bd0b4457be805e08d9928a94645683b321..6ffdd0ee43ec1d1110e89b351d5c97bcb11b6e30 100644 (file)
 
 #include "HYDROData_Document.h"
 #include "HYDROData_PolylineXY.h"
+#include "HYDROData_Polyline3D.h"
 #include "HYDROData_Profile.h"
 #include "HYDROData_ShapesGroup.h"
 #include "HYDROData_ShapesTool.h"
 #include "HYDROData_IAltitudeObject.h"
+#include "HYDROData_IProfilesInterpolator.h"
+#include "HYDROData_Tool.h"
 
 #include <TDataStd_RealArray.hxx>
 
@@ -119,6 +122,12 @@ QStringList HYDROData_Stream::DumpToPython( MapOfTreatedObjects& theTreatedObjec
     setPythonReferenceObject( theTreatedObjects, aResList, aProfile, "AddProfile" );
   }
 
+  // Set bottom polyline if exists
+  const Handle(HYDROData_Polyline3D) aBottomPolyline = GetBottomPolyline();
+  if ( !aBottomPolyline.IsNull() ) {
+    setPythonReferenceObject( theTreatedObjects, aResList, aBottomPolyline, "SetBottomPolyline" );
+  }
+
   aResList << QString( "" );
   aResList << QString( "%1.Update();" ).arg( aName );
   aResList << QString( "" );
@@ -164,6 +173,19 @@ Handle(Geom_BSplineCurve) HYDROData_Stream::buildInterpolationCurve(
 void HYDROData_Stream::Update()
 {
   updateProfilesOrder();
+
+  // Update bottom polyline if exists
+  const Handle(HYDROData_Polyline3D) aBottomPolyline = GetBottomPolyline();
+  if ( !aBottomPolyline.IsNull() ) {
+    if ( GenerateBottomPolyline() ) {
+      Handle(HYDROData_PolylineXY) aPolylineXY = aBottomPolyline->GetPolylineXY();
+      if ( !aPolylineXY.IsNull() ) {
+        aPolylineXY->Update();
+      }
+      aBottomPolyline->Update();
+    }
+  }
+
   UpdatePrs();
 }
 
@@ -382,7 +404,7 @@ void HYDROData_Stream::UpdatePrs()
   anInGroup->AddShape( aResultPrs.myInlet );
 
   QString anOutGroupName = GetName() + "_Outlet";
-
+  
   Handle(HYDROData_ShapesGroup) anOutGroup = createGroupObject();
   anOutGroup->SetName( anOutGroupName );
   anOutGroup->AddShape( aResultPrs.myOutlet );
@@ -997,3 +1019,197 @@ void HYDROData_Stream::removeParameter( const int& theIndex )
 
   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 );
+
+  // Fill 2D polyline
+  for ( int i = 1; i <= aNbBottomPoints; i++ ) {
+    const HYDROData_Profile::ProfilePoint& aBottomPoint = aBottomPoints.Value( i );
+    aPolylineXY->AddPoint( 0, HYDROData_PolylineXY::Point( aBottomPoint.X(), aBottomPoint.Y() ) );
+  }
+  
+  // Calculate profile UZ points
+
+  // First point
+  const HYDROData_Profile::ProfilePoint& aFirstBottomPoint = aBottomPoints.First();
+  aProfileUZ->AddPoint( 0, HYDROData_ProfileUZ::Point( 0, aFirstBottomPoint.Z() ) );
+
+  // Intermediate points
+  double aPolylineCommonDist = aPolylineXY->GetDistance( 0, aPolylineXY->NbPoints( 0 ) - 1 );
+
+  for ( int i = 2, aNbPoints = aBottomPoints.Size(); i < aNbPoints; i++ ) {
+    const HYDROData_Profile::ProfilePoint& aBottomPoint = aBottomPoints.Value( i );
+    
+    double aDistance = aPolylineXY->GetDistance( 0, i - 1 );
+    
+    Standard_Real anU = aDistance; // = ( aDistance / aPolylineCommonDist ) * aPolylineCommonDist;
+    aProfileUZ->AddPoint( 0, HYDROData_ProfileUZ::Point( anU, aBottomPoint.Z() ) );
+  }
+  
+  // Last point
+  const HYDROData_Profile::ProfilePoint& aLastBottomPoint = aBottomPoints.Last();
+  aProfileUZ->AddPoint( 0, HYDROData_ProfileUZ::Point( aPolylineCommonDist, aLastBottomPoint.Z() ) );
+  
+  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 ) const
+{
+  // Get the document
+  Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
+  if ( aDocument.IsNull() ) {
+    return;
+  }
+
+  // Call base method
+  HYDROData_Entity::CopyTo( theDestination );
+
+  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();
+      }
+    }
+  }
+}
\ No newline at end of file