X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_ChannelAltitude.cxx;h=413685f83f3ddbc4a8874ec8de21e856ee2d10c5;hb=cde2ec476486fcd7c9b7b38ce814c648d73e7fd3;hp=4031dc82b2761fd4a9425a4163610ca9659061f0;hpb=5875b067c1dffa0bd68b31c018b0ee4091775344;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_ChannelAltitude.cxx b/src/HYDROData/HYDROData_ChannelAltitude.cxx index 4031dc82..413685f8 100644 --- a/src/HYDROData/HYDROData_ChannelAltitude.cxx +++ b/src/HYDROData/HYDROData_ChannelAltitude.cxx @@ -23,6 +23,8 @@ #include "HYDROData_Channel.h" #include "HYDROData_Projection.h" #include "HYDROData_Polyline3D.h" +#include "HYDROData_PolylineXY.h" +#include "HYDROData_ProfileUZ.h" #include "HYDROData_Profile.h" #define _DEVDEBUG_ @@ -65,7 +67,7 @@ HYDROData_ChannelAltitude::~HYDROData_ChannelAltitude() double HYDROData_ChannelAltitude::GetAltitudeForPoint( const gp_XY& thePoint ) const { - DEBTRACE("HYDROData_ChannelAltitude::GetAltitudeForPoint"); + DEBTRACE("GetAltitudeForPoint p(" << thePoint.X() << ", " << thePoint.Y() << ")"); double aResAltitude = GetInvalidAltitude(); Handle(HYDROData_Channel) aChannel = @@ -76,26 +78,46 @@ double HYDROData_ChannelAltitude::GetAltitudeForPoint( const gp_XY& thePoint ) c return aResAltitude; } DEBTRACE("aChannel: " << aChannel->GetName().toStdString()); + Handle(HYDROData_Polyline3D) aGuideLine = aChannel->GetGuideLine(); if (aGuideLine.IsNull()) { DEBTRACE("aGuideLine.IsNull()"); return aResAltitude; } - DEBTRACE("aGuideLine: " << aGuideLine->GetName().toStdString()); + //DEBTRACE("aGuideLine: " << aGuideLine->GetName().toStdString()); + + Handle(HYDROData_PolylineXY) aGuideXY = aGuideLine->GetPolylineXY(); + if (aGuideXY.IsNull()) + { + DEBTRACE("aGuideXY.IsNull()"); + return aResAltitude; + } + //DEBTRACE("aGuideXY: " << aGuideXY->GetName().toStdString()); + + Handle(HYDROData_ProfileUZ) aGuideUZ = aGuideLine->GetProfileUZ(); + if (aGuideUZ.IsNull()) + { + aGuideUZ = aGuideLine->GetChildProfileUZ(); // profile obtained from bathymetry + } + if (aGuideUZ.IsNull()) + { + DEBTRACE("aGuideUZ.IsNull()"); + return aResAltitude; + } + //DEBTRACE("aGuideUZ: " << aGuideUZ->GetName().toStdString()); + Handle (HYDROData_Profile) aProfile = aChannel->GetProfile(); if (aProfile.IsNull()) { return aResAltitude; } - DEBTRACE("aProfile: " << aProfile->GetName().toStdString()); + //DEBTRACE("aProfile: " << aProfile->GetName().toStdString()); // --- See GEOMImpl_ProjectionDriver.cxx - TopoDS_Shape aShape = aGuideLine->GetShape3D(); - double middleZ = -9999; - aGuideLine->GetMiddleZ(middleZ); // use the middle Z value of the 3d line to help the projection. - gp_Pnt P1(thePoint.X(), thePoint.Y(), middleZ); + TopoDS_Shape aShape = aGuideXY->GetShape(); + gp_Pnt P1(thePoint.X(), thePoint.Y(), 0); TopoDS_Shape aPoint = BRepBuilderAPI_MakeVertex(P1).Shape(); if (aPoint.IsNull() || aShape.IsNull()) @@ -225,23 +247,72 @@ double HYDROData_ChannelAltitude::GetAltitudeForPoint( const gp_XY& thePoint ) c // Store the valid solution. hasValidSolution = Standard_True; - // Normalize parameter. - TopoDS_Edge aSupportEdge = TopoDS::Edge(aSupportShape); - Standard_Real aF, aL; - - BRep_Tool::Range(aSupportEdge, aF, aL); - - if (Abs(aL - aF) <= aTolConf) + // profile altitude at projection point + HYDROData_IPolyline::PointsList aProfilePoints = aGuideUZ->GetPoints(); + if ( aProfilePoints.IsEmpty() ) { - DEBTRACE("Projection aborted : degenerated projection edge"); + DEBTRACE("empty profile UZ"); return aResAltitude; } + double aDepth = HYDROData_ProfileUZ::GetDepthFromDistance( aProfilePoints, aParam ); + //DEBTRACE("profile altitude: " << aDepth); + + // Compute edge index. + TopExp_Explorer anExp(aShape, TopAbs_EDGE); + int anIndex = 0; + for (; anExp.More(); anExp.Next(), anIndex++) + { + if (aSupportShape.IsSame(anExp.Current())) + { + break; + } + } - // Construct a projection vertex. + // get the XY distance from point to guideline const gp_Pnt &aPntProj = aDistShSh.PointOnShape2(i); - TopoDS_Shape aProj = BRepBuilderAPI_MakeVertex(aPntProj).Shape(); - DEBTRACE("projection: (" << aPntProj.X() << ", " << aPntProj.Y() << ", " << aPntProj.Z() << ")"); - return aPntProj.Z() + 2.; + //DEBTRACE("projection: (" << aPntProj.X() << ", " << aPntProj.Y() << ", " << aPntProj.Z() << ")"); + gp_XY aProjXY = gp_XY(aPntProj.X(), aPntProj.Y()); + aProjXY.Subtract(thePoint); + double distance = aProjXY.Modulus(); + //DEBTRACE("distance to guideline " << distance); + + // get delta altitude on section (supposed symmetric) from guideline distance (aParam) + double delta = 0; + int i1 = 0; + gp_XY pt1 = gp_XY(); + gp_XY pt2 = gp_XY(); + HYDROData_ProfileUZ::PointsList aSectionPoints = aProfile->GetParametricPoints(); + for ( int i = 1, aNbPoints = aSectionPoints.Size(); i <= aNbPoints; ++i ) + { + const HYDROData_IPolyline::Point& aPolylinePoint = aSectionPoints.Value( i ); + //DEBTRACE(" profile point: " << aPolylinePoint.X() << " " << aPolylinePoint.Y()); + if (aPolylinePoint.X() < distance) + { + i1 = i; + pt1 = aPolylinePoint; + } + if (aPolylinePoint.X() >= distance) + { + pt2 = aPolylinePoint; + break; + } + } + if ((i1 == 0) && (distance > 0)) + { + DEBTRACE("Projection aborted : non centered profile"); + return aResAltitude; + } + if (i1 == aProfilePoints.Size()) // distance >= profile width + { + delta = pt1.Y(); + } + else + { + delta = pt1.Y() + (pt2.Y() - pt1.Y())*(distance -pt1.X())/(pt2.X()-pt1.X()); + } + aResAltitude = delta + aDepth; + DEBTRACE("distance XY: "<< aParam << " distance to guideline: " << distance << " final altitude: " << aResAltitude << " delta: " << delta); + return aResAltitude; } }