1 #include <ISession2D_SensitiveCurve.ixx>
2 #include <Geom2dAdaptor_Curve.hxx>
3 #include <GCPnts_TangentialDeflection.hxx>
5 #include <Bnd_Box2d.hxx>
6 #include <SelectBasics_BasicTool.hxx>
7 #include <TColgp_HArray1OfPnt2d.hxx>
8 #include <SelectBasics_ListOfBox2d.hxx>
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),
20 void ISession2D_SensitiveCurve::Compute()
22 Geom2dAdaptor_Curve Curve (myCurve);
23 Standard_Real ADeflect = 180; //Angular deflection
25 GCPnts_TangentialDeflection PointsOnCurve;
26 PointsOnCurve.Initialize (Curve, ADeflect, myCDeflect,myMaxRect,1.0e-9);
29 myPolyP2d = new TColgp_HArray1OfPnt2d(1,PointsOnCurve.NbPoints());
32 for (Standard_Integer i=1; i<=PointsOnCurve.NbPoints();i++)
34 P = PointsOnCurve.Value (i);
35 myPolyP2d->SetValue(i,gp_Pnt2d(P.X(),P.Y()));
39 void ISession2D_SensitiveCurve::Areas(SelectBasics_ListOfBox2d& aSeq)
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;
46 Standard_Integer CurrentPoint =1;
47 for (Standard_Integer i=1;i<=myMaxRect-1;i++)
50 abox.Set(myPolyP2d->Value(CurrentPoint));
51 for(Standard_Integer j=1;j<=nbPerBoxes;j++)
54 abox.Add(myPolyP2d->Value(CurrentPoint));
59 abox.Set(myPolyP2d->Value(CurrentPoint));
60 for(Standard_Integer j=CurrentPoint;j<=myPolyP2d->Length()-1;j++)
63 abox.Add(myPolyP2d->Value(CurrentPoint));
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)
71 BoundBox.Update(XMin-aTol,YMin-aTol,XMax+aTol,YMax+aTol);
73 for(Standard_Integer j=1;j<=myPolyP2d->Length()-1;j++)
75 if(BoundBox.IsOut(myPolyP2d->Value(j))) return Standard_False;
80 Standard_Boolean ISession2D_SensitiveCurve::Matches(const Standard_Real X,const Standard_Real Y,const Standard_Real aTol,Standard_Real& DMin)
82 // VERY VERY IMPORTANT : set the selector sensibility !!! ( it's aTol !! )
84 Standard_Integer Rank = 0;
85 Standard_Boolean Result = SelectBasics_BasicTool::MatchPolyg2d(myPolyP2d->Array1(),
95 Handle(TColgp_HArray1OfPnt2d) ISession2D_SensitiveCurve::SensitivePolygon()