606bf9ddf081bbc1613bfb3b474185654ba38786
[occt.git] / src / DsgPrs / DsgPrs_DiameterPresentation.cxx
1 // Created on: 1996-08-21
2 // Created by: Jacques MINOT
3 // Copyright (c) 1996-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
5 //
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
10 //
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 //
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
20
21 //              modified 12-january-98
22 //              Sergey ZARITCHNY
23 //              szy
24 #include <DsgPrs_DiameterPresentation.ixx>
25
26 #include <Prs3d_LineAspect.hxx>
27 #include <Prs3d_TextAspect.hxx>
28 #include <Prs3d_LengthAspect.hxx>
29 #include <Prs3d_Arrow.hxx>
30 #include <Prs3d_Text.hxx>
31 #include <Prs3d_ArrowAspect.hxx>
32
33 #include <Graphic3d_Group.hxx>
34 #include <Graphic3d_Array1OfVertex.hxx>
35
36 #include <gp_Dir.hxx>
37 #include <gp_Pnt.hxx>
38 #include <gp_Vec.hxx>
39
40 #include <ElCLib.hxx>
41
42 #include <Graphic3d_Vertex.hxx>
43 #include <Graphic3d_AspectMarker3d.hxx>
44 #include <Graphic3d_AspectLine3d.hxx>
45 #include <Aspect_TypeOfLine.hxx>
46 #include <Aspect_TypeOfMarker.hxx>
47 #include <Aspect_AspectMarker.hxx>
48 #include <Quantity_Color.hxx>
49 #include <DsgPrs.hxx>
50
51 //==========================================================================
52 // function : DsgPrs_DiameterPresentation::Add
53 // purpose  : it is possible to choose the symbol of extremities of the face (arrow, point ...)
54 //==========================================================================
55 void DsgPrs_DiameterPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
56                                        const Handle(Prs3d_Drawer)& aDrawer,
57                                        const TCollection_ExtendedString& aText,
58                                        const gp_Pnt& AttachmentPoint,
59                                        const gp_Circ& aCircle,
60                                        const DsgPrs_ArrowSide ArrowPrs,
61                                        const Standard_Boolean IsDiamSymbol )
62 {
63
64
65   Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
66   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
67
68   Standard_Real parat    = ElCLib::Parameter(aCircle, AttachmentPoint);
69   gp_Pnt        ptoncirc = ElCLib::Value    (parat, aCircle);
70
71   // sideline
72
73   gp_Pnt        center  = aCircle.Location();
74   gp_Vec        vecrap  (ptoncirc,center);
75
76   Standard_Real dist    = center.Distance(AttachmentPoint);
77   Standard_Real aRadius = aCircle.Radius();
78   Standard_Boolean inside  = Standard_False;
79
80   gp_Pnt pt1 = AttachmentPoint;
81   if (dist < aRadius) {
82     pt1 = ptoncirc;
83     dist = aRadius;
84     inside = Standard_True;
85   }
86   vecrap.Normalize();
87   vecrap *= (dist+aRadius);
88   gp_Pnt        OppositePoint = pt1.Translated(vecrap);
89
90   
91   Graphic3d_Array1OfVertex V(1,2);
92   Quantity_Length X,Y,Z;
93   pt1.Coord(X,Y,Z);
94   V(1).SetCoord(X,Y,Z);
95   OppositePoint.Coord(X,Y,Z);
96   V(2).SetCoord(X,Y,Z);
97   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
98
99   // value
100   TCollection_ExtendedString Text = aText;
101   if(IsDiamSymbol) 
102     Text = TCollection_ExtendedString("\330  ") +  aText; // VRO (2007-05-17) inserted a blank.
103   Prs3d_Text::Draw(aPresentation, LA->TextAspect(), Text, AttachmentPoint);
104
105   // arrows
106
107   gp_Dir arrdir (vecrap);
108   if (inside) arrdir.Reverse();
109
110
111   gp_Vec vecrap2 = vecrap; 
112   gp_Pnt ptoncirc2 = ptoncirc;
113   gp_Dir arrdir2 = arrdir;
114   vecrap2.Normalize();
115   vecrap2 *= (aCircle.Radius() * 2.);
116   ptoncirc2.Translate (vecrap2);
117   arrdir2.Reverse();
118
119   DsgPrs::ComputeSymbol(aPresentation,LA,ptoncirc,ptoncirc2,arrdir,arrdir2,ArrowPrs);
120 }
121
122
123 static Standard_Boolean DsgPrs_InDomain(const Standard_Real fpar,
124                                         const Standard_Real lpar,
125                                         const Standard_Real para) 
126 {
127  if (fpar >= 0.) {
128     if(lpar > fpar)
129       return ((para >= fpar) && (para <= lpar));
130     else { // fpar > lpar
131       Standard_Real delta = 2*M_PI-fpar;
132       Standard_Real lp, par, fp;
133       lp = lpar + delta;
134       par = para + delta;
135       while(lp > 2*M_PI) lp-=2*M_PI;
136       while(par > 2*M_PI) par-=2*M_PI;
137       fp = 0.;
138       return ((par >= fp) && (par <= lp));
139     }
140       
141   }
142   if (para >= (fpar+2*M_PI)) return Standard_True;
143   if (para <= lpar) return Standard_True;
144   return Standard_False;
145 }
146
147
148 //=======================================================================
149 //function : DsgPrs_DiameterPresentation::Add
150 //purpose  : SZY 12-february-98
151 //=======================================================================
152
153 void DsgPrs_DiameterPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
154                                        const Handle(Prs3d_Drawer)& aDrawer,
155                                        const TCollection_ExtendedString& aText,
156                                        const gp_Pnt& AttachmentPoint,
157                                        const gp_Circ& aCircle,
158                                        const Standard_Real uFirst,
159                                        const Standard_Real uLast,
160                                        const DsgPrs_ArrowSide ArrowPrs,//ArrowSide
161                                        const Standard_Boolean IsDiamSymbol )
162 {
163   Standard_Real fpara = uFirst;
164   Standard_Real lpara = uLast;
165   while (lpara > 2*M_PI) {
166     fpara -= 2*M_PI;
167     lpara -= 2*M_PI;
168   }
169
170   Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
171 //  Handle(Prs3d_TextAspect) TA = aDrawer->TextAspect();
172   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
173 // AspectText3d from Graphic3d
174   Standard_Real parEndOfArrow = ElCLib::Parameter(aCircle,AttachmentPoint); //
175   gp_Pnt EndOfArrow;
176   gp_Pnt DrawPosition = AttachmentPoint;// point of attachment
177   Standard_Boolean otherside = Standard_False;
178
179   gp_Pnt Center = aCircle.Location();
180   gp_Pnt FirstPoint = ElCLib::Value(uFirst, aCircle);
181   gp_Pnt SecondPoint = ElCLib::Value(uLast, aCircle);
182
183   if ( !DsgPrs_InDomain(fpara,lpara,parEndOfArrow)) {
184     Standard_Real otherpar = parEndOfArrow + M_PI;// not in domain
185     if (otherpar > 2*M_PI) otherpar -= 2*M_PI;
186     if (DsgPrs_InDomain(fpara,lpara,otherpar)) {
187       parEndOfArrow = otherpar; // parameter on circle
188       EndOfArrow = ElCLib::Value(parEndOfArrow, aCircle);
189       otherside = Standard_True;
190     }
191     else {
192       gp_Dir dir1(gp_Vec(Center, FirstPoint));
193       gp_Dir dir2(gp_Vec(Center, SecondPoint));
194       gp_Lin L1( Center, dir1 );
195       gp_Lin L2( Center, dir2 );
196       if(L1.Distance(AttachmentPoint) < L2.Distance(AttachmentPoint))
197         {
198           EndOfArrow = FirstPoint; //***
199           DrawPosition = ElCLib::Value(ElCLib::Parameter( L1, AttachmentPoint ), L1);   
200         }
201       else
202         {
203           EndOfArrow = SecondPoint; //***
204           DrawPosition = ElCLib::Value(ElCLib::Parameter( L2, AttachmentPoint ), L2);
205         }      
206     }
207 //    EndOfArrow   = ElCLib::Value(parEndOfArrow, aCircle);
208 //    DrawPosition = AttachmentPoint;
209   } 
210   else {
211     EndOfArrow   = ElCLib::Value(parEndOfArrow, aCircle);
212     DrawPosition = AttachmentPoint;
213   }
214   Graphic3d_Array1OfVertex Vrap(1,2);
215
216   Quantity_Length X,Y,Z;
217
218   DrawPosition.Coord(X,Y,Z);
219   Vrap(1).SetCoord(X,Y,Z);
220
221   EndOfArrow.Coord(X,Y,Z);
222   Vrap(2).SetCoord(X,Y,Z);
223
224   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrap);
225
226   // text
227   TCollection_ExtendedString Text = aText;
228   if(IsDiamSymbol)
229     Text = TCollection_ExtendedString("\330 ") +  Text;//  => \330 | \370?
230   Prs3d_Text::Draw(aPresentation,LA->TextAspect(),Text,DrawPosition);
231
232 // Add presentation of arrow 
233   gp_Dir DirOfArrow(gp_Vec(DrawPosition, EndOfArrow).XYZ()); 
234   DsgPrs::ComputeSymbol(aPresentation, LA,  EndOfArrow,  EndOfArrow, DirOfArrow, DirOfArrow, ArrowPrs);
235
236 }