#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void DsgPrs_LengthPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Prs3d_Drawer)& aDrawer, const TCollection_ExtendedString& aText, const gp_Pnt& AttachmentPoint1, const gp_Pnt& AttachmentPoint2, const gp_Dir& aDirection, const gp_Pnt& OffsetPoint) { Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect(); Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Lin L1 (AttachmentPoint1,aDirection); gp_Lin L2 (AttachmentPoint2,aDirection); gp_Pnt Proj1 = ElCLib::Value(ElCLib::Parameter(L1,OffsetPoint),L1); gp_Pnt Proj2 = ElCLib::Value(ElCLib::Parameter(L2,OffsetPoint),L2); gp_Lin L3; if (!Proj1.IsEqual(Proj2,Precision::Confusion())) { L3 = gce_MakeLin(Proj1,Proj2); } else { L3 = gp_Lin(Proj1,aDirection); } Standard_Real parmin,parmax,parcur; parmin = ElCLib::Parameter(L3,Proj1); parmax = parmin; parcur = ElCLib::Parameter(L3,Proj2); Standard_Real dist = Abs(parmin-parcur); if (parcur < parmin) parmin = parcur; if (parcur > parmax) parmax = parcur; parcur = ElCLib::Parameter(L3,OffsetPoint); gp_Pnt offp = ElCLib::Value(parcur,L3); Standard_Boolean outside = Standard_False; if (parcur < parmin) { parmin = parcur; outside = Standard_True; } if (parcur > parmax) { parmax = parcur; outside = Standard_True; } gp_Pnt PointMin = ElCLib::Value(parmin,L3); gp_Pnt PointMax = ElCLib::Value(parmax,L3); Graphic3d_Array1OfVertex V(1,2); Quantity_Length X,Y,Z; PointMin.Coord(X,Y,Z); V(1).SetCoord(X,Y,Z); PointMax.Coord(X,Y,Z); V(2).SetCoord(X,Y,Z); // face processing : 1st group Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V); Prs3d_Root::NewGroup(aPresentation); Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); if (dist < (LA->Arrow1Aspect()->Length()+LA->Arrow2Aspect()->Length())) { outside = Standard_True; } gp_Dir arrdir = L3.Direction().Reversed(); if (outside) { arrdir.Reverse(); } // arrow 1 : 2nd group Prs3d_Arrow::Draw(aPresentation,Proj1,arrdir, LA->Arrow1Aspect()->Angle(), LA->Arrow1Aspect()->Length()); Prs3d_Root::NewGroup(aPresentation); Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); // arrow 2 : 3rd group Prs3d_Arrow::Draw(aPresentation,Proj2,arrdir.Reversed(), LA->Arrow2Aspect()->Angle(), LA->Arrow2Aspect()->Length()); Prs3d_Root::NewGroup(aPresentation); // text : 4th group Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,offp); AttachmentPoint1.Coord(X,Y,Z); V(1).SetCoord(X,Y,Z); Proj1.Coord(X,Y,Z); V(2).SetCoord(X,Y,Z); Prs3d_Root::NewGroup(aPresentation); Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); // processing of call 1 : 5th group Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V); AttachmentPoint2.Coord(X,Y,Z); V(1).SetCoord(X,Y,Z); Proj2.Coord(X,Y,Z); V(2).SetCoord(X,Y,Z); Prs3d_Root::NewGroup(aPresentation); Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); // processing of call 2 : 6th group Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V); } //================================================================================== //function : Add //purpose : Adds presentation of length dimension between two planar faces //================================================================================== void DsgPrs_LengthPresentation::Add( const Handle(Prs3d_Presentation)& aPresentation, const Handle(Prs3d_Drawer)& aDrawer, const TCollection_ExtendedString& aText, const gp_Pnt& AttachmentPoint1, const gp_Pnt& AttachmentPoint2, const gp_Pln& PlaneOfFaces, const gp_Dir& aDirection, const gp_Pnt& OffsetPoint, const DsgPrs_ArrowSide ArrowPrs ) { Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect(); Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Pnt EndOfArrow1, EndOfArrow2; gp_Dir DirOfArrow1; DsgPrs::ComputePlanarFacesLengthPresentation( LA->Arrow1Aspect()->Length(), LA->Arrow2Aspect()->Length(), AttachmentPoint1, AttachmentPoint2, aDirection, OffsetPoint, PlaneOfFaces, EndOfArrow1, EndOfArrow2, DirOfArrow1 ); Graphic3d_Array1OfVertex VertexArray( 1, 2 ); // Parameters for length's line gp_Lin LengthLine( OffsetPoint, DirOfArrow1 ); Standard_Real Par1 = ElCLib::Parameter( LengthLine, EndOfArrow1 ); Standard_Real Par2 = ElCLib::Parameter( LengthLine, EndOfArrow2 ); gp_Pnt FirstPoint, LastPoint; if ((Par1 > 0.0 && Par2 > 0.0) || (Par1 < 0.0 && Par2 < 0.0)) { FirstPoint = OffsetPoint; LastPoint = (Abs( Par1 ) > Abs( Par2 ))? EndOfArrow1 : EndOfArrow2; } else { FirstPoint = EndOfArrow1; LastPoint = EndOfArrow2; } // Creating the length's line VertexArray(1).SetCoord( FirstPoint.X(), FirstPoint.Y(), FirstPoint.Z() ); VertexArray(2).SetCoord( LastPoint.X(), LastPoint.Y(), LastPoint.Z() ); Prs3d_Root::CurrentGroup( aPresentation )->Polyline( VertexArray ); // Add presentation of arrows DsgPrs::ComputeSymbol( aPresentation, LA, EndOfArrow1, EndOfArrow2, //EndOfArrow1, DirOfArrow1, DirOfArrow1.Reversed(), ArrowPrs ); // Drawing the text Prs3d_Text::Draw( aPresentation, LA->TextAspect(), aText, OffsetPoint ); // Line from AttachmentPoint1 to end of Arrow1 VertexArray(1).SetCoord(AttachmentPoint1.X(), AttachmentPoint1.Y(), AttachmentPoint1.Z()); VertexArray(2).SetCoord( EndOfArrow1.X(), EndOfArrow1.Y(), EndOfArrow1.Z() ); Prs3d_Root::CurrentGroup( aPresentation )->Polyline( VertexArray ); // Line from AttachmentPoint2 to end of Arrow2 VertexArray(1).SetCoord(AttachmentPoint2.X(), AttachmentPoint2.Y(), AttachmentPoint2.Z()); VertexArray(2).SetCoord( EndOfArrow2.X(), EndOfArrow2.Y(), EndOfArrow2.Z() ); Prs3d_Root::CurrentGroup( aPresentation )->Polyline( VertexArray ); } //========================================================================================= //function : Add //purpose : adds presentation of length between two edges, vertex and edge or two vertices //========================================================================================= void DsgPrs_LengthPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Prs3d_Drawer)& aDrawer, const TCollection_ExtendedString& aText, const gp_Pnt& AttachmentPoint1, const gp_Pnt& AttachmentPoint2, const gp_Dir& aDirection, const gp_Pnt& OffsetPoint, const DsgPrs_ArrowSide ArrowPrs) { Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect(); Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Lin L1 (AttachmentPoint1,aDirection); gp_Lin L2 (AttachmentPoint2,aDirection); gp_Pnt Proj1 = ElCLib::Value(ElCLib::Parameter(L1,OffsetPoint),L1); gp_Pnt Proj2 = ElCLib::Value(ElCLib::Parameter(L2,OffsetPoint),L2); gp_Lin L3; if (!Proj1.IsEqual(Proj2,Precision::Confusion())) { L3 = gce_MakeLin(Proj1,Proj2); } else { L3 = gp_Lin(Proj1,aDirection); } Standard_Real parmin,parmax,parcur; parmin = ElCLib::Parameter(L3,Proj1); parmax = parmin; parcur = ElCLib::Parameter(L3,Proj2); Standard_Real dist = Abs(parmin-parcur); if (parcur < parmin) parmin = parcur; if (parcur > parmax) parmax = parcur; parcur = ElCLib::Parameter(L3,OffsetPoint); gp_Pnt offp = ElCLib::Value(parcur,L3); Standard_Boolean outside = Standard_False; if (parcur < parmin) { parmin = parcur; outside = Standard_True; } if (parcur > parmax) { parmax = parcur; outside = Standard_True; } gp_Pnt PointMin = ElCLib::Value(parmin,L3); gp_Pnt PointMax = ElCLib::Value(parmax,L3); Graphic3d_Array1OfVertex V(1,2); Quantity_Length X,Y,Z; PointMin.Coord(X,Y,Z); V(1).SetCoord(X,Y,Z); PointMax.Coord(X,Y,Z); V(2).SetCoord(X,Y,Z); // processing of face Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V); if (dist < (LA->Arrow1Aspect()->Length()+LA->Arrow2Aspect()->Length())) { outside = Standard_True; } gp_Dir arrdir = L3.Direction().Reversed(); if (outside) { arrdir.Reverse(); } AttachmentPoint1.Coord(X,Y,Z); V(1).SetCoord(X,Y,Z); Proj1.Coord(X,Y,Z); V(2).SetCoord(X,Y,Z); // processing of call 1 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V); AttachmentPoint2.Coord(X,Y,Z); V(1).SetCoord(X,Y,Z); Proj2.Coord(X,Y,Z); V(2).SetCoord(X,Y,Z); // processing of call 2 Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V); // text Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,offp); // symbols at the extremities of the face DsgPrs::ComputeSymbol(aPresentation,LA,Proj1,Proj2,arrdir,arrdir.Reversed(),ArrowPrs); } //================================================================================== //function : Add //purpose : Adds presentation of length dimension between two curvilinear faces //================================================================================== void DsgPrs_LengthPresentation::Add( const Handle(Prs3d_Presentation)& aPresentation, const Handle(Prs3d_Drawer)& aDrawer, const TCollection_ExtendedString& aText, const Handle( Geom_Surface )& SecondSurf, const gp_Pnt& AttachmentPoint1, const gp_Pnt& AttachmentPoint2, const gp_Dir& aDirection, const gp_Pnt& OffsetPoint, const DsgPrs_ArrowSide ArrowPrs ) { Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect(); Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Pnt EndOfArrow2; gp_Dir DirOfArrow1; Handle( Geom_Curve ) VCurve, UCurve; Standard_Real FirstU, deltaU = 0.0e0, FirstV, deltaV = 0.0e0; DsgPrs::ComputeCurvilinearFacesLengthPresentation( LA->Arrow1Aspect()->Length(), LA->Arrow2Aspect()->Length(), SecondSurf, AttachmentPoint1, AttachmentPoint2, aDirection, EndOfArrow2, DirOfArrow1, VCurve, UCurve, FirstU, deltaU, FirstV, deltaV ); Graphic3d_Array1OfVertex VertexArray( 1, 2 ); gp_Lin LengthLine( OffsetPoint, DirOfArrow1 ); Standard_Real Par1 = ElCLib::Parameter( LengthLine, AttachmentPoint1 ); Standard_Real Par2 = ElCLib::Parameter( LengthLine, EndOfArrow2 ); gp_Pnt FirstPoint, LastPoint; if ((Par1 > 0.0 && Par2 > 0.0) || (Par1 < 0.0 && Par2 < 0.0)) { FirstPoint = OffsetPoint; LastPoint = (Abs( Par1 ) > Abs( Par2 ))? AttachmentPoint1 : EndOfArrow2; } else { FirstPoint = AttachmentPoint1; LastPoint = EndOfArrow2; } // Creating the length's line VertexArray(1).SetCoord( FirstPoint.X(), FirstPoint.Y(), FirstPoint.Z() ); VertexArray(2).SetCoord( LastPoint.X(), LastPoint.Y(), LastPoint.Z() ); Prs3d_Root::CurrentGroup( aPresentation )->Polyline( VertexArray ); // Add presentation of arrows DsgPrs::ComputeSymbol( aPresentation, LA, AttachmentPoint1, EndOfArrow2, DirOfArrow1, DirOfArrow1.Reversed(), ArrowPrs ); // Drawing the text Prs3d_Text::Draw( aPresentation, LA->TextAspect(), aText, OffsetPoint ); // Two curves from end of Arrow2 to AttachmentPoint2 Standard_Real Alpha, delta; Standard_Integer NodeNumber; Alpha = Abs( deltaU ); if (Alpha > Precision::Angular() && AlphaValue( FirstU ); ApproxCurve(i).SetCoord( CurPnt.X(), CurPnt.Y(), CurPnt.Z() ); FirstU += delta; } Prs3d_Root::CurrentGroup( aPresentation )->Polyline( ApproxCurve ); } Alpha = Abs( deltaV ); if (Alpha > Precision::Angular() && AlphaValue( FirstV ); ApproxCurve(i).SetCoord( CurPnt.X(), CurPnt.Y(), CurPnt.Z() ); FirstV += delta; } Prs3d_Root::CurrentGroup( aPresentation )->Polyline( ApproxCurve ); } } //================================ // Function: // Purpose: Rob 26-mar-96 //================================= void DsgPrs_LengthPresentation::Add (const Handle(Prs3d_Presentation)& aPrs, const Handle(Prs3d_Drawer)& aDrawer, const gp_Pnt& Pt1, const gp_Pnt& Pt2, const DsgPrs_ArrowSide ArrowPrs) { Prs3d_Root::CurrentGroup(aPrs)->BeginPrimitives(); Graphic3d_Array1OfVertex Vx(1,2); Vx(1).SetCoord(Pt1.X(),Pt1.Y(),Pt1.Z()); Vx(2).SetCoord(Pt2.X(),Pt2.Y(),Pt2.Z()); Prs3d_Root::CurrentGroup(aPrs)->Polyline(Vx); gp_Vec V ; switch(ArrowPrs){ case DsgPrs_AS_NONE: break; case DsgPrs_AS_LASTAR: Prs3d_Arrow::Draw(aPrs,Pt2,gp_Dir(gp_Vec(Pt1,Pt2)), aDrawer->LengthAspect()->Arrow1Aspect()->Angle(), aDrawer->LengthAspect()->Arrow1Aspect()->Length()); break; case DsgPrs_AS_FIRSTAR: Prs3d_Arrow::Draw(aPrs,Pt1,gp_Dir(gp_Vec(Pt2,Pt1)), aDrawer->LengthAspect()->Arrow1Aspect()->Angle(), aDrawer->LengthAspect()->Arrow1Aspect()->Length()); break; case DsgPrs_AS_BOTHAR: V = gp_Vec(Pt1,Pt2); Prs3d_Arrow::Draw(aPrs,Pt2,gp_Dir(V), aDrawer->LengthAspect()->Arrow1Aspect()->Angle(), aDrawer->LengthAspect()->Arrow1Aspect()->Length()); Prs3d_Arrow::Draw(aPrs,Pt1,gp_Dir(V.Reversed()), aDrawer->LengthAspect()->Arrow1Aspect()->Angle(), aDrawer->LengthAspect()->Arrow1Aspect()->Length()); break; #ifndef DEB default: break; #endif } Prs3d_Root::CurrentGroup(aPrs)->EndPrimitives(); }