X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_LCM_FaceClassifier.cxx;h=adfa27e3ed1c03fc99b3385bff2abd1c80e8232a;hb=f86cf7ecf17dbae2a1d84e0ebbab07c732208c2f;hp=b2c7a11aa9bd16bd076488a801464121eaf7ba8e;hpb=58bb6b7459bebeeb089c9ed486c4683a8bae7288;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_LCM_FaceClassifier.cxx b/src/HYDROData/HYDROData_LCM_FaceClassifier.cxx index b2c7a11a..adfa27e3 100644 --- a/src/HYDROData/HYDROData_LCM_FaceClassifier.cxx +++ b/src/HYDROData/HYDROData_LCM_FaceClassifier.cxx @@ -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& thePoints, std::vector >& theTypes, std::vector >* theFaces) const @@ -93,8 +98,25 @@ void HYDROData_LCM_FaceClassifier::Classify( const std::vector& 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); }