From 22454636c13f2e97ab7126a782fdd4bdf40905f9 Mon Sep 17 00:00:00 2001 From: szy Date: Fri, 17 Jan 2014 07:59:57 +0000 Subject: [PATCH] 17.01.2014. Workaround for computing point state on the face. --- src/HYDROData/HYDROData_StreamAltitude.cxx | 113 ++++++++++++++++++++- 1 file changed, 108 insertions(+), 5 deletions(-) diff --git a/src/HYDROData/HYDROData_StreamAltitude.cxx b/src/HYDROData/HYDROData_StreamAltitude.cxx index 0b70548d..6692ff0a 100644 --- a/src/HYDROData/HYDROData_StreamAltitude.cxx +++ b/src/HYDROData/HYDROData_StreamAltitude.cxx @@ -31,7 +31,22 @@ #include #include - +#define CLASS2D 1 +#ifdef CLASS2D +#include +#include +#include +#include +#include +#include +#include +#undef _NCollection_MapHasher +#endif +#ifdef DEB_CLASS2D +#include +#include +#include +#endif IMPLEMENT_STANDARD_HANDLE(HYDROData_StreamAltitude, HYDROData_IAltitudeObject) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_StreamAltitude, HYDROData_IAltitudeObject) @@ -128,6 +143,60 @@ Standard_Real getAltitudeFromProfile( const Handle(HYDROData_Profile)& theProfil return aResAlt; } +// =================================== workaround ============================== +// till fix of Classifier2d bug +#ifdef CLASS2D +TopAbs_State ComputePointState(const gp_XY& thePnt2d, const TopoDS_Face& theFace) +{ + TopAbs_State aStatus(TopAbs_UNKNOWN); + TopoDS_Wire aWire; + int nb(0); + TopoDS_Iterator it(theFace); + for(;it.More();it.Next()) { + aWire = TopoDS::Wire(it.Value()); + nb++; + } + if(nb > 1 || aWire.IsNull()) return aStatus; + gp_Pln aPlane; + gp_Vec aNormal; + BRepBuilderAPI_FindPlane fndPlane (theFace, Precision::Confusion()); + if(fndPlane.Found()) + aPlane = fndPlane.Plane()->Pln(); + else + return aStatus; + aNormal = gp_Vec(aPlane.Axis().Direction()); + if(theFace.Orientation() == TopAbs_REVERSED) + aNormal.Reverse(); + gp_Pnt aPoint = gp_Pnt (thePnt2d.X(), thePnt2d.Y(), 0); + TColgp_SequenceOfVec aSeq; + TopTools_MapOfShape aMap; + it.Initialize(aWire); + for (;it.More(); it.Next()) { + const TopoDS_Vertex& aVx = TopExp::FirstVertex(TopoDS::Edge(it.Value()), Standard_True); + if(!aMap.Add(aVx)) + continue; + const gp_Pnt& aCurPnt = BRep_Tool::Pnt(TopoDS::Vertex(aVx)); + if(aPoint.IsEqual(aCurPnt,Precision::Confusion())) { + aStatus = TopAbs_ON; + return aStatus; + } + gp_Vec aVec (aPoint, aCurPnt); + aSeq.Append(aVec); + } + Standard_Real anAng(0.0); + for(int i = 1;i < aSeq.Length();i++) { + const gp_Vec& aV1 = aSeq.Value(i); + const gp_Vec& aV2 = aSeq.Value(i+1); + anAng += aV1.AngleWithRef(aV2, aNormal); + } + anAng += aSeq.Value(aSeq.Length()).AngleWithRef(aSeq.Value(1), aNormal); + if(abs(anAng) > Precision::Angular()) + aStatus = TopAbs_IN; + else + aStatus = TopAbs_OUT; + return aStatus; +} +#endif bool HYDROData_StreamAltitude::getBoundaryProfilesForPoint( const gp_XY& thePoint, Handle(HYDROData_Profile)& theLeftProfile, @@ -169,11 +238,28 @@ bool HYDROData_StreamAltitude::getBoundaryProfilesForPoint( aRightMakeEdge.Edge(), aTopMakeEdge.Edge() ); BRepBuilderAPI_MakeFace aMakeFace( aMakeWire.Wire() ); - + TopoDS_Face aProfilesFace = aMakeFace.Face(); - +#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 BRepTopAdaptor_FClass2d aClassifier( aProfilesFace, Precision::Confusion() ); - TopAbs_State aPointState = aClassifier.Perform( gp_Pnt2d( thePoint ), Standard_False ); + TopAbs_State aPointState = +#ifdef CLASS2D + ComputePointState(thePoint, aProfilesFace); +#else + aClassifier.Perform( gp_Pnt2d( thePoint ), Standard_False ); +#endif +#ifdef DEB_CLASS2D + cout << "Point status is = " << aPointState <