0026936: Drawbacks of inlining in new type system in OCCT 7.0 -- automatic
[occt.git] / src / Geom / Geom_RectangularTrimmedSurface.cxx
CommitLineData
b311480e 1// Created on: 1993-03-10
2// Created by: JCV
3// Copyright (c) 1993-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 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
973c2be1 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.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
b311480e 16
7fd59977 17// *******************************************************************
7fd59977 18// *******************************************************************
19
42cf5bc1 20#include <ElCLib.hxx>
21#include <Geom_BezierSurface.hxx>
22#include <Geom_BSplineSurface.hxx>
23#include <Geom_ConicalSurface.hxx>
24#include <Geom_Curve.hxx>
25#include <Geom_CylindricalSurface.hxx>
7fd59977 26#include <Geom_Geometry.hxx>
42cf5bc1 27#include <Geom_OffsetSurface.hxx>
7fd59977 28#include <Geom_Plane.hxx>
42cf5bc1 29#include <Geom_RectangularTrimmedSurface.hxx>
7fd59977 30#include <Geom_SphericalSurface.hxx>
42cf5bc1 31#include <Geom_Surface.hxx>
7fd59977 32#include <Geom_SurfaceOfLinearExtrusion.hxx>
42cf5bc1 33#include <Geom_SurfaceOfRevolution.hxx>
34#include <Geom_ToroidalSurface.hxx>
35#include <Geom_TrimmedCurve.hxx>
36#include <Geom_UndefinedDerivative.hxx>
37#include <Geom_UndefinedValue.hxx>
38#include <gp_GTrsf2d.hxx>
39#include <gp_Pnt.hxx>
40#include <gp_Trsf.hxx>
41#include <gp_Vec.hxx>
7fd59977 42#include <Precision.hxx>
42cf5bc1 43#include <Standard_ConstructionError.hxx>
44#include <Standard_NoSuchObject.hxx>
45#include <Standard_RangeError.hxx>
46#include <Standard_Type.hxx>
7fd59977 47
92efcf78 48IMPLEMENT_STANDARD_RTTIEXT(Geom_RectangularTrimmedSurface,Geom_BoundedSurface)
49
7fd59977 50typedef Geom_RectangularTrimmedSurface RectangularTrimmedSurface;
7fd59977 51typedef gp_Ax1 Ax1;
52typedef gp_Ax2 Ax2;
53typedef gp_Pnt Pnt;
54typedef gp_Trsf Trsf;
55typedef gp_Vec Vec;
56
7fd59977 57//=======================================================================
58//function : Copy
59//purpose :
60//=======================================================================
61
62Handle(Geom_Geometry) Geom_RectangularTrimmedSurface::Copy () const {
63
c04c30b3 64 Handle(Geom_RectangularTrimmedSurface) S;
7fd59977 65
66 if ( isutrimmed && isvtrimmed )
67 S = new RectangularTrimmedSurface (basisSurf,
68 utrim1 , utrim2,
69 vtrim1 , vtrim2,
70 Standard_True , Standard_True );
71 else if ( isutrimmed)
72 S = new RectangularTrimmedSurface (basisSurf,
73 utrim1 , utrim2,
74 Standard_True, Standard_True );
75 else if (isvtrimmed)
76 S = new RectangularTrimmedSurface (basisSurf,
77 vtrim1 , vtrim2,
78 Standard_False , Standard_True );
79
80 return S;
81}
82
83
84//=======================================================================
85//function : Geom_RectangularTrimmedSurface
86//purpose :
87//=======================================================================
88
89Geom_RectangularTrimmedSurface::Geom_RectangularTrimmedSurface (
90
c04c30b3 91const Handle(Geom_Surface)& S,
7fd59977 92const Standard_Real U1,
93const Standard_Real U2,
94const Standard_Real V1,
95const Standard_Real V2,
96const Standard_Boolean USense,
97const Standard_Boolean VSense)
98
99: utrim1 (U1),
100 vtrim1(V1),
101 utrim2 (U2),
102 vtrim2 (V2),
103 isutrimmed (Standard_True),
104 isvtrimmed (Standard_True)
105{
106
107 // kill trimmed basis surfaces
108 Handle(Geom_RectangularTrimmedSurface) T =
109 Handle(Geom_RectangularTrimmedSurface)::DownCast(S);
110 if (!T.IsNull())
c04c30b3 111 basisSurf = Handle(Geom_Surface)::DownCast(T->BasisSurface()->Copy());
7fd59977 112 else
c04c30b3 113 basisSurf = Handle(Geom_Surface)::DownCast(S->Copy());
7fd59977 114
115 Handle(Geom_OffsetSurface) O =
116 Handle(Geom_OffsetSurface)::DownCast(basisSurf);
117 if (!O.IsNull())
118 {
119 Handle(Geom_RectangularTrimmedSurface) S2 =
120 new Geom_RectangularTrimmedSurface( O->BasisSurface(),U1,U2, V1, V2, USense, VSense);
121 Handle(Geom_OffsetSurface) OS = new Geom_OffsetSurface(S2, O->Offset());
c04c30b3 122 basisSurf = Handle(Geom_Surface)::DownCast(OS);
7fd59977 123 }
124
125 SetTrim( U1, U2, V1, V2, USense, VSense);
126}
127
128
129//=======================================================================
130//function : Geom_RectangularTrimmedSurface
131//purpose :
132//=======================================================================
133
134Geom_RectangularTrimmedSurface::Geom_RectangularTrimmedSurface (
135
136 const Handle(Geom_Surface)& S,
137 const Standard_Real Param1,
138 const Standard_Real Param2,
139 const Standard_Boolean UTrim,
140 const Standard_Boolean Sense
141) {
142
143 // kill trimmed basis surfaces
144 Handle(Geom_RectangularTrimmedSurface) T =
145 Handle(Geom_RectangularTrimmedSurface)::DownCast(S);
146 if (!T.IsNull())
c04c30b3 147 basisSurf = Handle(Geom_Surface)::DownCast(T->BasisSurface()->Copy());
7fd59977 148 else
c04c30b3 149 basisSurf = Handle(Geom_Surface)::DownCast(S->Copy());
7fd59977 150
151 Handle(Geom_OffsetSurface) O =
152 Handle(Geom_OffsetSurface)::DownCast(basisSurf);
153 if (!O.IsNull())
154 {
155 Handle(Geom_RectangularTrimmedSurface) S2 =
156 new Geom_RectangularTrimmedSurface( O->BasisSurface(),Param1,Param2, UTrim, Sense);
157 Handle(Geom_OffsetSurface) OS = new Geom_OffsetSurface(S2, O->Offset());
c04c30b3 158 basisSurf = Handle(Geom_Surface)::DownCast(OS);
7fd59977 159 }
160
161 SetTrim(Param1, Param2, UTrim, Sense);
162}
163
164
165//=======================================================================
166//function : SetTrim
167//purpose :
168//=======================================================================
169
170void Geom_RectangularTrimmedSurface::SetTrim (const Standard_Real U1,
171 const Standard_Real U2,
172 const Standard_Real V1,
173 const Standard_Real V2,
174 const Standard_Boolean USense,
175 const Standard_Boolean VSense ) {
176
177 SetTrim( U1, U2, V1, V2, Standard_True, Standard_True, USense, VSense);
178}
179
180
181
182//=======================================================================
183//function : SetTrim
184//purpose :
185//=======================================================================
186
187void Geom_RectangularTrimmedSurface::SetTrim (const Standard_Real Param1,
188 const Standard_Real Param2,
189 const Standard_Boolean UTrim,
190 const Standard_Boolean Sense ) {
191
192 // dummy arguments to call general SetTrim
193 Standard_Real dummy_a = 0.;
194 Standard_Real dummy_b = 0.;
195 Standard_Boolean dummy_Sense = Standard_True;
196
197 if ( UTrim) {
198 SetTrim( Param1 , Param2 ,
199 dummy_a , dummy_b ,
200 Standard_True , Standard_False,
201 Sense , dummy_Sense );
202 }
203 else {
204 SetTrim( dummy_a , dummy_b ,
205 Param1 , Param2 ,
206 Standard_False, Standard_True,
207 dummy_Sense , Sense );
208 }
209}
210
211
212//=======================================================================
213//function : SetTrim
214//purpose :
215//=======================================================================
216
217void Geom_RectangularTrimmedSurface::SetTrim(const Standard_Real U1,
218 const Standard_Real U2,
219 const Standard_Real V1,
220 const Standard_Real V2,
221 const Standard_Boolean UTrim,
222 const Standard_Boolean VTrim,
223 const Standard_Boolean USense,
224 const Standard_Boolean VSense) {
225
226 Standard_Boolean UsameSense = Standard_True;
227 Standard_Boolean VsameSense = Standard_True;
228 Standard_Real Udeb, Ufin, Vdeb, Vfin;
229
230 basisSurf->Bounds(Udeb, Ufin, Vdeb, Vfin);
231
232 // Trimming the U-Direction
233 isutrimmed = UTrim;
234 if (!UTrim) {
235 utrim1 = Udeb;
236 utrim2 = Ufin;
237 }
238 else {
239 if ( U1 == U2)
240 Standard_ConstructionError::Raise
241 ("Geom_RectangularTrimmedSurface::U1==U2");
242
243 if (basisSurf->IsUPeriodic()) {
244 UsameSense = USense;
245
246 // set uTrim1 in the range Udeb , Ufin
247 // set uTrim2 in the range uTrim1 , uTrim1 + Period()
248 utrim1 = U1;
249 utrim2 = U2;
250 ElCLib::AdjustPeriodic(Udeb, Ufin,
251 Min(Abs(utrim2-utrim1)/2,Precision::PConfusion()),
252 utrim1, utrim2);
253 }
254 else {
255 if (U1 < U2) {
256 UsameSense = USense;
257 utrim1 = U1;
258 utrim2 = U2;
259 }
260 else {
261 UsameSense = !USense;
262 utrim1 = U2;
263 utrim2 = U1;
264 }
265
266 if ((Udeb-utrim1 > Precision::PConfusion()) ||
267 (utrim2-Ufin > Precision::PConfusion()))
268 Standard_ConstructionError::Raise
269 ("Geom_RectangularTrimmedSurface::U parameters out of range");
270
271 }
272 }
273
274 // Trimming the V-Direction
275 isvtrimmed = VTrim;
276 if (!VTrim) {
277 vtrim1 = Vdeb;
278 vtrim2 = Vfin;
279 }
280 else {
281 if ( V1 == V2)
282 Standard_ConstructionError::Raise
283 ("Geom_RectangularTrimmedSurface::V1==V2");
284
285 if (basisSurf->IsVPeriodic()) {
286 VsameSense = VSense;
287
288 // set vTrim1 in the range Vdeb , Vfin
289 // set vTrim2 in the range vTrim1 , vTrim1 + Period()
290 vtrim1 = V1;
291 vtrim2 = V2;
292 ElCLib::AdjustPeriodic(Vdeb, Vfin,
293 Min(Abs(vtrim2-vtrim1)/2,Precision::PConfusion()),
294 vtrim1, vtrim2);
295 }
296 else {
297 if (V1 < V2) {
298 VsameSense = VSense;
299 vtrim1 = V1;
300 vtrim2 = V2;
301 }
302 else {
303 VsameSense = !VSense;
304 vtrim1 = V2;
305 vtrim2 = V1;
306 }
307
308 if ((Vdeb-vtrim1 > Precision::PConfusion()) ||
309 (vtrim2-Vfin > Precision::PConfusion()))
310 Standard_ConstructionError::Raise
311 ("Geom_RectangularTrimmedSurface::V parameters out of range");
312
313 }
314 }
315
316 if (!UsameSense) UReverse();
317 if (!VsameSense) VReverse();
318}
319
320
321//=======================================================================
322//function : UReverse
323//purpose :
324//=======================================================================
325
326void Geom_RectangularTrimmedSurface::UReverse ()
327{
328 Standard_Real U1 = basisSurf->UReversedParameter(utrim2);
329 Standard_Real U2 = basisSurf->UReversedParameter(utrim1);
330 basisSurf->UReverse();
331 SetTrim(U1,U2,vtrim1,vtrim2,
332 isutrimmed,isvtrimmed,
333 Standard_True,Standard_True);
334}
335
336
337//=======================================================================
338//function : UReversedParameter
339//purpose :
340//=======================================================================
341
342Standard_Real Geom_RectangularTrimmedSurface::UReversedParameter( const Standard_Real U) const {
343
344 return basisSurf->UReversedParameter(U);
345}
346
347
348//=======================================================================
349//function : VReverse
350//purpose :
351//=======================================================================
352
353void Geom_RectangularTrimmedSurface::VReverse ()
354{
355 Standard_Real V1 = basisSurf->VReversedParameter(vtrim2);
356 Standard_Real V2 = basisSurf->VReversedParameter(vtrim1);
357 basisSurf->VReverse();
358 SetTrim(utrim1,utrim2,V1,V2,
359 isutrimmed,isvtrimmed,
360 Standard_True,Standard_True);
361}
362
363
364//=======================================================================
365//function : VReversedParameter
366//purpose :
367//=======================================================================
368
369Standard_Real Geom_RectangularTrimmedSurface::VReversedParameter( const Standard_Real V) const {
370
371 return basisSurf->VReversedParameter( V);
372}
373
374
375//=======================================================================
376//function : BasisSurface
377//purpose :
378//=======================================================================
379
c04c30b3 380Handle(Geom_Surface) Geom_RectangularTrimmedSurface::BasisSurface () const
7fd59977 381{
382 return basisSurf;
383}
384
385
386//=======================================================================
387//function : Continuity
388//purpose :
389//=======================================================================
390
391GeomAbs_Shape Geom_RectangularTrimmedSurface::Continuity () const {
392
393 return basisSurf->Continuity();
394}
395
396
397//=======================================================================
398//function : D0
399//purpose :
400//=======================================================================
401
402void Geom_RectangularTrimmedSurface::D0
403 (const Standard_Real U, const Standard_Real V,
404 Pnt& P ) const {
405
406 basisSurf->D0 (U, V, P);
407}
408
409
410//=======================================================================
411//function : D1
412//purpose :
413//=======================================================================
414
415void Geom_RectangularTrimmedSurface::D1
416 (const Standard_Real U, const Standard_Real V,
417 Pnt& P,
418 Vec& D1U, Vec& D1V) const {
419
420 basisSurf->D1 (U, V, P, D1U, D1V);
421}
422
423
424//=======================================================================
425//function : D2
426//purpose :
427//=======================================================================
428
429void Geom_RectangularTrimmedSurface::D2
430 (const Standard_Real U, const Standard_Real V,
431 Pnt& P,
432 Vec& D1U, Vec& D1V,
433 Vec& D2U, Vec& D2V, Vec& D2UV) const {
434
435 basisSurf->D2 (U, V, P, D1U, D1V, D2U, D2V, D2UV);
436}
437
438
439//=======================================================================
440//function : D3
441//purpose :
442//=======================================================================
443
444void Geom_RectangularTrimmedSurface::D3
445 (const Standard_Real U, const Standard_Real V,
446 Pnt& P,
447 Vec& D1U, Vec& D1V,
448 Vec& D2U, Vec& D2V, Vec& D2UV,
449 Vec& D3U, Vec& D3V, Vec& D3UUV, Vec& D3UVV) const {
450
451 basisSurf->D3 (U, V, P, D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV);
452}
453
454
455//=======================================================================
456//function : DN
457//purpose :
458//=======================================================================
459
460Vec Geom_RectangularTrimmedSurface::DN
461 (const Standard_Real U , const Standard_Real V,
462 const Standard_Integer Nu, const Standard_Integer Nv) const {
463
464 return basisSurf->DN (U, V, Nu, Nv);
465}
466
467
468//=======================================================================
469//function : Bounds
470//purpose :
471//=======================================================================
472
473void Geom_RectangularTrimmedSurface::Bounds (Standard_Real& U1,
474 Standard_Real& U2,
475 Standard_Real& V1,
476 Standard_Real& V2) const {
477
478 U1 = utrim1;
479 U2 = utrim2;
480 V1 = vtrim1;
481 V2 = vtrim2;
482}
483
484
485//=======================================================================
486//function : UIso
487//purpose :
488//=======================================================================
489
490Handle(Geom_Curve) Geom_RectangularTrimmedSurface::UIso (const Standard_Real U) const {
491
492 Handle(Geom_Curve) C = basisSurf->UIso (U);
493
494 if ( isvtrimmed) {
495 Handle(Geom_TrimmedCurve) Ct;
496 Ct = new Geom_TrimmedCurve (C, vtrim1, vtrim2, Standard_True);
497 return Ct;
498 }
499 else {
500 return C;
501 }
502}
503
504
505//=======================================================================
506//function : VIso
507//purpose :
508//=======================================================================
509
510Handle(Geom_Curve) Geom_RectangularTrimmedSurface::VIso (const Standard_Real V) const {
511
512 Handle(Geom_Curve) C = basisSurf->VIso (V);
513
514 if ( isutrimmed) {
515 Handle(Geom_TrimmedCurve) Ct;
516 Ct = new Geom_TrimmedCurve (C, utrim1, utrim2, Standard_True);
517 return Ct;
518 }
519 else {
520 return C;
521 }
522}
523
524
525//=======================================================================
526//function : IsCNu
527//purpose :
528//=======================================================================
529
530Standard_Boolean Geom_RectangularTrimmedSurface::IsCNu (const Standard_Integer N) const {
531
532 Standard_RangeError_Raise_if (N < 0," ");
533 return basisSurf->IsCNu (N);
534}
535
536
537//=======================================================================
538//function : IsCNv
539//purpose :
540//=======================================================================
541
542Standard_Boolean Geom_RectangularTrimmedSurface::IsCNv (const Standard_Integer N) const {
543
544 Standard_RangeError_Raise_if (N < 0," ");
545 return basisSurf->IsCNv (N);
546}
547
548
549//=======================================================================
550//function : Transform
551//purpose :
552//=======================================================================
553
554void Geom_RectangularTrimmedSurface::Transform (const Trsf& T)
555{
556 basisSurf->Transform (T);
557 basisSurf->TransformParameters(utrim1,vtrim1,T);
558 basisSurf->TransformParameters(utrim2,vtrim2,T);
559}
560
561
562//=======================================================================
563//function : IsUPeriodic
564//purpose :
565// 24/11/98: pmn : Compare la periode a la longeur de l'intervalle
566//=======================================================================
567
568Standard_Boolean Geom_RectangularTrimmedSurface::IsUPeriodic () const
569{
570 if (basisSurf->IsUPeriodic() && !isutrimmed)
571 return Standard_True;
572 return Standard_False;
573}
574
575
576//=======================================================================
577//function : UPeriod
578//purpose :
579//=======================================================================
580
581Standard_Real Geom_RectangularTrimmedSurface::UPeriod() const
582{
583 return basisSurf->UPeriod();
584}
585
586
587//=======================================================================
588//function : IsVPeriodic
589//purpose :
590//=======================================================================
591
592Standard_Boolean Geom_RectangularTrimmedSurface::IsVPeriodic () const
593{
594 if (basisSurf->IsVPeriodic() && !isvtrimmed)
595 return Standard_True;
596 return Standard_False;
597}
598
599
600//=======================================================================
601//function : VPeriod
602//purpose :
603//=======================================================================
604
605Standard_Real Geom_RectangularTrimmedSurface::VPeriod() const
606{
607 return basisSurf->VPeriod();
608}
609
610
611//=======================================================================
612//function : IsUClosed
613//purpose :
614//=======================================================================
615
616Standard_Boolean Geom_RectangularTrimmedSurface::IsUClosed () const {
617
618 if (isutrimmed)
619 return Standard_False;
620 else
621 return basisSurf->IsUClosed();
622}
623
624
625//=======================================================================
626//function : IsVClosed
627//purpose :
628//=======================================================================
629
630Standard_Boolean Geom_RectangularTrimmedSurface::IsVClosed () const {
631
632 if (isvtrimmed)
633 return Standard_False;
634 else
635 return basisSurf->IsVClosed();
636}
637
638//=======================================================================
639//function : TransformParameters
640//purpose :
641//=======================================================================
642
643void Geom_RectangularTrimmedSurface::TransformParameters(Standard_Real& U,
644 Standard_Real& V,
645 const gp_Trsf& T)
646const
647{
648 basisSurf->TransformParameters(U,V,T);
649}
650
651//=======================================================================
652//function : ParametricTransformation
653//purpose :
654//=======================================================================
655
656gp_GTrsf2d Geom_RectangularTrimmedSurface::ParametricTransformation
657(const gp_Trsf& T) const
658{
659 return basisSurf->ParametricTransformation(T);
660}
661