0022312: Translation of french commentaries in OCCT files
[occt.git] / src / DsgPrs / DsgPrs_MidPointPresentation.cxx
1 // File:        DsgPrs_MidPointPresentation.cxx
2 // Created:     Fri Oct 20 16:00:58 2000
3 // Author:      Julia DOROVSKIKH
4 //              <jfa@androx.nnov.matra-dtv.fr>
5
6 #include <DsgPrs_MidPointPresentation.ixx>
7
8 #include <Precision.hxx>
9
10 #include <TCollection_ExtendedString.hxx>
11
12 #include <gp_Lin.hxx>
13 #include <gp_Circ.hxx>
14 #include <gp_Vec.hxx>
15 #include <gp_Dir.hxx>
16 #include <gp_Ax1.hxx>
17 #include <gp_Ax2.hxx>
18 #include <gp_Pnt.hxx>
19
20 #include <ElCLib.hxx>
21
22 #include <Graphic3d_Group.hxx>
23 #include <Graphic3d_Array1OfVertex.hxx>
24 #include <Graphic3d_AspectLine3d.hxx>
25
26 #include <Prs3d_Root.hxx>
27 #include <Prs3d_LineAspect.hxx>
28 #include <Prs3d_LengthAspect.hxx>
29 #include <Prs3d_Text.hxx>
30
31 //===================================================================
32 //Function:Add
33 //Purpose: draws the representation of a radial symmetry between two vertices.
34 //===================================================================
35 void DsgPrs_MidPointPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
36                                        const Handle(Prs3d_Drawer)& aDrawer,     
37                                        const gp_Ax2&  theAxe,
38                                        const gp_Pnt&  MidPoint,
39                                        const gp_Pnt&  Position,
40                                        const gp_Pnt&  AttachPoint,
41                                        const Standard_Boolean first)
42
43   Standard_Real rad = AttachPoint.Distance(MidPoint)/20.0;
44
45   Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
46   Graphic3d_Array1OfVertex V(1,2);
47
48   gp_Pnt Ptmp;
49
50   gp_Ax2 ax = theAxe;
51   ax.SetLocation(MidPoint);
52   gp_Circ aCircleM (ax,rad);
53
54   if ( first )
55     {
56       // center of the symmetry - circle around the MidPoint
57       Prs3d_Root::NewGroup(aPresentation);
58       Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
59       Standard_Real alpha = 2*Standard_PI;
60       Standard_Integer nbp = 100;
61       Graphic3d_Array1OfVertex VC(1,nbp);
62       Standard_Real dteta = alpha/(nbp-1);
63       gp_Pnt ptcur;
64       for (Standard_Integer i = 1; i <= nbp; i++)
65         {
66           ptcur =  ElCLib::Value(dteta*(i-1),aCircleM);
67           VC(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
68         }
69       Prs3d_Root::CurrentGroup(aPresentation)->Polyline(VC);
70
71       // segment from mid point to the text position
72       Prs3d_Root::NewGroup(aPresentation);
73       Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
74       // mid point
75       if ( Position.IsEqual(MidPoint,rad) )
76         Ptmp = MidPoint;
77       else
78         Ptmp = ElCLib::Value(ElCLib::Parameter(aCircleM,Position),aCircleM);
79       V(1).SetCoord(Ptmp.X(),Ptmp.Y(),Ptmp.Z());
80       // text position
81       V(2).SetCoord(Position.X(),Position.Y(),Position.Z());
82       Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
83
84       // texte 
85       TCollection_ExtendedString aText (" (+)");
86       Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,Position);
87     }
88
89   if ( !AttachPoint.IsEqual(MidPoint, Precision::Confusion()) )
90     {
91       // segment from mid point to the geometry
92       Prs3d_Root::NewGroup(aPresentation);
93       Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
94       // mid point
95       Ptmp = ElCLib::Value(ElCLib::Parameter(aCircleM,AttachPoint),aCircleM);
96       V(1).SetCoord(Ptmp.X(),Ptmp.Y(),Ptmp.Z());
97       // attach point to the geometry
98       V(2).SetCoord(AttachPoint.X(),AttachPoint.Y(),AttachPoint.Z());
99       Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
100     }
101 }
102   
103 //===================================================================
104 //Function:Add
105 //Purpose: draws the representation of a radial symmetry between two linear segments.
106 //===================================================================
107 void DsgPrs_MidPointPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
108                                        const Handle(Prs3d_Drawer)& aDrawer,     
109                                        const gp_Ax2&  theAxe,
110                                        const gp_Pnt&  MidPoint,
111                                        const gp_Pnt&  Position,
112                                        const gp_Pnt&  AttachPoint,
113                                        const gp_Pnt&  Point1,
114                                        const gp_Pnt&  Point2,
115                                        const Standard_Boolean first)
116 {
117   Standard_Real rad = AttachPoint.Distance(MidPoint)/20.0;
118   if ( rad <= Precision::Confusion() ) rad = Point1.Distance(Point2)/20.0;
119
120   Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
121   Graphic3d_Array1OfVertex V(1,2);
122
123   gp_Pnt Ptmp;
124
125   gp_Ax2 ax = theAxe;
126   ax.SetLocation(MidPoint);
127   gp_Circ aCircleM (ax,rad);
128
129   if ( first )
130     {
131       // center of the symmetry - circle around the MidPoint
132       Prs3d_Root::NewGroup(aPresentation);
133       Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
134       Standard_Real alpha = 2*Standard_PI;
135       Standard_Integer nbp = 100;
136       Graphic3d_Array1OfVertex VC(1,nbp);
137       Standard_Real dteta = alpha/(nbp-1);
138       gp_Pnt ptcur;
139       for (Standard_Integer i = 1; i <= nbp; i++)
140         {
141           ptcur =  ElCLib::Value(dteta*(i-1),aCircleM);
142           VC(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
143         }
144       Prs3d_Root::CurrentGroup(aPresentation)->Polyline(VC);
145
146       // segment from mid point to the text position
147       Prs3d_Root::NewGroup(aPresentation);
148       Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
149       // mid point
150       if ( Position.IsEqual(MidPoint,rad) )
151         Ptmp = MidPoint;
152       else
153         Ptmp = ElCLib::Value(ElCLib::Parameter(aCircleM,Position),aCircleM);
154       V(1).SetCoord(Ptmp.X(),Ptmp.Y(),Ptmp.Z());
155       // text position
156       V(2).SetCoord(Position.X(),Position.Y(),Position.Z());
157       Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
158
159       // texte 
160       TCollection_ExtendedString aText (" (+)");
161       Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,Position);
162     }
163
164   if ( !AttachPoint.IsEqual(MidPoint, Precision::Confusion()) )
165     {
166       // segment from mid point to the geometry
167       Prs3d_Root::NewGroup(aPresentation);
168       Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
169       // mid point
170       Ptmp = ElCLib::Value(ElCLib::Parameter(aCircleM,AttachPoint),aCircleM);
171       V(1).SetCoord(Ptmp.X(),Ptmp.Y(),Ptmp.Z());
172       // attach point to the geometry
173       V(2).SetCoord(AttachPoint.X(),AttachPoint.Y(),AttachPoint.Z());
174       Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
175     }
176
177   // segment on line
178   Prs3d_Root::NewGroup(aPresentation);
179   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
180   V(1).SetCoord(Point1.X(),Point1.Y(),Point1.Z());
181   V(2).SetCoord(Point2.X(),Point2.Y(),Point2.Z());
182   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
183 }
184   
185 //===================================================================
186 //Function:Add
187 //Purpose: draws the representation of a radial symmetry between two circular arcs.
188 //===================================================================
189 void DsgPrs_MidPointPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
190                                        const Handle(Prs3d_Drawer)& aDrawer,     
191                                        const gp_Circ& aCircle,
192                                        const gp_Pnt&  MidPoint,
193                                        const gp_Pnt&  Position,
194                                        const gp_Pnt&  AttachPoint,
195                                        const gp_Pnt&  Point1,
196                                        const gp_Pnt&  Point2,
197                                        const Standard_Boolean first)
198 {
199   Standard_Real rad = AttachPoint.Distance(MidPoint)/20.0;
200   if ( rad <= Precision::Confusion() ) rad = Point1.Distance(Point2)/20.0;
201
202   Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
203   Graphic3d_Array1OfVertex V(1,2);
204
205   gp_Pnt Ptmp,ptcur;
206
207   gp_Ax2 ax = aCircle.Position();
208   ax.SetLocation(MidPoint);
209   gp_Circ aCircleM (ax,rad);
210
211   if ( first )
212     {
213       // center of the symmetry - circle around the MidPoint
214       Prs3d_Root::NewGroup(aPresentation);
215       Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
216       Standard_Real alpha = 2*Standard_PI;
217       Standard_Integer nbp = 100;
218       Graphic3d_Array1OfVertex VC(1,nbp);
219       Standard_Real dteta = alpha/(nbp-1);
220       for (Standard_Integer i = 1; i <= nbp; i++)
221         {
222           ptcur =  ElCLib::Value(dteta*(i-1),aCircleM);
223           VC(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
224         }
225       Prs3d_Root::CurrentGroup(aPresentation)->Polyline(VC);
226
227       // segment from mid point to the text position
228       Prs3d_Root::NewGroup(aPresentation);
229       Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
230       // mid point
231       if ( Position.IsEqual(MidPoint,rad) )
232         Ptmp = MidPoint;
233       else
234         Ptmp = ElCLib::Value(ElCLib::Parameter(aCircleM,Position),aCircleM);
235       V(1).SetCoord(Ptmp.X(),Ptmp.Y(),Ptmp.Z());
236       // text position
237       V(2).SetCoord(Position.X(),Position.Y(),Position.Z());
238       Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
239
240       // texte 
241       TCollection_ExtendedString aText (" (+)");
242       Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,Position);
243     }
244
245   if ( !AttachPoint.IsEqual(MidPoint, Precision::Confusion()) )
246     {
247       // segment from mid point to the geometry
248       Prs3d_Root::NewGroup(aPresentation);
249       Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
250       // mid point
251       Ptmp = ElCLib::Value(ElCLib::Parameter(aCircleM,AttachPoint),aCircleM);
252       V(1).SetCoord(Ptmp.X(),Ptmp.Y(),Ptmp.Z());
253       // attach point to the geometry
254       V(2).SetCoord(AttachPoint.X(),AttachPoint.Y(),AttachPoint.Z());
255       Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
256     }
257
258   // segment on circle
259   Standard_Real pf = ElCLib::Parameter(aCircle,Point1);
260   Standard_Real pl = ElCLib::Parameter(aCircle,Point2);
261   Standard_Real alpha = pl - pf;
262   if ( alpha < 0 ) alpha += 2*Standard_PI;
263   Standard_Integer nb = (Standard_Integer)(50.0*alpha/PI);
264   Standard_Integer nbp = Max(4,nb);
265   Graphic3d_Array1OfVertex VC1(1,nbp);
266   Standard_Real dteta = alpha/(nbp-1);
267
268   for (Standard_Integer i = 1; i <= nbp; i++)
269     {
270       ptcur = ElCLib::Value(pf + dteta*(i-1),aCircle);
271       VC1(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
272     }
273   Prs3d_Root::NewGroup(aPresentation);
274   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
275   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(VC1);
276 }
277   
278 //===================================================================
279 //Function:Add
280 //Purpose: draws the representation of a radial symmetry between two elliptic arcs.
281 //===================================================================
282 void DsgPrs_MidPointPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
283                                        const Handle(Prs3d_Drawer)& aDrawer,     
284                                        const gp_Elips& aCircle,
285                                        const gp_Pnt&   MidPoint,
286                                        const gp_Pnt&   Position,
287                                        const gp_Pnt&   AttachPoint,
288                                        const gp_Pnt&   Point1,
289                                        const gp_Pnt&   Point2,
290                                        const Standard_Boolean first)
291 {
292   Standard_Real rad = AttachPoint.Distance(MidPoint)/20.0;
293   if ( rad <= Precision::Confusion() ) rad = Point1.Distance(Point2)/20.0;
294
295   Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
296   Graphic3d_Array1OfVertex V(1,2);
297
298   gp_Pnt Ptmp,ptcur;
299
300   gp_Ax2 ax = aCircle.Position();
301   ax.SetLocation(MidPoint);
302   gp_Circ aCircleM (ax,rad);
303
304   if ( first )
305     {
306       // center of the symmetry - circle around the MidPoint
307       Prs3d_Root::NewGroup(aPresentation);
308       Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
309       Standard_Real alpha = 2*Standard_PI;
310       Standard_Integer nbp = 100;
311       Graphic3d_Array1OfVertex VC(1,nbp);
312       Standard_Real dteta = alpha/(nbp-1);
313       for (Standard_Integer i = 1; i <= nbp; i++)
314         {
315           ptcur =  ElCLib::Value(dteta*(i-1),aCircleM);
316           VC(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
317         }
318       Prs3d_Root::CurrentGroup(aPresentation)->Polyline(VC);
319
320       // segment from mid point to the text position
321       Prs3d_Root::NewGroup(aPresentation);
322       Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
323       // mid point
324       if ( Position.IsEqual(MidPoint,rad) )
325         Ptmp = MidPoint;
326       else
327         Ptmp = ElCLib::Value(ElCLib::Parameter(aCircleM,Position),aCircleM);
328       V(1).SetCoord(Ptmp.X(),Ptmp.Y(),Ptmp.Z());
329       // text position
330       V(2).SetCoord(Position.X(),Position.Y(),Position.Z());
331       Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
332
333       // texte 
334       TCollection_ExtendedString aText (" (+)");
335       Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,Position);
336     }
337
338   if ( !AttachPoint.IsEqual(MidPoint, Precision::Confusion()) )
339     {
340       // segment from mid point to the geometry
341       Prs3d_Root::NewGroup(aPresentation);
342       Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
343       // mid point
344       Ptmp = ElCLib::Value(ElCLib::Parameter(aCircleM,AttachPoint),aCircleM);
345       V(1).SetCoord(Ptmp.X(),Ptmp.Y(),Ptmp.Z());
346       // attach point to the geometry
347       V(2).SetCoord(AttachPoint.X(),AttachPoint.Y(),AttachPoint.Z());
348       Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
349     }
350
351   // segment on ellipse
352   Standard_Real pf = ElCLib::Parameter(aCircle,Point1);
353   Standard_Real pl = ElCLib::Parameter(aCircle,Point2);
354   Standard_Real alpha = pl - pf;
355   if ( alpha < 0 ) alpha += 2*Standard_PI;
356   Standard_Integer nb = (Standard_Integer)(50.0*alpha/PI);
357   Standard_Integer nbp = Max(4,nb);
358   Graphic3d_Array1OfVertex VC1(1,nbp);
359   Standard_Real dteta = alpha/(nbp-1);
360
361   for (Standard_Integer i = 1; i <= nbp; i++)
362     {
363       ptcur = ElCLib::Value(pf + dteta*(i-1),aCircle);
364       VC1(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
365     }
366   Prs3d_Root::NewGroup(aPresentation);
367   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
368   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(VC1);
369 }