1 // Copyright (C) 2014-2015 EDF-R&D
2 // This library is free software; you can redistribute it and/or
3 // modify it under the terms of the GNU Lesser General Public
4 // License as published by the Free Software Foundation; either
5 // version 2.1 of the License, or (at your option) any later version.
7 // This library is distributed in the hope that it will be useful,
8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10 // Lesser General Public License for more details.
12 // You should have received a copy of the GNU Lesser General Public
13 // License along with this library; if not, write to the Free Software
14 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #include "HYDROData_LCM_FaceClassifier.h"
21 #include <HYDROData_LandCoverMap.h>
22 #include <Bnd_Box2d.hxx>
23 #include <BRepTools.hxx>
24 #include <NCollection_UBTree.hxx>
25 #include <NCollection_UBTreeFiller.hxx>
26 #include <BRepTopAdaptor_FClass2d.hxx>
28 #include <TopTools_IndexedMapOfShape.hxx>
29 #include <Geom_Plane.hxx>
30 #include <BRep_Tool.hxx>
31 #include <Geom_Surface.hxx>
34 Standard_Boolean HYDROData_FaceClassifier_BndBoxTreeSelector::Accept (const Standard_Integer& theObj)
36 if (theObj > myMapF2Class2d.Extent())
37 return Standard_False;
39 const TopoDS_Face& f = TopoDS::Face(myMapF2Class2d.FindKey(theObj));
41 return Standard_False;
43 BRepTopAdaptor_FClass2d* class2d = myMapF2Class2d.FindFromKey(f);
45 Handle(Geom_Plane) Pl = HYDROData_LCM_FaceClassifier::GetPlane(f);
47 ElSLib::Parameters(Pl->Pln(), gp_Pnt(myP.X(), myP.Y(), 0.0), u, v);
48 TopAbs_State aState = class2d->Perform( gp_Pnt2d(u, v), Standard_False );
50 if (aState == TopAbs_IN)
53 myStop = 1; //no more faces includes this point; quit
56 else if (aState == TopAbs_ON)
62 return Standard_False;
66 Handle(Geom_Plane) HYDROData_LCM_FaceClassifier::GetPlane(const TopoDS_Face& F)
69 Handle(Geom_Surface) S = BRep_Tool::Surface(F, L);
70 Handle(Geom_Plane) Pl = Handle(Geom_Plane)::DownCast(S->Transformed(L.Transformation()));
74 void HYDROData_LCM_FaceClassifier::Classify( const std::vector<gp_XY>& thePoints,
75 std::vector<std::set <QString> >& theTypes,
76 std::vector<NCollection_Map<TopoDS_Face> >* theFaces) const
78 HYDROData_LandCoverMap::Explorer anIt( *myLCM );
79 HYDROData_MapOfFaceToStricklerType aMapF2ST;
80 TopTools_IndexedMapOfShape aFaces;
81 for( ; anIt.More(); anIt.Next() )
83 const TopoDS_Face& F = anIt.Face();
84 aMapF2ST.Add(F, anIt.StricklerType());
88 HYDROData_FaceClassifier_BndBoxTree aTree;
89 NCollection_UBTreeFiller <Standard_Integer, Bnd_Box2d> aTreeFiller (aTree);
90 NCollection_IndexedDataMap<TopoDS_Face, BRepTopAdaptor_FClass2d*> aMapF2Class2d;
92 int NbF = aFaces.Extent();
93 std::vector<BRepTopAdaptor_FClass2d*> fclass2dpointers;
94 fclass2dpointers.reserve(NbF);
96 for (int i = 1; i <= NbF; i++)
99 const TopoDS_Face& F = TopoDS::Face(aFaces(i));
100 BRepTools::AddUVBounds(F, B);
102 //convert 2d space of planar face to the 3d space of given points
103 //this is more faster way then getting of bnd3d of faces and project them on plane...
104 Handle(Geom_Plane) Pl = HYDROData_LCM_FaceClassifier::GetPlane(F);
106 RT.SetTransformation(Pl->Position());
108 double xmin, ymin, xmax, ymax;
109 B.Get(xmin, ymin, xmax, ymax);
110 gp_Pnt MinP(xmin, ymin, 0), MaxP(xmax, ymax, 0);
113 gp_Pnt2d MinPT(MinP.X(), MinP.Y());
114 gp_Pnt2d MaxPT(MaxP.X(), MaxP.Y());
116 NB.Update(MinPT.X(), MinPT.Y(), MaxPT.X(), MaxPT.Y() );
118 aTreeFiller.Add(i, NB);
119 BRepTopAdaptor_FClass2d* aClass2d = new BRepTopAdaptor_FClass2d( F, 1E-7 );
120 aMapF2Class2d.Add(F, aClass2d);
121 fclass2dpointers.push_back(aClass2d);
126 size_t pntsize = thePoints.size();
127 theTypes.resize(pntsize);
129 theFaces->resize(pntsize);
131 Standard_Integer aSel = 0;
132 for (size_t i = 0; i < pntsize; i++ )
134 HYDROData_FaceClassifier_BndBoxTreeSelector aSelector(aMapF2Class2d);
135 const gp_Pnt2d& pnt2d = thePoints[i];
136 aSelector.SetCurrentPoint(pnt2d);
137 aSel = aTree.Select(aSelector);
140 const NCollection_List<TopoDS_Face>& rf = aSelector.GetResFaces();
141 NCollection_List<TopoDS_Face>::Iterator it(rf);
142 for (;it.More();it.Next())
144 const TopoDS_Face& f = it.Value();
145 QString aST = aMapF2ST.FindFromKey(f);
146 theTypes[i].insert(aST);
148 (*theFaces)[i].Add(f);
153 for (size_t i = 0; i < fclass2dpointers.size(); i++)
154 delete fclass2dpointers[i];