7fd59977 |
1 | // File V3d.cxx |
2 | // Created September 1992 |
3 | // Author GG |
4 | // Modified 23/02/98 : FMN ; Remplacement PI par Standard_PI |
5 | // 02.15.100 : JR : Clutter |
6 | |
7 | //-Copyright MatraDatavision 1991,1992 |
8 | |
9 | //-Version |
10 | |
11 | //-Design |
12 | |
13 | //-Warning |
14 | |
15 | //-References |
16 | |
17 | //-Language C++ 2.1 |
18 | |
19 | //-Declarations |
20 | |
21 | // for the class |
22 | #include <V3d.ixx> |
23 | #include <V3d_View.hxx> |
24 | |
25 | #include <Quantity_NameOfColor.hxx> |
26 | #include <Aspect_Grid.hxx> |
27 | #include <Aspect_Window.hxx> |
28 | #include <Graphic3d_Array1OfVertex.hxx> |
29 | #include <Graphic3d_Group.hxx> |
30 | #include <Graphic3d_Structure.hxx> |
31 | #include <Graphic3d_AspectLine3d.hxx> |
32 | #include <Graphic3d_AspectText3d.hxx> |
33 | #include <Visual3d_HSetOfView.hxx> |
34 | #include <Visual3d_SetIteratorOfSetOfView.hxx> |
35 | #include <Visual3d_View.hxx> |
36 | #include <Visual3d_ViewManager.hxx> |
37 | |
38 | Graphic3d_Vector V3d::GetProjAxis(const V3d_TypeOfOrientation Orientation) { |
39 | Standard_Real Xpn=0,Ypn=0,Zpn=0 ; |
40 | Graphic3d_Vector Vec ; |
41 | |
42 | switch (Orientation) { |
43 | case V3d_Xpos : |
44 | Xpn = 1. ; Ypn = 0. ; Zpn = 0. ; |
45 | break ; |
46 | case V3d_Ypos : |
47 | Xpn = 0. ; Ypn = 1. ; Zpn = 0. ; |
48 | break ; |
49 | case V3d_Zpos : |
50 | Xpn = 0. ; Ypn = 0. ; Zpn = 1. ; |
51 | break ; |
52 | case V3d_Xneg : |
53 | Xpn = -1. ; Ypn = 0. ; Zpn = 0. ; |
54 | break ; |
55 | case V3d_Yneg : |
56 | Xpn = 0. ; Ypn = -1. ; Zpn = 0. ; |
57 | break ; |
58 | case V3d_Zneg : |
59 | Xpn = 0. ; Ypn = 0. ; Zpn = -1. ; |
60 | break ; |
61 | case V3d_XposYposZpos : |
62 | Xpn = 1. ; Ypn = 1. ; Zpn = 1. ; |
63 | break ; |
64 | case V3d_XposYposZneg : |
65 | Xpn = 1. ; Ypn = 1. ; Zpn = -1. ; |
66 | break ; |
67 | case V3d_XposYnegZpos : |
68 | Xpn = 1. ; Ypn = -1. ; Zpn = 1. ; |
69 | break ; |
70 | case V3d_XposYnegZneg : |
71 | Xpn = 1. ; Ypn = -1. ; Zpn = -1. ; |
72 | break ; |
73 | case V3d_XnegYposZpos : |
74 | Xpn = -1. ; Ypn = 1. ; Zpn = 1. ; |
75 | break ; |
76 | case V3d_XnegYposZneg : |
77 | Xpn = -1. ; Ypn = 1. ; Zpn = -1. ; |
78 | break ; |
79 | case V3d_XnegYnegZpos : |
80 | Xpn = -1. ; Ypn = -1. ; Zpn = 1. ; |
81 | break ; |
82 | case V3d_XnegYnegZneg : |
83 | Xpn = -1. ; Ypn = -1. ; Zpn = -1. ; |
84 | break ; |
85 | case V3d_XposYpos : |
86 | Xpn = 1. ; Ypn = 1. ; Zpn = 0. ; |
87 | break ; |
88 | case V3d_XposYneg : |
89 | Xpn = 1. ; Ypn = -1. ; Zpn = 0. ; |
90 | break ; |
91 | case V3d_XnegYpos : |
92 | Xpn = -1. ; Ypn = 1. ; Zpn = 0. ; |
93 | break ; |
94 | case V3d_XnegYneg : |
95 | Xpn = -1. ; Ypn = -1. ; Zpn = 0. ; |
96 | break ; |
97 | case V3d_XposZpos : |
98 | Xpn = 1. ; Ypn = 0. ; Zpn = 1. ; |
99 | break ; |
100 | case V3d_XposZneg : |
101 | Xpn = 1. ; Ypn = 0. ; Zpn = -1. ; |
102 | break ; |
103 | case V3d_XnegZpos : |
104 | Xpn = -1. ; Ypn = 0. ; Zpn = 1. ; |
105 | break ; |
106 | case V3d_XnegZneg : |
107 | Xpn = -1. ; Ypn = 0. ; Zpn = -1. ; |
108 | break ; |
109 | case V3d_YposZpos : |
110 | Xpn = 0. ; Ypn = 1. ; Zpn = 1. ; |
111 | break ; |
112 | case V3d_YposZneg : |
113 | Xpn = 0. ; Ypn = 1. ; Zpn = -1. ; |
114 | break ; |
115 | case V3d_YnegZpos : |
116 | Xpn = 0. ; Ypn = -1. ; Zpn = 1. ; |
117 | break ; |
118 | case V3d_YnegZneg : |
119 | Xpn = 0. ; Ypn = -1. ; Zpn = -1. ; |
120 | break ; |
121 | } |
122 | Vec.SetCoord(Xpn,Ypn,Zpn) ; Vec.Normalize() ; |
123 | return Vec ; |
124 | } |
125 | |
126 | void V3d::ArrowOfRadius(const Handle(Graphic3d_Group)& garrow,const Standard_Real X0,const Standard_Real Y0,const Standard_Real Z0,const Standard_Real Dx,const Standard_Real Dy,const Standard_Real Dz,const Standard_Real Alpha,const Standard_Real Lng) { |
127 | |
128 | Standard_Real Xc,Yc,Zc,Xi,Yi,Zi,Xj,Yj,Zj; |
129 | Standard_Real Xn,Yn,Zn,X,Y,Z,Norme; |
130 | Standard_Integer NbPoints = 10, i; |
131 | Graphic3d_Array1OfVertex VN(1,NbPoints+1); |
132 | Graphic3d_Array1OfVertex V2(1,2); |
133 | |
134 | // Centre du cercle base de la fleche : |
135 | Xc = X0 - Dx * Lng; |
136 | Yc = Y0 - Dy * Lng; |
137 | Zc = Z0 - Dz * Lng; |
138 | |
139 | // Construction d'un repere i,j pour le cercle: |
140 | Xn=0., Yn=0., Zn=0.; |
141 | |
142 | if ( Abs(Dx) <= Abs(Dy) && Abs(Dx) <= Abs(Dz)) Xn=1.; |
143 | else if ( Abs(Dy) <= Abs(Dz) && Abs(Dy) <= Abs(Dx)) Yn=1.; |
144 | else Zn=1.; |
145 | Xi = Dy * Zn - Dz * Yn; |
146 | Yi = Dz * Xn - Dx * Zn; |
147 | Zi = Dx * Yn - Dy * Xn; |
148 | |
149 | Norme = Sqrt ( Xi*Xi + Yi*Yi + Zi*Zi ); |
150 | Xi= Xi / Norme; Yi = Yi / Norme; Zi = Zi/Norme; |
151 | |
152 | Xj = Dy * Zi - Dz * Yi; |
153 | Yj = Dz * Xi - Dx * Zi; |
154 | Zj = Dx * Yi - Dy * Xi; |
155 | |
156 | V2(1).SetCoord(X0,Y0,Z0); |
157 | |
158 | Standard_Real cosinus,sinus, Tg=Tan(Alpha); |
159 | |
160 | for (i = 1 ; i <= NbPoints ; i++) { |
161 | |
162 | cosinus = Cos ( 2 * Standard_PI / NbPoints * (i-1) ); |
163 | sinus = Sin ( 2 * Standard_PI / NbPoints * (i-1) ); |
164 | |
165 | X = Xc + (cosinus * Xi + sinus * Xj) * Lng * Tg; |
166 | Y = Yc + (cosinus * Yi + sinus * Yj) * Lng * Tg; |
167 | Z = Zc + (cosinus * Zi + sinus * Zj) * Lng * Tg; |
168 | |
169 | VN(i).SetCoord(X,Y,Z); |
170 | if(i==1) VN(NbPoints+1).SetCoord(X,Y,Z); |
171 | V2(2).SetCoord(X,Y,Z); |
172 | garrow->Polyline(V2); |
173 | } |
174 | garrow->Polyline(VN); |
175 | } |
176 | |
177 | |
178 | void V3d::CircleInPlane(const Handle(Graphic3d_Group)& gcircle,const Standard_Real X0,const Standard_Real Y0,const Standard_Real Z0,const Standard_Real DX,const Standard_Real DY,const Standard_Real DZ,const Standard_Real Rayon) { |
179 | |
180 | Standard_Real VX,VY,VZ,X,Y,Z,Xn,Yn,Zn,Xi,Yi,Zi,Xj,Yj,Zj,Norme; |
181 | Standard_Integer NFACES = 30 , i; |
182 | Standard_Real Alpha = 0. ; |
183 | Standard_Real Dalpha = 2.*Standard_PI/NFACES ; |
184 | Graphic3d_Array1OfVertex Points(0,NFACES); |
185 | |
186 | Norme = Sqrt ( DX*DX + DY*DY + DZ*DZ ); |
187 | if ( Norme >= 0.0001 ) { |
188 | VX= DX/Norme; VY = DY/Norme; VZ = DZ/Norme; |
189 | |
81bba717 |
190 | //Construction of marker i,j for the circle: |
7fd59977 |
191 | Xn=0., Yn=0., Zn=0.; |
192 | if ( Abs(VX) <= Abs(VY) && Abs(VX) <= Abs(VZ)) Xn=1.; |
193 | else if ( Abs(VY) <= Abs(VZ) && Abs(VY) <= Abs(VX)) Yn=1.; |
194 | else Zn=1.; |
195 | Xi = VY * Zn - VZ * Yn; |
196 | Yi = VZ * Xn - VX * Zn; |
197 | Zi = VX * Yn - VY * Xn; |
198 | |
199 | Norme = Sqrt ( Xi*Xi + Yi*Yi + Zi*Zi ); |
200 | Xi= Xi / Norme; Yi = Yi / Norme; Zi = Zi/Norme; |
201 | |
202 | Xj = VY * Zi - VZ * Yi; |
203 | Yj = VZ * Xi - VX * Zi; |
204 | Zj = VX * Yi - VY * Xi; |
205 | |
206 | for (i = 0 ; i <= NFACES ; i++) { |
207 | X = X0 + (Cos(Alpha) * Xi + Sin(Alpha) * Xj) * Rayon; |
208 | Y = Y0 + (Cos(Alpha) * Yi + Sin(Alpha) * Yj) * Rayon; |
209 | Z = Z0 + (Cos(Alpha) * Zi + Sin(Alpha) * Zj) * Rayon; |
210 | Alpha +=Dalpha; |
211 | Points(i).SetCoord(X,Y,Z); |
212 | } |
213 | |
214 | gcircle->Polyline(Points); |
215 | } |
216 | } |
217 | |
218 | |
219 | void V3d::SwitchViewsinWindow(const Handle(V3d_View)& aPreviousView, |
220 | const Handle(V3d_View)& aNextView) { |
221 | aPreviousView->Viewer()->SetViewOff(aPreviousView); |
222 | if(!aNextView->IfWindow()) |
223 | aNextView->SetWindow(aPreviousView->Window()); |
224 | aNextView->Viewer()->SetViewOn(aNextView); |
225 | |
226 | } |
227 | void V3d::DrawSphere(const Handle(V3d_Viewer)& aViewer,const Quantity_Length ray) { |
228 | Standard_Boolean inf = ray < 0; |
229 | Standard_Real aRadius = Abs(ray); |
230 | Handle(Graphic3d_Structure) Struct = new Graphic3d_Structure(aViewer->Viewer()) ; |
231 | Handle(Graphic3d_Group) Group = new Graphic3d_Group(Struct) ; |
232 | |
233 | Handle(Graphic3d_AspectLine3d) LineAttrib = new Graphic3d_AspectLine3d() ; |
234 | LineAttrib->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); |
235 | Struct->SetPrimitivesAspect(LineAttrib) ; |
236 | |
237 | Standard_Integer NFACES = 30; |
238 | Graphic3d_Array1OfVertex Points(0,NFACES) ; |
239 | Standard_Real R,X,Y,Z ; |
240 | Standard_Real Beta = 0. ; |
241 | Standard_Real Alpha = 0. ; |
242 | Standard_Real Dbeta = 2.*Standard_PI/NFACES ; |
243 | Standard_Real Dalpha = 2.*Standard_PI/NFACES ; |
244 | Standard_Integer i,j ; |
245 | for( j=0 ; j<NFACES/2 ; j++ ) { |
246 | Alpha = 0. ; |
247 | R = aRadius*sin(Beta) ; |
248 | Z = aRadius*cos(Beta) ; |
249 | Beta += Dbeta ; |
250 | for( i=0 ; i<NFACES ; i++ ) { |
251 | X = R*cos(Alpha) ; |
252 | Y = R*sin(Alpha) ; |
253 | Alpha += Dalpha ; |
254 | Points(i).SetCoord(X,Y,Z); |
255 | } |
256 | Points(0).Coord(X,Y,Z) ; |
257 | Points(NFACES).SetCoord(X,Y,Z) ; |
258 | Group->Polyline(Points) ; |
259 | } |
260 | for( j=0 ; j<NFACES/2 ; j++ ) { |
261 | Alpha = 0. ; |
262 | R = aRadius*sin(Beta) ; |
263 | Y = aRadius*cos(Beta) ; |
264 | Beta += Dbeta ; |
265 | for( i=0 ; i<NFACES ; i++ ) { |
266 | X = R*cos(Alpha) ; |
267 | Z = R*sin(Alpha) ; |
268 | Alpha += Dalpha ; |
269 | Points(i).SetCoord(X,Y,Z); |
270 | } |
271 | Points(0).Coord(X,Y,Z) ; |
272 | Points(NFACES).SetCoord(X,Y,Z) ; |
273 | Group->Polyline(Points) ; |
274 | } |
275 | if(inf) Struct->SetInfiniteState(Standard_True); |
276 | Struct->Display(); |
277 | aViewer->Update(); |
278 | } |
279 | void V3d::SetPlane(const Handle(V3d_Viewer)& aViewer, |
280 | const Standard_Real x1, |
281 | const Standard_Real y1, |
282 | const Standard_Real z1, |
283 | const Standard_Real x2, |
284 | const Standard_Real y2, |
285 | const Standard_Real z2) { |
286 | |
287 | gp_Ax3 a(gp_Pnt(0.,0.,0),gp_Dir(x1,y1,z1),gp_Dir(x2,y2,z2)); |
288 | aViewer->SetPrivilegedPlane(a); |
289 | |
290 | } |
291 | void V3d::PickGrid(const Handle(V3d_Viewer)& aViewer, |
292 | // const Quantity_Length ray) { |
293 | const Quantity_Length ) { |
294 | Standard_Real x1, y1, z1; |
295 | Standard_Real x2, y2, z2; |
296 | cout << "Direction ? " << flush; |
297 | cin >> x1; cin >> y1; cin >> z1; |
298 | cout << "XDirection ? " << flush; |
299 | cin >> x2; cin >> y2; cin >> z2; |
300 | Standard_Integer u, v; |
301 | cout << "u, v ? " << flush; |
302 | cin >> u; cin >> v; |
303 | V3d::SetPlane (aViewer, x1, y1, z1, x2, y2, z2); |
304 | |
81bba717 |
305 | // To restart the calculation on the new plane |
7fd59977 |
306 | if (aViewer->Grid ()->IsActive ()) { |
307 | Standard_Real xo, yo; |
308 | Quantity_PlaneAngle angle; |
309 | switch (aViewer->GridType ()) { |
310 | case Aspect_GT_Rectangular : |
311 | Standard_Real xstep, ystep; |
312 | aViewer->RectangularGridValues |
313 | (xo, yo, xstep, ystep, angle); |
314 | aViewer->SetRectangularGridValues |
315 | (xo, yo, xstep, ystep, angle); |
316 | break; |
317 | case Aspect_GT_Circular : |
318 | Standard_Real radiusstep; |
319 | Standard_Integer division; |
320 | aViewer->CircularGridValues |
321 | (xo, yo, radiusstep, division, angle); |
322 | aViewer->SetCircularGridValues |
323 | (xo, yo, radiusstep, division, angle); |
324 | break; |
325 | } |
326 | } |
327 | |
328 | for (aViewer->InitActiveViews (); |
329 | aViewer->MoreActiveViews (); |
330 | aViewer->NextActiveViews()) { |
331 | Standard_Real X, Y, Z; |
332 | aViewer->ActiveView ()->Convert (u, v, X, Y, Z); |
333 | } |
334 | } |