OCC22357 Hidden face selection
[occt.git] / src / Select3D / Select3D_SensitivePoint.cxx
1 // Copyright:   Matra-Datavision 1995
2 // File:        Select3D_SensitivePoint.cxx
3 // Created:     Fri Mar 10 13:41:23 1995
4 // Author:      Mister rmi
5 //              <rmi>
6
7
8
9 #include <Select3D_SensitivePoint.ixx>
10
11 #include <Select3D_Projector.hxx>
12 #include <Bnd_Box2d.hxx>
13 #include <ElCLib.hxx>
14 #include <CSLib_Class2d.hxx>
15
16 //==================================================
17 // Function: 
18 // Purpose :
19 //==================================================
20
21 Select3D_SensitivePoint
22 ::Select3D_SensitivePoint(const Handle(SelectBasics_EntityOwner)& anOwner,
23                           const gp_Pnt& aPoint):
24 Select3D_SensitiveEntity(anOwner)
25 {
26   SetSensitivityFactor(4.);
27   mypoint = aPoint;
28 }
29
30 //==================================================
31 // Function: 
32 // Purpose :
33 //==================================================
34 void Select3D_SensitivePoint
35 ::Project (const Handle(Select3D_Projector)& aProj)
36 {
37   Select3D_SensitiveEntity::Project(aProj); // to set the field last proj...
38   gp_Pnt2d aPoint2d;
39   if(!HasLocation())
40     aProj->Project(mypoint, aPoint2d);
41   else{
42     gp_Pnt aP(mypoint.x, mypoint.y, mypoint.z);
43     aProj->Project(aP.Transformed(Location().Transformation()), aPoint2d);
44   }
45   myprojpt = aPoint2d;
46 }
47
48 //==================================================
49 // Function: 
50 // Purpose :
51 //==================================================
52 void Select3D_SensitivePoint
53 ::Areas(SelectBasics_ListOfBox2d& boxes)
54 {
55   Bnd_Box2d abox;
56   abox.Set(myprojpt);
57   boxes.Append(abox);
58 }
59
60
61 //==================================================
62 // Function: 
63 // Purpose :
64 //==================================================
65 Standard_Boolean Select3D_SensitivePoint
66 ::Matches(const Standard_Real X,
67           const Standard_Real Y,
68           const Standard_Real aTol,
69           Standard_Real& DMin)
70 {
71   DMin = gp_Pnt2d(X,Y).Distance(myprojpt);
72   if(DMin<=aTol*SensitivityFactor())
73   {
74     // compute and validate the depth (::Depth()) along the eyeline
75     return Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
76   }
77   return Standard_False;
78 }
79
80 Standard_Boolean Select3D_SensitivePoint::
81 Matches (const Standard_Real XMin,
82          const Standard_Real YMin,
83          const Standard_Real XMax,
84          const Standard_Real YMax,
85          const Standard_Real aTol)
86 {
87   Bnd_Box2d B;
88   B.Update(Min(XMin,XMax),Min(YMin,YMax),Max(XMin,XMax),Max(YMin,YMax));
89   B.Enlarge(aTol);
90   return !B.IsOut(myprojpt);
91 }
92
93
94 //=======================================================================
95 //function : Matches
96 //purpose  : 
97 //=======================================================================
98
99 Standard_Boolean Select3D_SensitivePoint::
100 Matches (const TColgp_Array1OfPnt2d& aPoly,
101          const Bnd_Box2d& aBox,
102          const Standard_Real aTol)
103
104   Standard_Real Umin,Vmin,Umax,Vmax;
105   aBox.Get(Umin,Vmin,Umax,Vmax);
106   Standard_Real Tolu,Tolv;
107   Tolu = 1e-7;
108   Tolv = 1e-7;
109   CSLib_Class2d aClassifier2d(aPoly,aTol,aTol,Umin,Vmin,Umax,Vmax);
110
111   Standard_Integer RES = aClassifier2d.SiDans(myprojpt);
112   if(RES==1) return Standard_True;
113   
114   return Standard_False;
115 }
116
117
118
119 //=======================================================================
120 //function : Point
121 //purpose  : 
122 //=======================================================================
123 gp_Pnt Select3D_SensitivePoint::Point() const
124 {return mypoint;}
125
126 //=======================================================================
127 //function : GetConnected
128 //purpose  : 
129 //=======================================================================
130
131 Handle(Select3D_SensitiveEntity) Select3D_SensitivePoint::GetConnected(const TopLoc_Location& aLoc)  
132 {
133   Handle(Select3D_SensitivePoint) NiouEnt = new Select3D_SensitivePoint(myOwnerId,mypoint);
134   if(HasLocation()) NiouEnt->SetLocation(Location());
135   NiouEnt->UpdateLocation(aLoc);
136   return NiouEnt;
137 }
138
139
140 //=======================================================================
141 //function : Dump
142 //purpose  : 
143 //=======================================================================
144
145 void Select3D_SensitivePoint::Dump(Standard_OStream& S,const Standard_Boolean FullDump) const
146 {
147   S<<"\tSensitivePoint 3D :";
148   if(HasLocation())
149     S<<"\t\tExisting Location"<<endl;
150
151   S<<"\t\t P3d [ "<<mypoint.x<<" , "<<mypoint.y<<" , "<<mypoint.z<<" ]"<<endl;
152   S<<"\t\t P2d [ "<<myprojpt.x<<" , "<<myprojpt.y<<" ]"<<endl;
153 }
154
155 //=======================================================================
156 //function : ComputeDepth
157 //purpose  : 
158 //=======================================================================
159
160 Standard_Real Select3D_SensitivePoint::ComputeDepth(const gp_Lin& EyeLine) const
161 {
162   return ElCLib::Parameter(EyeLine,mypoint);
163 }
164
165