0024742: Remove rarely used collection classes: Set
[occt.git] / src / V3d / V3d.cxx
CommitLineData
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
47Graphic3d_Vector V3d::GetProjAxis(const V3d_TypeOfOrientation Orientation) {
48Standard_Real Xpn=0,Ypn=0,Zpn=0 ;
49Graphic3d_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 135void 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 188void 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
235void 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 243void 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 293void 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}
305void V3d::PickGrid(const Handle(V3d_Viewer)& aViewer,
306// const Quantity_Length ray) {
307 const Quantity_Length ) {
308Standard_Real x1, y1, z1;
309Standard_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;
314Standard_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()) {
345Standard_Real X, Y, Z;
346 aViewer->ActiveView ()->Convert (u, v, X, Y, Z);
347 }
348}