1 #include <DrawTrSurf_Curve.ixx>
2 #include <GeomAdaptor_Curve.hxx>
3 #include <GeomTools_CurveSet.hxx>
4 #include <GeomLProp_CLProps.hxx>
5 #include <Precision.hxx>
7 #include <gp_Pnt2d.hxx>
8 #include <gp_Dir2d.hxx>
10 #include <gp_Vec2d.hxx>
11 #include <TColStd_Array1OfReal.hxx>
13 Standard_Real DrawTrSurf_CurveLimit = 400;
14 extern Standard_Boolean Draw_Bounds;
17 //=======================================================================
18 //function : DrawTrSurf_Curve
20 //=======================================================================
22 DrawTrSurf_Curve::DrawTrSurf_Curve (const Handle(Geom_Curve)& C,
23 const Standard_Boolean DispOrigin) :
24 DrawTrSurf_Drawable (16, 0.01, 1),
27 disporigin(DispOrigin),
28 dispcurvradius(Standard_False),
36 //=======================================================================
37 //function : DrawTrSurf_Curve
39 //=======================================================================
41 DrawTrSurf_Curve::DrawTrSurf_Curve (const Handle(Geom_Curve)& C,
42 const Draw_Color& aColor,
43 const Standard_Integer Discret,
44 const Standard_Real Deflection,
45 const Standard_Integer DrawMode,
46 const Standard_Boolean DispOrigin,
47 const Standard_Boolean DispCurvRadius,
48 const Standard_Real RadiusMax,
49 const Standard_Real RadiusRatio) :
50 DrawTrSurf_Drawable (Discret,Deflection, DrawMode),
53 disporigin(DispOrigin),
54 dispcurvradius(DispCurvRadius),
56 radiusratio(RadiusRatio)
61 //=======================================================================
64 //=======================================================================
66 void DrawTrSurf_Curve::DrawOn (Draw_Display& dis) const
68 Standard_Real First = curv->FirstParameter();
69 Standard_Real Last = curv->LastParameter();
70 Standard_Boolean firstInf = Precision::IsNegativeInfinite(First);
71 Standard_Boolean lastInf = Precision::IsPositiveInfinite(Last);
73 if (firstInf || lastInf) {
75 Standard_Real delta = 1;
76 if (firstInf && lastInf) {
83 } while (P1.Distance(P2) < DrawTrSurf_CurveLimit);
91 } while (P1.Distance(P2) < DrawTrSurf_CurveLimit);
99 } while (P1.Distance(P2) < DrawTrSurf_CurveLimit);
104 GeomAdaptor_Curve C(curv,First,Last);
107 // mark the orientation
109 Draw_Bounds = Standard_False;
118 if (v.Magnitude() > gp::Resolution()) {
119 Standard_Real L = 20 / dis.Zoom();
120 Standard_Real H = 10 / dis.Zoom();
122 p2.SetCoord(p1.X() - L*d.X() - H*d.Y(), p1.Y() - L*d.Y() + H*d.X());
124 p2.SetCoord(p1.X() - L*d.X() + H*d.Y(), p1.Y() - L*d.Y() - H*d.X());
128 Draw_Bounds = Standard_True;
130 // Draw the curvature Radius
131 if (dispcurvradius && (C.GetType() != GeomAbs_Line)) {
133 Standard_Integer intrv, nbintv = C.NbIntervals(GeomAbs_CN);
134 TColStd_Array1OfReal TI(1,nbintv+1);
135 C.Intervals(TI,GeomAbs_CN);
136 Standard_Real Resolution = 1.0e-9, Curvature;
137 GeomLProp_CLProps LProp(curv, 2, Resolution);
140 for (intrv = 1; intrv <= nbintv; intrv++) {
141 Standard_Real t = TI(intrv);
142 Standard_Real step = (TI(intrv+1) - t) / GetDiscretisation();
143 Standard_Real LRad, ratio;
144 for (ii = 1; ii <= GetDiscretisation(); ii++) {
145 LProp.SetParameter(t);
146 if (LProp.IsTangentDefined()) {
147 Curvature = Abs(LProp.Curvature());
148 if ( Curvature > Resolution) {
152 ratio = ( ( LRad > radiusmax) ? radiusmax/LRad : 1 );
153 ratio *= radiusratio;
154 LProp.CentreOfCurvature(P2);
156 dis.DrawTo(P1.Translated(ratio*V));
166 //=======================================================================
169 //=======================================================================
171 Handle(Draw_Drawable3D) DrawTrSurf_Curve::Copy()const
173 Handle(DrawTrSurf_Curve) DC = new DrawTrSurf_Curve
174 (Handle(Geom_Curve)::DownCast(curv->Copy()),
176 GetDiscretisation(),GetDeflection(),GetDrawMode());
182 //=======================================================================
185 //=======================================================================
187 void DrawTrSurf_Curve::Dump(Standard_OStream& S)const
189 GeomTools_CurveSet::PrintCurve(curv,S);
193 //=======================================================================
196 //=======================================================================
198 void DrawTrSurf_Curve::Whatis(Draw_Interpretor& S)const