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