0024023: Revamp the OCCT Handle -- general
[occt.git] / src / Geom / Geom_ToroidalSurface.cxx
1 // Created on: 1993-03-10
2 // Created by: JCV
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <Geom_ToroidalSurface.ixx>
18
19 #include <GeomAbs_UVSense.hxx>
20 #include <Geom_Circle.hxx>
21 #include <gp.hxx>
22 #include <gp_Circ.hxx>
23 #include <gp_Dir.hxx>
24 #include <gp_XYZ.hxx>
25 #include <ElSLib.hxx>
26
27 #include <Standard_ConstructionError.hxx>
28 #include <Standard_RangeError.hxx>
29
30 typedef Geom_ToroidalSurface         ToroidalSurface;
31 typedef TColStd_Array1OfReal      Array1OfReal;
32 typedef gp_Ax1  Ax1;
33 typedef gp_Ax2  Ax2;
34 typedef gp_Ax3  Ax3;
35 typedef gp_Circ Circ;
36 typedef gp_Dir  Dir;
37 typedef gp_Pnt  Pnt;
38 typedef gp_Trsf Trsf;
39 typedef gp_Vec  Vec;
40 typedef gp_XYZ  XYZ;
41
42
43
44 //=======================================================================
45 //function : Copy
46 //purpose  : 
47 //=======================================================================
48
49 Handle(Geom_Geometry) Geom_ToroidalSurface::Copy () const {
50  
51    Handle(Geom_ToroidalSurface) Cs;
52    Cs = new ToroidalSurface (pos, majorRadius, minorRadius);
53    return Cs;
54 }
55
56
57
58 //=======================================================================
59 //function : Geom_ToroidalSurface
60 //purpose  : 
61 //=======================================================================
62
63 Geom_ToroidalSurface::Geom_ToroidalSurface 
64   ( const Ax3& A3, 
65     const Standard_Real MajorRadius, 
66     const Standard_Real MinorRadius )
67  
68 : majorRadius (MajorRadius), minorRadius (MinorRadius) {
69
70   if (MinorRadius < 0.0 || MajorRadius < 0.0) {
71     Standard_ConstructionError::Raise();
72   }
73   else {
74     pos = A3;
75   }
76 }
77
78
79 //=======================================================================
80 //function : Geom_ToroidalSurface
81 //purpose  : 
82 //=======================================================================
83
84 Geom_ToroidalSurface::Geom_ToroidalSurface (const gp_Torus& T)  
85 : majorRadius (T.MajorRadius()), minorRadius (T.MinorRadius()) {
86
87    pos = T.Position();
88 }
89
90
91
92 //=======================================================================
93 //function : MajorRadius
94 //purpose  : 
95 //=======================================================================
96
97 Standard_Real Geom_ToroidalSurface::MajorRadius () const { 
98
99   return majorRadius; 
100 }
101
102 //=======================================================================
103
104 //function : MinorRadius
105 //purpose  : 
106 //=======================================================================
107
108 Standard_Real Geom_ToroidalSurface::MinorRadius () const {
109   
110   return minorRadius; 
111 }
112
113
114 //=======================================================================
115 //function : UReversedParameter
116 //purpose  : 
117 //=======================================================================
118
119 Standard_Real Geom_ToroidalSurface::UReversedParameter( const Standard_Real U) const {
120
121   return (2.*M_PI - U);
122 }
123
124
125 //=======================================================================
126 //function : VReversedParameter
127 //purpose  : 
128 //=======================================================================
129
130 Standard_Real Geom_ToroidalSurface::VReversedParameter( const Standard_Real V) const {
131
132   return (2.*M_PI - V);
133 }
134
135
136 //=======================================================================
137 //function : IsUClosed
138 //purpose  : 
139 //=======================================================================
140
141 Standard_Boolean Geom_ToroidalSurface::IsUClosed () const {
142
143   return Standard_True; 
144 }
145
146 //=======================================================================
147 //function : IsVClosed
148 //purpose  : 
149 //=======================================================================
150
151 Standard_Boolean Geom_ToroidalSurface::IsVClosed () const {
152
153   return Standard_True; 
154 }
155
156 //=======================================================================
157 //function : IsUPeriodic
158 //purpose  : 
159 //=======================================================================
160
161 Standard_Boolean Geom_ToroidalSurface::IsUPeriodic () const {
162
163   return Standard_True; 
164 }
165
166 //=======================================================================
167 //function : IsVPeriodic
168 //purpose  : 
169 //=======================================================================
170
171 Standard_Boolean Geom_ToroidalSurface::IsVPeriodic () const {
172
173  return Standard_True; 
174 }
175
176
177 //=======================================================================
178 //function : SetMajorRadius
179 //purpose  : 
180 //=======================================================================
181
182 void Geom_ToroidalSurface::SetMajorRadius (const Standard_Real MajorRadius) {
183
184   if (MajorRadius - minorRadius <= gp::Resolution())
185     Standard_ConstructionError::Raise();
186   else 
187     majorRadius = MajorRadius;
188 }
189
190
191 //=======================================================================
192 //function : SetMinorRadius
193 //purpose  : 
194 //=======================================================================
195
196 void Geom_ToroidalSurface::SetMinorRadius (const Standard_Real MinorRadius) {
197
198   if (MinorRadius < 0.0 || majorRadius - MinorRadius <= gp::Resolution())
199     Standard_ConstructionError::Raise();
200   else 
201     minorRadius = MinorRadius;
202 }
203
204
205 //=======================================================================
206 //function : SetTorus
207 //purpose  : 
208 //=======================================================================
209
210 void Geom_ToroidalSurface::SetTorus (const gp_Torus& T) {
211   
212    minorRadius = T.MinorRadius();
213    majorRadius = T.MajorRadius();
214    pos = T.Position();
215 }
216
217
218 //=======================================================================
219 //function : Area
220 //purpose  : 
221 //=======================================================================
222
223 Standard_Real Geom_ToroidalSurface::Area () const {
224   return 4.0 * M_PI * M_PI * minorRadius * majorRadius;
225 }
226
227
228 //=======================================================================
229 //function : Bounds
230 //purpose  : 
231 //=======================================================================
232
233 void Geom_ToroidalSurface::Bounds (Standard_Real& U1,
234                                    Standard_Real& U2, 
235                                    Standard_Real& V1, 
236                                    Standard_Real& V2 ) const {
237  
238   U1 = 0.0;  
239   V1 = 0.0;  
240   U2 = 2*M_PI;  
241   V2 = 2*M_PI;
242 }
243
244
245 //=======================================================================
246 //function : Coefficients
247 //purpose  : 
248 //=======================================================================
249
250 void Geom_ToroidalSurface::Coefficients (Array1OfReal& Coef) const {
251
252   gp_Torus Tor (pos, majorRadius, minorRadius);
253   Tor.Coefficients (Coef);
254 }
255
256
257 //=======================================================================
258 //function : D0
259 //purpose  : 
260 //=======================================================================
261
262 void Geom_ToroidalSurface::D0 (const Standard_Real U, const Standard_Real V, Pnt& P) const 
263 {
264
265   ElSLib::TorusD0 (U, V, pos, majorRadius, minorRadius,P);
266 }
267
268
269 //=======================================================================
270 //function : D1
271 //purpose  : 
272 //=======================================================================
273
274 void Geom_ToroidalSurface::D1 
275   (const Standard_Real U, const Standard_Real V, 
276          Pnt& P, 
277          Vec& D1U, Vec& D1V) const 
278 {
279   ElSLib::TorusD1 (U, V, pos, majorRadius, minorRadius, P, D1U, D1V);  
280 }
281
282
283 //=======================================================================
284 //function : D2
285 //purpose  : 
286 //=======================================================================
287
288 void Geom_ToroidalSurface::D2 
289   (const Standard_Real U  , const Standard_Real V, 
290          Pnt& P  , 
291          Vec& D1U, Vec& D1V, 
292          Vec& D2U, Vec& D2V, Vec& D2UV ) const 
293 {
294   ElSLib::TorusD2 (U, V, pos, majorRadius, minorRadius, P, D1U, D1V,
295                    D2U, D2V, D2UV);  
296 }
297
298
299 //=======================================================================
300 //function : D3
301 //purpose  : 
302 //=======================================================================
303
304 void Geom_ToroidalSurface::D3 
305   (const Standard_Real U, const Standard_Real V,
306          Pnt& P, 
307          Vec& D1U, Vec& D1V,
308          Vec& D2U, Vec& D2V, Vec& D2UV,
309          Vec& D3U, Vec& D3V, Vec& D3UUV, Vec& D3UVV ) const 
310 {
311
312   ElSLib::TorusD3 (U, V, pos, majorRadius, minorRadius, P, D1U, D1V,
313                    D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV);  
314 }
315
316
317 //=======================================================================
318 //function : DN
319 //purpose  : 
320 //=======================================================================
321
322 Vec Geom_ToroidalSurface::DN 
323   (const Standard_Real    U , const Standard_Real    V, 
324    const Standard_Integer Nu, const Standard_Integer Nv ) const {
325
326   Standard_RangeError_Raise_if (Nu + Nv < 1 || Nu < 0 || Nv <0, "  ");
327   return ElSLib::TorusDN (U, V, pos, majorRadius, minorRadius, Nu, Nv);
328 }
329
330
331 //=======================================================================
332 //function : Torus
333 //purpose  : 
334 //=======================================================================
335
336 gp_Torus Geom_ToroidalSurface::Torus () const {
337
338    return gp_Torus (pos, majorRadius, minorRadius);
339 }
340
341
342 //=======================================================================
343 //function : UIso
344 //purpose  : 
345 //=======================================================================
346
347 Handle(Geom_Curve) Geom_ToroidalSurface::UIso (const Standard_Real U) const 
348 {
349   Handle(Geom_Circle) 
350     GC = new Geom_Circle(ElSLib::TorusUIso(pos,majorRadius,minorRadius,U));
351   return GC;
352 }
353
354
355 //=======================================================================
356 //function : VIso
357 //purpose  : 
358 //=======================================================================
359
360 Handle(Geom_Curve) Geom_ToroidalSurface::VIso (const Standard_Real V) const 
361 {
362   Handle(Geom_Circle) GC = 
363     new Geom_Circle(ElSLib::TorusVIso(pos,majorRadius,minorRadius,V));
364   return GC;
365 }
366
367
368 //=======================================================================
369 //function : Volume
370 //purpose  : 
371 //=======================================================================
372
373 Standard_Real Geom_ToroidalSurface::Volume () const {
374
375   return (M_PI * minorRadius * minorRadius) * (2.0 * M_PI * majorRadius);
376 }
377
378
379 //=======================================================================
380 //function : Transform
381 //purpose  : 
382 //=======================================================================
383
384 void Geom_ToroidalSurface::Transform (const Trsf& T) {
385
386    majorRadius = majorRadius * Abs(T.ScaleFactor());
387    minorRadius = minorRadius * Abs(T.ScaleFactor());
388    pos.Transform (T);
389 }