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