0024157: Parallelization of assembly part of BO
[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   gp_Pnt2d aPoint2d;
54   if(!HasLocation())
55     aProj->Project(mypoint, aPoint2d);
56   else
57   {
58     gp_Pnt aP(mypoint.x, mypoint.y, mypoint.z);
59     aProj->Project(aP.Transformed(Location().Transformation()), aPoint2d);
60   }
61   myprojpt = aPoint2d;
62 }
63
64 //==================================================
65 // Function: Areas
66 // Purpose :
67 //==================================================
68
69 void Select3D_SensitivePoint
70 ::Areas(SelectBasics_ListOfBox2d& boxes)
71 {
72   Bnd_Box2d abox;
73   abox.Set(myprojpt);
74   boxes.Append(abox);
75 }
76
77 //==================================================
78 // Function: Matches
79 // Purpose :
80 //==================================================
81
82 Standard_Boolean Select3D_SensitivePoint::Matches (const SelectBasics_PickArgs& thePickArgs,
83                                                    Standard_Real& theMatchDMin,
84                                                    Standard_Real& theMatchDepth)
85 {
86   // check coordinate matching
87   Standard_Real aDist = gp_Pnt2d (thePickArgs.X(), thePickArgs.Y()).Distance (myprojpt);
88   if (aDist > thePickArgs.Tolerance() * SensitivityFactor())
89   {
90     return Standard_False;
91   }
92
93   Standard_Real aDepth = ComputeDepth (thePickArgs.PickLine());
94   if (thePickArgs.IsClipped (aDepth))
95   {
96     return Standard_False;
97   }
98
99   theMatchDMin = aDist;
100   theMatchDepth = aDepth;
101   return Standard_True;
102 }
103
104 //==================================================
105 // Function: Matches
106 // Purpose :
107 //==================================================
108
109 Standard_Boolean Select3D_SensitivePoint::
110 Matches (const Standard_Real XMin,
111          const Standard_Real YMin,
112          const Standard_Real XMax,
113          const Standard_Real YMax,
114          const Standard_Real aTol)
115 {
116   Bnd_Box2d B;
117   B.Update(Min(XMin,XMax),Min(YMin,YMax),Max(XMin,XMax),Max(YMin,YMax));
118   B.Enlarge(aTol);
119   return !B.IsOut(myprojpt);
120 }
121
122 //=======================================================================
123 //function : Matches
124 //purpose  :
125 //=======================================================================
126
127 Standard_Boolean Select3D_SensitivePoint::
128 Matches (const TColgp_Array1OfPnt2d& aPoly,
129          const Bnd_Box2d& aBox,
130          const Standard_Real aTol)
131 {
132   Standard_Real Umin,Vmin,Umax,Vmax;
133   aBox.Get(Umin,Vmin,Umax,Vmax);
134   CSLib_Class2d aClassifier2d(aPoly,aTol,aTol,Umin,Vmin,Umax,Vmax);
135
136   Standard_Integer RES = aClassifier2d.SiDans(myprojpt);
137   if(RES==1) return Standard_True;
138
139   return Standard_False;
140 }
141
142 //=======================================================================
143 //function : Point
144 //purpose  :
145 //=======================================================================
146
147 gp_Pnt Select3D_SensitivePoint::Point() const
148 {return mypoint;}
149
150 //=======================================================================
151 //function : GetConnected
152 //purpose  :
153 //=======================================================================
154
155 Handle(Select3D_SensitiveEntity) Select3D_SensitivePoint::GetConnected(const TopLoc_Location& aLoc)
156 {
157   Handle(Select3D_SensitivePoint) NiouEnt = new Select3D_SensitivePoint(myOwnerId,mypoint);
158   if(HasLocation()) NiouEnt->SetLocation(Location());
159   NiouEnt->UpdateLocation(aLoc);
160   return NiouEnt;
161 }
162
163 //=======================================================================
164 //function : Dump
165 //purpose  :
166 //=======================================================================
167
168 void Select3D_SensitivePoint::Dump(Standard_OStream& S,const Standard_Boolean /*FullDump*/) const
169 {
170   S<<"\tSensitivePoint 3D :";
171   if(HasLocation())
172     S<<"\t\tExisting Location"<<endl;
173
174   S<<"\t\t P3d [ "<<mypoint.x<<" , "<<mypoint.y<<" , "<<mypoint.z<<" ]"<<endl;
175   S<<"\t\t P2d [ "<<myprojpt.x<<" , "<<myprojpt.y<<" ]"<<endl;
176 }
177
178 //=======================================================================
179 //function : ComputeDepth
180 //purpose  :
181 //=======================================================================
182
183 Standard_Real Select3D_SensitivePoint::ComputeDepth(const gp_Lin& EyeLine) const
184 {
185   return ElCLib::Parameter(EyeLine,mypoint);
186 }