0022717: Exception during sewing
[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,
23 const Bnd_Box& BBox):
24Select3D_SensitiveEntity(OwnerId),
25mybox3d(BBox){}
26
27
28//==================================================
29// Function: Constructor
30// Purpose :
31//==================================================
32
33Select3D_SensitiveBox::
34Select3D_SensitiveBox(const Handle(SelectBasics_EntityOwner)& OwnerId,
35 const Standard_Real XMin,
36 const Standard_Real YMin,
37 const Standard_Real ZMin,
38 const Standard_Real XMax,
39 const Standard_Real YMax,
40 const Standard_Real ZMax):
41Select3D_SensitiveEntity(OwnerId)
42{
43 mybox3d.Update(XMin,YMin,ZMin,XMax,YMax,ZMax);
44}
45
46
47//==================================================
48// Function: Project
49// Purpose :
50//==================================================
51void Select3D_SensitiveBox::
4952a30a 52Project(const Handle(Select3D_Projector)& aProj)
7fd59977 53{
54 Select3D_SensitiveEntity::Project(aProj); // to set the field last proj...
4952a30a 55
7fd59977 56 if(HasLocation()){
57 Bnd_Box B = mybox3d.Transformed(Location().Transformation());
58 ProjectBox(aProj,B);
59 }
60 else
61 ProjectBox(aProj,mybox3d);
62}
63
64//==================================================
65// Function:
66// Purpose :
67//==================================================
68void Select3D_SensitiveBox::
69Areas(SelectBasics_ListOfBox2d& aSeq)
70{ aSeq.Append(mybox2d);}
71
72
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
87
88
89//==================================================
90// Function:
91// Purpose :
92//==================================================
93Standard_Boolean Select3D_SensitiveBox::
94Matches(const Standard_Real X,
95 const Standard_Real Y,
96 const Standard_Real aTol,
97 Standard_Real& DMin)
98{
99 Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
100 DMin=0.;
101
102 return Standard_True;
103
104}
105
106//==================================================
107// Function:
108// Purpose :
109//==================================================
110
111Standard_Boolean Select3D_SensitiveBox::
112Matches (const Standard_Real XMin,
113 const Standard_Real YMin,
114 const Standard_Real XMax,
115 const Standard_Real YMax,
116 const Standard_Real aTol)
117{
118 Bnd_Box2d BoundBox;
119 BoundBox.Update(XMin-aTol,YMin-aTol,XMax+aTol,YMax+aTol);
120 return(!BoundBox.IsOut(mybox2d));
121}
122
123
124//=======================================================================
125//function : Matches
126//purpose :
127//=======================================================================
128
129Standard_Boolean Select3D_SensitiveBox::
130Matches (const TColgp_Array1OfPnt2d& aPoly,
131 const Bnd_Box2d& aBox,
132 const Standard_Real aTol)
133{
134 return(!aBox.IsOut(mybox2d));
135}
136
137
138//=======================================================================
139//function : Dump
140//purpose :
141//=======================================================================
142
143void Select3D_SensitiveBox::Dump(Standard_OStream& S,const Standard_Boolean FullDump) const
144{
145 S<<"\tSensitiveBox 3D :\n";
146 if(HasLocation())
147 S<<"\t\tExisting Location"<<endl;
148
149 Standard_Real XMin,YMin,ZMin,XMax,YMax,ZMax;
150 mybox3d.Get(XMin,YMin,ZMin,XMax,YMax,ZMax);
151
152 S<<"\t\t PMin [ "<<XMin<<" , "<<YMin<<" , "<<ZMin<<" ]";
153 S<<"\t\t PMax [ "<<XMax<<" , "<<YMax<<" , "<<ZMax<<" ]"<<endl;
154
155 if(FullDump){
156// S<<"\t\t\tOwner:"<<myOwnerId<<endl;
157 Select3D_SensitiveEntity::DumpBox(S,mybox2d);}
158
159}
160
161
162//=======================================================================
163//function : ProjectBox
164//purpose :
165//=======================================================================
166
4952a30a 167void Select3D_SensitiveBox::ProjectBox(const Handle(Select3D_Projector)& aPrj,
7fd59977 168 const Bnd_Box& aBox)
169{
170 mybox2d.SetVoid();
171 gp_Pnt2d curp2d;
172 Standard_Real XMin,YMin,ZMin,XMax,YMax,ZMax;
173 aBox.Get(XMin,YMin,ZMin,XMax,YMax,ZMax);
4952a30a 174
175 aPrj->Project(gp_Pnt(XMin,YMin,ZMin),curp2d);
7fd59977 176 mybox2d.Update(curp2d.X(),curp2d.Y());
4952a30a 177 aPrj->Project(gp_Pnt(XMax,YMin,ZMin),curp2d);
7fd59977 178 mybox2d.Update(curp2d.X(),curp2d.Y());
4952a30a 179 aPrj->Project(gp_Pnt(XMax,YMax,ZMin),curp2d);
7fd59977 180 mybox2d.Update(curp2d.X(),curp2d.Y());
4952a30a 181 aPrj->Project(gp_Pnt(XMin,YMax,ZMin),curp2d);
7fd59977 182 mybox2d.Update(curp2d.X(),curp2d.Y());
4952a30a 183 aPrj->Project(gp_Pnt(XMin,YMin,ZMax),curp2d);
7fd59977 184 mybox2d.Update(curp2d.X(),curp2d.Y());
4952a30a 185 aPrj->Project(gp_Pnt(XMax,YMin,ZMax),curp2d);
7fd59977 186 mybox2d.Update(curp2d.X(),curp2d.Y());
4952a30a 187 aPrj->Project(gp_Pnt(XMax,YMax,ZMax),curp2d);
7fd59977 188 mybox2d.Update(curp2d.X(),curp2d.Y());
4952a30a 189 aPrj->Project(gp_Pnt(XMin,YMax,ZMax),curp2d);
7fd59977 190 mybox2d.Update(curp2d.X(),curp2d.Y());
191}
192
193//=======================================================================
194//function : ComputeDepth
195//purpose :
196//=======================================================================
197
198Standard_Real Select3D_SensitiveBox::ComputeDepth(const gp_Lin& EyeLine) const
199{
200 Standard_Real XMin,YMin,ZMin,XMax,YMax,ZMax;
201 mybox3d.Get(XMin,YMin,ZMin,XMax,YMax,ZMax);
202 gp_Pnt PMid((XMin+XMax)/2.,(YMin+YMax)/2.,(ZMin+ZMax)/2.);
203 return ElCLib::Parameter(EyeLine,PMid);
204}