1 // File: Geom_SurfaceOfLinearExtrusion.cxx
2 // Created: Wed Mar 10 10:28:33 1993
5 // Copyright: Matra Datavision 1993
7 //File Geom_SurfaceOfLinearExtrusion.cxx, JCV 4/03/91
9 #include <GeomAbs_CurveType.hxx>
10 #include <Geom_SurfaceOfLinearExtrusion.ixx>
11 #include <Precision.hxx>
13 #include <gp_Ax2d.hxx>
16 #include <Geom_Line.hxx>
17 #include <Geom_Circle.hxx>
18 #include <Geom_Ellipse.hxx>
19 #include <Geom_Hyperbola.hxx>
20 #include <Geom_Parabola.hxx>
21 #include <Geom_BezierCurve.hxx>
22 #include <Geom_BSplineCurve.hxx>
23 #include <Geom_TrimmedCurve.hxx>
24 #include <Geom_OffsetCurve.hxx>
25 #include <BSplSLib.hxx>
26 #include <BSplCLib.hxx>
27 #include <Standard_RangeError.hxx>
29 #define POLES (poles->Array2())
30 #define WEIGHTS (weights->Array2())
31 #define UKNOTS (uknots->Array1())
32 #define VKNOTS (vknots->Array1())
33 #define UFKNOTS (ufknots->Array1())
34 #define VFKNOTS (vfknots->Array1())
35 #define FMULTS (BSplCLib::NoMults())
37 typedef Geom_SurfaceOfLinearExtrusion SurfaceOfLinearExtrusion;
38 typedef Handle(Geom_SurfaceOfLinearExtrusion) Handle(SurfaceOfLinearExtrusion);
39 typedef Geom_Curve Curve;
40 typedef Handle(Geom_Curve) Handle(Curve);
47 static void LocateSide(const Standard_Real U,
48 const Standard_Integer Side,
49 const Handle(Geom_BSplineCurve)& BSplC,
50 const Standard_Integer NDir,
56 Standard_Integer Ideb, Ifin;
57 Standard_Real ParTol=Precision::PConfusion()/2;
58 BSplC->Geom_BSplineCurve::LocateU(U,ParTol,Ideb,Ifin,Standard_False);
62 if ((Ideb>=Ifin)) Ifin = Ideb+1;
66 if(Ifin > BSplC -> NbKnots()) Ifin=BSplC->NbKnots();
67 if ((Ideb>=Ifin)) Ideb = Ifin-1;
72 case 0 : BSplC->Geom_BSplineCurve::LocalD0(U,Ideb,Ifin,P); break;
73 case 1 : BSplC->Geom_BSplineCurve::LocalD1(U,Ideb,Ifin,P,D1U); break;
74 case 2 : BSplC->Geom_BSplineCurve::LocalD2(U,Ideb,Ifin,P,D1U,D2U); break;
75 case 3 : BSplC->Geom_BSplineCurve::LocalD3(U,Ideb,Ifin,P,D1U,D2U,D3U);break;
80 static gp_Vec LocateSideN(const Standard_Real U,
81 const Standard_Integer Side,
82 const Handle(Geom_BSplineCurve)& BSplC,
83 const Standard_Integer Nu,
84 // const Standard_Integer Nv )
85 const Standard_Integer )
87 Standard_Integer Ideb, Ifin;
88 Standard_Real ParTol=Precision::PConfusion()/2;
89 BSplC->Geom_BSplineCurve::LocateU(U,ParTol,Ideb,Ifin,Standard_False);
93 if ((Ideb>=Ifin)) Ifin = Ideb+1;
97 if(Ifin > BSplC -> NbKnots()) Ifin=BSplC->NbKnots();
98 if ((Ideb>=Ifin)) Ideb = Ifin-1;
100 return BSplC->Geom_BSplineCurve::LocalDN(U,Ideb,Ifin,Nu);
105 //=======================================================================
108 //=======================================================================
110 Handle(Geom_Geometry) Geom_SurfaceOfLinearExtrusion::Copy () const
113 Handle(Geom_SurfaceOfLinearExtrusion) Sr;
114 Sr = new SurfaceOfLinearExtrusion (basisCurve, direction);
119 //=======================================================================
120 //function : Geom_SurfaceOfLinearExtrusion
122 //=======================================================================
124 Geom_SurfaceOfLinearExtrusion::Geom_SurfaceOfLinearExtrusion
125 ( const Handle(Curve)& C,
128 basisCurve = Handle(Curve)::DownCast(C->Copy()); // Copy 10-03-93
130 smooth = C->Continuity();
134 //=======================================================================
135 //function : UReverse
137 //=======================================================================
139 void Geom_SurfaceOfLinearExtrusion::UReverse () {
141 basisCurve->Reverse();
145 //=======================================================================
146 //function : UReversedParameter
148 //=======================================================================
150 Standard_Real Geom_SurfaceOfLinearExtrusion::UReversedParameter(const Standard_Real U) const {
152 return basisCurve->ReversedParameter(U);
156 //=======================================================================
157 //function : VReverse
159 //=======================================================================
161 void Geom_SurfaceOfLinearExtrusion::VReverse () {
167 //=======================================================================
168 //function : VReversedParameter
170 //=======================================================================
172 Standard_Real Geom_SurfaceOfLinearExtrusion::VReversedParameter( const Standard_Real V) const {
178 //=======================================================================
179 //function : SetDirection
181 //=======================================================================
183 void Geom_SurfaceOfLinearExtrusion::SetDirection (const Dir& V) {
185 Handle(Geom_Curve) C;
191 //=======================================================================
192 //function : SetBasisCurve
194 //=======================================================================
196 void Geom_SurfaceOfLinearExtrusion::SetBasisCurve (const Handle(Curve)& C) {
198 smooth = C->Continuity();
199 basisCurve = Handle(Curve)::DownCast(C->Copy()); // Copy 10-03-93
203 //=======================================================================
206 //=======================================================================
208 void Geom_SurfaceOfLinearExtrusion::Bounds ( Standard_Real& U1,
211 Standard_Real& V2 ) const {
213 V1 = -Precision::Infinite(); V2 = Precision::Infinite();
214 U1 = basisCurve->FirstParameter(); U2 = basisCurve->LastParameter();
218 //=======================================================================
221 //=======================================================================
223 void Geom_SurfaceOfLinearExtrusion::D0 (const Standard_Real U, const Standard_Real V,
226 XYZ Pxyz = direction.XYZ();
228 Pxyz.Add (basisCurve->Value (U).XYZ());
233 //=======================================================================
236 //=======================================================================
238 void Geom_SurfaceOfLinearExtrusion::D1 ( const Standard_Real U ,
239 const Standard_Real V ,
241 Vec& D1U, Vec& D1V) const {
243 basisCurve->D1 (U, P, D1U);
245 XYZ Pxyz = direction.XYZ();
252 //=======================================================================
255 //=======================================================================
257 void Geom_SurfaceOfLinearExtrusion::D2 ( const Standard_Real U ,
258 const Standard_Real V ,
261 Vec& D2U, Vec& D2V, Vec& D2UV)
264 basisCurve->D2 (U, P, D1U, D2U);
266 D2V.SetCoord (0.0, 0.0, 0.0);
267 D2UV.SetCoord (0.0, 0.0, 0.0);
268 XYZ Pxyz = direction.XYZ();
275 //=======================================================================
278 //=======================================================================
280 void Geom_SurfaceOfLinearExtrusion::D3
281 ( const Standard_Real U, const Standard_Real V,
284 Vec& D2U, Vec& D2V, Vec& D2UV,
285 Vec& D3U, Vec& D3V, Vec& D3UUV, Vec& D3UVV ) const {
288 basisCurve->D3 (U, P, D1U, D2U, D3U);
290 D2V.SetCoord (0.0, 0.0, 0.0);
291 D3V.SetCoord (0.0, 0.0, 0.0);
292 D3UUV.SetCoord (0.0, 0.0, 0.0);
293 D3UVV.SetCoord (0.0, 0.0, 0.0);
294 D2UV.SetCoord (0.0, 0.0, 0.0);
295 XYZ Pxyz = direction.XYZ();
300 //=======================================================================
303 //=======================================================================
305 Vec Geom_SurfaceOfLinearExtrusion::DN
306 ( const Standard_Real U, const Standard_Real ,
307 const Standard_Integer Nu, const Standard_Integer Nv) const {
309 Standard_RangeError_Raise_if (Nu + Nv < 1 || Nu < 0 || Nv <0, " ");
310 if (Nu == 0 && Nv == 1) return Vec (direction);
311 else if (Nv == 0) return basisCurve->DN (U, Nu);
312 else return Vec (0.0, 0.0, 0.0);
316 //=======================================================================
319 //=======================================================================
321 void Geom_SurfaceOfLinearExtrusion::LocalD0 (const Standard_Real U,
322 const Standard_Real V,
323 const Standard_Integer USide,
326 if((USide != 0) && basisCurve->IsKind(STANDARD_TYPE(Geom_BSplineCurve)))
329 Handle( Geom_BSplineCurve) BSplC;
330 BSplC= Handle(Geom_BSplineCurve)::DownCast(basisCurve);
332 LocateSide(U,USide,BSplC,0,P,D1U,D2U,D3U);
333 XYZ Pxyz = direction.XYZ();
341 //=======================================================================
344 //=======================================================================
346 void Geom_SurfaceOfLinearExtrusion::LocalD1 (const Standard_Real U,
347 const Standard_Real V,
348 const Standard_Integer USide,
353 if((USide != 0) && basisCurve->IsKind(STANDARD_TYPE(Geom_BSplineCurve)))
356 Handle( Geom_BSplineCurve) BSplC;
357 BSplC= Handle(Geom_BSplineCurve)::DownCast(basisCurve);
359 LocateSide(U,USide,BSplC,1,P,D1U,D2U,D3U);
361 XYZ Pxyz = direction.XYZ();
366 else D1(U,V,P,D1U,D1V);
369 //=======================================================================
372 //=======================================================================
374 void Geom_SurfaceOfLinearExtrusion::LocalD2 (const Standard_Real U,
375 const Standard_Real V,
376 const Standard_Integer USide,
384 if((USide != 0) && basisCurve->IsKind(STANDARD_TYPE(Geom_BSplineCurve)))
387 Handle( Geom_BSplineCurve) BSplC;
388 BSplC= Handle(Geom_BSplineCurve)::DownCast(basisCurve);
390 LocateSide(U,USide,BSplC,2,P,D1U,D2U,D3U);
392 D2V.SetCoord (0.0, 0.0, 0.0);
393 D2UV.SetCoord (0.0, 0.0, 0.0);
394 XYZ Pxyz = direction.XYZ();
399 else D2(U,V,P,D1U,D1V,D2U,D2V,D2UV);
402 //=======================================================================
405 //=======================================================================
407 void Geom_SurfaceOfLinearExtrusion::LocalD3 (const Standard_Real U,
408 const Standard_Real V,
409 const Standard_Integer USide,
421 if((USide != 0) && basisCurve->IsKind(STANDARD_TYPE(Geom_BSplineCurve)))
423 Handle( Geom_BSplineCurve) BSplC;
424 BSplC= Handle(Geom_BSplineCurve)::DownCast(basisCurve);
426 LocateSide(U,USide,BSplC,3,P,D1U,D2U,D3U);
428 D2V.SetCoord (0.0, 0.0, 0.0);
429 D3V.SetCoord (0.0, 0.0, 0.0);
430 D3UUV.SetCoord (0.0, 0.0, 0.0);
431 D3UVV.SetCoord (0.0, 0.0, 0.0);
432 D2UV.SetCoord (0.0, 0.0, 0.0);
433 XYZ Pxyz = direction.XYZ();
438 else D3(U,V,P,D1U,D1V,D2U,D2V,D2UV,D3U,D3V,D3UUV,D3UVV);
442 //=======================================================================
445 //=======================================================================
447 gp_Vec Geom_SurfaceOfLinearExtrusion::LocalDN (const Standard_Real U,
448 const Standard_Real V,
449 const Standard_Integer USide,
450 const Standard_Integer Nu,
451 const Standard_Integer Nv) const
453 Standard_RangeError_Raise_if (Nu + Nv < 1 || Nu < 0 || Nv <0, " ");
454 if (Nu == 0 && Nv == 1) return Vec (direction);
456 if((USide != 0) && basisCurve->IsKind(STANDARD_TYPE(Geom_BSplineCurve))) {
457 Handle( Geom_BSplineCurve) BSplC;
458 BSplC= Handle(Geom_BSplineCurve)::DownCast(basisCurve);
459 return LocateSideN(U,USide,BSplC,Nu,Nv);
462 return DN(U,V,Nu,Nv);
464 return Vec (0.0, 0.0, 0.0);
467 //=======================================================================
470 //=======================================================================
472 Handle(Geom_Curve) Geom_SurfaceOfLinearExtrusion::UIso (const Standard_Real U) const {
475 L = new Geom_Line (basisCurve->Value (U), direction);
480 //=======================================================================
483 //=======================================================================
485 Handle(Curve) Geom_SurfaceOfLinearExtrusion::VIso (const Standard_Real V) const {
487 Vec Vdir (direction);
490 C = Handle(Geom_Curve)::DownCast(basisCurve->Translated(Vdir));
495 //=======================================================================
498 //=======================================================================
500 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsCNu (const Standard_Integer N) const {
502 Standard_RangeError_Raise_if (N < 0, " ");
503 return basisCurve->IsCN (N);
507 //=======================================================================
510 //=======================================================================
512 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsCNv (const Standard_Integer ) const {
514 return Standard_True;
518 //=======================================================================
519 //function : Transform
521 //=======================================================================
523 void Geom_SurfaceOfLinearExtrusion::Transform (const Trsf& T) {
525 direction.Transform (T);
526 basisCurve->Transform (T);
531 //=======================================================================
532 //function : IsUClosed
534 //=======================================================================
536 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsUClosed () const {
538 return basisCurve->IsClosed ();
542 //=======================================================================
543 //function : IsUPeriodic
545 //=======================================================================
547 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsUPeriodic () const {
549 return basisCurve->IsPeriodic ();
552 //=======================================================================
553 //function : IsVClosed
555 //=======================================================================
557 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsVClosed () const {
559 return Standard_False;
562 //=======================================================================
563 //function : IsVPeriodic
565 //=======================================================================
567 Standard_Boolean Geom_SurfaceOfLinearExtrusion::IsVPeriodic () const {
569 return Standard_False;
572 //=======================================================================
573 //function : TransformParameters
575 //=======================================================================
577 void Geom_SurfaceOfLinearExtrusion::TransformParameters(Standard_Real& U,
582 U = basisCurve->TransformedParameter(U,T);
583 if (!Precision::IsInfinite(V)) V *= Abs(T.ScaleFactor());
586 //=======================================================================
587 //function : ParametricTransformation
589 //=======================================================================
591 gp_GTrsf2d Geom_SurfaceOfLinearExtrusion::ParametricTransformation
592 (const gp_Trsf& T) const
594 // transformation in the V Direction
596 gp_Ax2d Axis(gp::Origin2d(),gp::DX2d());
597 TV.SetAffinity(Axis, Abs(T.ScaleFactor()));
598 // transformation in the U Direction
600 Axis = gp_Ax2d(gp::Origin2d(),gp::DY2d());
601 TU.SetAffinity(Axis, basisCurve->ParametricTransformation(T));