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