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