1 // Created on: 1993-03-10
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 // *******************************************************************
18 // *******************************************************************
22 #include <Geom_RectangularTrimmedSurface.ixx>
25 #include <Standard_ConstructionError.hxx>
26 #include <Standard_RangeError.hxx>
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>
42 #include <Precision.hxx>
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);
60 //=======================================================================
63 //=======================================================================
65 Handle(Geom_Geometry) Geom_RectangularTrimmedSurface::Copy () const {
67 Handle(RectangularTrimmedSurface) S;
69 if ( isutrimmed && isvtrimmed )
70 S = new RectangularTrimmedSurface (basisSurf,
73 Standard_True , Standard_True );
75 S = new RectangularTrimmedSurface (basisSurf,
77 Standard_True, Standard_True );
79 S = new RectangularTrimmedSurface (basisSurf,
81 Standard_False , Standard_True );
87 //=======================================================================
88 //function : Geom_RectangularTrimmedSurface
90 //=======================================================================
92 Geom_RectangularTrimmedSurface::Geom_RectangularTrimmedSurface (
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)
106 isutrimmed (Standard_True),
107 isvtrimmed (Standard_True)
110 // kill trimmed basis surfaces
111 Handle(Geom_RectangularTrimmedSurface) T =
112 Handle(Geom_RectangularTrimmedSurface)::DownCast(S);
114 basisSurf = Handle(Surface)::DownCast(T->BasisSurface()->Copy());
116 basisSurf = Handle(Surface)::DownCast(S->Copy());
118 Handle(Geom_OffsetSurface) O =
119 Handle(Geom_OffsetSurface)::DownCast(basisSurf);
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);
128 SetTrim( U1, U2, V1, V2, USense, VSense);
132 //=======================================================================
133 //function : Geom_RectangularTrimmedSurface
135 //=======================================================================
137 Geom_RectangularTrimmedSurface::Geom_RectangularTrimmedSurface (
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
146 // kill trimmed basis surfaces
147 Handle(Geom_RectangularTrimmedSurface) T =
148 Handle(Geom_RectangularTrimmedSurface)::DownCast(S);
150 basisSurf = Handle(Surface)::DownCast(T->BasisSurface()->Copy());
152 basisSurf = Handle(Surface)::DownCast(S->Copy());
154 Handle(Geom_OffsetSurface) O =
155 Handle(Geom_OffsetSurface)::DownCast(basisSurf);
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);
164 SetTrim(Param1, Param2, UTrim, Sense);
168 //=======================================================================
171 //=======================================================================
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 ) {
180 SetTrim( U1, U2, V1, V2, Standard_True, Standard_True, USense, VSense);
185 //=======================================================================
188 //=======================================================================
190 void Geom_RectangularTrimmedSurface::SetTrim (const Standard_Real Param1,
191 const Standard_Real Param2,
192 const Standard_Boolean UTrim,
193 const Standard_Boolean Sense ) {
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;
201 SetTrim( Param1 , Param2 ,
203 Standard_True , Standard_False,
204 Sense , dummy_Sense );
207 SetTrim( dummy_a , dummy_b ,
209 Standard_False, Standard_True,
210 dummy_Sense , Sense );
215 //=======================================================================
218 //=======================================================================
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) {
229 Standard_Boolean UsameSense = Standard_True;
230 Standard_Boolean VsameSense = Standard_True;
231 Standard_Real Udeb, Ufin, Vdeb, Vfin;
233 basisSurf->Bounds(Udeb, Ufin, Vdeb, Vfin);
235 // Trimming the U-Direction
243 Standard_ConstructionError::Raise
244 ("Geom_RectangularTrimmedSurface::U1==U2");
246 if (basisSurf->IsUPeriodic()) {
249 // set uTrim1 in the range Udeb , Ufin
250 // set uTrim2 in the range uTrim1 , uTrim1 + Period()
253 ElCLib::AdjustPeriodic(Udeb, Ufin,
254 Min(Abs(utrim2-utrim1)/2,Precision::PConfusion()),
264 UsameSense = !USense;
269 if ((Udeb-utrim1 > Precision::PConfusion()) ||
270 (utrim2-Ufin > Precision::PConfusion()))
271 Standard_ConstructionError::Raise
272 ("Geom_RectangularTrimmedSurface::U parameters out of range");
277 // Trimming the V-Direction
285 Standard_ConstructionError::Raise
286 ("Geom_RectangularTrimmedSurface::V1==V2");
288 if (basisSurf->IsVPeriodic()) {
291 // set vTrim1 in the range Vdeb , Vfin
292 // set vTrim2 in the range vTrim1 , vTrim1 + Period()
295 ElCLib::AdjustPeriodic(Vdeb, Vfin,
296 Min(Abs(vtrim2-vtrim1)/2,Precision::PConfusion()),
306 VsameSense = !VSense;
311 if ((Vdeb-vtrim1 > Precision::PConfusion()) ||
312 (vtrim2-Vfin > Precision::PConfusion()))
313 Standard_ConstructionError::Raise
314 ("Geom_RectangularTrimmedSurface::V parameters out of range");
319 if (!UsameSense) UReverse();
320 if (!VsameSense) VReverse();
324 //=======================================================================
325 //function : UReverse
327 //=======================================================================
329 void Geom_RectangularTrimmedSurface::UReverse ()
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);
340 //=======================================================================
341 //function : UReversedParameter
343 //=======================================================================
345 Standard_Real Geom_RectangularTrimmedSurface::UReversedParameter( const Standard_Real U) const {
347 return basisSurf->UReversedParameter(U);
351 //=======================================================================
352 //function : VReverse
354 //=======================================================================
356 void Geom_RectangularTrimmedSurface::VReverse ()
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);
367 //=======================================================================
368 //function : VReversedParameter
370 //=======================================================================
372 Standard_Real Geom_RectangularTrimmedSurface::VReversedParameter( const Standard_Real V) const {
374 return basisSurf->VReversedParameter( V);
378 //=======================================================================
379 //function : BasisSurface
381 //=======================================================================
383 Handle(Surface) Geom_RectangularTrimmedSurface::BasisSurface () const
389 //=======================================================================
390 //function : Continuity
392 //=======================================================================
394 GeomAbs_Shape Geom_RectangularTrimmedSurface::Continuity () const {
396 return basisSurf->Continuity();
400 //=======================================================================
403 //=======================================================================
405 void Geom_RectangularTrimmedSurface::D0
406 (const Standard_Real U, const Standard_Real V,
409 basisSurf->D0 (U, V, P);
413 //=======================================================================
416 //=======================================================================
418 void Geom_RectangularTrimmedSurface::D1
419 (const Standard_Real U, const Standard_Real V,
421 Vec& D1U, Vec& D1V) const {
423 basisSurf->D1 (U, V, P, D1U, D1V);
427 //=======================================================================
430 //=======================================================================
432 void Geom_RectangularTrimmedSurface::D2
433 (const Standard_Real U, const Standard_Real V,
436 Vec& D2U, Vec& D2V, Vec& D2UV) const {
438 basisSurf->D2 (U, V, P, D1U, D1V, D2U, D2V, D2UV);
442 //=======================================================================
445 //=======================================================================
447 void Geom_RectangularTrimmedSurface::D3
448 (const Standard_Real U, const Standard_Real V,
451 Vec& D2U, Vec& D2V, Vec& D2UV,
452 Vec& D3U, Vec& D3V, Vec& D3UUV, Vec& D3UVV) const {
454 basisSurf->D3 (U, V, P, D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV);
458 //=======================================================================
461 //=======================================================================
463 Vec Geom_RectangularTrimmedSurface::DN
464 (const Standard_Real U , const Standard_Real V,
465 const Standard_Integer Nu, const Standard_Integer Nv) const {
467 return basisSurf->DN (U, V, Nu, Nv);
471 //=======================================================================
474 //=======================================================================
476 void Geom_RectangularTrimmedSurface::Bounds (Standard_Real& U1,
479 Standard_Real& V2) const {
488 //=======================================================================
491 //=======================================================================
493 Handle(Geom_Curve) Geom_RectangularTrimmedSurface::UIso (const Standard_Real U) const {
495 Handle(Geom_Curve) C = basisSurf->UIso (U);
498 Handle(Geom_TrimmedCurve) Ct;
499 Ct = new Geom_TrimmedCurve (C, vtrim1, vtrim2, Standard_True);
508 //=======================================================================
511 //=======================================================================
513 Handle(Geom_Curve) Geom_RectangularTrimmedSurface::VIso (const Standard_Real V) const {
515 Handle(Geom_Curve) C = basisSurf->VIso (V);
518 Handle(Geom_TrimmedCurve) Ct;
519 Ct = new Geom_TrimmedCurve (C, utrim1, utrim2, Standard_True);
528 //=======================================================================
531 //=======================================================================
533 Standard_Boolean Geom_RectangularTrimmedSurface::IsCNu (const Standard_Integer N) const {
535 Standard_RangeError_Raise_if (N < 0," ");
536 return basisSurf->IsCNu (N);
540 //=======================================================================
543 //=======================================================================
545 Standard_Boolean Geom_RectangularTrimmedSurface::IsCNv (const Standard_Integer N) const {
547 Standard_RangeError_Raise_if (N < 0," ");
548 return basisSurf->IsCNv (N);
552 //=======================================================================
553 //function : Transform
555 //=======================================================================
557 void Geom_RectangularTrimmedSurface::Transform (const Trsf& T)
559 basisSurf->Transform (T);
560 basisSurf->TransformParameters(utrim1,vtrim1,T);
561 basisSurf->TransformParameters(utrim2,vtrim2,T);
565 //=======================================================================
566 //function : IsUPeriodic
568 // 24/11/98: pmn : Compare la periode a la longeur de l'intervalle
569 //=======================================================================
571 Standard_Boolean Geom_RectangularTrimmedSurface::IsUPeriodic () const
573 if (basisSurf->IsUPeriodic() && !isutrimmed)
574 return Standard_True;
575 return Standard_False;
579 //=======================================================================
582 //=======================================================================
584 Standard_Real Geom_RectangularTrimmedSurface::UPeriod() const
586 return basisSurf->UPeriod();
590 //=======================================================================
591 //function : IsVPeriodic
593 //=======================================================================
595 Standard_Boolean Geom_RectangularTrimmedSurface::IsVPeriodic () const
597 if (basisSurf->IsVPeriodic() && !isvtrimmed)
598 return Standard_True;
599 return Standard_False;
603 //=======================================================================
606 //=======================================================================
608 Standard_Real Geom_RectangularTrimmedSurface::VPeriod() const
610 return basisSurf->VPeriod();
614 //=======================================================================
615 //function : IsUClosed
617 //=======================================================================
619 Standard_Boolean Geom_RectangularTrimmedSurface::IsUClosed () const {
622 return Standard_False;
624 return basisSurf->IsUClosed();
628 //=======================================================================
629 //function : IsVClosed
631 //=======================================================================
633 Standard_Boolean Geom_RectangularTrimmedSurface::IsVClosed () const {
636 return Standard_False;
638 return basisSurf->IsVClosed();
641 //=======================================================================
642 //function : TransformParameters
644 //=======================================================================
646 void Geom_RectangularTrimmedSurface::TransformParameters(Standard_Real& U,
651 basisSurf->TransformParameters(U,V,T);
654 //=======================================================================
655 //function : ParametricTransformation
657 //=======================================================================
659 gp_GTrsf2d Geom_RectangularTrimmedSurface::ParametricTransformation
660 (const gp_Trsf& T) const
662 return basisSurf->ParametricTransformation(T);