0030682: Configuration, qmake - all warnings are suppressed on macOS target
[occt.git] / src / DsgPrs / DsgPrs.cxx
CommitLineData
b311480e 1// Copyright (c) 1998-1999 Matra Datavision
973c2be1 2// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 3//
973c2be1 4// This file is part of Open CASCADE Technology software library.
b311480e 5//
d5f74e42 6// This library is free software; you can redistribute it and/or modify it under
7// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 8// by the Free Software Foundation, with special exception defined in the file
9// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10// distribution for complete text of the license and disclaimer of any warranty.
b311480e 11//
973c2be1 12// Alternatively, this file may be used under the terms of Open CASCADE
13// commercial license or contractual agreement.
b311480e 14
7fd59977 15#include <Aspect_TypeOfLine.hxx>
16#include <Aspect_TypeOfMarker.hxx>
42cf5bc1 17#include <DsgPrs.hxx>
7fd59977 18#include <ElCLib.hxx>
42cf5bc1 19#include <gce_MakeLin.hxx>
7fd59977 20#include <Geom_Circle.hxx>
42cf5bc1 21#include <Geom_Curve.hxx>
22#include <Geom_Line.hxx>
23#include <Geom_Surface.hxx>
7fd59977 24#include <GeomAPI_ExtremaCurveCurve.hxx>
7fd59977 25#include <GeomAPI_ProjectPointOnCurve.hxx>
42cf5bc1 26#include <GeomAPI_ProjectPointOnSurf.hxx>
27#include <gp_Ax1.hxx>
28#include <gp_Circ.hxx>
29#include <gp_Dir.hxx>
30#include <gp_Elips.hxx>
31#include <gp_Pln.hxx>
32#include <gp_Pnt.hxx>
33#include <gp_Vec.hxx>
34#include <Graphic3d_ArrayOfPoints.hxx>
35#include <Graphic3d_AspectLine3d.hxx>
36#include <Graphic3d_AspectMarker3d.hxx>
37#include <Graphic3d_Group.hxx>
42cf5bc1 38#include <Precision.hxx>
39#include <Prs3d_Arrow.hxx>
40#include <Prs3d_ArrowAspect.hxx>
41#include <Prs3d_DimensionAspect.hxx>
42#include <Prs3d_LineAspect.hxx>
43#include <Prs3d_Presentation.hxx>
44#include <Prs3d_Root.hxx>
45#include <Quantity_Color.hxx>
46#include <TCollection_AsciiString.hxx>
47#include <TCollection_ExtendedString.hxx>
7fd59977 48
7fd59977 49void DsgPrs::ComputeSymbol (const Handle(Prs3d_Presentation)& aPresentation,
a6eb515f 50 const Handle(Prs3d_DimensionAspect)& LA,
7fd59977 51 const gp_Pnt& pt1,
52 const gp_Pnt& pt2,
53 const gp_Dir& dir1,
54 const gp_Dir& dir2,
a6eb515f 55 const DsgPrs_ArrowSide ArrowSide,
56 const Standard_Boolean drawFromCenter)
7fd59977 57{
bf5f0ca2 58 Handle(Graphic3d_Group) aGroup = aPresentation->NewGroup();
a577aaab 59
b6472664 60 Quantity_Color aColor = LA->LineAspect()->Aspect()->Color();
a577aaab 61 Handle(Graphic3d_AspectMarker3d) aMarkerAsp = new Graphic3d_AspectMarker3d (Aspect_TOM_O, aColor, 1.0);
bf5f0ca2 62 aGroup->SetGroupPrimitivesAspect (LA->LineAspect()->Aspect());
7fd59977 63
64 switch(ArrowSide) {
65 case DsgPrs_AS_NONE:
66 {
67 break;
68 }
69 case DsgPrs_AS_FIRSTAR:
70 {
bf5f0ca2 71 Prs3d_Arrow::Draw (aGroup,
7fd59977 72 pt1,
73 dir1,
74 LA->ArrowAspect()->Angle(),
75 LA->ArrowAspect()->Length());
76 break;
77 }
78 case DsgPrs_AS_LASTAR:
79 {
80
bf5f0ca2 81 Prs3d_Arrow::Draw (aGroup,
7fd59977 82 pt2,
83 dir2,
84 LA->ArrowAspect()->Angle(),
85 LA->ArrowAspect()->Length());
86 break;
87 }
88
89 case DsgPrs_AS_BOTHAR:
90 {
bf5f0ca2 91 Prs3d_Arrow::Draw (aGroup,
7fd59977 92 pt1,
93 dir1,
94 LA->ArrowAspect()->Angle(),
95 LA->ArrowAspect()->Length());
bf5f0ca2 96 Prs3d_Arrow::Draw (aGroup,
7fd59977 97 pt2,
98 dir2,
99 LA->ArrowAspect()->Angle(),
100 LA->ArrowAspect()->Length());
101
102 break;
103 }
104
105 case DsgPrs_AS_FIRSTPT:
106 {
a6eb515f 107 if(drawFromCenter)
a577aaab 108 {
109 Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
110 anArrayOfPoints->AddVertex (pt1.X(), pt1.Y(), pt1.Z());
111 Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints);
112 }
7fd59977 113 break;
114 }
115
116 case DsgPrs_AS_LASTPT:
117 {
118 // On dessine un rond
a577aaab 119 Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
120 anArrayOfPoints->AddVertex (pt2.X(), pt2.Y(), pt2.Z());
121 Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints);
7fd59977 122 break;
123 }
124
125 case DsgPrs_AS_BOTHPT:
126 {
a6eb515f 127 if(drawFromCenter)
a577aaab 128 {
bf5f0ca2 129 Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints1 = new Graphic3d_ArrayOfPoints (2);
a577aaab 130 anArrayOfPoints1->AddVertex (pt1.X(), pt1.Y(), pt1.Z());
bf5f0ca2 131 anArrayOfPoints1->AddVertex (pt2.X(), pt2.Y(), pt2.Z());
132 aGroup->SetGroupPrimitivesAspect (aMarkerAsp);
133 aGroup->AddPrimitiveArray (anArrayOfPoints1);
a6eb515f 134 }
7fd59977 135 break;
136 }
137
138 case DsgPrs_AS_FIRSTAR_LASTPT:
139 {
140 // an Arrow
bf5f0ca2 141 Prs3d_Arrow::Draw (aGroup,
a6eb515f 142 pt1,
143 dir1,
144 LA->ArrowAspect()->Angle(),
145 LA->ArrowAspect()->Length());
7fd59977 146 // a Round
a577aaab 147 Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
148 anArrayOfPoints->AddVertex (pt2.X(), pt2.Y(), pt2.Z());
bf5f0ca2 149 aGroup->SetPrimitivesAspect (aMarkerAsp);
150 aGroup->AddPrimitiveArray (anArrayOfPoints);
7fd59977 151 break;
152 }
153
154 case DsgPrs_AS_FIRSTPT_LASTAR:
155 {
7fd59977 156 // an Arrow
bf5f0ca2 157 Prs3d_Arrow::Draw (aGroup,
a6eb515f 158 pt2,
159 dir2,
160 LA->ArrowAspect()->Angle(),
161 LA->ArrowAspect()->Length());
bf5f0ca2 162
163 // a Round
164 if (drawFromCenter)
165 {
166 Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
167 anArrayOfPoints->AddVertex (pt1.X(), pt1.Y(), pt1.Z());
168 aGroup->SetPrimitivesAspect (aMarkerAsp);
169 aGroup->AddPrimitiveArray (anArrayOfPoints);
170 }
7fd59977 171 break;
172 }
173 }
174}
175
176
177//=======================================================================
178//function : ComputePlanarFacesLengthPresentation
179//purpose :
180//=======================================================================
181
182void DsgPrs::ComputePlanarFacesLengthPresentation( const Standard_Real FirstArrowLength,
183 const Standard_Real SecondArrowLength,
184 const gp_Pnt& AttachmentPoint1,
185 const gp_Pnt& AttachmentPoint2,
186 const gp_Dir& DirAttach,
187 const gp_Pnt& OffsetPoint,
188 const gp_Pln& PlaneOfFaces,
189 gp_Pnt & EndOfArrow1,
190 gp_Pnt & EndOfArrow2,
191 gp_Dir & DirOfArrow1 )
192{
193 gp_Lin FirstLin( AttachmentPoint1, DirAttach );
194 gp_Lin SecondLin( AttachmentPoint2, DirAttach );
195
196 EndOfArrow1 = ElCLib::Value( ElCLib::Parameter( FirstLin, OffsetPoint ), FirstLin );
197 EndOfArrow2 = ElCLib::Value( ElCLib::Parameter( SecondLin, OffsetPoint ), SecondLin );
198
08cd2f6b 199 if (EndOfArrow1.SquareDistance( EndOfArrow2 ) > Precision::SquareConfusion()) // not null length
7fd59977 200 {
201 gp_Dir LengthDir( gp_Vec( EndOfArrow1, EndOfArrow2 ) );
202 if ((FirstArrowLength + SecondArrowLength)*(FirstArrowLength + SecondArrowLength) <
203 EndOfArrow1.SquareDistance( EndOfArrow2 ))
204 DirOfArrow1 = -LengthDir;
205 else
206 DirOfArrow1 = LengthDir;
207 }
208 else // null length
209 DirOfArrow1 = PlaneOfFaces.Axis().Direction();
210}
211
212//=======================================================================
213//function : ComputeCurvilinearFacesLengthPresentation
214//purpose :
215//=======================================================================
216
217void DsgPrs::ComputeCurvilinearFacesLengthPresentation( const Standard_Real FirstArrowLength,
218 const Standard_Real SecondArrowLength,
219 const Handle( Geom_Surface )& SecondSurf,
220 const gp_Pnt& AttachmentPoint1,
221 const gp_Pnt& AttachmentPoint2,
222 const gp_Dir& DirAttach,
223 gp_Pnt & EndOfArrow2,
224 gp_Dir & DirOfArrow1,
225 Handle( Geom_Curve )& VCurve,
226 Handle( Geom_Curve )& UCurve,
227 Standard_Real & FirstU,
228 Standard_Real & deltaU,
229 Standard_Real & FirstV,
230 Standard_Real & deltaV )
231{
232 GeomAPI_ProjectPointOnSurf ProjectorOnSurface;
233 GeomAPI_ProjectPointOnCurve ProjectorOnCurve;
ee2be2a8 234 Standard_Real U1, V1, U2, V2;
7fd59977 235 Standard_Real LastU, LastV;
08cd2f6b 236 Standard_Real SquareTolerance = Precision::SquareConfusion();
7fd59977 237
238 ProjectorOnSurface.Init( AttachmentPoint1, SecondSurf );
239 Standard_Integer Index(1);
ee2be2a8 240 Standard_Real MinDist = RealLast();
241 Standard_Real LocalU, LocalV;
7fd59977 242 gp_Vec D1U, D1V;
243 gp_Dir LocalDir;
244 for (Standard_Integer i = 1; i <= ProjectorOnSurface.NbPoints(); i++)
245 {
246 ProjectorOnSurface.Parameters( i, LocalU, LocalV );
247
248 SecondSurf->D1( LocalU, LocalV, EndOfArrow2, D1U, D1V );
249 if (D1U.SquareMagnitude() <= SquareTolerance || D1V.SquareMagnitude() <= SquareTolerance)
250 LocalDir = gp_Dir( gp_Vec( AttachmentPoint1, ProjectorOnSurface.Point( i ) ) );
251 else
252 LocalDir = gp_Dir( D1U ^ D1V );
253 if (DirAttach.IsParallel( LocalDir, Precision::Angular() ) && ProjectorOnSurface.Distance( i ) < MinDist)
254 {
255 Index = i;
256 MinDist = ProjectorOnSurface.Distance( i );
257 }
258 }
259 EndOfArrow2 = ProjectorOnSurface.Point( Index );
260 ProjectorOnSurface.Parameters( Index, U1, V1 );
261
262 if ((FirstArrowLength + SecondArrowLength)*(FirstArrowLength + SecondArrowLength) <
263 AttachmentPoint1.SquareDistance( EndOfArrow2 ))
264 DirOfArrow1 = -DirAttach;
265 else
266 DirOfArrow1 = DirAttach;
267
08cd2f6b 268 if (EndOfArrow2.SquareDistance( AttachmentPoint2 ) > Precision::SquareConfusion())
7fd59977 269 {
270 VCurve = SecondSurf->VIso( V1 );
271 ProjectorOnCurve.Init( EndOfArrow2, VCurve );
272 FirstU = ProjectorOnCurve.LowerDistanceParameter();
273
274 ProjectorOnSurface.Init( AttachmentPoint2, SecondSurf );
275 ProjectorOnSurface.LowerDistanceParameters( U2, V2 );
276 UCurve = SecondSurf->UIso( U2 );
277
278 ProjectorOnCurve.Init( AttachmentPoint2, UCurve );
279 LastV = ProjectorOnCurve.LowerDistanceParameter();
280
281 gp_Pnt Intersection = SecondSurf->Value( U2, V1 );
282 ProjectorOnCurve.Init( Intersection, VCurve );
283 LastU = ProjectorOnCurve.LowerDistanceParameter();
284 ProjectorOnCurve.Init( Intersection, UCurve );
285 FirstV = ProjectorOnCurve.LowerDistanceParameter();
286
287 deltaU = LastU - FirstU;
288 deltaV = LastV - FirstV;
289
290 if (VCurve->IsPeriodic() && Abs( deltaU ) > VCurve->Period()/2)
291 {
292 Standard_Real Sign = (deltaU > 0.0)? -1.0 : 1.0;
293 deltaU = VCurve->Period() - Abs( deltaU );
294 deltaU *= Sign;
295 }
296 if (UCurve->IsPeriodic() && Abs( deltaV ) > UCurve->Period()/2)
297 {
298 Standard_Real Sign = (deltaV > 0.0)? -1.0 : 1.0;
299 deltaV = UCurve->Period() - Abs( deltaV );
300 deltaV *= Sign;
301 }
302 }
303}
304
305
306//=======================================================================
307//function : ComputeFacesAnglePresentation
308//purpose :
309//=======================================================================
310
311void DsgPrs::ComputeFacesAnglePresentation( const Standard_Real ArrowLength,
312 const Standard_Real Value,
313 const gp_Pnt& CenterPoint,
314 const gp_Pnt& AttachmentPoint1,
315 const gp_Pnt& AttachmentPoint2,
316 const gp_Dir& dir1,
317 const gp_Dir& dir2,
318 const gp_Dir& axisdir,
319 const Standard_Boolean isPlane,
320 const gp_Ax1& AxisOfSurf,
321 const gp_Pnt& OffsetPoint,
322 gp_Circ & AngleCirc,
323 Standard_Real & FirstParAngleCirc,
324 Standard_Real & LastParAngleCirc,
325 gp_Pnt & EndOfArrow1,
326 gp_Pnt & EndOfArrow2,
327 gp_Dir & DirOfArrow1,
328 gp_Dir & DirOfArrow2,
329 gp_Pnt & ProjAttachPoint2,
330 gp_Circ & AttachCirc,
331 Standard_Real & FirstParAttachCirc,
332 Standard_Real & LastParAttachCirc )
333{
c6541a0c 334 if (Value > Precision::Angular() && Abs( M_PI-Value ) > Precision::Angular())
7fd59977 335 {
336 // Computing presentation of angle's arc
337 gp_Ax2 ax( CenterPoint, axisdir, dir1 );
338 AngleCirc.SetPosition( ax );
339 AngleCirc.SetRadius( CenterPoint.Distance( OffsetPoint ) );
340 gp_Vec vec1( dir1 );
341 vec1 *= AngleCirc.Radius();
342 gp_Pnt p1 = CenterPoint.Translated( vec1 );
343 gp_Vec vec2( dir2 );
344 vec2 *= AngleCirc.Radius();
345 gp_Pnt p2 = CenterPoint.Translated( vec2 );
346
347 Standard_Real Par1 = 0.;
348 Standard_Real Par2 = ElCLib::Parameter( AngleCirc, p2 );
349 Standard_Real Par0 = ElCLib::Parameter( AngleCirc, OffsetPoint );
350
351 gp_Vec PosVec( CenterPoint, OffsetPoint );
352 gp_Vec NormalOfPlane = vec1 ^ vec2;
353
354 gp_Vec Normal1 = NormalOfPlane ^ vec1;
355 gp_Vec Normal2 = NormalOfPlane ^ vec2;
356 Standard_Integer Sign1 = (PosVec * Normal1 >= 0)? 1 : -1;
357 Standard_Integer Sign2 = (PosVec * Normal2 >= 0)? 1 : -1;
358 if (Sign1 == 1 && Sign2 == -1)
359 {
360 FirstParAngleCirc = Par1;
361 LastParAngleCirc = Par2;
362 }
363 else if (Sign1 == 1 && Sign2 == 1)
364 {
365 FirstParAngleCirc = Par1;
366 LastParAngleCirc = Par0;
367 }
368 else if (Sign1 == -1 && Sign2 == 1)
369 {
c6541a0c
D
370 Par1 += M_PI;
371 Par2 += M_PI;
7fd59977 372 FirstParAngleCirc = Par1;
373 LastParAngleCirc = Par2;
374 }
375 else //Sign1 == -1 && Sign2 == -1
376 {
377 AngleCirc.SetPosition( gp_Ax2( CenterPoint, axisdir, gp_Dir( PosVec ) ) );
378 Par0 = 0.;
379 Par1 = ElCLib::Parameter( AngleCirc, p1 );
380 Par2 = ElCLib::Parameter( AngleCirc, p2 );
381 FirstParAngleCirc = Par0;
382 LastParAngleCirc = Par2;
383 }
384
385 // Computing presentation of arrows
386 EndOfArrow1 = ElCLib::Value( Par1, AngleCirc );
387 EndOfArrow2 = ElCLib::Value( Par2, AngleCirc );
388 Standard_Real beta = 0.;
389 if (AngleCirc.Radius() > Precision::Confusion())
390 beta = ArrowLength / AngleCirc.Radius();
391 gp_Pnt OriginOfArrow1 = ElCLib::Value( Par1 + beta, AngleCirc );
392 gp_Pnt OriginOfArrow2 = ElCLib::Value( Par2 - beta, AngleCirc );
393 DirOfArrow1 = gp_Dir( gp_Vec( OriginOfArrow1, EndOfArrow1 ) );
394 DirOfArrow2 = gp_Dir( gp_Vec( OriginOfArrow2, EndOfArrow2 ) );
395 if (EndOfArrow1.SquareDistance( EndOfArrow2 ) <= (ArrowLength + ArrowLength)*(ArrowLength + ArrowLength))
396 {
397 DirOfArrow1.Reverse();
398 DirOfArrow2.Reverse();
399 }
400 }
401 else // dir1 and dir2 are parallel
402 {
403 gp_Dir ArrowDir = axisdir ^ dir1;
404 DirOfArrow1 = ArrowDir;
405 DirOfArrow2 = -ArrowDir;
406 gp_Lin DirLine( AttachmentPoint1, dir1 );
407 EndOfArrow1 = ElCLib::Value( ElCLib::Parameter( DirLine, OffsetPoint ), DirLine );
408 EndOfArrow2 = EndOfArrow1;
409 }
410
411 // Line or arc from AttachmentPoint2 to its "projection"
412 gp_Lin SecondLin( CenterPoint, dir2 );
413 if (SecondLin.Contains( AttachmentPoint2, Precision::Confusion() ))
414 ProjAttachPoint2 = AttachmentPoint2;
415 else
416 {
417 if (isPlane)
418 ProjAttachPoint2 = ElCLib::Value( ElCLib::Parameter( SecondLin, AttachmentPoint2 ), SecondLin );
419 else
420 {
421 gp_Lin LineOfAxis( AxisOfSurf );
422 gp_Pnt CenterOfArc = ElCLib::Value( ElCLib::Parameter( LineOfAxis, AttachmentPoint2 ),
423 LineOfAxis );
424
425 gp_Ax2 Ax2( CenterOfArc,
426 AxisOfSurf.Direction(),
427 gp_Dir( gp_Vec( CenterOfArc, AttachmentPoint2 ) ) );
428 AttachCirc.SetPosition( Ax2 );
429 AttachCirc.SetRadius( CenterOfArc.Distance( AttachmentPoint2 ) );
430
431 GeomAPI_ExtremaCurveCurve Intersection( new Geom_Circle( AttachCirc ),
432 new Geom_Line( SecondLin ) );
433 Intersection.NearestPoints( ProjAttachPoint2, ProjAttachPoint2 );
434
435 Standard_Real U2 = ElCLib::Parameter( AttachCirc, ProjAttachPoint2 );
c6541a0c 436 if (U2 <= M_PI)
7fd59977 437 {
438 FirstParAttachCirc = 0;
439 LastParAttachCirc = U2;
440 }
441 else
442 {
443 FirstParAttachCirc = U2;
c6541a0c 444 LastParAttachCirc = 2*M_PI;
7fd59977 445 }
446 }
447 }
448}
449
450
451
35e08fe8 452void DsgPrs::ComputeFilletRadiusPresentation( const Standard_Real /*ArrowLength*/,
7fd59977 453 const Standard_Real Value,
454 const gp_Pnt & Position,
455 const gp_Dir & NormalDir,
456 const gp_Pnt & FirstPoint,
457 const gp_Pnt & SecondPoint,
458 const gp_Pnt & Center,
459 const gp_Pnt & BasePnt,
460 const Standard_Boolean drawRevers,
461 Standard_Boolean & SpecCase,
462 gp_Circ & FilletCirc,
463 Standard_Real & FirstParCirc,
464 Standard_Real & LastParCirc,
465 gp_Pnt & EndOfArrow,
466 gp_Dir & DirOfArrow,
467 gp_Pnt & DrawPosition)
468{
469 gp_Dir dir1(gp_Vec(Center, FirstPoint));
470 gp_Dir dir2(gp_Vec(Center, SecondPoint));
471 Standard_Real Angle = dir1.Angle(dir2);
c6541a0c 472 if(Angle <= Precision::Angular() || ( M_PI - Angle ) <= Precision::Angular() ||
7fd59977 473 Value <= Precision::Confusion()) SpecCase = Standard_True;
474 else SpecCase = Standard_False;
475 if ( !SpecCase )
476 {
477 // Computing presentation of fillet's arc
478 gp_Ax2 ax( Center, NormalDir, dir1 );
479 FilletCirc.SetPosition( ax );
480 FilletCirc.SetRadius( Center.Distance( FirstPoint ) ); //***
481 gp_Vec vec1( dir1 );
482 vec1 *= FilletCirc.Radius();
7fd59977 483 gp_Vec vec2( dir2 );
484 vec2 *= FilletCirc.Radius();
7fd59977 485 gp_Vec PosVec;
486 if(! Center.IsEqual( Position, Precision::Confusion() ))
487 PosVec.SetXYZ( gp_Vec(Center, Position).XYZ() );
488 else
489 PosVec.SetXYZ( (vec1.Added(vec2)).XYZ() );
490 gp_Vec NormalOfPlane = vec1 ^ vec2;
491 gp_Vec Normal1 = NormalOfPlane ^ vec1;
492 gp_Vec Normal2 = NormalOfPlane ^ vec2;
493 Standard_Integer Sign1 = (PosVec * Normal1 >= 0)? 1 : -1;
494 Standard_Integer Sign2 = (PosVec * Normal2 >= 0)? 1 : -1;
495 gp_Lin L1( Center, dir1 );
496 gp_Lin L2( Center, dir2 );
497 if ( Sign1 != Sign2 )
498 {
499 DrawPosition = Position; //***
500 gp_Dir direction(PosVec) ;
501 Standard_Real angle = dir1.Angle(direction) ;
502 if (( dir1 ^ direction) * NormalDir < 0.0e0) angle = -angle ;
c6541a0c 503 if(Sign1 == -1) angle += M_PI;
7fd59977 504 EndOfArrow = ElCLib::Value(angle, FilletCirc); //***
505
506 }
507 else
508 {
509 if(L1.Distance(Position) < L2.Distance(Position))
510 {
511 EndOfArrow = FirstPoint; //***
512 DrawPosition = ElCLib::Value(ElCLib::Parameter(L1, Position), L1);
513 }
514 else
515 {
516 EndOfArrow = SecondPoint; //***
517 DrawPosition = ElCLib::Value(ElCLib::Parameter(L2, Position), L2);
518 }
519 }
520 if((dir1^dir2).IsOpposite(NormalDir, Precision::Angular()))
521 {
522 gp_Dir newdir = NormalDir.Reversed() ;
523 gp_Ax2 axnew( Center, newdir, dir1 );
524 FilletCirc.SetPosition( axnew );
525 }
526 FirstParCirc = ElCLib::Parameter( FilletCirc, FirstPoint );
527 LastParCirc = ElCLib::Parameter( FilletCirc, SecondPoint );
7fd59977 528 }
529 else //Angle equal 0 or PI or R = 0
530 {
531 DrawPosition = Position;
532 EndOfArrow = BasePnt;
533 }
534
7fd59977 535 if(drawRevers)
536 {
537 gp_Vec Vd(DrawPosition, EndOfArrow);
538 DrawPosition.Translate(Vd *2);
539 }
540 DirOfArrow.SetXYZ(gp_Dir(gp_Vec(DrawPosition, EndOfArrow)).XYZ());
541}
542
543//=======================================================================
544//function : ComputeRadiusLine
545//purpose :
546//=======================================================================
547
548void DsgPrs::ComputeRadiusLine(const gp_Pnt & aCenter,
549 const gp_Pnt & anEndOfArrow,
550 const gp_Pnt & aPosition,
551 const Standard_Boolean drawFromCenter,
552 gp_Pnt & aRadLineOrign,
553 gp_Pnt & aRadLineEnd)
554{
555 if(drawFromCenter)
556 {
557 gp_Lin RadiusLine = gce_MakeLin( aCenter, anEndOfArrow );
558 Standard_Real PosParOnLine = ElCLib::Parameter( RadiusLine, aPosition );
559 Standard_Real EndOfArrowPar = ElCLib::Parameter( RadiusLine, anEndOfArrow );
560 if (PosParOnLine < 0.0)
561 {
562 aRadLineOrign = aPosition;
563 aRadLineEnd = anEndOfArrow;
564 }
565 else if (PosParOnLine > EndOfArrowPar)
566 {
567 aRadLineOrign = aPosition;
568 aRadLineEnd = aCenter;
569 }
570 else
571 {
572 aRadLineOrign = aCenter;
573 aRadLineEnd = anEndOfArrow;
574 }
575 }
576 else
577 {
578 aRadLineOrign = aPosition;
579 aRadLineEnd = anEndOfArrow;
580 }
581}
582
583
584//=======================================================================
585//function : DistanceFromApex
586//purpose :
587//=======================================================================
588
589Standard_Real DsgPrs::DistanceFromApex(const gp_Elips & elips,
590 const gp_Pnt & Apex,
591 const Standard_Real par)
592{
593 Standard_Real dist;
594 Standard_Real parApex = ElCLib::Parameter ( elips, Apex );
c6541a0c 595 if(parApex == 0.0 || parApex == M_PI)
7fd59977 596 {//Major case
597 if(parApex == 0.0) //pos Apex
c6541a0c 598 dist = (par < M_PI) ? par : (2*M_PI - par);
7fd59977 599 else //neg Apex
c6541a0c 600 dist = (par < M_PI) ? ( M_PI - par) : ( par - M_PI );
7fd59977 601 }
602 else
603 {// Minor case
c6541a0c 604 if(parApex == M_PI / 2) //pos Apex
7fd59977 605 {
c6541a0c 606 if(par <= parApex + M_PI && par > parApex )
7fd59977 607 dist = par - parApex;
608 else
609 {
c6541a0c
D
610 if(par > parApex + M_PI)
611 dist = 2*M_PI - par + parApex;
7fd59977 612 else
c6541a0c 613 dist = parApex - par; // 0 < par < M_PI/2
7fd59977 614 }
615 }
616 else //neg Apex == 3/2 PI
617 {
c6541a0c 618 if(par <= parApex && par >= M_PI/2)
7fd59977 619 dist = parApex - par;
620 else
621 {
622 if(par > parApex)
623 dist = par - parApex;
624 else
c6541a0c 625 dist = par + M_PI/2; // 0 < par < PI/2
7fd59977 626 }
627 }
628 }
629 return dist;
630}