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>
6 #include <DsgPrs_MidPointPresentation.ixx>
8 #include <Precision.hxx>
10 #include <TCollection_ExtendedString.hxx>
13 #include <gp_Circ.hxx>
22 #include <Graphic3d_Group.hxx>
23 #include <Graphic3d_Array1OfVertex.hxx>
24 #include <Graphic3d_AspectLine3d.hxx>
26 #include <Prs3d_Root.hxx>
27 #include <Prs3d_LineAspect.hxx>
28 #include <Prs3d_LengthAspect.hxx>
29 #include <Prs3d_Text.hxx>
31 //===================================================================
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,
38 const gp_Pnt& MidPoint,
39 const gp_Pnt& Position,
40 const gp_Pnt& AttachPoint,
41 const Standard_Boolean first)
43 Standard_Real rad = AttachPoint.Distance(MidPoint)/20.0;
45 Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
46 Graphic3d_Array1OfVertex V(1,2);
51 ax.SetLocation(MidPoint);
52 gp_Circ aCircleM (ax,rad);
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);
64 for (Standard_Integer i = 1; i <= nbp; i++)
66 ptcur = ElCLib::Value(dteta*(i-1),aCircleM);
67 VC(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
69 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(VC);
71 // segment from mid point to the text position
72 Prs3d_Root::NewGroup(aPresentation);
73 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
75 if ( Position.IsEqual(MidPoint,rad) )
78 Ptmp = ElCLib::Value(ElCLib::Parameter(aCircleM,Position),aCircleM);
79 V(1).SetCoord(Ptmp.X(),Ptmp.Y(),Ptmp.Z());
81 V(2).SetCoord(Position.X(),Position.Y(),Position.Z());
82 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
85 TCollection_ExtendedString aText (" (+)");
86 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,Position);
89 if ( !AttachPoint.IsEqual(MidPoint, Precision::Confusion()) )
91 // segment from mid point to the geometry
92 Prs3d_Root::NewGroup(aPresentation);
93 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
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);
103 //===================================================================
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)
117 Standard_Real rad = AttachPoint.Distance(MidPoint)/20.0;
118 if ( rad <= Precision::Confusion() ) rad = Point1.Distance(Point2)/20.0;
120 Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
121 Graphic3d_Array1OfVertex V(1,2);
126 ax.SetLocation(MidPoint);
127 gp_Circ aCircleM (ax,rad);
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);
139 for (Standard_Integer i = 1; i <= nbp; i++)
141 ptcur = ElCLib::Value(dteta*(i-1),aCircleM);
142 VC(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
144 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(VC);
146 // segment from mid point to the text position
147 Prs3d_Root::NewGroup(aPresentation);
148 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
150 if ( Position.IsEqual(MidPoint,rad) )
153 Ptmp = ElCLib::Value(ElCLib::Parameter(aCircleM,Position),aCircleM);
154 V(1).SetCoord(Ptmp.X(),Ptmp.Y(),Ptmp.Z());
156 V(2).SetCoord(Position.X(),Position.Y(),Position.Z());
157 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
160 TCollection_ExtendedString aText (" (+)");
161 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,Position);
164 if ( !AttachPoint.IsEqual(MidPoint, Precision::Confusion()) )
166 // segment from mid point to the geometry
167 Prs3d_Root::NewGroup(aPresentation);
168 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
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);
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);
185 //===================================================================
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)
199 Standard_Real rad = AttachPoint.Distance(MidPoint)/20.0;
200 if ( rad <= Precision::Confusion() ) rad = Point1.Distance(Point2)/20.0;
202 Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
203 Graphic3d_Array1OfVertex V(1,2);
207 gp_Ax2 ax = aCircle.Position();
208 ax.SetLocation(MidPoint);
209 gp_Circ aCircleM (ax,rad);
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++)
222 ptcur = ElCLib::Value(dteta*(i-1),aCircleM);
223 VC(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
225 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(VC);
227 // segment from mid point to the text position
228 Prs3d_Root::NewGroup(aPresentation);
229 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
231 if ( Position.IsEqual(MidPoint,rad) )
234 Ptmp = ElCLib::Value(ElCLib::Parameter(aCircleM,Position),aCircleM);
235 V(1).SetCoord(Ptmp.X(),Ptmp.Y(),Ptmp.Z());
237 V(2).SetCoord(Position.X(),Position.Y(),Position.Z());
238 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
241 TCollection_ExtendedString aText (" (+)");
242 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,Position);
245 if ( !AttachPoint.IsEqual(MidPoint, Precision::Confusion()) )
247 // segment from mid point to the geometry
248 Prs3d_Root::NewGroup(aPresentation);
249 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
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);
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);
268 for (Standard_Integer i = 1; i <= nbp; i++)
270 ptcur = ElCLib::Value(pf + dteta*(i-1),aCircle);
271 VC1(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
273 Prs3d_Root::NewGroup(aPresentation);
274 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
275 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(VC1);
278 //===================================================================
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)
292 Standard_Real rad = AttachPoint.Distance(MidPoint)/20.0;
293 if ( rad <= Precision::Confusion() ) rad = Point1.Distance(Point2)/20.0;
295 Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
296 Graphic3d_Array1OfVertex V(1,2);
300 gp_Ax2 ax = aCircle.Position();
301 ax.SetLocation(MidPoint);
302 gp_Circ aCircleM (ax,rad);
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++)
315 ptcur = ElCLib::Value(dteta*(i-1),aCircleM);
316 VC(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
318 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(VC);
320 // segment from mid point to the text position
321 Prs3d_Root::NewGroup(aPresentation);
322 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
324 if ( Position.IsEqual(MidPoint,rad) )
327 Ptmp = ElCLib::Value(ElCLib::Parameter(aCircleM,Position),aCircleM);
328 V(1).SetCoord(Ptmp.X(),Ptmp.Y(),Ptmp.Z());
330 V(2).SetCoord(Position.X(),Position.Y(),Position.Z());
331 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
334 TCollection_ExtendedString aText (" (+)");
335 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,Position);
338 if ( !AttachPoint.IsEqual(MidPoint, Precision::Confusion()) )
340 // segment from mid point to the geometry
341 Prs3d_Root::NewGroup(aPresentation);
342 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
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);
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);
361 for (Standard_Integer i = 1; i <= nbp; i++)
363 ptcur = ElCLib::Value(pf + dteta*(i-1),aCircle);
364 VC1(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
366 Prs3d_Root::NewGroup(aPresentation);
367 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
368 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(VC1);