Integration of OCCT 6.5.0 from SVN
[occt.git] / samples / java / src / ISession2D / ISession2D_SensitiveCurve.cxx
1 #include <ISession2D_SensitiveCurve.ixx>
2 #include <Geom2dAdaptor_Curve.hxx>
3 #include <GCPnts_TangentialDeflection.hxx>
4 #include <gp_Pnt.hxx>
5 #include <Bnd_Box2d.hxx>
6 #include <SelectBasics_BasicTool.hxx>
7 #include <TColgp_HArray1OfPnt2d.hxx>
8 #include <SelectBasics_ListOfBox2d.hxx>
9
10
11 ISession2D_SensitiveCurve::ISession2D_SensitiveCurve(const Handle(SelectBasics_EntityOwner)& OwnerId,const Handle(Geom2d_Curve)& C,const Standard_Real CDeflect,const Standard_Integer MaxRect)
12      :Select2D_SensitiveEntity(OwnerId),
13        myCDeflect(CDeflect),
14        myMaxRect(MaxRect),
15        myCurve(C)
16 {
17   Compute();
18 }
19
20  void ISession2D_SensitiveCurve::Compute() 
21 {
22   Geom2dAdaptor_Curve Curve (myCurve);
23   Standard_Real ADeflect = 180; //Angular deflection
24   
25   GCPnts_TangentialDeflection PointsOnCurve;
26   PointsOnCurve.Initialize (Curve, ADeflect, myCDeflect,myMaxRect,1.0e-9); 
27   
28   
29   myPolyP2d = new TColgp_HArray1OfPnt2d(1,PointsOnCurve.NbPoints());
30   
31   gp_Pnt P; 
32   for (Standard_Integer i=1; i<=PointsOnCurve.NbPoints();i++) 
33     {
34       P = PointsOnCurve.Value (i);
35       myPolyP2d->SetValue(i,gp_Pnt2d(P.X(),P.Y()));
36     }
37 }
38
39  void ISession2D_SensitiveCurve::Areas(SelectBasics_ListOfBox2d& aSeq) 
40 {
41   // calcul des Areas --> le nombre voulu est myMaxRect
42   //  mais il y a myPolyP2d->Length() segments
43   Standard_Integer NbSeg = myPolyP2d->Length()-1;
44   Standard_Integer nbPerBoxes= NbSeg/myMaxRect;
45
46   Standard_Integer CurrentPoint =1;
47   for (Standard_Integer i=1;i<=myMaxRect-1;i++)
48     { 
49       Bnd_Box2d abox;
50       abox.Set(myPolyP2d->Value(CurrentPoint));
51       for(Standard_Integer j=1;j<=nbPerBoxes;j++)
52         {
53           CurrentPoint++;
54           abox.Add(myPolyP2d->Value(CurrentPoint));
55         }
56       aSeq.Append(abox);
57     }
58   Bnd_Box2d abox;
59   abox.Set(myPolyP2d->Value(CurrentPoint));
60   for(Standard_Integer j=CurrentPoint;j<=myPolyP2d->Length()-1;j++)
61     {
62       CurrentPoint++;
63       abox.Add(myPolyP2d->Value(CurrentPoint));
64     }
65   aSeq.Append(abox);
66 }
67
68  Standard_Boolean ISession2D_SensitiveCurve::Matches(const Standard_Real XMin,const Standard_Real YMin,const Standard_Real XMax,const Standard_Real YMax,const Standard_Real aTol) 
69 {
70   Bnd_Box2d BoundBox;
71   BoundBox.Update(XMin-aTol,YMin-aTol,XMax+aTol,YMax+aTol);
72
73   for(Standard_Integer j=1;j<=myPolyP2d->Length()-1;j++)
74   {
75     if(BoundBox.IsOut(myPolyP2d->Value(j))) return Standard_False;
76   }
77   return Standard_True;
78 }
79
80  Standard_Boolean ISession2D_SensitiveCurve::Matches(const Standard_Real X,const Standard_Real Y,const Standard_Real aTol,Standard_Real& DMin) 
81 {
82   // VERY VERY IMPORTANT : set the selector sensibility !!! ( it's aTol !! )
83   
84   Standard_Integer Rank = 0;
85   Standard_Boolean Result =  SelectBasics_BasicTool::MatchPolyg2d(myPolyP2d->Array1(),
86                                                                   X,Y,
87                                                                   aTol,
88                                                                   DMin, 
89                                                                   Rank);
90   
91
92   return Result;
93 }
94
95  Handle(TColgp_HArray1OfPnt2d) ISession2D_SensitiveCurve::SensitivePolygon() 
96 {
97   return myPolyP2d;
98 }
99