0025341: Visualization - disallow displaying object as part of connected one and...
[occt.git] / src / AIS / AIS_TextLabel.cxx
1 // Created on: 2014-11-10
2 // Copyright (c) 2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
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
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.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #include <AIS_TextLabel.hxx>
16
17 #include <AIS_InteractiveContext.hxx>
18 #include <Font_FTFont.hxx>
19 #include <Font_FontMgr.hxx>
20 #include <Font_Rect.hxx>
21 #include <Graphic3d_AspectText3d.hxx>
22 #include <Graphic3d_RenderingParams.hxx>
23
24 #include <Prs3d_Text.hxx>
25 #include <Prs3d_TextAspect.hxx>
26
27 #include <Select3D_SensitivePoint.hxx>
28 #include <SelectMgr_Selection.hxx>
29 #include <SelectMgr_EntityOwner.hxx>
30
31 #include <V3d_Viewer.hxx>
32
33 IMPLEMENT_STANDARD_RTTIEXT(AIS_TextLabel,AIS_InteractiveObject)
34
35 //=======================================================================
36 //function : AIS_TextLabel
37 //purpose  :
38 //=======================================================================
39 AIS_TextLabel::AIS_TextLabel()
40 : myText             ("?"),
41   myFont             ("Courier"),
42   myFontAspect       (Font_FA_Regular),
43   myHasOrientation3D (Standard_False),
44   myHasFlipping      (Standard_False)
45 {
46   myDrawer->SetTextAspect (new Prs3d_TextAspect());
47   myDrawer->SetDisplayMode (0);
48 }
49
50 //=======================================================================
51 //function : SetColor
52 //purpose  :
53 //=======================================================================
54 void AIS_TextLabel::SetColor (const Quantity_Color& theColor)
55 {
56   hasOwnColor = Standard_True;
57   myDrawer->SetColor (theColor);
58   myDrawer->TextAspect()->SetColor (theColor);
59   SynchronizeAspects();
60 }
61
62 //=======================================================================
63 //function : SetTransparency
64 //purpose  :
65 //=======================================================================
66 void AIS_TextLabel::SetTransparency (const Standard_Real theValue)
67 {
68   Quantity_ColorRGBA aTextColor (myDrawer->TextAspect()->Aspect()->Color());
69   aTextColor.SetAlpha (Standard_ShortReal(1.0 - theValue));
70
71   Quantity_ColorRGBA aSubColor (myDrawer->TextAspect()->Aspect()->ColorSubTitle());
72   aSubColor.SetAlpha (aTextColor.Alpha());
73
74   myDrawer->TextAspect()->Aspect()->SetColor (aTextColor);
75   myDrawer->TextAspect()->Aspect()->SetColorSubTitle (aSubColor);
76   myDrawer->SetTransparency (Standard_ShortReal(theValue));
77   SynchronizeAspects();
78 }
79
80 //=======================================================================
81 //function : SetText
82 //purpose  :
83 //=======================================================================
84 void AIS_TextLabel::SetText (const TCollection_ExtendedString& theText)
85 {
86   myText = theText;
87 }
88
89 //=======================================================================
90 //function : SetPosition
91 //purpose  :
92 //=======================================================================
93 void AIS_TextLabel::SetPosition (const gp_Pnt& thePosition)
94 {
95   myOrientation3D.SetLocation (thePosition);
96 }
97
98 //=======================================================================
99 //function : SetHJustification
100 //purpose  :
101 //=======================================================================
102 void AIS_TextLabel::SetHJustification (const Graphic3d_HorizontalTextAlignment theHJust)
103 {
104   myDrawer->TextAspect()->SetHorizontalJustification (theHJust);
105 }
106
107 //=======================================================================
108 //function : SetVJustification
109 //purpose  : Setup vertical justification.
110 //=======================================================================
111 void AIS_TextLabel::SetVJustification (const Graphic3d_VerticalTextAlignment theVJust)
112 {
113   myDrawer->TextAspect()->SetVerticalJustification (theVJust);
114 }
115
116 //=======================================================================
117 //function : SetAngle
118 //purpose  :
119 //=======================================================================
120 void AIS_TextLabel::SetAngle (const Standard_Real theAngle)
121 {
122   myDrawer->TextAspect()->Aspect()->SetTextAngle (theAngle * 180.0 / M_PI);
123 }
124
125 //=======================================================================
126 //function : SetZoom
127 //purpose  :
128 //=======================================================================
129 void AIS_TextLabel::SetZoomable (const Standard_Boolean theIsZoomable)
130 {
131   myDrawer->TextAspect()->Aspect()->SetTextZoomable (theIsZoomable == Standard_True);
132 }
133
134 //=======================================================================
135 //function : SetHeight
136 //purpose  :
137 //=======================================================================
138 void AIS_TextLabel::SetHeight (const Standard_Real theHeight)
139 {
140   myDrawer->TextAspect()->SetHeight (theHeight);
141 }
142
143 //=======================================================================
144 //function : SetAngle
145 //purpose  :
146 //=======================================================================
147 void AIS_TextLabel::SetFontAspect (const Font_FontAspect theFontAspect)
148 {
149   myDrawer->TextAspect()->Aspect()->SetTextFontAspect (theFontAspect);
150 }
151
152 //=======================================================================
153 //function : SetFont
154 //purpose  :
155 //=======================================================================
156 void AIS_TextLabel::SetFont (Standard_CString theFont)
157 {
158   myFont = theFont;
159   myDrawer->TextAspect()->SetFont (myFont.ToCString());
160 }
161
162 //=======================================================================
163 //function : SetOrientation3D
164 //purpose  :
165 //=======================================================================
166 void AIS_TextLabel::SetOrientation3D (const gp_Ax2& theOrientation)
167 {
168   myHasOrientation3D = Standard_True;
169   myOrientation3D    = theOrientation;
170 }
171
172 //=======================================================================
173 //function : UnsetOrientation3D
174 //purpose  :
175 //=======================================================================
176 void AIS_TextLabel::UnsetOrientation3D ()
177 {
178   myHasOrientation3D = Standard_False;
179 }
180
181 //=======================================================================
182 //function : Position
183 //purpose  :
184 //=======================================================================
185 const gp_Pnt& AIS_TextLabel::Position() const
186 {
187   return myOrientation3D.Location();
188 }
189
190 //=======================================================================
191 //function : Orientation3D
192 //purpose  :
193 //=======================================================================
194 const gp_Ax2& AIS_TextLabel::Orientation3D() const
195 {
196   return myOrientation3D;
197 }
198
199 //=======================================================================
200 //function : HasOrientation3D
201 //purpose  :
202 //=======================================================================
203 Standard_Boolean AIS_TextLabel::HasOrientation3D() const
204 {
205   return myHasOrientation3D;
206 }
207
208 //=======================================================================
209 //function : SetFlipping
210 //purpose  :
211 //=======================================================================
212 void AIS_TextLabel::SetFlipping (const Standard_Boolean theIsFlipping)
213 {
214   myHasFlipping = theIsFlipping;
215 }
216
217 //=======================================================================
218 //function : HasFlipping
219 //purpose  :
220 //=======================================================================
221 Standard_Boolean AIS_TextLabel::HasFlipping() const
222 {
223   return myHasFlipping;
224 }
225
226 //=======================================================================
227 //function : SetDisplayType
228 //purpose  :
229 //=======================================================================
230 void AIS_TextLabel::SetDisplayType (const Aspect_TypeOfDisplayText theDisplayType)
231 {
232   myDrawer->TextAspect()->Aspect()->SetDisplayType(theDisplayType);
233 }
234
235 //=======================================================================
236 //function : SetColorSubTitle
237 //purpose  :
238 //=======================================================================
239 void AIS_TextLabel::SetColorSubTitle (const Quantity_Color& theColor)
240 {
241   myDrawer->TextAspect()->Aspect()->SetColorSubTitle(theColor);
242 }
243
244 //=======================================================================
245 //function : Compute
246 //purpose  :
247 //=======================================================================
248 void AIS_TextLabel::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePrsMgr*/,
249                              const Handle(Prs3d_Presentation)&             thePrs,
250                              const Standard_Integer                        theMode)
251 {
252   switch (theMode)
253   {
254     case 0:
255     {
256       Handle(Prs3d_TextAspect) anAsp = myDrawer->TextAspect();
257       gp_Pnt aPosition = Position();
258
259       if (myHasOrientation3D)
260       {
261         Standard_Boolean isInit = Standard_False;
262         if (myHasFlipping)
263         {
264           // Get width and height of text
265           Font_FTFontParams aFontParams;
266           aFontParams.PointSize  = (unsigned int )anAsp->Height();
267           aFontParams.Resolution = GetContext()->CurrentViewer()->DefaultRenderingParams().Resolution;
268           if (Handle(Font_FTFont) aFont = Font_FTFont::FindAndCreate (anAsp->Aspect()->Font(), anAsp->Aspect()->GetTextFontAspect(), aFontParams))
269           {
270             isInit = Standard_True;
271             const NCollection_String aText (myText.ToExtString());
272             Font_Rect aBndBox = aFont->BoundingBox (aText, anAsp->HorizontalJustification(), anAsp->VerticalJustification());
273             Standard_Real aWidth = Abs (aBndBox.Width());
274             Standard_Real aHeight = Abs (aBndBox.Height());
275             gp_Pnt aCenterOfLabel = aPosition;
276
277             if (anAsp->VerticalJustification() == Graphic3d_VTA_BOTTOM)
278             {
279               aCenterOfLabel.ChangeCoord() += myOrientation3D.YDirection().XYZ() * aHeight * 0.5;
280             }
281             else if (anAsp->VerticalJustification() == Graphic3d_VTA_TOP)
282             {
283               aCenterOfLabel.ChangeCoord() -= myOrientation3D.YDirection().XYZ() * aHeight * 0.5;
284             }
285             if (anAsp->HorizontalJustification() == Graphic3d_HTA_LEFT)
286             {
287               aCenterOfLabel.ChangeCoord() += myOrientation3D.XDirection().XYZ() * aWidth * 0.5;
288             }
289             else if (anAsp->HorizontalJustification() == Graphic3d_HTA_RIGHT)
290             {
291               aCenterOfLabel.ChangeCoord() -= myOrientation3D.XDirection().XYZ() * aWidth * 0.5;
292             }
293
294             if (!anAsp->Aspect()->GetTextZoomable()
295              && (TransformPersistence().IsNull()
296               || TransformPersistence()->Mode() == Graphic3d_TMF_ZoomPers))
297             {
298               anAsp->Aspect()->SetTextZoomable (Standard_True);
299               SetTransformPersistence (new Graphic3d_TransformPers (Graphic3d_TMF_ZoomPers, aPosition));
300               aPosition = gp::Origin();
301             }
302
303             gp_Ax2 aFlippingAxes (aCenterOfLabel, myOrientation3D.Direction(), myOrientation3D.XDirection());
304             Prs3d_Root::CurrentGroup (thePrs)->SetFlippingOptions (Standard_True, aFlippingAxes);
305           }
306         }
307
308         gp_Ax2 anOrientation = myOrientation3D;
309         anOrientation.SetLocation (aPosition);
310         Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (thePrs), anAsp, myText, myOrientation3D, !myHasFlipping);
311         if (myHasFlipping && isInit)
312         {
313           Prs3d_Root::CurrentGroup (thePrs)->SetFlippingOptions (Standard_False, gp_Ax2());
314         }
315       }
316       else
317       {
318         Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (thePrs), anAsp, myText, Position());
319       }
320
321       break;
322     }
323   }
324 }
325
326 //=======================================================================
327 //function : ComputeSelection
328 //purpose  :
329 //=======================================================================
330 void AIS_TextLabel::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
331                                       const Standard_Integer             theMode)
332 {
333   switch (theMode)
334   {
335     case 0:
336     {
337       Handle(SelectMgr_EntityOwner)   anEntityOwner   = new SelectMgr_EntityOwner (this, 10);
338       Handle(Select3D_SensitivePoint) aSensitivePoint = new Select3D_SensitivePoint (anEntityOwner, Position());
339       theSelection->Add (aSensitivePoint);
340       break;
341     }
342   }
343 }