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
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.
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.
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.
24 #include <Select3D_SensitivePoint.ixx>
26 #include <Select3D_Projector.hxx>
27 #include <Bnd_Box2d.hxx>
29 #include <CSLib_Class2d.hxx>
31 //==================================================
34 //==================================================
36 Select3D_SensitivePoint
37 ::Select3D_SensitivePoint(const Handle(SelectBasics_EntityOwner)& anOwner,
38 const gp_Pnt& aPoint):
39 Select3D_SensitiveEntity(anOwner)
41 SetSensitivityFactor(4.);
45 //==================================================
48 //==================================================
50 void Select3D_SensitivePoint
51 ::Project (const Handle(Select3D_Projector)& aProj)
53 Select3D_SensitiveEntity::Project(aProj); // to set the field last proj...
56 aProj->Project(mypoint, aPoint2d);
59 gp_Pnt aP(mypoint.x, mypoint.y, mypoint.z);
60 aProj->Project(aP.Transformed(Location().Transformation()), aPoint2d);
65 //==================================================
68 //==================================================
70 void Select3D_SensitivePoint
71 ::Areas(SelectBasics_ListOfBox2d& boxes)
78 //==================================================
81 //==================================================
83 Standard_Boolean Select3D_SensitivePoint
84 ::Matches(const Standard_Real X,
85 const Standard_Real Y,
86 const Standard_Real aTol,
89 DMin = gp_Pnt2d(X,Y).Distance(myprojpt);
90 if(DMin<=aTol*SensitivityFactor())
92 // compute and validate the depth (::Depth()) along the eyeline
93 return Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
95 return Standard_False;
98 //==================================================
101 //==================================================
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)
111 B.Update(Min(XMin,XMax),Min(YMin,YMax),Max(XMin,XMax),Max(YMin,YMax));
113 return !B.IsOut(myprojpt);
116 //=======================================================================
119 //=======================================================================
121 Standard_Boolean Select3D_SensitivePoint::
122 Matches (const TColgp_Array1OfPnt2d& aPoly,
123 const Bnd_Box2d& aBox,
124 const Standard_Real aTol)
126 Standard_Real Umin,Vmin,Umax,Vmax;
127 aBox.Get(Umin,Vmin,Umax,Vmax);
128 Standard_Real Tolu,Tolv;
131 CSLib_Class2d aClassifier2d(aPoly,aTol,aTol,Umin,Vmin,Umax,Vmax);
133 Standard_Integer RES = aClassifier2d.SiDans(myprojpt);
134 if(RES==1) return Standard_True;
136 return Standard_False;
139 //=======================================================================
142 //=======================================================================
144 gp_Pnt Select3D_SensitivePoint::Point() const
147 //=======================================================================
148 //function : GetConnected
150 //=======================================================================
152 Handle(Select3D_SensitiveEntity) Select3D_SensitivePoint::GetConnected(const TopLoc_Location& aLoc)
154 Handle(Select3D_SensitivePoint) NiouEnt = new Select3D_SensitivePoint(myOwnerId,mypoint);
155 if(HasLocation()) NiouEnt->SetLocation(Location());
156 NiouEnt->UpdateLocation(aLoc);
160 //=======================================================================
163 //=======================================================================
165 void Select3D_SensitivePoint::Dump(Standard_OStream& S,const Standard_Boolean FullDump) const
167 S<<"\tSensitivePoint 3D :";
169 S<<"\t\tExisting Location"<<endl;
171 S<<"\t\t P3d [ "<<mypoint.x<<" , "<<mypoint.y<<" , "<<mypoint.z<<" ]"<<endl;
172 S<<"\t\t P2d [ "<<myprojpt.x<<" , "<<myprojpt.y<<" ]"<<endl;
175 //=======================================================================
176 //function : ComputeDepth
178 //=======================================================================
180 Standard_Real Select3D_SensitivePoint::ComputeDepth(const gp_Lin& EyeLine) const
182 return ElCLib::Parameter(EyeLine,mypoint);