0024023: Revamp the OCCT Handle -- general
[occt.git] / src / Geom / Geom_Plane.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_Plane.ixx>
18
19 #include <Precision.hxx>
20 #include <Standard_RangeError.hxx>
21
22 #include <gp_XYZ.hxx>
23 #include <gp.hxx>
24 #include <gp_Lin.hxx>
25 #include <gp_Trsf2d.hxx>
26 #include <ElSLib.hxx>
27 #include <Geom_Line.hxx>
28 #include <GeomAbs_UVSense.hxx>
29
30 typedef Geom_Plane         Plane;
31 typedef gp_Ax1  Ax1;
32 typedef gp_Ax2  Ax2;
33 typedef gp_Ax3  Ax3;
34 typedef gp_Dir  Dir;
35 typedef gp_Lin  Lin;
36 typedef gp_Pln  Pln;
37 typedef gp_Pnt  Pnt;
38 typedef gp_Trsf Trsf;
39 typedef gp_Vec  Vec;
40 typedef gp_XYZ  XYZ;
41
42 //=======================================================================
43 //function : Copy
44 //purpose  : 
45 //=======================================================================
46
47 Handle(Geom_Geometry) Geom_Plane::Copy () const {
48  
49   Handle(Geom_Plane) Pl = new Plane ( pos);
50   return Pl;
51 }
52
53
54
55
56 //=======================================================================
57 //function : Geom_Plane
58 //purpose  : 
59 //=======================================================================
60
61 Geom_Plane::Geom_Plane (const gp_Ax3& A3)  {
62
63   pos = A3;
64 }
65
66
67 //=======================================================================
68 //function : Geom_Plane
69 //purpose  : 
70 //=======================================================================
71
72 Geom_Plane::Geom_Plane (const gp_Pln& Pl)   {
73
74   pos = Pl.Position(); 
75 }
76
77
78 //=======================================================================
79 //function : Geom_Plane
80 //purpose  : 
81 //=======================================================================
82
83 Geom_Plane::Geom_Plane (const Pnt& P, const Dir& V) {
84
85   gp_Pln Pl (P, V);
86   pos = Pl.Position();
87 }
88
89
90 //=======================================================================
91 //function : Geom_Plane
92 //purpose  : 
93 //=======================================================================
94
95 Geom_Plane::Geom_Plane ( const Standard_Real A, 
96                          const Standard_Real B, 
97                          const Standard_Real C, 
98                          const Standard_Real D) {
99
100   gp_Pln Pl (A, B, C, D);
101   pos = Pl.Position ();
102 }
103
104
105 //=======================================================================
106 //function : SetPln
107 //purpose  : 
108 //=======================================================================
109
110 void Geom_Plane::SetPln (const gp_Pln& Pl)    
111 { pos = Pl.Position(); }
112
113 //=======================================================================
114 //function : Pln
115 //purpose  : 
116 //=======================================================================
117
118 gp_Pln Geom_Plane::Pln () const { 
119
120   return gp_Pln (Position()); 
121 }
122
123
124 //=======================================================================
125 //function : UReverse
126 //purpose  : 
127 //=======================================================================
128
129 void Geom_Plane::UReverse() {
130   pos.XReverse();
131 }
132
133 //=======================================================================
134 //function : UReversedParameter
135 //purpose  : 
136 //=======================================================================
137
138 Standard_Real Geom_Plane::UReversedParameter( const Standard_Real U) const {
139
140   return (-U); 
141 }
142
143
144 //=======================================================================
145 //function : VReverse
146 //purpose  : 
147 //=======================================================================
148
149 void Geom_Plane::VReverse() {
150
151   pos.YReverse();
152 }
153
154
155 //=======================================================================
156 //function : VReversedParameter
157 //purpose  : 
158 //=======================================================================
159
160 Standard_Real Geom_Plane::VReversedParameter( const Standard_Real V) const {
161
162   return (-V); 
163 }
164
165 //=======================================================================
166 //function : Transform
167 //purpose  : 
168 //=======================================================================
169
170 void Geom_Plane::Transform (const Trsf& T)           
171 { pos.Transform (T); }
172
173 //=======================================================================
174 //function : IsUClosed
175 //purpose  : 
176 //=======================================================================
177
178 Standard_Boolean Geom_Plane::IsUClosed () const {
179
180   return Standard_False; 
181 }
182
183 //=======================================================================
184 //function : IsVClosed
185 //purpose  : 
186 //=======================================================================
187
188 Standard_Boolean Geom_Plane::IsVClosed () const {
189
190   return Standard_False; 
191 }
192
193 //=======================================================================
194 //function : IsUPeriodic
195 //purpose  : 
196 //=======================================================================
197
198 Standard_Boolean Geom_Plane::IsUPeriodic () const {
199
200   return Standard_False; 
201 }
202
203 //=======================================================================
204 //function : IsVPeriodic
205 //purpose  : 
206 //=======================================================================
207
208 Standard_Boolean Geom_Plane::IsVPeriodic () const {
209
210   return Standard_False; 
211 }
212
213 //=======================================================================
214 //function : Bounds
215 //purpose  : 
216 //=======================================================================
217
218 void Geom_Plane::Bounds (Standard_Real& U1, Standard_Real& U2, Standard_Real& V1, Standard_Real& V2) const {
219   
220   U1 = -Precision::Infinite();  
221   U2 = Precision::Infinite();  
222   V1 = -Precision::Infinite(); 
223   V2 = Precision::Infinite();
224 }
225
226
227 //=======================================================================
228 //function : Coefficients
229 //purpose  : 
230 //=======================================================================
231
232 void Geom_Plane::Coefficients (Standard_Real& A, Standard_Real& B, Standard_Real& C, Standard_Real& D) const {
233
234    gp_Pln Pl (Position());
235    Pl.Coefficients (A, B, C, D);
236 }
237
238
239 //=======================================================================
240 //function : D0
241 //purpose  : 
242 //=======================================================================
243
244 void Geom_Plane::D0 (const Standard_Real U, const Standard_Real V, Pnt& P) const {
245   
246   P = ElSLib::PlaneValue (U, V, pos);
247 }
248
249
250
251 //=======================================================================
252 //function : D1
253 //purpose  : 
254 //=======================================================================
255
256 void Geom_Plane::D1 ( const Standard_Real U, const Standard_Real V, 
257                             Pnt& P,       Vec& D1U, Vec& D1V) const 
258 {
259
260   ElSLib::PlaneD1 (U, V, pos, P, D1U, D1V);   
261 }
262
263
264 //=======================================================================
265 //function : D2
266 //purpose  : 
267 //=======================================================================
268
269 void Geom_Plane::D2 ( const Standard_Real U  , const Standard_Real V, 
270                             Pnt& P  , 
271                             Vec& D1U, Vec& D1V, 
272                             Vec& D2U, Vec& D2V, Vec& D2UV) const 
273 {
274
275   ElSLib::PlaneD1 (U, V, pos, P, D1U, D1V);
276     D2U.SetCoord (0.0, 0.0, 0.0);
277     D2V.SetCoord (0.0, 0.0, 0.0);
278     D2UV.SetCoord (0.0, 0.0, 0.0);
279 }
280
281
282 //=======================================================================
283 //function : D3
284 //purpose  : 
285 //=======================================================================
286
287 void Geom_Plane::D3 ( const Standard_Real U, const Standard_Real V, 
288                       Pnt& P, 
289                       Vec& D1U, Vec& D1V, 
290                       Vec& D2U, Vec& D2V, Vec& D2UV, 
291                       Vec& D3U, Vec& D3V, Vec& D3UUV, Vec& D3UVV) const 
292 {
293   ElSLib::PlaneD1 (U, V, pos, P, D1U, D1V);
294    D2U.SetCoord (0.0, 0.0, 0.0);
295    D2V.SetCoord (0.0, 0.0, 0.0);
296    D2UV.SetCoord (0.0, 0.0, 0.0);
297    D3U.SetCoord (0.0, 0.0, 0.0);
298    D3V.SetCoord (0.0, 0.0, 0.0);
299    D3UUV.SetCoord (0.0, 0.0, 0.0);
300    D3UVV.SetCoord (0.0, 0.0, 0.0);
301 }
302
303
304
305 //=======================================================================
306 //function : DN
307 //purpose  : 
308 //=======================================================================
309
310 Vec Geom_Plane::DN ( const Standard_Real      , const Standard_Real      , 
311                      const Standard_Integer Nu, const Standard_Integer Nv ) const {
312
313    Standard_RangeError_Raise_if (Nu < 0 || Nv < 0 || Nu + Nv < 1, " ");
314    if (Nu == 0 && Nv == 1) {
315      return Vec (pos.YDirection());
316    }
317    else if (Nu == 1 && Nv == 0) {
318      return Vec (pos.XDirection());
319    }
320    return Vec (0.0, 0.0, 0.0);
321 }
322
323
324 //=======================================================================
325 //function : UIso
326 //purpose  : 
327 //=======================================================================
328
329 Handle(Geom_Curve) Geom_Plane::UIso (const Standard_Real U) const 
330 {
331   Handle(Geom_Line) GL = new Geom_Line (ElSLib::PlaneUIso(pos,U));
332   return GL;
333 }
334
335
336 //=======================================================================
337 //function : VIso
338 //purpose  : 
339 //=======================================================================
340
341 Handle(Geom_Curve) Geom_Plane::VIso (const Standard_Real V) const 
342 {
343   Handle(Geom_Line) GL = new Geom_Line (ElSLib::PlaneVIso(pos,V));
344   return GL;
345 }
346
347 //=======================================================================
348 //function : TransformParameters
349 //purpose  : 
350 //=======================================================================
351
352 void Geom_Plane::TransformParameters(Standard_Real& U,
353                                      Standard_Real& V,
354                                      const gp_Trsf& T) 
355 const
356 {
357   if (!Precision::IsInfinite(U)) U *= Abs(T.ScaleFactor());
358   if (!Precision::IsInfinite(V)) V *= Abs(T.ScaleFactor());
359 }
360
361 //=======================================================================
362 //function : ParametricTransformation
363 //purpose  : 
364 //=======================================================================
365
366 gp_GTrsf2d Geom_Plane::ParametricTransformation(const gp_Trsf& T) const
367 {
368   gp_Trsf2d T2;
369   T2.SetScale(gp::Origin2d(), Abs(T.ScaleFactor()));
370   return gp_GTrsf2d(T2);
371 }