ae5d5c31d3aabcae61ef5340be5157c0e2dbdbe9
[occt.git] / src / Select3D / Select3D_SensitivePoint.cxx
1 // Created on: 1995-03-10
2 // Created by: Mister rmi
3 // Copyright (c) 1995-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
5 //
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
10 //
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 //
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
20
21
22
23
24 #include <Select3D_SensitivePoint.ixx>
25
26 #include <Select3D_Projector.hxx>
27 #include <Bnd_Box2d.hxx>
28 #include <ElCLib.hxx>
29 #include <CSLib_Class2d.hxx>
30
31 //==================================================
32 // Function: Creation
33 // Purpose :
34 //==================================================
35
36 Select3D_SensitivePoint
37 ::Select3D_SensitivePoint(const Handle(SelectBasics_EntityOwner)& anOwner,
38                           const gp_Pnt& aPoint):
39 Select3D_SensitiveEntity(anOwner)
40 {
41   SetSensitivityFactor(4.);
42   mypoint = aPoint;
43 }
44
45 //==================================================
46 // Function: Project
47 // Purpose :
48 //==================================================
49
50 void Select3D_SensitivePoint
51 ::Project (const Handle(Select3D_Projector)& aProj)
52 {
53   Select3D_SensitiveEntity::Project(aProj); // to set the field last proj...
54   gp_Pnt2d aPoint2d;
55   if(!HasLocation())
56     aProj->Project(mypoint, aPoint2d);
57   else
58   {
59     gp_Pnt aP(mypoint.x, mypoint.y, mypoint.z);
60     aProj->Project(aP.Transformed(Location().Transformation()), aPoint2d);
61   }
62   myprojpt = aPoint2d;
63 }
64
65 //==================================================
66 // Function: Areas
67 // Purpose :
68 //==================================================
69
70 void Select3D_SensitivePoint
71 ::Areas(SelectBasics_ListOfBox2d& boxes)
72 {
73   Bnd_Box2d abox;
74   abox.Set(myprojpt);
75   boxes.Append(abox);
76 }
77
78 //==================================================
79 // Function: Matches
80 // Purpose :
81 //==================================================
82
83 Standard_Boolean Select3D_SensitivePoint
84 ::Matches(const Standard_Real X,
85           const Standard_Real Y,
86           const Standard_Real aTol,
87           Standard_Real& DMin)
88 {
89   DMin = gp_Pnt2d(X,Y).Distance(myprojpt);
90   if(DMin<=aTol*SensitivityFactor())
91   {
92     // compute and validate the depth (::Depth()) along the eyeline
93     return Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
94   }
95   return Standard_False;
96 }
97
98 //==================================================
99 // Function: Matches
100 // Purpose :
101 //==================================================
102
103 Standard_Boolean Select3D_SensitivePoint::
104 Matches (const Standard_Real XMin,
105          const Standard_Real YMin,
106          const Standard_Real XMax,
107          const Standard_Real YMax,
108          const Standard_Real aTol)
109 {
110   Bnd_Box2d B;
111   B.Update(Min(XMin,XMax),Min(YMin,YMax),Max(XMin,XMax),Max(YMin,YMax));
112   B.Enlarge(aTol);
113   return !B.IsOut(myprojpt);
114 }
115
116 //=======================================================================
117 //function : Matches
118 //purpose  :
119 //=======================================================================
120
121 Standard_Boolean Select3D_SensitivePoint::
122 Matches (const TColgp_Array1OfPnt2d& aPoly,
123          const Bnd_Box2d& aBox,
124          const Standard_Real aTol)
125 {
126   Standard_Real Umin,Vmin,Umax,Vmax;
127   aBox.Get(Umin,Vmin,Umax,Vmax);
128   CSLib_Class2d aClassifier2d(aPoly,aTol,aTol,Umin,Vmin,Umax,Vmax);
129
130   Standard_Integer RES = aClassifier2d.SiDans(myprojpt);
131   if(RES==1) return Standard_True;
132
133   return Standard_False;
134 }
135
136 //=======================================================================
137 //function : Point
138 //purpose  :
139 //=======================================================================
140
141 gp_Pnt Select3D_SensitivePoint::Point() const
142 {return mypoint;}
143
144 //=======================================================================
145 //function : GetConnected
146 //purpose  :
147 //=======================================================================
148
149 Handle(Select3D_SensitiveEntity) Select3D_SensitivePoint::GetConnected(const TopLoc_Location& aLoc)
150 {
151   Handle(Select3D_SensitivePoint) NiouEnt = new Select3D_SensitivePoint(myOwnerId,mypoint);
152   if(HasLocation()) NiouEnt->SetLocation(Location());
153   NiouEnt->UpdateLocation(aLoc);
154   return NiouEnt;
155 }
156
157 //=======================================================================
158 //function : Dump
159 //purpose  :
160 //=======================================================================
161
162 void Select3D_SensitivePoint::Dump(Standard_OStream& S,const Standard_Boolean /*FullDump*/) const
163 {
164   S<<"\tSensitivePoint 3D :";
165   if(HasLocation())
166     S<<"\t\tExisting Location"<<endl;
167
168   S<<"\t\t P3d [ "<<mypoint.x<<" , "<<mypoint.y<<" , "<<mypoint.z<<" ]"<<endl;
169   S<<"\t\t P2d [ "<<myprojpt.x<<" , "<<myprojpt.y<<" ]"<<endl;
170 }
171
172 //=======================================================================
173 //function : ComputeDepth
174 //purpose  :
175 //=======================================================================
176
177 Standard_Real Select3D_SensitivePoint::ComputeDepth(const gp_Lin& EyeLine) const
178 {
179   return ElCLib::Parameter(EyeLine,mypoint);
180 }