0022554: Application hangs on selection
[occt.git] / src / Select3D / Select3D_SensitiveBox.cxx
CommitLineData
7fd59977 1// Copyright: Matra-Datavision 1995
2// File: Select3D_SensitiveBox.cxx
3// Created: Thu Apr 13 10:28:17 1995
4// Author: Robert COUBLANC
5// <rob>
6
7
8
9#include <Select3D_SensitiveBox.ixx>
10#include <gp_Pnt2d.hxx>
11#include <gp_Pnt.hxx>
12#include <Bnd_Box.hxx>
13#include <ElCLib.hxx>
14
15
16
17//==================================================
18// Function: Constructor
19// Purpose :
20//==================================================
21
22Select3D_SensitiveBox::Select3D_SensitiveBox(const Handle(SelectBasics_EntityOwner)& OwnerId,
ac04d101 23 const Bnd_Box& BBox):
7fd59977 24Select3D_SensitiveEntity(OwnerId),
25mybox3d(BBox){}
26
7fd59977 27//==================================================
28// Function: Constructor
29// Purpose :
30//==================================================
31
32Select3D_SensitiveBox::
33Select3D_SensitiveBox(const Handle(SelectBasics_EntityOwner)& OwnerId,
ac04d101
SA
34 const Standard_Real XMin,
35 const Standard_Real YMin,
36 const Standard_Real ZMin,
37 const Standard_Real XMax,
38 const Standard_Real YMax,
39 const Standard_Real ZMax):
7fd59977 40Select3D_SensitiveEntity(OwnerId)
41{
42 mybox3d.Update(XMin,YMin,ZMin,XMax,YMax,ZMax);
43}
44
7fd59977 45//==================================================
46// Function: Project
47// Purpose :
48//==================================================
ac04d101 49
7fd59977 50void Select3D_SensitiveBox::
4952a30a 51Project(const Handle(Select3D_Projector)& aProj)
7fd59977 52{
53 Select3D_SensitiveEntity::Project(aProj); // to set the field last proj...
4952a30a 54
ac04d101
SA
55 if(HasLocation())
56 {
7fd59977 57 Bnd_Box B = mybox3d.Transformed(Location().Transformation());
58 ProjectBox(aProj,B);
59 }
60 else
61 ProjectBox(aProj,mybox3d);
62}
63
64//==================================================
ac04d101 65// Function: Areas
7fd59977 66// Purpose :
67//==================================================
ac04d101 68
7fd59977 69void Select3D_SensitiveBox::
70Areas(SelectBasics_ListOfBox2d& aSeq)
71{ aSeq.Append(mybox2d);}
72
7fd59977 73//=======================================================================
74//function : GetConnected
75//purpose :
76//=======================================================================
77
78Handle(Select3D_SensitiveEntity) Select3D_SensitiveBox::GetConnected(const TopLoc_Location& aLoc)
79{
80 Handle(Select3D_SensitiveBox) NiouEnt = new Select3D_SensitiveBox(myOwnerId,mybox3d);
81
82 if(HasLocation()) NiouEnt->SetLocation(Location());
83 NiouEnt->UpdateLocation(aLoc);
84 return NiouEnt;
85}
86
7fd59977 87//==================================================
ac04d101 88// Function: Matches
7fd59977 89// Purpose :
90//==================================================
91Standard_Boolean Select3D_SensitiveBox::
ac04d101
SA
92Matches(const Standard_Real X,
93 const Standard_Real Y,
94 const Standard_Real aTol,
95 Standard_Real& DMin)
7fd59977 96{
97 Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
98 DMin=0.;
99
100 return Standard_True;
7fd59977 101}
102
103//==================================================
ac04d101 104// Function: Matches
7fd59977 105// Purpose :
106//==================================================
107
108Standard_Boolean Select3D_SensitiveBox::
109Matches (const Standard_Real XMin,
ac04d101
SA
110 const Standard_Real YMin,
111 const Standard_Real XMax,
112 const Standard_Real YMax,
113 const Standard_Real aTol)
7fd59977 114{
115 Bnd_Box2d BoundBox;
116 BoundBox.Update(XMin-aTol,YMin-aTol,XMax+aTol,YMax+aTol);
117 return(!BoundBox.IsOut(mybox2d));
118}
119
7fd59977 120//=======================================================================
121//function : Matches
122//purpose :
123//=======================================================================
124
125Standard_Boolean Select3D_SensitiveBox::
126Matches (const TColgp_Array1OfPnt2d& aPoly,
ac04d101
SA
127 const Bnd_Box2d& aBox,
128 const Standard_Real aTol)
129{
7fd59977 130 return(!aBox.IsOut(mybox2d));
131}
132
7fd59977 133//=======================================================================
134//function : Dump
135//purpose :
136//=======================================================================
137
138void Select3D_SensitiveBox::Dump(Standard_OStream& S,const Standard_Boolean FullDump) const
139{
140 S<<"\tSensitiveBox 3D :\n";
141 if(HasLocation())
142 S<<"\t\tExisting Location"<<endl;
143
144 Standard_Real XMin,YMin,ZMin,XMax,YMax,ZMax;
145 mybox3d.Get(XMin,YMin,ZMin,XMax,YMax,ZMax);
146
147 S<<"\t\t PMin [ "<<XMin<<" , "<<YMin<<" , "<<ZMin<<" ]";
148 S<<"\t\t PMax [ "<<XMax<<" , "<<YMax<<" , "<<ZMax<<" ]"<<endl;
149
ac04d101
SA
150 if(FullDump)
151 {
7fd59977 152// S<<"\t\t\tOwner:"<<myOwnerId<<endl;
ac04d101
SA
153 Select3D_SensitiveEntity::DumpBox(S,mybox2d);
154 }
7fd59977 155}
156
157
158//=======================================================================
159//function : ProjectBox
160//purpose :
161//=======================================================================
162
4952a30a 163void Select3D_SensitiveBox::ProjectBox(const Handle(Select3D_Projector)& aPrj,
ac04d101 164 const Bnd_Box& aBox)
7fd59977 165{
166 mybox2d.SetVoid();
167 gp_Pnt2d curp2d;
168 Standard_Real XMin,YMin,ZMin,XMax,YMax,ZMax;
169 aBox.Get(XMin,YMin,ZMin,XMax,YMax,ZMax);
4952a30a 170
171 aPrj->Project(gp_Pnt(XMin,YMin,ZMin),curp2d);
7fd59977 172 mybox2d.Update(curp2d.X(),curp2d.Y());
4952a30a 173 aPrj->Project(gp_Pnt(XMax,YMin,ZMin),curp2d);
7fd59977 174 mybox2d.Update(curp2d.X(),curp2d.Y());
4952a30a 175 aPrj->Project(gp_Pnt(XMax,YMax,ZMin),curp2d);
7fd59977 176 mybox2d.Update(curp2d.X(),curp2d.Y());
4952a30a 177 aPrj->Project(gp_Pnt(XMin,YMax,ZMin),curp2d);
7fd59977 178 mybox2d.Update(curp2d.X(),curp2d.Y());
4952a30a 179 aPrj->Project(gp_Pnt(XMin,YMin,ZMax),curp2d);
7fd59977 180 mybox2d.Update(curp2d.X(),curp2d.Y());
4952a30a 181 aPrj->Project(gp_Pnt(XMax,YMin,ZMax),curp2d);
7fd59977 182 mybox2d.Update(curp2d.X(),curp2d.Y());
4952a30a 183 aPrj->Project(gp_Pnt(XMax,YMax,ZMax),curp2d);
7fd59977 184 mybox2d.Update(curp2d.X(),curp2d.Y());
4952a30a 185 aPrj->Project(gp_Pnt(XMin,YMax,ZMax),curp2d);
7fd59977 186 mybox2d.Update(curp2d.X(),curp2d.Y());
187}
188
189//=======================================================================
190//function : ComputeDepth
191//purpose :
192//=======================================================================
193
194Standard_Real Select3D_SensitiveBox::ComputeDepth(const gp_Lin& EyeLine) const
195{
196 Standard_Real XMin,YMin,ZMin,XMax,YMax,ZMax;
197 mybox3d.Get(XMin,YMin,ZMin,XMax,YMax,ZMax);
198 gp_Pnt PMid((XMin+XMax)/2.,(YMin+YMax)/2.,(ZMin+ZMax)/2.);
199 return ElCLib::Parameter(EyeLine,PMid);
200}