+// Copyright (C) 2014-2015 EDF-R&D
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
#include "HYDROData_StreamAltitude.h"
#include "HYDROData_Profile.h"
#include "HYDROData_Stream.h"
#include "HYDROData_ShapesTool.h"
-
+#include <HYDROData_Tool.h>
#include <BRep_Tool.hxx>
-#include <BRepTopAdaptor_FClass2d.hxx>
-
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <TopTools_SequenceOfShape.hxx>
-#include <QStringList>
-
-#define PYTHON_STREAM_ALTITUDE_ID "KIND_STREAM_ALTITUDE"
+#include <Geom_Line.hxx>
+#include <QStringList>
+#ifdef DEB_CLASS2D
+#include <BRepTools.hxx>
+#include <BRep_Builder.hxx>
+#include <BRepBuilderAPI_MakeVertex.hxx>
+#endif
IMPLEMENT_STANDARD_HANDLE(HYDROData_StreamAltitude, HYDROData_IAltitudeObject)
IMPLEMENT_STANDARD_RTTIEXT(HYDROData_StreamAltitude, HYDROData_IAltitudeObject)
{
}
-QStringList HYDROData_StreamAltitude::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
-{
- QStringList aResList;
-
- Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab );
- if ( aDocument.IsNull() )
- return aResList;
-
- QString aDocName = aDocument->GetDocPyName();
- QString anAltitudeName = GetName();
-
- aResList << QString( "%1 = %2.CreateObject( %3 );" )
- .arg( anAltitudeName ).arg( aDocName ).arg( PYTHON_STREAM_ALTITUDE_ID );
- aResList << QString( "%1.SetName( \"%2\" );" )
- .arg( anAltitudeName ).arg( anAltitudeName );
-
- // TODO
-
- return aResList;
-}
-
Standard_Real getAltitudeFromProfile( const Handle(HYDROData_Profile)& theProfile,
const Standard_Real& theLeftDist,
const Standard_Real& theRightDist )
Standard_Real aResAlt = 0.0;
gp_XY aFirstPoint, aLastPoint;
- if ( !theProfile->GetLeftPoint( aFirstPoint ) ||
- !theProfile->GetRightPoint( aLastPoint ) )
+ if ( !theProfile->GetLeftPoint( aFirstPoint, false ) ||
+ !theProfile->GetRightPoint( aLastPoint, false ) )
return aResAlt;
gp_Pnt aPnt1( aFirstPoint.X(), aFirstPoint.Y(), 0 );
gp_Pnt aPrevPoint;
gp_Lin aPrevNormal;
- HYDROData_Profile::ProfilePoints aProfilePoints = theProfile->GetProfilePoints();
+ HYDROData_Profile::ProfilePoints aProfilePoints = theProfile->GetProfilePoints( false );
for ( int i = 1, n = aProfilePoints.Length(); i <= n; ++i )
{
gp_Pnt aProfPoint( aProfilePoints.Value( i ) );
continue;
gp_XY aFirstPoint, aLastPoint;
- if ( !aProfile->GetLeftPoint( aFirstPoint ) || !aProfile->GetRightPoint( aLastPoint ) )
+ if ( !aProfile->GetLeftPoint( aFirstPoint, false ) ||
+ !aProfile->GetRightPoint( aLastPoint, false ) )
continue;
gp_Pnt aPnt1( aFirstPoint.X(), aFirstPoint.Y(), 0 );
aRightMakeEdge.Edge(), aTopMakeEdge.Edge() );
BRepBuilderAPI_MakeFace aMakeFace( aMakeWire.Wire() );
-
+
TopoDS_Face aProfilesFace = aMakeFace.Face();
-
- BRepTopAdaptor_FClass2d aClassifier( aProfilesFace, Precision::Confusion() );
- TopAbs_State aPointState = aClassifier.Perform( gp_Pnt2d( thePoint ), Standard_False );
+#ifdef DEB_CLASS2D
+ TopoDS_Compound aCmp;
+ BRep_Builder aBB;
+ aBB.MakeCompound(aCmp);
+ aBB.Add(aCmp, aProfilesFace);
+ gp_Pnt aPnt (thePoint.X(), thePoint.Y(), 0.);
+ BRepBuilderAPI_MakeVertex aMk(aPnt);
+ aBB.Add(aCmp, aMk.Vertex());
+ BRepTools::Write(aCmp, "ProfileFace.brep");
+#endif
+
+ TopAbs_State aPointState = HYDROData_Tool::ComputePointState(thePoint, aProfilesFace);
+
+#ifdef DEB_CLASS2D
+ cout << "Point status is = " << aPointState <<endl;
+#endif
if ( aPointState != TopAbs_OUT )
{
theLeftProfile = aPrevProfile;
TopoDS_Face aStreamFace = TopoDS::Face( aStreamFaceExp.Current() );
// Check if point is inside of stream presentation
- BRepTopAdaptor_FClass2d aClassifier( aStreamFace, Precision::Confusion() );
- TopAbs_State aPointState = aClassifier.Perform( gp_Pnt2d( thePoint ), Standard_False );
+ TopAbs_State aPointState = HYDROData_Tool::ComputePointState(thePoint, aStreamFace);
+
+#ifdef DEB_CLASS2D
+ cout << "Point status is = " << aPointState <<endl;
+ TopoDS_Compound aCmp;
+ BRep_Builder aBB;
+ aBB.MakeCompound(aCmp);
+ aBB.Add(aCmp, aStreamFace);
+ gp_Pnt aPnt (thePoint.X(), thePoint.Y(), 0.);
+ BRepBuilderAPI_MakeVertex aMk(aPnt);
+ aBB.Add(aCmp, aMk.Vertex());
+ BRepTools::Write(aCmp, "FCL2d.brep");
+#endif
if ( aPointState == TopAbs_OUT )
return aResAltitude;
Standard_Real aRightAlt = getAltitudeFromProfile( aRightProfile, aLeftDist, aRightDist );
// Interpolate altitudes
- Standard_Real aFirstCoeff = aLeftDist / ( aLeftDist + aRightDist );
- Standard_Real aSecCoeff = aRightDist / ( aLeftDist + aRightDist );
-
- aResAltitude = aLeftAlt * aFirstCoeff + aRightAlt * aSecCoeff;
+ // Left profile line ( the segment between the firts and the last profile point )
+ HYDROData_Profile::ProfilePoints aLeftProfilePoints = aLeftProfile->GetProfilePoints( false );
+ gp_Pnt aLeftProfileP1( aLeftProfilePoints.First() );
+ aLeftProfileP1.SetZ( 0 );
+ gp_Pnt aLeftProfileP2( aLeftProfilePoints.Last() );
+ aLeftProfileP2.SetZ( 0 );
+ gp_Vec aLeftProfileVec( aLeftProfileP1, aLeftProfileP2 );
+ Handle(Geom_Line) aLeftProfileLine = new Geom_Line( gp_Ax1( aLeftProfileP1, aLeftProfileVec ) );
+ // Right profile line
+ HYDROData_Profile::ProfilePoints aRightProfilePoints = aRightProfile->GetProfilePoints( false );
+ gp_Pnt aRightProfileP1( aRightProfilePoints.First() );
+ aRightProfileP1.SetZ( 0 );
+ gp_Pnt aRightProfileP2( aRightProfilePoints.Last() );
+ aRightProfileP2.SetZ( 0 );
+ gp_Vec aRightProfileVec( aRightProfileP1, aRightProfileP2 );
+ Handle(Geom_Line) aRightProfileLine = new Geom_Line( gp_Ax1( aRightProfileP1, aRightProfileVec ) );
+ // The point projections on the left and right profiles
+ GeomAPI_ProjectPointOnCurve aLeftProfileProject( aPointToTest, aLeftProfileLine );
+ GeomAPI_ProjectPointOnCurve aRightProfileProject( aPointToTest, aRightProfileLine );
+ // The point distance to the left and right profiles
+ Standard_Real aLeftProfileDist = aLeftProfileProject.LowerDistance();
+ Standard_Real aRightProfileDist = aRightProfileProject.LowerDistance();
+ // The coefficients
+ Standard_Real aFirstCoeff = aLeftProfileDist / ( aLeftProfileDist + aRightProfileDist );
+ Standard_Real aSecCoeff = aRightProfileDist / ( aLeftProfileDist + aRightProfileDist );
+
+ aResAltitude = aLeftAlt * ( 1 - aFirstCoeff ) + aRightAlt * ( 1 - aSecCoeff );
return aResAltitude;
}