2 // Copyright (c) 1991-1999 Matra Datavision
3 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
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.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
16 // Modified 23/02/98 : FMN ; Remplacement PI par Standard_PI
17 // 02.15.100 : JR : Clutter
34 #include <V3d_View.hxx>
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>
49 Graphic3d_Vector V3d::GetProjAxis(const V3d_TypeOfOrientation Orientation) {
50 Standard_Real Xpn=0,Ypn=0,Zpn=0 ;
51 Graphic3d_Vector Vec ;
53 switch (Orientation) {
55 Xpn = 1. ; Ypn = 0. ; Zpn = 0. ;
58 Xpn = 0. ; Ypn = 1. ; Zpn = 0. ;
61 Xpn = 0. ; Ypn = 0. ; Zpn = 1. ;
64 Xpn = -1. ; Ypn = 0. ; Zpn = 0. ;
67 Xpn = 0. ; Ypn = -1. ; Zpn = 0. ;
70 Xpn = 0. ; Ypn = 0. ; Zpn = -1. ;
72 case V3d_XposYposZpos :
73 Xpn = 1. ; Ypn = 1. ; Zpn = 1. ;
75 case V3d_XposYposZneg :
76 Xpn = 1. ; Ypn = 1. ; Zpn = -1. ;
78 case V3d_XposYnegZpos :
79 Xpn = 1. ; Ypn = -1. ; Zpn = 1. ;
81 case V3d_XposYnegZneg :
82 Xpn = 1. ; Ypn = -1. ; Zpn = -1. ;
84 case V3d_XnegYposZpos :
85 Xpn = -1. ; Ypn = 1. ; Zpn = 1. ;
87 case V3d_XnegYposZneg :
88 Xpn = -1. ; Ypn = 1. ; Zpn = -1. ;
90 case V3d_XnegYnegZpos :
91 Xpn = -1. ; Ypn = -1. ; Zpn = 1. ;
93 case V3d_XnegYnegZneg :
94 Xpn = -1. ; Ypn = -1. ; Zpn = -1. ;
97 Xpn = 1. ; Ypn = 1. ; Zpn = 0. ;
100 Xpn = 1. ; Ypn = -1. ; Zpn = 0. ;
103 Xpn = -1. ; Ypn = 1. ; Zpn = 0. ;
106 Xpn = -1. ; Ypn = -1. ; Zpn = 0. ;
109 Xpn = 1. ; Ypn = 0. ; Zpn = 1. ;
112 Xpn = 1. ; Ypn = 0. ; Zpn = -1. ;
115 Xpn = -1. ; Ypn = 0. ; Zpn = 1. ;
118 Xpn = -1. ; Ypn = 0. ; Zpn = -1. ;
121 Xpn = 0. ; Ypn = 1. ; Zpn = 1. ;
124 Xpn = 0. ; Ypn = 1. ; Zpn = -1. ;
127 Xpn = 0. ; Ypn = -1. ; Zpn = 1. ;
130 Xpn = 0. ; Ypn = -1. ; Zpn = -1. ;
133 Vec.SetCoord(Xpn,Ypn,Zpn) ; Vec.Normalize() ;
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)
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;
143 // Centre du cercle base de la fleche :
148 // Construction d'un repere i,j pour le cercle:
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.;
154 Xi = Dy * Zn - Dz * Yn;
155 Yi = Dz * Xn - Dx * Zn;
156 Zi = Dx * Yn - Dy * Xn;
158 Norme = Sqrt ( Xi*Xi + Yi*Yi + Zi*Zi );
159 Xi= Xi / Norme; Yi = Yi / Norme; Zi = Zi/Norme;
161 Xj = Dy * Zi - Dz * Yi;
162 Yj = Dz * Xi - Dx * Zi;
163 Zj = Dx * Yi - Dy * Xi;
165 Handle(Graphic3d_ArrayOfPolylines) aPrims = new Graphic3d_ArrayOfPolylines(3*NbPoints,NbPoints);
168 const Standard_Real Tg = Tan(Alpha);
169 for (i = 1; i <= NbPoints; i++)
171 const Standard_Real cosinus = Cos ( 2. * M_PI / NbPoints * (i-1) );
172 const Standard_Real sinus = Sin ( 2. * M_PI / NbPoints * (i-1) );
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;
178 if(i==1) { X1=X, Y1=Y, Z1=Z; }
179 else aPrims->AddVertex(X,Y,Z);
181 aPrims->AddVertex(X0,Y0,Z0);
182 aPrims->AddVertex(X,Y,Z);
184 aPrims->AddVertex(X1,Y1,Z1);
186 garrow->AddPrimitiveArray(aPrims);
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)
192 Standard_Real Norme = Sqrt ( DX*DX + DY*DY + DZ*DZ );
193 if ( Norme >= 0.0001 )
195 Standard_Real VX,VY,VZ,X,Y,Z,Xn,Yn,Zn,Xi,Yi,Zi,Xj,Yj,Zj;
197 VX= DX/Norme; VY = DY/Norme; VZ = DZ/Norme;
199 //Construction of marker i,j for the circle:
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.;
204 Xi = VY * Zn - VZ * Yn;
205 Yi = VZ * Xn - VX * Zn;
206 Zi = VX * Yn - VY * Xn;
208 Norme = Sqrt ( Xi*Xi + Yi*Yi + Zi*Zi );
209 Xi= Xi / Norme; Yi = Yi / Norme; Zi = Zi/Norme;
211 Xj = VY * Zi - VZ * Yi;
212 Yj = VZ * Xi - VX * Zi;
213 Zj = VX * Yi - VY * Xi;
215 const Standard_Integer NFACES = 30;
216 Handle(Graphic3d_ArrayOfPolylines) aPrims = new Graphic3d_ArrayOfPolylines(NFACES+1);
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)
223 const Standard_Real cosinus = Cos(Alpha);
224 const Standard_Real sinus = Sin(Alpha);
226 X = X0 + (cosinus * Xi + sinus * Xj) * Rayon;
227 Y = Y0 + (cosinus * Yi + sinus * Yj) * Rayon;
228 Z = Z0 + (cosinus * Zi + sinus * Zj) * Rayon;
230 aPrims->AddVertex(X,Y,Z);
232 gcircle->AddPrimitiveArray(aPrims);
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);
245 void V3d::DrawSphere(const Handle(V3d_Viewer)& aViewer,const Quantity_Length ray)
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) ;
252 Handle(Graphic3d_AspectLine3d) LineAttrib = new Graphic3d_AspectLine3d() ;
253 LineAttrib->SetColor(Quantity_Color(Quantity_NOC_YELLOW));
254 Struct->SetPrimitivesAspect(LineAttrib) ;
256 const Standard_Integer NFACES = 30;
257 Handle(Graphic3d_ArrayOfPolylines) aPrims = new Graphic3d_ArrayOfPolylines(NFACES*(NFACES+1),NFACES);
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; }
274 aPrims->AddVertex(X0,Y0,Z0);
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));
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; }
287 aPrims->AddVertex(X0,Y0,Z0);
289 Group->AddPrimitiveArray(aPrims);
290 if(inf) Struct->SetInfiniteState(Standard_True);
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) {
303 gp_Ax3 a(gp_Pnt(0.,0.,0),gp_Dir(x1,y1,z1),gp_Dir(x2,y2,z2));
304 aViewer->SetPrivilegedPlane(a);
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;
319 V3d::SetPlane (aViewer, x1, y1, z1, x2, y2, z2);
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);
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);
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);