From 216399653492d563cd2855580fa4275e61ee0495 Mon Sep 17 00:00:00 2001 From: szy Date: Fri, 17 Jan 2014 14:02:02 +0000 Subject: [PATCH] 17.01.2014. Redesign of workaround for calcualtion point state. --- src/HYDROData/HYDROData_CalculationCase.cxx | 5 +- src/HYDROData/HYDROData_StreamAltitude.cxx | 90 ++------------------- src/HYDROData/HYDROData_Tool.cxx | 86 ++++++++++++++++++-- src/HYDROData/HYDROData_Tool.h | 8 ++ 4 files changed, 98 insertions(+), 91 deletions(-) diff --git a/src/HYDROData/HYDROData_CalculationCase.cxx b/src/HYDROData/HYDROData_CalculationCase.cxx index bfce3af4..9e05aa3f 100644 --- a/src/HYDROData/HYDROData_CalculationCase.cxx +++ b/src/HYDROData/HYDROData_CalculationCase.cxx @@ -627,9 +627,8 @@ HYDROData_CalculationCase::PointClassification HYDROData_CalculationCase::GetPoi TopoDS_Face aZoneFace = TopoDS::Face( theZone->GetShape() ); if ( aZoneFace.IsNull() ) return aRes; - - BRepTopAdaptor_FClass2d aClassifier( aZoneFace, Precision::Confusion() ); - TopAbs_State State = aClassifier.Perform( gp_Pnt2d(thePoint), Standard_False ); + + TopAbs_State State = HYDROData_Tool::ComputePointState(thePoint, aZoneFace); if (State == TopAbs_OUT) aRes = POINT_OUT; else if(State == TopAbs_IN) diff --git a/src/HYDROData/HYDROData_StreamAltitude.cxx b/src/HYDROData/HYDROData_StreamAltitude.cxx index 656bbdc1..bb8aa4e7 100644 --- a/src/HYDROData/HYDROData_StreamAltitude.cxx +++ b/src/HYDROData/HYDROData_StreamAltitude.cxx @@ -5,11 +5,9 @@ #include "HYDROData_Profile.h" #include "HYDROData_Stream.h" #include "HYDROData_ShapesTool.h" - +#include #include -#include - #include #include #include @@ -31,17 +29,7 @@ #include #include -#define CLASS2D 1 -#ifdef CLASS2D -#include -#include -#include -#include -#include -#include -#include -#undef _NCollection_MapHasher -#endif + #ifdef DEB_CLASS2D #include #include @@ -129,60 +117,6 @@ 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, @@ -235,14 +169,10 @@ bool HYDROData_StreamAltitude::getBoundaryProfilesForPoint( BRepBuilderAPI_MakeVertex aMk(aPnt); aBB.Add(aCmp, aMk.Vertex()); BRepTools::Write(aCmp, "ProfileFace.brep"); -#endif - BRepTopAdaptor_FClass2d aClassifier( aProfilesFace, Precision::Confusion() ); - TopAbs_State aPointState = -#ifdef CLASS2D - ComputePointState(thePoint, aProfilesFace); -#else - aClassifier.Perform( gp_Pnt2d( thePoint ), Standard_False ); -#endif +#endif + + TopAbs_State aPointState = HYDROData_Tool::ComputePointState(thePoint, aProfilesFace); + #ifdef DEB_CLASS2D cout << "Point status is = " << aPointState < - #include - #include #include @@ -17,7 +14,25 @@ #include #include - +#define CLASS2D 1 +#ifdef CLASS2D +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#undef _NCollection_MapHasher +#endif static int aMaxNameId = std::numeric_limits::max(); void HYDROData_Tool::WriteStringsToFile( QFile& theFile, @@ -210,4 +225,65 @@ QString HYDROData_Tool::GenerateNameForPython( const MapOfTreatedObjects& theTre } return aName; -} \ No newline at end of file +} +//====================================================================================================== +// the Face to be: planer, whitout holes +#ifdef CLASS2D +TopAbs_State HYDROData_Tool::ComputePointState( const gp_XY& thePnt2d, const TopoDS_Face& theFace ) +{ + TopAbs_State aState(TopAbs_UNKNOWN); + if(theFace.IsNull()) return aState; + +#ifdef CLASS2D + 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 aState; + gp_Pln aPlane; + gp_Vec aNormal; + BRepBuilderAPI_FindPlane fndPlane (theFace, Precision::Confusion()); + if(fndPlane.Found()) + aPlane = fndPlane.Plane()->Pln(); + else + return aState; + 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())) { + aState = TopAbs_ON; + return aState; + } + 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()) + aState = TopAbs_IN; + else + aState = TopAbs_OUT; + +#else + BRepTopAdaptor_FClass2d aClassifier( theFace, Precision::Confusion() ); + aState = aClassifier.Perform( gp_Pnt2d( thePoint ), Standard_False ); +#endif + return aState; +} +#endif \ No newline at end of file diff --git a/src/HYDROData/HYDROData_Tool.h b/src/HYDROData/HYDROData_Tool.h index 6dc38124..d2260e78 100644 --- a/src/HYDROData/HYDROData_Tool.h +++ b/src/HYDROData/HYDROData_Tool.h @@ -11,6 +11,8 @@ #include #include +#include +#include class QFile; class TopoDS_Shape; @@ -92,6 +94,12 @@ public: */ static QString GenerateNameForPython( const MapOfTreatedObjects& theTreatedObjects, const QString& thePrefix ); + /** + * Computes Point State from TopAbs (simplified & limited method). + */ + + static TopAbs_State ComputePointState( const gp_XY& thePnt2d, + const TopoDS_Face& theFace ); }; inline bool ValuesEquals( const double& theFirst, const double& theSecond ) -- 2.39.2