Salome HOME
land cover map icon
[modules/hydro.git] / src / HYDROData / HYDROData_LCM_FaceClassifier.cxx
index b2c7a11aa9bd16bd076488a801464121eaf7ba8e..adfa27e3ed1c03fc99b3385bff2abd1c80e8232a 100644 (file)
@@ -40,14 +40,11 @@ Standard_Boolean HYDROData_FaceClassifier_BndBoxTreeSelector::Accept (const Stan
   if(f.IsNull()) 
     return Standard_False;
 
-  BRepTopAdaptor_FClass2d* class2d = myMapF2Class2d.FindFromKey(f);
-  
-  TopLoc_Location L;
-  Handle(Geom_Surface) C = BRep_Tool::Surface(f, L);
-  Handle(Geom_Plane) Pl = Handle(Geom_Plane)::DownCast(C->Transformed(L.Transformation()));
+  BRepTopAdaptor_FClass2d* class2d = myMapF2Class2d.FindFromKey(f);  
+
+  Handle(Geom_Plane) Pl = HYDROData_LCM_FaceClassifier::GetPlane(f);
   Standard_Real u, v;
   ElSLib::Parameters(Pl->Pln(), gp_Pnt(myP.X(), myP.Y(), 0.0), u, v);
-
   TopAbs_State aState = class2d->Perform( gp_Pnt2d(u, v), Standard_False );
 
   if (aState == TopAbs_IN)
@@ -66,6 +63,14 @@ Standard_Boolean HYDROData_FaceClassifier_BndBoxTreeSelector::Accept (const Stan
 
 }
 
+Handle(Geom_Plane) HYDROData_LCM_FaceClassifier::GetPlane(const TopoDS_Face& F)
+{
+  TopLoc_Location L;
+  Handle(Geom_Surface) S = BRep_Tool::Surface(F, L);
+  Handle(Geom_Plane) Pl = Handle(Geom_Plane)::DownCast(S->Transformed(L.Transformation()));
+  return Pl;
+}
+
 void HYDROData_LCM_FaceClassifier::Classify( const std::vector<gp_XY>& thePoints, 
                                              std::vector<std::set <QString> >& theTypes,
                                              std::vector<NCollection_Map<TopoDS_Face> >* theFaces) const
@@ -93,8 +98,25 @@ void HYDROData_LCM_FaceClassifier::Classify( const std::vector<gp_XY>& thePoints
     Bnd_Box2d B;
     const TopoDS_Face& F = TopoDS::Face(aFaces(i));
     BRepTools::AddUVBounds(F, B);
-    aTreeFiller.Add(i, B);
-    BRepTopAdaptor_FClass2d* aClass2d = new BRepTopAdaptor_FClass2d( F, 0 );
+
+    //convert 2d space of planar face to the 3d space of given points 
+    //this is more faster way then getting of bnd3d of faces and project them on plane...
+    Handle(Geom_Plane) Pl = HYDROData_LCM_FaceClassifier::GetPlane(F);
+    gp_Trsf RT;
+    RT.SetTransformation(Pl->Position());
+    RT.Invert();
+    double xmin, ymin, xmax, ymax; 
+    B.Get(xmin, ymin, xmax, ymax);
+    gp_Pnt MinP(xmin, ymin, 0), MaxP(xmax, ymax, 0);
+    MinP.Transform(RT);
+    MaxP.Transform(RT);
+    gp_Pnt2d MinPT(MinP.X(), MinP.Y());
+    gp_Pnt2d MaxPT(MaxP.X(), MaxP.Y());
+    Bnd_Box2d NB;
+    NB.Update(MinPT.X(), MinPT.Y(), MaxPT.X(), MaxPT.Y() );
+
+    aTreeFiller.Add(i, NB);
+    BRepTopAdaptor_FClass2d* aClass2d = new BRepTopAdaptor_FClass2d( F, 1E-7 );
     aMapF2Class2d.Add(F, aClass2d);
     fclass2dpointers.push_back(aClass2d);
   }