1 // File: DsgPrs_EllipseRadiusPresentation.cxx
2 // Created: Mon Jan 26 09:59:22 1998
3 // Author: Sergey ZARITCHNY
4 // <szy@androx.nnov.matra-dtv.fr>
7 #include <DsgPrs_EllipseRadiusPresentation.ixx>
11 #include <gp_Elips.hxx>
13 #include <Graphic3d_Group.hxx>
14 #include <Graphic3d_Array1OfVertex.hxx>
15 #include <Prs3d_LengthAspect.hxx>
16 #include <Prs3d_Arrow.hxx>
17 #include <Prs3d_ArrowAspect.hxx>
18 #include <Prs3d_LineAspect.hxx>
19 #include <Prs3d_Text.hxx>
20 #include <TCollection_AsciiString.hxx>
21 #include <TCollection_ExtendedString.hxx>
23 #include <Graphic3d_Vertex.hxx>
24 #include <Graphic3d_AspectMarker3d.hxx>
25 #include <Graphic3d_AspectLine3d.hxx>
26 #include <Aspect_TypeOfLine.hxx>
27 #include <Aspect_TypeOfMarker.hxx>
28 #include <Aspect_AspectMarker.hxx>
29 #include <Quantity_Color.hxx>
31 #include <Precision.hxx>
33 #include <Geom_Ellipse.hxx>
34 #include <Geom_Line.hxx>
35 #include <Geom_TrimmedCurve.hxx>
36 #include <GeomAPI_ExtremaCurveCurve.hxx>
37 #include <Geom_OffsetCurve.hxx>
38 //=======================================================================
41 //=======================================================================
43 void DsgPrs_EllipseRadiusPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
44 const Handle(Prs3d_Drawer)& aDrawer,
45 const Standard_Real theval,
46 const TCollection_ExtendedString & aText,
47 // const gp_Elips & anEllipse,
48 const gp_Pnt & aPosition,
49 const gp_Pnt & anEndOfArrow,
50 const gp_Pnt & aCenter,
51 const Standard_Boolean IsMaxRadius,
52 const DsgPrs_ArrowSide ArrowPrs)
55 Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
56 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
58 Standard_Boolean inside = Standard_False;
59 // gp_Pnt EndPoint, EndOfArrow;
61 Standard_Real dist = aCenter.Distance( aPosition );
62 if( dist > theval ) EndPoint = aPosition;
64 EndPoint = anEndOfArrow;
65 inside = Standard_True;
67 Graphic3d_Array1OfVertex V(1,2);
68 Quantity_Length X,Y,Z;
71 EndPoint.Coord(X,Y,Z);
73 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
76 TCollection_ExtendedString Text;
78 Text = TCollection_ExtendedString("a = ");
80 Text = TCollection_ExtendedString("b = ");
82 Prs3d_Text::Draw(aPresentation, LA->TextAspect(), Text, aPosition );
85 gp_Dir arrdir( gp_Vec( aCenter, anEndOfArrow));
86 if (!inside) arrdir.Reverse();
88 DsgPrs::ComputeSymbol(aPresentation, LA, anEndOfArrow, anEndOfArrow, arrdir, arrdir, ArrowPrs );
92 //=======================================================================
95 //=======================================================================
97 void DsgPrs_EllipseRadiusPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
98 const Handle(Prs3d_Drawer)& aDrawer,
99 const Standard_Real theval,
100 const TCollection_ExtendedString & aText,
101 const gp_Elips & anEllipse,
102 const gp_Pnt & aPosition,
103 const gp_Pnt & anEndOfArrow,
104 const gp_Pnt & aCenter,
105 const Standard_Real uFirst,
106 const Standard_Boolean IsInDomain,
107 const Standard_Boolean IsMaxRadius,
108 const DsgPrs_ArrowSide ArrowPrs)
111 Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
112 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
115 Standard_Real parFirst;
116 Standard_Real uLast = ElCLib::Parameter ( anEllipse, anEndOfArrow );
117 Standard_Real Alpha = DsgPrs::DistanceFromApex(anEllipse, anEndOfArrow, uFirst);//length of ellipse arc
118 gp_Vec Vapex(aCenter, ElCLib::Value( uLast, anEllipse )) ;
119 gp_Vec Vpnt(aCenter, ElCLib::Value( uFirst, anEllipse )) ;
120 gp_Dir dir(Vpnt ^ Vapex);
121 if(anEllipse.Position().Direction().IsOpposite( dir, Precision::Angular()))
125 Standard_Integer NodeNumber = Max (4 , Standard_Integer (50. * Alpha / M_PI));
126 Graphic3d_Array1OfVertex ApproxArc( 0, NodeNumber-1 );
127 Standard_Real delta = Alpha / ( NodeNumber - 1 );
129 for (Standard_Integer i = 0 ; i < NodeNumber; i++)
131 CurPnt = ElCLib::Value( parFirst, anEllipse );
132 ApproxArc(i).SetCoord( CurPnt.X(), CurPnt.Y(), CurPnt.Z() );
135 Prs3d_Root::CurrentGroup( aPresentation )->Polyline( ApproxArc );
137 DsgPrs_EllipseRadiusPresentation::Add(aPresentation, aDrawer, theval, aText,
138 aPosition, anEndOfArrow, aCenter, IsMaxRadius, ArrowPrs);
144 //=======================================================================
146 //purpose : // for offset curve
147 //=======================================================================
149 void DsgPrs_EllipseRadiusPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
150 const Handle(Prs3d_Drawer)& aDrawer,
151 const Standard_Real theval,
152 const TCollection_ExtendedString & aText,
153 const Handle(Geom_OffsetCurve) & aCurve,
154 const gp_Pnt & aPosition,
155 const gp_Pnt & anEndOfArrow,
156 const gp_Pnt & aCenter,
157 const Standard_Real uFirst,
158 const Standard_Boolean IsInDomain,
159 const Standard_Boolean IsMaxRadius,
160 const DsgPrs_ArrowSide ArrowPrs)
163 Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
164 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
167 Standard_Real parFirst;
168 if(!aCurve->IsCN(1)) return ;
169 gp_Elips aBEllipse = Handle(Geom_Ellipse)::DownCast(aCurve->BasisCurve ())->Elips();
170 Standard_Real Offset = aCurve->Offset();
171 aBEllipse.SetMajorRadius(aBEllipse.MajorRadius() + Offset);
172 aBEllipse.SetMinorRadius(aBEllipse.MinorRadius() + Offset);
173 Standard_Real uLast = ElCLib::Parameter ( aBEllipse, anEndOfArrow );
174 Standard_Real Alpha = DsgPrs::DistanceFromApex(aBEllipse, anEndOfArrow, uFirst);//length of ellipse arc
176 aCurve->D0(uFirst, p1);
177 gp_Vec Vapex(aCenter, anEndOfArrow) ;
178 gp_Vec Vpnt (aCenter, p1) ;
179 gp_Dir dir(Vpnt ^ Vapex);
180 if(aCurve->Direction().IsOpposite( dir, Precision::Angular()))
184 Standard_Integer NodeNumber = Max (4 , Standard_Integer (50. * Alpha / M_PI));
185 Graphic3d_Array1OfVertex ApproxArc( 0, NodeNumber-1 );
186 Standard_Real delta = Alpha / ( NodeNumber - 1 );
188 for (Standard_Integer i = 0 ; i < NodeNumber; i++)
190 aCurve->D0( parFirst, CurPnt );
191 ApproxArc(i).SetCoord( CurPnt.X(), CurPnt.Y(), CurPnt.Z() );
194 Prs3d_Root::CurrentGroup( aPresentation )->Polyline( ApproxArc );
196 DsgPrs_EllipseRadiusPresentation::Add(aPresentation, aDrawer, theval, aText,
197 aPosition, anEndOfArrow, aCenter, IsMaxRadius, ArrowPrs);