a024e31f712f3613c7fe31997a8d475b8b067ebe
[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     Handle(Geom_OffsetSurface) OS = new Geom_OffsetSurface(S2, O->Offset());
122     basisSurf = Handle(Geom_Surface)::DownCast(OS);
123   }  
124
125   SetTrim( U1, U2, V1, V2, USense, VSense);
126 }
127
128
129 //=======================================================================
130 //function : Geom_RectangularTrimmedSurface
131 //purpose  : 
132 //=======================================================================
133
134 Geom_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())
147     basisSurf = Handle(Geom_Surface)::DownCast(T->BasisSurface()->Copy());
148   else
149     basisSurf = Handle(Geom_Surface)::DownCast(S->Copy());
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());
158     basisSurf = Handle(Geom_Surface)::DownCast(OS);
159   }  
160
161   SetTrim(Param1, Param2, UTrim, Sense);
162 }
163
164
165 //=======================================================================
166 //function : SetTrim
167 //purpose  : 
168 //=======================================================================
169
170 void 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
187 void 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
217 void 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
326 void 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
342 Standard_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
353 void 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
369 Standard_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
380 Handle(Geom_Surface) Geom_RectangularTrimmedSurface::BasisSurface () const
381 {
382   return basisSurf;
383 }
384
385
386 //=======================================================================
387 //function : Continuity
388 //purpose  : 
389 //=======================================================================
390
391 GeomAbs_Shape Geom_RectangularTrimmedSurface::Continuity () const {
392
393   return basisSurf->Continuity();
394 }
395
396
397 //=======================================================================
398 //function : D0
399 //purpose  : 
400 //=======================================================================
401
402 void 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
415 void 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
429 void 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
444 void 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
460 Vec 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
473 void 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
490 Handle(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
510 Handle(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
530 Standard_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
542 Standard_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
554 void 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
568 Standard_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
581 Standard_Real Geom_RectangularTrimmedSurface::UPeriod() const
582 {
583   return basisSurf->UPeriod();
584 }
585
586
587 //=======================================================================
588 //function : IsVPeriodic
589 //purpose  : 
590 //=======================================================================
591
592 Standard_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
605 Standard_Real Geom_RectangularTrimmedSurface::VPeriod() const
606 {
607    return basisSurf->VPeriod(); 
608 }
609
610
611 //=======================================================================
612 //function : IsUClosed
613 //purpose  : 
614 //=======================================================================
615
616 Standard_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
630 Standard_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
643 void Geom_RectangularTrimmedSurface::TransformParameters(Standard_Real& U,
644                                                          Standard_Real& V,
645                                                          const gp_Trsf& T) 
646 const
647 {
648   basisSurf->TransformParameters(U,V,T);
649 }
650
651 //=======================================================================
652 //function : ParametricTransformation
653 //purpose  : 
654 //=======================================================================
655
656 gp_GTrsf2d Geom_RectangularTrimmedSurface::ParametricTransformation
657 (const gp_Trsf& T) const
658 {
659   return basisSurf->ParametricTransformation(T);
660 }
661