]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
refs #1100
authorisn <isn@opencascade.com>
Thu, 15 Dec 2016 11:14:25 +0000 (14:14 +0300)
committerisn <isn@opencascade.com>
Thu, 15 Dec 2016 11:14:25 +0000 (14:14 +0300)
src/HYDROData/HYDROData_DTM.cxx
src/HYDROData/HYDROData_Object.cxx

index 2c96221db00810397c763a7f2ec6c88066a68bac..6678a8b90035bef1d3d4e70e2c7bec180cd0bc87 100644 (file)
@@ -534,13 +534,14 @@ Handle_Geom2d_BSplineCurve HYDROData_DTM::CreateHydraulicAxis(
   TColgp_Array1OfVec2d tangents( 1, (int)n );
   Handle(TColStd_HArray1OfBoolean) flags = new TColStd_HArray1OfBoolean( 1, (int)n );
 
-  for( size_t i = 1; i <= n; i++ )
+  // Stage 1. Orient all profiles to be co-oriented with the first profile
+  theProfiles[0]->Update();
+  for( size_t i = 1; i < n; i++ )
   {
-    Handle_HYDROData_Profile aProfile = theProfiles[i-1];
-    Handle_HYDROData_Profile aPrevProfile = i==1 ? theProfiles[i-1] : theProfiles[i-2];
-    Handle_HYDROData_Profile aNextProfile = i==n ? theProfiles[i-1] : theProfiles[i];
+    Handle_HYDROData_Profile aProfile = theProfiles[i];
+    Handle_HYDROData_Profile aPrevProfile = theProfiles[i-1];
 
-    if( !IsCooriented( aProfile, aNextProfile ) )
+    if( !IsCooriented( aProfile, aPrevProfile ) )
     {
       gp_XY lp, rp;
       aProfile->GetLeftPoint( lp, true );
@@ -549,20 +550,22 @@ Handle_Geom2d_BSplineCurve HYDROData_DTM::CreateHydraulicAxis(
       aProfile->SetRightPoint( lp, true );
     }
     aProfile->Update();
+  }
+
+  // Stage 2. Calculate normals so that each normal "points" to the next profile
+  for( size_t i = 0; i < n; i++ )
+  {
+    Handle_HYDROData_Profile aProfile = theProfiles[i];
+    Handle_HYDROData_Profile aNextProfile = i==n-1 ? theProfiles[i-1] : theProfiles[i+1];
 
     gp_Pnt aLowest;
     gp_Vec2d aNormal;
     double zmin, zmax;
 
-    gp_XYZ curP = aProfile->GetBottomPoint();
+    gp_XYZ curP = aProfile->GetBottomPoint(true);
     gp_XY curP2d = gp_XY(curP.X(), curP.Y());
 
-    gp_XYZ nextP;
-    if( i==n )
-      nextP = aPrevProfile->GetBottomPoint(true);
-    else
-      nextP = aNextProfile->GetBottomPoint(true);
-
+    gp_XYZ nextP = aNextProfile->GetBottomPoint(true);
     gp_XY nextP2d = gp_XY(nextP.X(), nextP.Y());
 
     gp_Vec2d aPrTangent;
@@ -570,16 +573,17 @@ Handle_Geom2d_BSplineCurve HYDROData_DTM::CreateHydraulicAxis(
     aNormal.SetCoord( -aPrTangent.Y(), aPrTangent.X() );
 
     gp_Vec2d aDirToNextProfile(nextP2d.X() - curP2d.X(), nextP2d.Y() - curP2d.Y() );
-    if( i==n )
+    if( i==n-1 )
       aDirToNextProfile.Reverse();
+
     if (aNormal.Dot(aDirToNextProfile) < 0)
       aNormal.Reverse();
 
     aNormal.Normalize();
 
-    points->SetValue( (int)i, gp_Pnt2d( aLowest.X(), aLowest.Y() ) );
-    tangents.SetValue( (int)i, aNormal );
-    flags->SetValue( (int)i, Standard_True );
+    points->SetValue( (int)(i+1), gp_Pnt2d( aLowest.X(), aLowest.Y() ) );
+    tangents.SetValue( (int)(i+1), aNormal );
+    flags->SetValue( (int)(i+1), Standard_True );
   }
 
   Geom2dAPI_Interpolate anInterpolator( points, Standard_False, Standard_False );
index 93499b742335d4787b5b438ab74b44875a3b7f80..7745ee0f0a9eb885e9ea98de3e6b4d15de3c788a 100644 (file)
@@ -317,8 +317,8 @@ void HYDROData_Object::checkAndSetAltitudeObject()
   if ( anAltitudeObjectType == KIND_UNKNOWN )
     return; // No need to create altitude object
 
-  TDF_Label aLabel = myLab.FindChild( DataTag_ChildAltitudeObject, false );
-  if ( !aLabel.IsNull() )
+  Handle(HYDROData_IAltitudeObject) altObject = GetAltitudeObject();
+  if( !altObject.IsNull() && altObject->GetKind()==anAltitudeObjectType )
     return;
 
   TDF_Label aChildLabel = myLab.FindChild( DataTag_ChildAltitudeObject ).FindChild( 0 );