0022792: Globally defined symbol PI conflicts with VTK definition (Intel compiler)
[occt.git] / src / V3d / V3d.cxx
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 * M_PI / NbPoints * (i-1) );   
163             sinus = Sin ( 2 * M_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. * M_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
190 //Construction of marker i,j for the circle:
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. * M_PI / NFACES ;
243   Standard_Real Dalpha = 2. * M_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
305         // To restart the calculation on the new plane
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 }