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 // *******************************************************************
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>
40 #include <gp_Trsf.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>
48 IMPLEMENT_STANDARD_RTTIEXT(Geom_RectangularTrimmedSurface,Geom_BoundedSurface)
50 typedef Geom_RectangularTrimmedSurface RectangularTrimmedSurface;
57 //=======================================================================
60 //=======================================================================
62 Handle(Geom_Geometry) Geom_RectangularTrimmedSurface::Copy () const {
64 Handle(Geom_RectangularTrimmedSurface) S;
66 if ( isutrimmed && isvtrimmed )
67 S = new RectangularTrimmedSurface (basisSurf,
70 Standard_True , Standard_True );
72 S = new RectangularTrimmedSurface (basisSurf,
74 Standard_True, Standard_True );
76 S = new RectangularTrimmedSurface (basisSurf,
78 Standard_False , Standard_True );
84 //=======================================================================
85 //function : Geom_RectangularTrimmedSurface
87 //=======================================================================
89 Geom_RectangularTrimmedSurface::Geom_RectangularTrimmedSurface (
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)
103 isutrimmed (Standard_True),
104 isvtrimmed (Standard_True)
107 // kill trimmed basis surfaces
108 Handle(Geom_RectangularTrimmedSurface) T =
109 Handle(Geom_RectangularTrimmedSurface)::DownCast(S);
111 basisSurf = Handle(Geom_Surface)::DownCast(T->BasisSurface()->Copy());
113 basisSurf = Handle(Geom_Surface)::DownCast(S->Copy());
115 Handle(Geom_OffsetSurface) O =
116 Handle(Geom_OffsetSurface)::DownCast(basisSurf);
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());
124 SetTrim( U1, U2, V1, V2, USense, VSense);
128 //=======================================================================
129 //function : Geom_RectangularTrimmedSurface
131 //=======================================================================
133 Geom_RectangularTrimmedSurface::Geom_RectangularTrimmedSurface (
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
142 // kill trimmed basis surfaces
143 Handle(Geom_RectangularTrimmedSurface) T =
144 Handle(Geom_RectangularTrimmedSurface)::DownCast(S);
146 basisSurf = Handle(Geom_Surface)::DownCast(T->BasisSurface()->Copy());
148 basisSurf = Handle(Geom_Surface)::DownCast(S->Copy());
150 Handle(Geom_OffsetSurface) O =
151 Handle(Geom_OffsetSurface)::DownCast(basisSurf);
154 Handle(Geom_RectangularTrimmedSurface) S2 =
155 new Geom_RectangularTrimmedSurface( O->BasisSurface(),Param1,Param2, UTrim, Sense);
156 basisSurf = new Geom_OffsetSurface(S2, O->Offset());
159 SetTrim(Param1, Param2, UTrim, Sense);
163 //=======================================================================
166 //=======================================================================
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 ) {
175 SetTrim( U1, U2, V1, V2, Standard_True, Standard_True, USense, VSense);
180 //=======================================================================
183 //=======================================================================
185 void Geom_RectangularTrimmedSurface::SetTrim (const Standard_Real Param1,
186 const Standard_Real Param2,
187 const Standard_Boolean UTrim,
188 const Standard_Boolean Sense ) {
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;
196 SetTrim( Param1 , Param2 ,
198 Standard_True , Standard_False,
199 Sense , dummy_Sense );
202 SetTrim( dummy_a , dummy_b ,
204 Standard_False, Standard_True,
205 dummy_Sense , Sense );
210 //=======================================================================
213 //=======================================================================
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) {
224 Standard_Boolean UsameSense = Standard_True;
225 Standard_Boolean VsameSense = Standard_True;
226 Standard_Real Udeb, Ufin, Vdeb, Vfin;
228 basisSurf->Bounds(Udeb, Ufin, Vdeb, Vfin);
230 // Trimming the U-Direction
238 Standard_ConstructionError::Raise
239 ("Geom_RectangularTrimmedSurface::U1==U2");
241 if (basisSurf->IsUPeriodic()) {
244 // set uTrim1 in the range Udeb , Ufin
245 // set uTrim2 in the range uTrim1 , uTrim1 + Period()
248 ElCLib::AdjustPeriodic(Udeb, Ufin,
249 Min(Abs(utrim2-utrim1)/2,Precision::PConfusion()),
259 UsameSense = !USense;
264 if ((Udeb-utrim1 > Precision::PConfusion()) ||
265 (utrim2-Ufin > Precision::PConfusion()))
266 Standard_ConstructionError::Raise
267 ("Geom_RectangularTrimmedSurface::U parameters out of range");
272 // Trimming the V-Direction
280 Standard_ConstructionError::Raise
281 ("Geom_RectangularTrimmedSurface::V1==V2");
283 if (basisSurf->IsVPeriodic()) {
286 // set vTrim1 in the range Vdeb , Vfin
287 // set vTrim2 in the range vTrim1 , vTrim1 + Period()
290 ElCLib::AdjustPeriodic(Vdeb, Vfin,
291 Min(Abs(vtrim2-vtrim1)/2,Precision::PConfusion()),
301 VsameSense = !VSense;
306 if ((Vdeb-vtrim1 > Precision::PConfusion()) ||
307 (vtrim2-Vfin > Precision::PConfusion()))
308 Standard_ConstructionError::Raise
309 ("Geom_RectangularTrimmedSurface::V parameters out of range");
314 if (!UsameSense) UReverse();
315 if (!VsameSense) VReverse();
319 //=======================================================================
320 //function : UReverse
322 //=======================================================================
324 void Geom_RectangularTrimmedSurface::UReverse ()
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);
335 //=======================================================================
336 //function : UReversedParameter
338 //=======================================================================
340 Standard_Real Geom_RectangularTrimmedSurface::UReversedParameter( const Standard_Real U) const {
342 return basisSurf->UReversedParameter(U);
346 //=======================================================================
347 //function : VReverse
349 //=======================================================================
351 void Geom_RectangularTrimmedSurface::VReverse ()
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);
362 //=======================================================================
363 //function : VReversedParameter
365 //=======================================================================
367 Standard_Real Geom_RectangularTrimmedSurface::VReversedParameter( const Standard_Real V) const {
369 return basisSurf->VReversedParameter( V);
373 //=======================================================================
374 //function : BasisSurface
376 //=======================================================================
378 Handle(Geom_Surface) Geom_RectangularTrimmedSurface::BasisSurface () const
384 //=======================================================================
385 //function : Continuity
387 //=======================================================================
389 GeomAbs_Shape Geom_RectangularTrimmedSurface::Continuity () const {
391 return basisSurf->Continuity();
395 //=======================================================================
398 //=======================================================================
400 void Geom_RectangularTrimmedSurface::D0
401 (const Standard_Real U, const Standard_Real V,
404 basisSurf->D0 (U, V, P);
408 //=======================================================================
411 //=======================================================================
413 void Geom_RectangularTrimmedSurface::D1
414 (const Standard_Real U, const Standard_Real V,
416 Vec& D1U, Vec& D1V) const {
418 basisSurf->D1 (U, V, P, D1U, D1V);
422 //=======================================================================
425 //=======================================================================
427 void Geom_RectangularTrimmedSurface::D2
428 (const Standard_Real U, const Standard_Real V,
431 Vec& D2U, Vec& D2V, Vec& D2UV) const {
433 basisSurf->D2 (U, V, P, D1U, D1V, D2U, D2V, D2UV);
437 //=======================================================================
440 //=======================================================================
442 void Geom_RectangularTrimmedSurface::D3
443 (const Standard_Real U, const Standard_Real V,
446 Vec& D2U, Vec& D2V, Vec& D2UV,
447 Vec& D3U, Vec& D3V, Vec& D3UUV, Vec& D3UVV) const {
449 basisSurf->D3 (U, V, P, D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV);
453 //=======================================================================
456 //=======================================================================
458 Vec Geom_RectangularTrimmedSurface::DN
459 (const Standard_Real U , const Standard_Real V,
460 const Standard_Integer Nu, const Standard_Integer Nv) const {
462 return basisSurf->DN (U, V, Nu, Nv);
466 //=======================================================================
469 //=======================================================================
471 void Geom_RectangularTrimmedSurface::Bounds (Standard_Real& U1,
474 Standard_Real& V2) const {
483 //=======================================================================
486 //=======================================================================
488 Handle(Geom_Curve) Geom_RectangularTrimmedSurface::UIso (const Standard_Real U) const {
490 Handle(Geom_Curve) C = basisSurf->UIso (U);
493 Handle(Geom_TrimmedCurve) Ct;
494 Ct = new Geom_TrimmedCurve (C, vtrim1, vtrim2, Standard_True);
503 //=======================================================================
506 //=======================================================================
508 Handle(Geom_Curve) Geom_RectangularTrimmedSurface::VIso (const Standard_Real V) const {
510 Handle(Geom_Curve) C = basisSurf->VIso (V);
513 Handle(Geom_TrimmedCurve) Ct;
514 Ct = new Geom_TrimmedCurve (C, utrim1, utrim2, Standard_True);
523 //=======================================================================
526 //=======================================================================
528 Standard_Boolean Geom_RectangularTrimmedSurface::IsCNu (const Standard_Integer N) const {
530 Standard_RangeError_Raise_if (N < 0," ");
531 return basisSurf->IsCNu (N);
535 //=======================================================================
538 //=======================================================================
540 Standard_Boolean Geom_RectangularTrimmedSurface::IsCNv (const Standard_Integer N) const {
542 Standard_RangeError_Raise_if (N < 0," ");
543 return basisSurf->IsCNv (N);
547 //=======================================================================
548 //function : Transform
550 //=======================================================================
552 void Geom_RectangularTrimmedSurface::Transform (const Trsf& T)
554 basisSurf->Transform (T);
555 basisSurf->TransformParameters(utrim1,vtrim1,T);
556 basisSurf->TransformParameters(utrim2,vtrim2,T);
560 //=======================================================================
561 //function : IsUPeriodic
563 // 24/11/98: pmn : Compare la periode a la longeur de l'intervalle
564 //=======================================================================
566 Standard_Boolean Geom_RectangularTrimmedSurface::IsUPeriodic () const
568 if (basisSurf->IsUPeriodic() && !isutrimmed)
569 return Standard_True;
570 return Standard_False;
574 //=======================================================================
577 //=======================================================================
579 Standard_Real Geom_RectangularTrimmedSurface::UPeriod() const
581 return basisSurf->UPeriod();
585 //=======================================================================
586 //function : IsVPeriodic
588 //=======================================================================
590 Standard_Boolean Geom_RectangularTrimmedSurface::IsVPeriodic () const
592 if (basisSurf->IsVPeriodic() && !isvtrimmed)
593 return Standard_True;
594 return Standard_False;
598 //=======================================================================
601 //=======================================================================
603 Standard_Real Geom_RectangularTrimmedSurface::VPeriod() const
605 return basisSurf->VPeriod();
609 //=======================================================================
610 //function : IsUClosed
612 //=======================================================================
614 Standard_Boolean Geom_RectangularTrimmedSurface::IsUClosed () const {
617 return Standard_False;
619 return basisSurf->IsUClosed();
623 //=======================================================================
624 //function : IsVClosed
626 //=======================================================================
628 Standard_Boolean Geom_RectangularTrimmedSurface::IsVClosed () const {
631 return Standard_False;
633 return basisSurf->IsVClosed();
636 //=======================================================================
637 //function : TransformParameters
639 //=======================================================================
641 void Geom_RectangularTrimmedSurface::TransformParameters(Standard_Real& U,
646 basisSurf->TransformParameters(U,V,T);
649 //=======================================================================
650 //function : ParametricTransformation
652 //=======================================================================
654 gp_GTrsf2d Geom_RectangularTrimmedSurface::ParametricTransformation
655 (const gp_Trsf& T) const
657 return basisSurf->ParametricTransformation(T);