1 // File: DsgPrs_AnglePresentation.cxx
2 // Created: Tue Feb 7 12:18:14 1995
5 #include <DsgPrs_AnglePresentation.ixx>
9 #include <Graphic3d_Group.hxx>
10 #include <Graphic3d_Array1OfVertex.hxx>
11 #include <Prs3d_AngleAspect.hxx>
12 #include <Prs3d_Arrow.hxx>
13 #include <Prs3d_ArrowAspect.hxx>
14 #include <Prs3d_LineAspect.hxx>
15 #include <Prs3d_LengthAspect.hxx>
16 #include <Prs3d_Text.hxx>
17 #include <TCollection_AsciiString.hxx>
18 #include <TCollection_ExtendedString.hxx>
22 #include <Graphic3d_Vertex.hxx>
23 #include <Graphic3d_AspectMarker3d.hxx>
24 #include <Graphic3d_AspectLine3d.hxx>
25 #include <Aspect_TypeOfLine.hxx>
26 #include <Aspect_TypeOfMarker.hxx>
27 #include <Aspect_AspectMarker.hxx>
28 #include <Quantity_Color.hxx>
30 #include <Precision.hxx>
32 #include <Geom_Circle.hxx>
33 #include <Geom_Line.hxx>
34 #include <GeomAPI_ExtremaCurveCurve.hxx>
35 #include <GC_MakeCircle.hxx>
36 #include <gce_MakePln.hxx>
38 #include <UnitsAPI.hxx>
46 static Standard_Integer AboveInBelowCone(gp_Circ CMax, gp_Circ CMin, gp_Circ C);
49 //==========================================================================
50 // function : DsgPrs_AnglePresentation::Add
51 // purpose : draws the presentation of the cone's angle;
52 //==========================================================================
53 void DsgPrs_AnglePresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
54 const Handle(Prs3d_Drawer)& aDrawer,
55 const Standard_Real aVal,
56 const TCollection_ExtendedString& aText,
57 const gp_Circ& aCircle,
58 const gp_Pnt& aPosition,
60 const gp_Circ& VminCircle,
61 const gp_Circ& VmaxCircle,
62 const Standard_Real aArrowSize)
67 Handle(Prs3d_AngleAspect) anAngleAspect = aDrawer->AngleAspect();
68 Handle(Prs3d_LengthAspect) aLengthAspect = aDrawer->LengthAspect();
69 Standard_Real myArrowSize;
71 TCollection_ExtendedString txt = aText;
72 if( aArrowSize == 0.0 ) myArrowSize = aCircle.Radius()/ 10.;
73 else myArrowSize = aArrowSize;
75 anAngleAspect->ArrowAspect()->SetLength(myArrowSize);
76 aDrawer->ArrowAspect()->SetLength(myArrowSize);
78 Standard_Boolean IsArrowOut = Standard_True; //Is arrows inside or outside of the cone
79 Standard_Boolean IsConeTrimmed = Standard_False;
80 gp_Circ myCircle = aCircle;
83 if( VminCircle.Radius() > 0.01 ) {
84 IsConeTrimmed = Standard_True;
85 if( AboveInBelowCone( VmaxCircle, VminCircle, myCircle ) == 1 ) myCircle = VminCircle;
93 Quantity_Length X,Y,Z;
95 Standard_Real param = 0.; //ElCLib::Parameter(myCircle, aPosition);
98 gp_Pnt P1 = ElCLib::Value(0., myCircle);
99 gp_Pnt P2 = ElCLib::Value(Standard_PI, myCircle);
101 gce_MakePln mkPln(P1, P2, aPnt); // create a plane whitch defines plane for projection aPosition on it
103 gp_Vec aVector( mkPln.Value().Location(), aPosition ); //project aPosition on a plane
104 gp_Vec Normal = mkPln.Value().Axis().Direction();
105 Normal = (aVector * Normal) * Normal;
108 aPnt = aPnt.Translated( -Normal );
112 if( aPnt.Distance(P1) < aPnt.Distance(P2) ){
121 aPnt = AttachmentPnt ; // Creating of circle whitch defines a plane for a dimension arc
122 gp_Vec Vec(AttachmentPnt, Apex); // Dimension arc is a part of the circle
125 GC_MakeCircle mkCirc(AttachmentPnt, OppositePnt, aPnt);
126 gp_Circ aCircle2 = mkCirc.Value()->Circ();
129 Standard_Real AttParam = ElCLib::Parameter(aCircle2, AttachmentPnt); //must be equal to zero (look circle construction)
130 Standard_Real OppParam = ElCLib::Parameter(aCircle2, OppositePnt);
133 while ( AttParam >= 2*Standard_PI ) AttParam -= 2*Standard_PI;
134 while ( OppParam >= 2*Standard_PI ) OppParam -= 2*Standard_PI;
136 //-------------------------- Compute angle ------------------------
137 if( txt.Length() == 0 ) {
138 Standard_Real angle = UnitsAPI::CurrentFromLS( Abs( OppParam ),"PLANE ANGLE");
140 sprintf(res, "%g", angle );
141 txt = TCollection_ExtendedString(res);
143 //-----------------------------------------------------------------
147 if( ElCLib::Parameter(aCircle2, tmpPnt) < OppParam )
148 // if( aPosition.Distance( myCircle.Location() ) <= myCircle.Radius() )
149 if( 2 * myCircle.Radius() > 4 * myArrowSize ) IsArrowOut = Standard_False; //four times more than an arrow size
152 Graphic3d_Array1OfVertex V(1, 12);
155 // param = ElCLib::Parameter(aCircle2, tmpPnt);
156 angle = OppParam - AttParam;
160 aDir = gp_Dir( ( gp_Vec( ElCLib::Value( AttParam - Standard_PI/12, aCircle2 ), AttachmentPnt) ) );
161 aDir2 = gp_Dir( ( gp_Vec( ElCLib::Value( OppParam + Standard_PI/12, aCircle2 ), OppositePnt) ) );
164 aDir = gp_Dir( ( gp_Vec( ElCLib::Value( AttParam + Standard_PI/12, aCircle2 ), AttachmentPnt ) ) );
165 aDir2 = gp_Dir( ( gp_Vec( ElCLib::Value( OppParam - Standard_PI/12, aCircle2 ), OppositePnt ) ) );
168 while ( angle > 2*Standard_PI ) angle -= 2*Standard_PI;
169 for( i = 0; i <= 11; i++ ) { //calculating of arc
170 ( ElCLib::Value(param + angle/11 * i, aCircle2) ).Coord(X, Y, Z);
171 V(i+1).SetCoord(X, Y, Z);
174 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V); //add the arc
176 DsgPrs::ComputeSymbol(aPresentation, anAngleAspect, AttachmentPnt,
177 AttachmentPnt, aDir, aDir, DsgPrs_AS_LASTAR);
178 DsgPrs::ComputeSymbol(aPresentation, anAngleAspect, OppositePnt,
179 OppositePnt, aDir2, aDir2, DsgPrs_AS_LASTAR);
181 param = ElCLib::Parameter(aCircle2, tmpPnt);
182 tmpPnt = ElCLib::Value(param, aCircle2);
183 tmpPnt = tmpPnt.Translated(gp_Vec(0, 0, -1)*2);
184 Prs3d_Text::Draw(aPresentation,aLengthAspect->TextAspect(), txt, tmpPnt); //add the TCollection_ExtendedString
186 angle = 2*Standard_PI - param ;
187 if( param > OppParam ) {
188 while ( angle > 2*Standard_PI ) angle -= 2*Standard_PI;
189 for( i = 11; i >= 0; i-- ) { //calculating of arc
190 ( ElCLib::Value(-angle/11 * i, aCircle2) ).Coord(X, Y, Z);
191 V(i+1).SetCoord(X, Y, Z);
194 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V); //add additional line
197 if( AboveInBelowCone( VmaxCircle, VminCircle, myCircle ) == 1 && !IsConeTrimmed ) { //above
198 Graphic3d_Array1OfVertex V2(1,3);
199 AttachmentPnt.Coord(X, Y, Z);
200 V2(1).SetCoord(X, Y, Z);
202 V2(2).SetCoord(X, Y, Z);
203 OppositePnt.Coord(X, Y, Z);
204 V2(3).SetCoord(X, Y, Z);
206 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V2); //add the additional lines
210 if ( AboveInBelowCone( VmaxCircle, VminCircle, myCircle ) == 0 ) return;
211 Graphic3d_Array1OfVertex V3(1,2);
212 gp_Pnt P11 = ElCLib::Value( 0., VmaxCircle );
213 gp_Pnt P12 = ElCLib::Value( Standard_PI, VmaxCircle );
215 AttachmentPnt.Coord(X, Y, Z);
216 V3(1).SetCoord(X, Y, Z);
217 if( aPnt.Distance(P1) < aPnt.Distance(P2) ) P12.Coord(X, Y, Z);
218 else P11.Coord(X, Y, Z);
219 V3(2).SetCoord(X, Y, Z);
221 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V3);
223 OppositePnt.Coord(X, Y, Z);
224 V3(1).SetCoord(X, Y, Z);
225 if( aPnt.Distance(P1) < aPnt.Distance(P2) ) P11.Coord(X, Y, Z);
226 else P12.Coord(X, Y, Z);
227 V3(2).SetCoord(X, Y, Z);
229 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V3);
233 //------------------------------------------------------------------------------------------------------------------
234 // Returns 1 if C is above of CMin; 0 if C is bitween CMin and CMax; -1 if C is Below CMax
235 //-----------------------------------------------------------------------------------------------------------------
236 static Standard_Integer AboveInBelowCone(gp_Circ CMax, gp_Circ CMin, gp_Circ C)
238 Standard_Real D, D1, D2;
240 D = CMax.Location().Distance( CMin.Location() );
241 D1 = CMax.Location().Distance( C.Location() );
242 D2 = CMin.Location().Distance( C.Location() );
245 if ( D >= D1 && D >= D2 ) return 0;
246 if ( D < D2 && D1 < D2 ) return -1;
247 if ( D < D1 && D2 < D1 ) return 1;
253 //==========================================================================
254 // function : DsgPrs_AnglePresentation::Add
257 //==========================================================================
259 void DsgPrs_AnglePresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
260 const Handle(Prs3d_Drawer)& aDrawer,
261 const Standard_Real theval,
262 const TCollection_ExtendedString& aText,
263 const gp_Pnt& CenterPoint,
264 const gp_Pnt& AttachmentPoint1,
265 const gp_Pnt& AttachmentPoint2,
268 const gp_Dir& axisdir,
269 const gp_Pnt& OffsetPoint) {
271 sprintf(valcar,"%5.2f",theval);
273 Handle(Prs3d_AngleAspect) LA = aDrawer->AngleAspect();
274 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
276 gp_Ax2 ax(CenterPoint,axisdir,dir1);
277 gp_Circ cer(ax,CenterPoint.Distance(OffsetPoint));
279 vec1 *= cer.Radius();
283 CenterPoint.Translated(vec1);
285 vec2 *= cer.Radius();
286 gp_Pnt p2 = CenterPoint.Translated(vec2);
288 Standard_Real uc1 = 0.;
289 Standard_Real uc2 = ElCLib::Parameter(cer,p2);
290 Standard_Real uco = ElCLib::Parameter(cer,OffsetPoint);
292 Standard_Real udeb = uc1;
293 Standard_Real ufin = uc2;
296 if (Abs(theval)<PI) {
297 // test si uco est dans le secteur oppose
298 if (uco > udeb+PI && uco < ufin+PI){
308 if ((uco-uc2) < (uc1-uco+(2*PI))) {
316 Standard_Real alpha = Abs(ufin-udeb);
317 Standard_Integer nbp = Max (4 , Standard_Integer (50. * alpha / PI));
318 Graphic3d_Array1OfVertex V(1,nbp);
319 Standard_Real dteta = alpha/(nbp-1);
321 for (Standard_Integer i = 1; i<=nbp; i++) {
322 ptcur = ElCLib::Value(udeb+ dteta*(i-1),cer);
323 V(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
325 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
327 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,OffsetPoint);
331 ElCLib::D1(uc1,cer,ptarr,vecarr);
332 gp_Ax1 ax1(ptarr, axisdir);
333 gp_Dir dirarr(-vecarr);
334 //calcul de l'angle de rotation
335 Standard_Real beta(0.);
336 Standard_Real length = LA->ArrowAspect()->Length();
337 if (length < Precision::Confusion()) length = 1.e-04;
338 gp_Pnt ptarr2(ptarr.XYZ() + length*dirarr.XYZ());
339 Standard_Real parcir = ElCLib::Parameter(cer, ptarr2);
340 gp_Pnt ptarr3 = ElCLib::Value(parcir, cer);
341 gp_Vec v1(ptarr,ptarr2 );
342 gp_Vec v2(ptarr, ptarr3);
344 dirarr.Rotate(ax1, beta);
345 Prs3d_Arrow::Draw(aPresentation,
348 LA->ArrowAspect()->Angle(),
351 Graphic3d_Array1OfVertex Vrap(1,2);
352 Vrap(1).SetCoord(AttachmentPoint1.X(),
353 AttachmentPoint1.Y(),
354 AttachmentPoint1.Z());
355 Vrap(2).SetCoord(ptarr.X(),ptarr.Y(),ptarr.Z());
356 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrap);
358 ElCLib::D1(uc2,cer,ptarr,vecarr);
359 ax1.SetLocation(ptarr);
360 gp_Dir dirarr2(vecarr);
361 dirarr2.Rotate(ax1,-beta);
362 Prs3d_Arrow::Draw(aPresentation,
365 LA->ArrowAspect()->Angle(),
368 Vrap(1).SetCoord(AttachmentPoint2.X(),
369 AttachmentPoint2.Y(),
370 AttachmentPoint2.Z());
371 Vrap(2).SetCoord(ptarr.X(),ptarr.Y(),ptarr.Z());
372 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrap);
376 //==========================================================================
377 // function : DsgPrs_AnglePresentation::Add
378 // purpose : Adds prezentation of angle between two faces
379 //==========================================================================
381 void DsgPrs_AnglePresentation::Add( const Handle(Prs3d_Presentation)& aPresentation,
382 const Handle(Prs3d_Drawer)& aDrawer,
383 const Standard_Real theval,
384 const TCollection_ExtendedString& aText,
385 const gp_Pnt& CenterPoint,
386 const gp_Pnt& AttachmentPoint1,
387 const gp_Pnt& AttachmentPoint2,
390 const gp_Dir& axisdir,
391 const Standard_Boolean isPlane,
392 const gp_Ax1& AxisOfSurf,
393 const gp_Pnt& OffsetPoint,
394 const DsgPrs_ArrowSide ArrowPrs )
397 sprintf( valcar, "%5.2f", theval );
399 Handle( Prs3d_AngleAspect ) LA = aDrawer->AngleAspect();
400 Prs3d_Root::CurrentGroup( aPresentation )->SetPrimitivesAspect( LA->LineAspect()->Aspect() );
402 gp_Circ AngleCirc, AttachCirc;
403 Standard_Real FirstParAngleCirc, LastParAngleCirc, FirstParAttachCirc, LastParAttachCirc;
404 gp_Pnt EndOfArrow1, EndOfArrow2, ProjAttachPoint2;
405 gp_Dir DirOfArrow1, DirOfArrow2;
406 DsgPrs::ComputeFacesAnglePresentation( LA->ArrowAspect()->Length(),
429 Graphic3d_Array1OfVertex Vrap(1,2);
431 // Creating the angle's arc or line if null angle
432 if (theval > Precision::Angular() && Abs( PI-theval ) > Precision::Angular())
434 Standard_Real Alpha = Abs( LastParAngleCirc - FirstParAngleCirc );
435 Standard_Integer NodeNumber = Max (4 , Standard_Integer (50. * Alpha / PI));
436 Graphic3d_Array1OfVertex ApproxArc( 0, NodeNumber-1 );
437 Standard_Real delta = Alpha / (Standard_Real)( NodeNumber - 1 );
439 for (Standard_Integer i = 0 ; i < NodeNumber; i++)
441 CurPnt = ElCLib::Value( FirstParAngleCirc, AngleCirc );
442 ApproxArc(i).SetCoord( CurPnt.X(), CurPnt.Y(), CurPnt.Z() );
443 FirstParAngleCirc += delta ;
445 Prs3d_Root::CurrentGroup( aPresentation )->Polyline( ApproxArc );
449 Vrap(1).SetCoord( OffsetPoint.X(),
452 Vrap(2).SetCoord( EndOfArrow1.X(), EndOfArrow1.Y(), EndOfArrow1.Z() );
453 Prs3d_Root::CurrentGroup( aPresentation )->Polyline( Vrap );
456 // Add presentation of arrows
457 DsgPrs::ComputeSymbol( aPresentation, LA, EndOfArrow1, EndOfArrow2, DirOfArrow1, DirOfArrow2, ArrowPrs );
460 Prs3d_Text::Draw( aPresentation, LA->TextAspect(), aText, OffsetPoint );
462 // Line from AttachmentPoint1 to end of Arrow1
463 Vrap(1).SetCoord(AttachmentPoint1.X(),
464 AttachmentPoint1.Y(),
465 AttachmentPoint1.Z());
466 Vrap(2).SetCoord( EndOfArrow1.X(), EndOfArrow1.Y(), EndOfArrow1.Z() );
467 Prs3d_Root::CurrentGroup( aPresentation )->Polyline( Vrap );
469 // Line or arc from AttachmentPoint2 to its "projection"
470 if (AttachmentPoint2.Distance( ProjAttachPoint2 ) > Precision::Confusion())
474 // Creating the line from AttachmentPoint2 to its projection
475 Vrap(1).SetCoord( AttachmentPoint2.X(),
476 AttachmentPoint2.Y(),
477 AttachmentPoint2.Z() );
478 Vrap(2).SetCoord( ProjAttachPoint2.X(),
479 ProjAttachPoint2.Y(),
480 ProjAttachPoint2.Z() );
481 Prs3d_Root::CurrentGroup( aPresentation )->Polyline( Vrap );
485 // Creating the arc from AttachmentPoint2 to its "projection"
486 Standard_Real Alpha = Abs( LastParAttachCirc - FirstParAttachCirc );
487 Standard_Integer NodeNumber = Max (4 , Standard_Integer (50. * Alpha / PI));
488 Graphic3d_Array1OfVertex ApproxArc( 0, NodeNumber-1 );
489 Standard_Real delta = Alpha / (Standard_Real)( NodeNumber - 1 );
491 for (Standard_Integer i = 0 ; i < NodeNumber; i++)
493 CurPnt = ElCLib::Value( FirstParAttachCirc, AttachCirc );
494 ApproxArc(i).SetCoord( CurPnt.X(), CurPnt.Y(), CurPnt.Z() );
495 FirstParAttachCirc += delta ;
497 Prs3d_Root::CurrentGroup( aPresentation )->Polyline( ApproxArc );
500 // Line from "projection" of AttachmentPoint2 to end of Arrow2
501 Vrap(1).SetCoord( ProjAttachPoint2.X(),
502 ProjAttachPoint2.Y(),
503 ProjAttachPoint2.Z() );
504 Vrap(2).SetCoord( EndOfArrow2.X(), EndOfArrow2.Y(), EndOfArrow2.Z());
505 Prs3d_Root::CurrentGroup( aPresentation )->Polyline( Vrap );
509 //==========================================================================
510 // function : DsgPrs_AnglePresentation::Add
513 //==========================================================================
515 void DsgPrs_AnglePresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
516 const Handle(Prs3d_Drawer)& aDrawer,
517 const Standard_Real theval,
518 const TCollection_ExtendedString& aText,
519 const gp_Pnt& CenterPoint,
520 const gp_Pnt& AttachmentPoint1,
521 const gp_Pnt& AttachmentPoint2,
524 const gp_Pnt& OffsetPoint) {
526 sprintf(valcar,"%5.2f",theval);
528 Handle(Prs3d_AngleAspect) LA = aDrawer->AngleAspect();
529 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
531 if (!dir1.IsParallel(dir2, Precision::Angular())) {
532 Norm = dir1.Crossed(dir2);
535 gp_Dir dir2B = gp_Dir(gp_Vec(CenterPoint, OffsetPoint));
536 Norm = dir1.Crossed(dir2B);
539 if (Abs(theval) > PI) Norm.Reverse();
541 gp_Ax2 ax(CenterPoint,Norm,dir1);
542 gp_Circ cer(ax,CenterPoint.Distance(OffsetPoint));
544 vec1 *= cer.Radius();
548 CenterPoint.Translated(vec1);
550 vec2 *= cer.Radius();
551 gp_Pnt p2 = CenterPoint.Translated(vec2);
553 Standard_Real uc1 = 0.;
554 Standard_Real uc2 = ElCLib::Parameter(cer,p2);
555 Standard_Real uco = ElCLib::Parameter(cer,OffsetPoint);
557 Standard_Real udeb = uc1;
558 Standard_Real ufin = uc2;
561 if (Abs(theval)<PI) {
562 // test si uco est dans le secteur oppose
563 if (uco > udeb+PI && uco < ufin+PI){
573 if ((uco-uc2) < (uc1-uco+(2*PI))) {
581 Standard_Real alpha = Abs(ufin-udeb);
582 Standard_Integer nbp = Max (4 , Standard_Integer (50. * alpha / PI));
583 Graphic3d_Array1OfVertex V(1,nbp);
584 Standard_Real dteta = alpha/(nbp-1);
586 for (Standard_Integer i = 1; i<=nbp; i++) {
587 ptcur = ElCLib::Value(udeb+ dteta*(i-1),cer);
588 V(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
590 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
592 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,OffsetPoint);
596 ElCLib::D1(uc1,cer,ptarr,vecarr);
597 gp_Ax1 ax1(ptarr, Norm);
598 gp_Dir dirarr(-vecarr);
599 //calcul de l'angle de rotation
601 Standard_Real length = LA->ArrowAspect()->Length();
602 if (length < Precision::Confusion()) length = 1.e-04;
603 gp_Pnt ptarr2(ptarr.XYZ() + length*dirarr.XYZ());
604 Standard_Real parcir = ElCLib::Parameter(cer, ptarr2);
605 gp_Pnt ptarr3 = ElCLib::Value(parcir, cer);
606 gp_Vec v1(ptarr,ptarr2 );
607 gp_Vec v2(ptarr, ptarr3);
609 dirarr.Rotate(ax1, beta);
610 Prs3d_Arrow::Draw(aPresentation,
613 LA->ArrowAspect()->Angle(),
615 Graphic3d_Array1OfVertex Vrap(1,2);
616 Vrap(1).SetCoord(AttachmentPoint1.X(),
617 AttachmentPoint1.Y(),
618 AttachmentPoint1.Z());
619 Vrap(2).SetCoord(ptarr.X(),ptarr.Y(),ptarr.Z());
620 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrap);
622 ElCLib::D1(uc2,cer,ptarr,vecarr);
623 ax1.SetLocation(ptarr);
624 gp_Dir dirarr2(vecarr);
625 dirarr2.Rotate(ax1, - beta);
626 Prs3d_Arrow::Draw(aPresentation,
629 LA->ArrowAspect()->Angle(),
632 Vrap(1).SetCoord(AttachmentPoint2.X(),
633 AttachmentPoint2.Y(),
634 AttachmentPoint2.Z());
635 Vrap(2).SetCoord(ptarr.X(),ptarr.Y(),ptarr.Z());
636 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrap);
639 //==========================================================================
640 // function : DsgPrs_AnglePresentation::Add
641 // purpose : ODL 4-fevrier-97
642 // on peut choisir le symbol des extremites de la cote (fleche, point ...)
643 //==========================================================================
645 void DsgPrs_AnglePresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
646 const Handle(Prs3d_Drawer)& aDrawer,
647 const Standard_Real theval,
648 const TCollection_ExtendedString& aText,
649 const gp_Pnt& CenterPoint,
650 const gp_Pnt& AttachmentPoint1,
651 const gp_Pnt& AttachmentPoint2,
654 const gp_Pnt& OffsetPoint,
655 const DsgPrs_ArrowSide ArrowPrs)
658 sprintf(valcar,"%5.2f",theval);
660 Handle(Prs3d_AngleAspect) LA = aDrawer->AngleAspect();
661 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
662 gp_Dir Norm = dir1.Crossed(dir2);
664 if (Abs(theval) > PI) Norm.Reverse();
666 gp_Ax2 ax(CenterPoint,Norm,dir1);
667 gp_Circ cer(ax,CenterPoint.Distance(OffsetPoint));
669 vec1 *= cer.Radius();
673 CenterPoint.Translated(vec1);
675 vec2 *= cer.Radius();
676 gp_Pnt p2 = CenterPoint.Translated(vec2);
678 Standard_Real uc1 = 0.;
679 Standard_Real uc2 = ElCLib::Parameter(cer,p2);
680 Standard_Real uco = ElCLib::Parameter(cer,OffsetPoint);
682 Standard_Real udeb = uc1;
683 Standard_Real ufin = uc2;
686 if (Abs(theval)<PI) {
687 // test si uco est dans le secteur oppose
688 if (uco > udeb+PI && uco < ufin+PI){
698 if ((uco-uc2) < (uc1-uco+(2*PI))) {
706 Standard_Real alpha = Abs(ufin-udeb);
707 Standard_Integer nbp = Max (4 , Standard_Integer (50. * alpha / PI));
708 Graphic3d_Array1OfVertex V(1,nbp);
709 Standard_Real dteta = alpha/(nbp-1);
711 for (Standard_Integer i = 1; i<=nbp; i++) {
712 ptcur = ElCLib::Value(udeb+ dteta*(i-1),cer);
713 V(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
715 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
717 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,OffsetPoint);
722 ElCLib::D1(uc1,cer,ptarr,vecarr);
723 gp_Ax1 ax1(ptarr, Norm);
724 gp_Dir dirarr(-vecarr);
725 //calcul de l'angle de rotation
726 Standard_Real beta(0.);
727 Standard_Real length = LA->ArrowAspect()->Length();
728 if (length < Precision::Confusion()) length = 1.e-04;
729 gp_Pnt ptarr2(ptarr.XYZ() + length*dirarr.XYZ());
730 Standard_Real parcir = ElCLib::Parameter(cer, ptarr2);
731 gp_Pnt ptarr3 = ElCLib::Value(parcir, cer);
732 gp_Vec v1(ptarr,ptarr2 );
733 gp_Vec v2(ptarr, ptarr3);
735 dirarr.Rotate(ax1, beta);
737 Graphic3d_Array1OfVertex Vrap(1,2);
738 Vrap(1).SetCoord(AttachmentPoint1.X(),
739 AttachmentPoint1.Y(),
740 AttachmentPoint1.Z());
741 Vrap(2).SetCoord(ptarr.X(),ptarr.Y(),ptarr.Z());
742 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrap);
746 ElCLib::D1(uc2,cer,ptarr1,vecarr1);
747 ax1.SetLocation(ptarr1);
748 gp_Dir dirarr2(vecarr1);
749 dirarr2.Rotate(ax1, - beta);
752 Vrap(1).SetCoord(AttachmentPoint2.X(),
753 AttachmentPoint2.Y(),
754 AttachmentPoint2.Z());
755 Vrap(2).SetCoord(ptarr1.X(),ptarr1.Y(),ptarr1.Z());
756 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrap);
759 // On trace les fleches
760 DsgPrs::ComputeSymbol(aPresentation,LA,ptarr,ptarr1,dirarr,dirarr2,ArrowPrs);
766 //==========================================================================
767 // function : DsgPrs_AnglePresentation::Add
770 //==========================================================================
772 void DsgPrs_AnglePresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
773 const Handle(Prs3d_Drawer)& aDrawer,
774 const Standard_Real theval,
775 const gp_Pnt& CenterPoint,
776 const gp_Pnt& AttachmentPoint1,
777 const gp_Pnt& AttachmentPoint2,
780 const gp_Pnt& OffsetPoint) {
784 sprintf(valcar,"%5.2f",theval);
785 TCollection_AsciiString valas(valcar);
786 TCollection_ExtendedString aText(valas);
788 Handle(Prs3d_AngleAspect) LA = aDrawer->AngleAspect();
789 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
790 gp_Dir Norm = dir1.Crossed(dir2);
792 if (Abs(theval) > PI) Norm.Reverse();
794 gp_Ax2 ax(CenterPoint,Norm,dir1);
795 gp_Circ cer(ax,CenterPoint.Distance(OffsetPoint));
797 vec1 *= cer.Radius();
801 CenterPoint.Translated(vec1);
803 vec2 *= cer.Radius();
804 gp_Pnt p2 = CenterPoint.Translated(vec2);
806 Standard_Real uc1 = 0.;
807 Standard_Real uc2 = ElCLib::Parameter(cer,p2);
808 Standard_Real uco = ElCLib::Parameter(cer,OffsetPoint);
810 Standard_Real udeb = uc1;
811 Standard_Real ufin = uc2;
814 if (Abs(theval)<PI) {
815 // test si uco est dans le secteur oppose
816 if (uco > udeb+PI && uco < ufin+PI){
826 if ((uco-uc2) < (uc1-uco+(2*PI))) {
834 Standard_Real alpha = Abs(ufin-udeb);
835 Standard_Integer nbp = Max (4 , Standard_Integer (50. * alpha / PI));
836 Graphic3d_Array1OfVertex V(1,nbp);
837 Standard_Real dteta = alpha/(nbp-1);
839 for (Standard_Integer i = 1; i<=nbp; i++) {
840 ptcur = ElCLib::Value(udeb+ dteta*(i-1),cer);
841 V(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
843 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
845 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,OffsetPoint);
849 ElCLib::D1(uc1,cer,ptarr,vecarr);
850 gp_Ax1 ax1(ptarr, Norm);
851 gp_Dir dirarr(-vecarr);
852 //calcul de l'angle de rotation
854 Standard_Real length = LA->ArrowAspect()->Length();
855 if (length < Precision::Confusion()) length = 1.e-04;
856 gp_Pnt ptarr2(ptarr.XYZ() + length*dirarr.XYZ());
857 Standard_Real parcir = ElCLib::Parameter(cer, ptarr2);
858 gp_Pnt ptarr3 = ElCLib::Value(parcir, cer);
859 gp_Vec v1(ptarr,ptarr2 );
860 gp_Vec v2(ptarr, ptarr3);
862 dirarr.Rotate(ax1, beta);
863 Prs3d_Arrow::Draw(aPresentation,
866 LA->ArrowAspect()->Angle(),
869 Graphic3d_Array1OfVertex Vrap(1,2);
870 Vrap(1).SetCoord(AttachmentPoint1.X(),
871 AttachmentPoint1.Y(),
872 AttachmentPoint1.Z());
873 Vrap(2).SetCoord(ptarr.X(),ptarr.Y(),ptarr.Z());
874 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrap);
876 ElCLib::D1(uc2,cer,ptarr,vecarr);
877 ax1.SetLocation(ptarr);
878 gp_Dir dirarr2(vecarr);
879 dirarr2.Rotate(ax1, - beta);
880 Prs3d_Arrow::Draw(aPresentation,
883 LA->ArrowAspect()->Angle(),
886 Vrap(1).SetCoord(AttachmentPoint2.X(),
887 AttachmentPoint2.Y(),
888 AttachmentPoint2.Z());
889 Vrap(2).SetCoord(ptarr.X(),ptarr.Y(),ptarr.Z());
890 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrap);
893 void DsgPrs_AnglePresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
894 const Handle(Prs3d_Drawer)& aDrawer,
895 const Standard_Real theval,
896 const gp_Pnt& CenterPoint,
897 const gp_Pnt& AttachmentPoint1,
898 const gp_Ax1& theAxe,
899 const DsgPrs_ArrowSide ArrowSide)
901 Handle(Prs3d_AngleAspect) LA = aDrawer->AngleAspect();
902 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
904 gp_Dir dir1(gp_Vec(CenterPoint, AttachmentPoint1));
905 gp_Ax2 ax(CenterPoint,theAxe.Direction(),dir1);
906 gp_Circ cer(ax,CenterPoint.Distance(AttachmentPoint1));
908 Standard_Integer nbp = Max (4 , Standard_Integer (50. * theval / PI));
909 Graphic3d_Array1OfVertex V(1,nbp);
910 Standard_Real dteta = theval/(nbp-1);
912 for (Standard_Integer i = 1; i<=nbp; i++) {
913 ptcur = ElCLib::Value(dteta*(i-1),cer);
914 V(i).SetCoord(ptcur.X(),ptcur.Y(),ptcur.Z());
916 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
918 Standard_Real uc1 = 0.;
919 Standard_Real uc2 = ElCLib::Parameter(cer,AttachmentPoint1.Rotated(theAxe,theval));
923 Standard_Real length = LA->ArrowAspect()->Length();
924 if (length < Precision::Confusion()) length = 1.e-04;
931 case DsgPrs_AS_FIRSTAR:
933 ElCLib::D1(uc1,cer,ptarr,vecarr);
934 Prs3d_Arrow::Draw(aPresentation,
937 LA->ArrowAspect()->Angle(),
941 case DsgPrs_AS_LASTAR:
943 ElCLib::D1(uc2,cer,ptarr,vecarr);
944 Prs3d_Arrow::Draw(aPresentation,
947 LA->ArrowAspect()->Angle(),
951 case DsgPrs_AS_BOTHAR:
953 ElCLib::D1(uc1,cer,ptarr,vecarr);
954 Prs3d_Arrow::Draw(aPresentation,
957 LA->ArrowAspect()->Angle(),
959 ElCLib::D1(uc2,cer,ptarr,vecarr);
960 Prs3d_Arrow::Draw(aPresentation,
963 LA->ArrowAspect()->Angle(),