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