7fd59977 |
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> |
5 | |
6 | |
7 | #include <DsgPrs_EllipseRadiusPresentation.ixx> |
8 | |
9 | #include <gp_Lin.hxx> |
10 | #include <gp_Dir.hxx> |
11 | #include <gp_Elips.hxx> |
12 | #include <ElCLib.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> |
22 | |
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> |
30 | #include <DsgPrs.hxx> |
31 | #include <Precision.hxx> |
32 | |
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 | //======================================================================= |
39 | //function : Add |
40 | //purpose : |
41 | //======================================================================= |
42 | |
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) |
53 | { |
54 | |
55 | Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect(); |
56 | Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); |
57 | |
58 | Standard_Boolean inside = Standard_False; |
59 | // gp_Pnt EndPoint, EndOfArrow; |
60 | gp_Pnt EndPoint; |
61 | Standard_Real dist = aCenter.Distance( aPosition ); |
62 | if( dist > theval ) EndPoint = aPosition; |
63 | else { |
64 | EndPoint = anEndOfArrow; |
65 | inside = Standard_True; |
66 | } |
67 | Graphic3d_Array1OfVertex V(1,2); |
68 | Quantity_Length X,Y,Z; |
69 | aCenter.Coord(X,Y,Z); |
70 | V(1).SetCoord(X,Y,Z); |
71 | EndPoint.Coord(X,Y,Z); |
72 | V(2).SetCoord(X,Y,Z); |
73 | Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V); |
74 | |
75 | // value |
76 | TCollection_ExtendedString Text; |
77 | if(IsMaxRadius) |
78 | Text = TCollection_ExtendedString("a = "); |
79 | else |
80 | Text = TCollection_ExtendedString("b = "); |
81 | Text += aText; |
82 | Prs3d_Text::Draw(aPresentation, LA->TextAspect(), Text, aPosition ); |
83 | |
84 | // arrows |
85 | gp_Dir arrdir( gp_Vec( aCenter, anEndOfArrow)); |
86 | if (!inside) arrdir.Reverse(); |
87 | |
88 | DsgPrs::ComputeSymbol(aPresentation, LA, anEndOfArrow, anEndOfArrow, arrdir, arrdir, ArrowPrs ); |
89 | |
90 | } |
91 | |
92 | //======================================================================= |
93 | //function : Add |
94 | //purpose : |
95 | //======================================================================= |
96 | |
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) |
109 | { |
110 | |
111 | Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect(); |
112 | Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); |
113 | if(!IsInDomain) |
114 | { |
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())) |
122 | parFirst = uLast; |
123 | else |
124 | parFirst = uFirst; |
c6541a0c |
125 | Standard_Integer NodeNumber = Max (4 , Standard_Integer (50. * Alpha / M_PI)); |
7fd59977 |
126 | Graphic3d_Array1OfVertex ApproxArc( 0, NodeNumber-1 ); |
127 | Standard_Real delta = Alpha / ( NodeNumber - 1 ); |
128 | gp_Pnt CurPnt; |
129 | for (Standard_Integer i = 0 ; i < NodeNumber; i++) |
130 | { |
131 | CurPnt = ElCLib::Value( parFirst, anEllipse ); |
132 | ApproxArc(i).SetCoord( CurPnt.X(), CurPnt.Y(), CurPnt.Z() ); |
133 | parFirst += delta ; |
134 | } |
135 | Prs3d_Root::CurrentGroup( aPresentation )->Polyline( ApproxArc ); |
136 | } |
137 | DsgPrs_EllipseRadiusPresentation::Add(aPresentation, aDrawer, theval, aText, |
138 | aPosition, anEndOfArrow, aCenter, IsMaxRadius, ArrowPrs); |
139 | |
140 | } |
141 | |
142 | |
143 | |
144 | //======================================================================= |
145 | //function : Add |
146 | //purpose : // for offset curve |
147 | //======================================================================= |
148 | |
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) |
161 | { |
162 | |
163 | Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect(); |
164 | Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); |
165 | if(!IsInDomain) |
166 | { |
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 |
175 | gp_Pnt p1; |
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())) |
181 | parFirst = uLast; |
182 | else |
183 | parFirst = uFirst; |
c6541a0c |
184 | Standard_Integer NodeNumber = Max (4 , Standard_Integer (50. * Alpha / M_PI)); |
7fd59977 |
185 | Graphic3d_Array1OfVertex ApproxArc( 0, NodeNumber-1 ); |
186 | Standard_Real delta = Alpha / ( NodeNumber - 1 ); |
187 | gp_Pnt CurPnt; |
188 | for (Standard_Integer i = 0 ; i < NodeNumber; i++) |
189 | { |
190 | aCurve->D0( parFirst, CurPnt ); |
191 | ApproxArc(i).SetCoord( CurPnt.X(), CurPnt.Y(), CurPnt.Z() ); |
192 | parFirst += delta ; |
193 | } |
194 | Prs3d_Root::CurrentGroup( aPresentation )->Polyline( ApproxArc ); |
195 | } |
196 | DsgPrs_EllipseRadiusPresentation::Add(aPresentation, aDrawer, theval, aText, |
197 | aPosition, anEndOfArrow, aCenter, IsMaxRadius, ArrowPrs); |
198 | |
199 | } |