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 | |
22 | Select3D_SensitiveBox::Select3D_SensitiveBox(const Handle(SelectBasics_EntityOwner)& OwnerId, |
23 | const Bnd_Box& BBox): |
24 | Select3D_SensitiveEntity(OwnerId), |
25 | mybox3d(BBox){} |
26 | |
27 | |
28 | //================================================== |
29 | // Function: Constructor |
30 | // Purpose : |
31 | //================================================== |
32 | |
33 | Select3D_SensitiveBox:: |
34 | Select3D_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): |
41 | Select3D_SensitiveEntity(OwnerId) |
42 | { |
43 | mybox3d.Update(XMin,YMin,ZMin,XMax,YMax,ZMax); |
44 | } |
45 | |
46 | |
47 | //================================================== |
48 | // Function: Project |
49 | // Purpose : |
50 | //================================================== |
51 | void Select3D_SensitiveBox:: |
4952a30a |
52 | Project(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 | //================================================== |
68 | void Select3D_SensitiveBox:: |
69 | Areas(SelectBasics_ListOfBox2d& aSeq) |
70 | { aSeq.Append(mybox2d);} |
71 | |
72 | |
73 | //======================================================================= |
74 | //function : GetConnected |
75 | //purpose : |
76 | //======================================================================= |
77 | |
78 | Handle(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 | //================================================== |
93 | Standard_Boolean Select3D_SensitiveBox:: |
94 | Matches(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 | |
111 | Standard_Boolean Select3D_SensitiveBox:: |
112 | Matches (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 | |
129 | Standard_Boolean Select3D_SensitiveBox:: |
130 | Matches (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 | |
143 | void 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 |
167 | void 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 | |
198 | Standard_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 | } |