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 throw Standard_ConstructionError("Geom_RectangularTrimmedSurface::U1==U2");
240 if (basisSurf->IsUPeriodic()) {
243 // set uTrim1 in the range Udeb , Ufin
244 // set uTrim2 in the range uTrim1 , uTrim1 + Period()
247 ElCLib::AdjustPeriodic(Udeb, Ufin,
248 Min(Abs(utrim2-utrim1)/2,Precision::PConfusion()),
258 UsameSense = !USense;
263 if ((Udeb-utrim1 > Precision::PConfusion()) ||
264 (utrim2-Ufin > Precision::PConfusion()))
265 throw Standard_ConstructionError("Geom_RectangularTrimmedSurface::U parameters out of range");
270 // Trimming the V-Direction
278 throw Standard_ConstructionError("Geom_RectangularTrimmedSurface::V1==V2");
280 if (basisSurf->IsVPeriodic()) {
283 // set vTrim1 in the range Vdeb , Vfin
284 // set vTrim2 in the range vTrim1 , vTrim1 + Period()
287 ElCLib::AdjustPeriodic(Vdeb, Vfin,
288 Min(Abs(vtrim2-vtrim1)/2,Precision::PConfusion()),
298 VsameSense = !VSense;
303 if ((Vdeb-vtrim1 > Precision::PConfusion()) ||
304 (vtrim2-Vfin > Precision::PConfusion()))
305 throw Standard_ConstructionError("Geom_RectangularTrimmedSurface::V parameters out of range");
310 if (!UsameSense) UReverse();
311 if (!VsameSense) VReverse();
315 //=======================================================================
316 //function : UReverse
318 //=======================================================================
320 void Geom_RectangularTrimmedSurface::UReverse ()
322 Standard_Real U1 = basisSurf->UReversedParameter(utrim2);
323 Standard_Real U2 = basisSurf->UReversedParameter(utrim1);
324 basisSurf->UReverse();
325 SetTrim(U1,U2,vtrim1,vtrim2,
326 isutrimmed,isvtrimmed,
327 Standard_True,Standard_True);
331 //=======================================================================
332 //function : UReversedParameter
334 //=======================================================================
336 Standard_Real Geom_RectangularTrimmedSurface::UReversedParameter( const Standard_Real U) const {
338 return basisSurf->UReversedParameter(U);
342 //=======================================================================
343 //function : VReverse
345 //=======================================================================
347 void Geom_RectangularTrimmedSurface::VReverse ()
349 Standard_Real V1 = basisSurf->VReversedParameter(vtrim2);
350 Standard_Real V2 = basisSurf->VReversedParameter(vtrim1);
351 basisSurf->VReverse();
352 SetTrim(utrim1,utrim2,V1,V2,
353 isutrimmed,isvtrimmed,
354 Standard_True,Standard_True);
358 //=======================================================================
359 //function : VReversedParameter
361 //=======================================================================
363 Standard_Real Geom_RectangularTrimmedSurface::VReversedParameter( const Standard_Real V) const {
365 return basisSurf->VReversedParameter( V);
369 //=======================================================================
370 //function : BasisSurface
372 //=======================================================================
374 Handle(Geom_Surface) Geom_RectangularTrimmedSurface::BasisSurface () const
380 //=======================================================================
381 //function : Continuity
383 //=======================================================================
385 GeomAbs_Shape Geom_RectangularTrimmedSurface::Continuity () const {
387 return basisSurf->Continuity();
391 //=======================================================================
394 //=======================================================================
396 void Geom_RectangularTrimmedSurface::D0
397 (const Standard_Real U, const Standard_Real V,
400 basisSurf->D0 (U, V, P);
404 //=======================================================================
407 //=======================================================================
409 void Geom_RectangularTrimmedSurface::D1
410 (const Standard_Real U, const Standard_Real V,
412 Vec& D1U, Vec& D1V) const {
414 basisSurf->D1 (U, V, P, D1U, D1V);
418 //=======================================================================
421 //=======================================================================
423 void Geom_RectangularTrimmedSurface::D2
424 (const Standard_Real U, const Standard_Real V,
427 Vec& D2U, Vec& D2V, Vec& D2UV) const {
429 basisSurf->D2 (U, V, P, D1U, D1V, D2U, D2V, D2UV);
433 //=======================================================================
436 //=======================================================================
438 void Geom_RectangularTrimmedSurface::D3
439 (const Standard_Real U, const Standard_Real V,
442 Vec& D2U, Vec& D2V, Vec& D2UV,
443 Vec& D3U, Vec& D3V, Vec& D3UUV, Vec& D3UVV) const {
445 basisSurf->D3 (U, V, P, D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV);
449 //=======================================================================
452 //=======================================================================
454 Vec Geom_RectangularTrimmedSurface::DN
455 (const Standard_Real U , const Standard_Real V,
456 const Standard_Integer Nu, const Standard_Integer Nv) const {
458 return basisSurf->DN (U, V, Nu, Nv);
462 //=======================================================================
465 //=======================================================================
467 void Geom_RectangularTrimmedSurface::Bounds (Standard_Real& U1,
470 Standard_Real& V2) const {
479 //=======================================================================
482 //=======================================================================
484 Handle(Geom_Curve) Geom_RectangularTrimmedSurface::UIso (const Standard_Real U) const {
486 Handle(Geom_Curve) C = basisSurf->UIso (U);
489 Handle(Geom_TrimmedCurve) Ct;
490 Ct = new Geom_TrimmedCurve (C, vtrim1, vtrim2, Standard_True);
499 //=======================================================================
502 //=======================================================================
504 Handle(Geom_Curve) Geom_RectangularTrimmedSurface::VIso (const Standard_Real V) const {
506 Handle(Geom_Curve) C = basisSurf->VIso (V);
509 Handle(Geom_TrimmedCurve) Ct;
510 Ct = new Geom_TrimmedCurve (C, utrim1, utrim2, Standard_True);
519 //=======================================================================
522 //=======================================================================
524 Standard_Boolean Geom_RectangularTrimmedSurface::IsCNu (const Standard_Integer N) const {
526 Standard_RangeError_Raise_if (N < 0," ");
527 return basisSurf->IsCNu (N);
531 //=======================================================================
534 //=======================================================================
536 Standard_Boolean Geom_RectangularTrimmedSurface::IsCNv (const Standard_Integer N) const {
538 Standard_RangeError_Raise_if (N < 0," ");
539 return basisSurf->IsCNv (N);
543 //=======================================================================
544 //function : Transform
546 //=======================================================================
548 void Geom_RectangularTrimmedSurface::Transform (const Trsf& T)
550 basisSurf->Transform (T);
551 basisSurf->TransformParameters(utrim1,vtrim1,T);
552 basisSurf->TransformParameters(utrim2,vtrim2,T);
556 //=======================================================================
557 //function : IsUPeriodic
559 // 24/11/98: pmn : Compare la periode a la longeur de l'intervalle
560 //=======================================================================
562 Standard_Boolean Geom_RectangularTrimmedSurface::IsUPeriodic () const
564 if (basisSurf->IsUPeriodic() && !isutrimmed)
565 return Standard_True;
566 return Standard_False;
570 //=======================================================================
573 //=======================================================================
575 Standard_Real Geom_RectangularTrimmedSurface::UPeriod() const
577 return basisSurf->UPeriod();
581 //=======================================================================
582 //function : IsVPeriodic
584 //=======================================================================
586 Standard_Boolean Geom_RectangularTrimmedSurface::IsVPeriodic () const
588 if (basisSurf->IsVPeriodic() && !isvtrimmed)
589 return Standard_True;
590 return Standard_False;
594 //=======================================================================
597 //=======================================================================
599 Standard_Real Geom_RectangularTrimmedSurface::VPeriod() const
601 return basisSurf->VPeriod();
605 //=======================================================================
606 //function : IsUClosed
608 //=======================================================================
610 Standard_Boolean Geom_RectangularTrimmedSurface::IsUClosed () const {
613 return Standard_False;
615 return basisSurf->IsUClosed();
619 //=======================================================================
620 //function : IsVClosed
622 //=======================================================================
624 Standard_Boolean Geom_RectangularTrimmedSurface::IsVClosed () const {
627 return Standard_False;
629 return basisSurf->IsVClosed();
632 //=======================================================================
633 //function : TransformParameters
635 //=======================================================================
637 void Geom_RectangularTrimmedSurface::TransformParameters(Standard_Real& U,
642 basisSurf->TransformParameters(U,V,T);
645 //=======================================================================
646 //function : ParametricTransformation
648 //=======================================================================
650 gp_GTrsf2d Geom_RectangularTrimmedSurface::ParametricTransformation
651 (const gp_Trsf& T) const
653 return basisSurf->ParametricTransformation(T);