]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
17.01.2014. Redesign of workaround for calcualtion point state.
authorszy <szy@opencascade.com>
Fri, 17 Jan 2014 14:02:02 +0000 (14:02 +0000)
committerszy <szy@opencascade.com>
Fri, 17 Jan 2014 14:02:02 +0000 (14:02 +0000)
src/HYDROData/HYDROData_CalculationCase.cxx
src/HYDROData/HYDROData_StreamAltitude.cxx
src/HYDROData/HYDROData_Tool.cxx
src/HYDROData/HYDROData_Tool.h

index bfce3af46610d7a9b3923c18d25fa08c2030d7f1..9e05aa3f19bda6a4158aea5d4b73721c497d7083 100644 (file)
@@ -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)
index 656bbdc1670580363f499ea5031078759bf1ffac..bb8aa4e7610b4a9e2a474e770273ede71569edad 100644 (file)
@@ -5,11 +5,9 @@
 #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 CLASS2D 1
-#ifdef CLASS2D
-#include <gp_Pln.hxx>
-#include <TopExp.hxx>
-#include <Geom_Plane.hxx>
-#include <BRepBuilderAPI_FindPlane.hxx>
-#include <TopoDS_Vertex.hxx>
-#include <TColgp_SequenceOfVec.hxx>
-#include <TopTools_ShapeMapHasher.hxx>
-#undef _NCollection_MapHasher
-#endif
+
 #ifdef DEB_CLASS2D
 #include <BRepTools.hxx>
 #include <BRep_Builder.hxx>
@@ -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 <<endl;
 #endif
@@ -283,13 +213,7 @@ double HYDROData_StreamAltitude::GetAltitudeForPoint( const gp_XY& thePoint ) co
   TopoDS_Face aStreamFace = TopoDS::Face( aStreamFaceExp.Current() );
 
   // Check if point is inside of stream presentation
-  BRepTopAdaptor_FClass2d aClassifier( aStreamFace, Precision::Confusion() );
-  TopAbs_State aPointState = 
-#ifdef CLASS2D
-    ComputePointState(thePoint, aStreamFace);
-#else 
-    aClassifier.Perform( gp_Pnt2d( thePoint ), Standard_False );
-#endif
+  TopAbs_State aPointState = HYDROData_Tool::ComputePointState(thePoint, aStreamFace);
 
 #ifdef DEB_CLASS2D
       cout << "Point status is = " << aPointState <<endl;
index 072b0d2290baa22a03bf24b3bb9c701281c0d07c..e5b45109b0f778544d8d0866a31437d952a26530 100644 (file)
@@ -6,10 +6,7 @@
 #include "HYDROData_Iterator.h"
 #include "HYDROData_NaturalObject.h"
 
-#include <TopoDS_Shape.hxx>
-
 #include <TopTools_SequenceOfShape.hxx>
-
 #include <TopExp_Explorer.hxx>
 
 #include <QFile>
 #include <QTextStream>
 
 #include <limits>
-
+#define CLASS2D 1
+#ifdef CLASS2D
+#include <gp_Pnt.hxx>
+#include <gp_Vec.hxx>
+#include <gp_Pln.hxx>
+#include <TopExp.hxx>
+#include <Geom_Plane.hxx>
+#include <BRep_Tool.hxx>
+#include <BRepBuilderAPI_FindPlane.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Vertex.hxx>
+#include <TopoDS_Wire.hxx>
+#include <TopoDS_Face.hxx>
+#include <TopoDS_Iterator.hxx>
+#include <TopTools_MapOfShape.hxx>
+#include <TColgp_SequenceOfVec.hxx>
+#include <TopTools_ShapeMapHasher.hxx>
+#undef _NCollection_MapHasher
+#endif
 static int aMaxNameId = std::numeric_limits<int>::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
index 6dc38124e46804c95e8e3c162917be02e9c3f48f..d2260e781100c6601d95b13801a7f0f0a269781b 100644 (file)
@@ -11,6 +11,8 @@
 
 #include <QString>
 #include <QStringList>
+#include <gp_XY.hxx>
+#include <TopoDS_Face.hxx>
 
 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 )