13c1fc0aeab8f747aa1d44439ab2de78dbdbb755
[occt.git] / src / AIS / AIS_AngleDimension.hxx
1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2013 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
7 // under the terms of the GNU Lesser General Public 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 #ifndef _AIS_AngleDimension_HeaderFile
16 #define _AIS_AngleDimension_HeaderFile
17
18 #include <AIS_Dimension.hxx>
19 #include <Geom_Plane.hxx>
20 #include <Geom_Line.hxx>
21 #include <Geom_Transformation.hxx>
22 #include <gp.hxx>
23 #include <gp_Ax1.hxx>
24 #include <gp_Dir.hxx>
25 #include <gp_Pnt.hxx>
26 #include <Prs3d_DimensionAspect.hxx>
27 #include <Prs3d_Projector.hxx>
28 #include <Prs3d_Presentation.hxx>
29 #include <Standard.hxx>
30 #include <Standard_Macro.hxx>
31 #include <Standard_DefineHandle.hxx>
32 #include <TopoDS.hxx>
33 #include <TopoDS_Edge.hxx>
34 #include <TopoDS_Face.hxx>
35 #include <TopoDS_Vertex.hxx>
36
37 DEFINE_STANDARD_HANDLE (AIS_AngleDimension, AIS_Dimension)
38
39 //! Angle dimension. Can be constructed:
40 //! - on two intersected edges.
41 //! - on three points or vertices.
42 //! - on conical face.
43 //! - between two intersected faces.
44 //!
45 //! In case of three points or two intersected edges the dimension plane
46 //! (on which dimension presentation is built) can be computed uniquely
47 //! as through three defined points can be built only one plane.
48 //! Therefore, if user-defined plane differs from this one, the dimension can't be built.
49 //!
50 //! In cases of two planes automatic plane by default is built on point of the
51 //! origin of parametric space of the first face (the basis surface) so, that
52 //! the working plane and two faces intersection forms minimal angle between the faces.
53 //! User can define the other point which the dimension plane should pass through
54 //! using the appropriate constructor. This point can lay on the one of the faces or not.
55 //! Also user can define his own plane but it should pass through the three points
56 //! computed on the geometry initialization step (when the constructor or SetMeasuredGeometry() method
57 //! is called). 
58 //!
59 //! In case of the conical face the center point of the angle is the apex of the conical surface.
60 //! The attachment points are points of the first and the last parameter of the basis circle of the cone.
61 //!
62 class AIS_AngleDimension : public AIS_Dimension
63 {
64 public:
65
66   //! Constructs minimum angle dimension between two linear edges (where possible).
67   //! These two edges should be intersected by each other. Otherwise the geometry is not valid.
68   //! @param theFirstEdge [in] the first edge.
69   //! @param theSecondEdge [in] the second edge.
70   Standard_EXPORT AIS_AngleDimension (const TopoDS_Edge& theFirstEdge,
71                                       const TopoDS_Edge& theSecondEdge);
72
73   //! Constructs the angle display object defined by three points.
74   //! @param theFirstPoint [in] the first point (point on first angle flyout).
75   //! @param theSecondPoint [in] the center point of angle dimension.
76   //! @param theThirdPoint [in] the second point (point on second angle flyout).
77   Standard_EXPORT AIS_AngleDimension (const gp_Pnt& theFirstPoint,
78                                       const gp_Pnt& theSecondPoint,
79                                       const gp_Pnt& theThirdPoint);
80
81   //! Constructs the angle display object defined by three vertices.
82   //! @param theFirstVertex [in] the first vertex (vertex for first angle flyout).
83   //! @param theSecondVertex [in] the center vertex of angle dimension.
84   //! @param theThirdPoint [in] the second vertex (vertex for second angle flyout).
85   Standard_EXPORT AIS_AngleDimension (const TopoDS_Vertex& theFirstVertex,
86                                       const TopoDS_Vertex& theSecondVertex,
87                                       const TopoDS_Vertex& theThirdVertex);
88
89   //! Constructs angle dimension for the cone face.
90   //! @param theCone [in] the conical face.
91   Standard_EXPORT AIS_AngleDimension (const TopoDS_Face& theCone);
92
93   //! Constructs angle dimension between two planar faces.
94   //! @param theFirstFace [in] the first face.
95   //! @param theSecondFace [in] the second face.
96   Standard_EXPORT AIS_AngleDimension (const TopoDS_Face& theFirstFace,
97                                       const TopoDS_Face& theSecondFace);
98
99   //! Constructs angle dimension between two planar faces.
100   //! @param theFirstFace [in] the first face.
101   //! @param theSecondFace [in] the second face.
102   //! @param thePoint [in] the point which the dimension plane should pass through.
103   //! This point can lay on the one of the faces or not.
104   Standard_EXPORT AIS_AngleDimension (const TopoDS_Face& theFirstFace,
105                                       const TopoDS_Face& theSecondFace,
106                                       const gp_Pnt& thePoint);
107
108 public:
109
110   //! @return first point forming the angle.
111   const gp_Pnt& FirstPoint() const
112   {
113     return myFirstPoint;
114   }
115
116   //! @return second point forming the angle.
117   const gp_Pnt& SecondPoint() const
118   {
119     return mySecondPoint;
120   }
121
122   //! @return center point forming the angle.
123   const gp_Pnt& CenterPoint() const
124   {
125     return myCenterPoint;
126   }
127
128   //! @return first argument shape.
129   const TopoDS_Shape& FirstShape() const
130   {
131     return myFirstShape;
132   }
133
134   //! @return second argument shape.
135   const TopoDS_Shape& SecondShape() const
136   {
137     return mySecondShape;
138   }
139
140   //! @return third argument shape.
141   const TopoDS_Shape& ThirdShape() const
142   {
143     return myThirdShape;
144   }
145
146 public:
147
148   //! Measures minimum angle dimension between two linear edges.
149   //! These two edges should be intersected by each other. Otherwise the geometry is not valid.
150   //! @param theFirstEdge [in] the first edge.
151   //! @param theSecondEdge [in] the second edge.
152   Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Edge& theFirstEdge,
153                                             const TopoDS_Edge& theSecondEdge);
154
155   //! Measures angle defined by three points.
156   //! @param theFirstPoint [in] the first point (point on first angle flyout).
157   //! @param theSecondPoint [in] the center point of angle dimension.
158   //! @param theThirdPoint [in] the second point (point on second angle flyout).
159   Standard_EXPORT void SetMeasuredGeometry (const gp_Pnt& theFirstPoint,
160                                             const gp_Pnt& theSecondPoint,
161                                             const gp_Pnt& theThridPoint);
162
163   //! Measures angle defined by three vertices.
164   //! @param theFirstVertex [in] the first vertex (vertex for first angle flyout).
165   //! @param theSecondVertex [in] the center vertex of angle dimension.
166   //! @param theThirdPoint [in] the second vertex (vertex for second angle flyout).
167   Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Vertex& theFirstVertex,
168                                             const TopoDS_Vertex& theSecondVertex,
169                                             const TopoDS_Vertex& theThirdVertex);
170
171   //! Measures angle of conical face.
172   //! @param theCone [in] the shape to measure.
173   Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theCone);
174
175   //! Measures angle between two planar faces.
176   //! @param theFirstFace [in] the first face.
177   //! @param theSecondFace [in] the second face..
178   Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFirstFace,
179                                             const TopoDS_Face& theSecondFace);
180
181   //! Measures angle between two planar faces.
182   //! @param theFirstFace [in] the first face.
183   //! @param theSecondFace [in] the second face.
184   //! @param thePoint [in] the point which the dimension plane should pass through.
185   //! This point can lay on the one of the faces or not.
186   Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFirstFace,
187                                             const TopoDS_Face& theSecondFace,
188                                             const gp_Pnt& thePoint);
189
190   //! @return the display units string.
191   Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const;
192   
193   //! @return the model units string.
194   Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const;
195
196   Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits);
197
198   Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits);
199
200   //! Principle of horizontal text alignment settings:
201   //! - divide circle into two halves according to attachment points
202   //! - if aTextPos is between attach points -> Center + positive flyout
203   //! - if aTextPos is not between attach points but in this half -> Left or Right + positive flyout
204   //! - if aTextPos is between reflections of attach points -> Center + negative flyout
205   //! - if aTextPos is not between reflections of attach points -> Left or Right + negative flyout
206   Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos);
207
208   Standard_EXPORT virtual const gp_Pnt GetTextPosition () const;
209
210 public:
211
212   DEFINE_STANDARD_RTTI (AIS_AngleDimension)
213
214 protected:
215
216   //! Initialization of fields that is common to all constructors. 
217   Standard_EXPORT void Init();
218
219   //! @param theFirstAttach [in] the first attachment point.
220   //! @param theSecondAttach [in] the second attachment point.
221   //! @param theCenter [in] the center point (center point of the angle).  
222   //! @return the center of the dimension arc (the main dimension line in case of angle). 
223   Standard_EXPORT gp_Pnt GetCenterOnArc (const gp_Pnt& theFirstAttach,
224                                          const gp_Pnt& theSecondAttach,
225                                          const gp_Pnt& theCenter) const;
226
227   //! Draws main dimension line (arc).
228   //! @param thePresentation [in] the dimension presentation.
229   //! @param theFirstAttach [in] the first attachment point.
230   //! @param theSecondAttach [in] the second attachment point.
231   //! @param theCenter [in] the center point (center point of the angle).
232   //! @param theRadius [in] the radius of the dimension arc.
233   //! @param theMode [in] the display mode.
234   Standard_EXPORT void DrawArc (const Handle(Prs3d_Presentation)& thePresentation,
235                                 const gp_Pnt& theFirstAttach,
236                                 const gp_Pnt& theSecondAttach,
237                                 const gp_Pnt& theCenter,
238                                 const Standard_Real theRadius,
239                                 const Standard_Integer theMode);
240
241   //! Draws main dimension line (arc) with text.
242   //! @param thePresentation [in] the dimension presentation.
243   //! @param theFirstAttach [in] the first attachment point.
244   //! @param theSecondAttach [in] the second attachment point.
245   //! @param theCenter [in] the center point (center point of the angle).
246   //! @param theText [in] the text label string.
247   //! @param theTextWidth [in] the text label width. 
248   //! @param theMode [in] the display mode.
249   //! @param theLabelPosition [in] the text label vertical and horizontal positioning option
250   //! respectively to the main dimension line. 
251   Standard_EXPORT void DrawArcWithText (const Handle(Prs3d_Presentation)& thePresentation,
252                                         const gp_Pnt& theFirstAttach,
253                                         const gp_Pnt& theSecondAttach,
254                                         const gp_Pnt& theCenter,
255                                         const TCollection_ExtendedString& theText,
256                                         const Standard_Real theTextWidth,
257                                         const Standard_Integer theMode,
258                                         const Standard_Integer theLabelPosition);
259
260   //! Fits text alignment relatively to the dimension line;
261   //! it computes the value of label position and arrow orientation
262   //! according set in the aspect and dimension properties.
263   //! @param theHorizontalTextPos [in] the horizontal alignment for text position.
264   //! @param theLabelPosition [out] the label position, contains bits that defines
265   //! vertical and horizontal alignment. (for internal usage in count text position).
266   //! @param theIsArrowExternal [out] is the arrows external,
267   //! if arrow orientation in the dimension aspect is Prs3d_DAO_Fit, it fits arrow
268   //! orientation automatically.
269   Standard_EXPORT void FitTextAlignment (const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos,
270                                          Standard_Integer& theLabelPosition,
271                                          Standard_Boolean& theIsArrowsExternal) const;
272
273   //! Adjusts aspect parameters according the text position:
274   //! extension size, vertical text alignment and flyout.
275   //! It changes flyout of the dimension.
276   //! @param theTextPos [in] the user defined 3d point of text position.
277   //! @param theExtensionSize [out] the adjusted extension size.
278   //! @param theAlignment [out] the horizontal label alignment.
279   Standard_EXPORT void AdjustParameters (const gp_Pnt& theTextPos,
280                                          Standard_Real& theExtensionSize,
281                                          Prs3d_DimensionTextHorizontalPosition& theAlignment);
282
283 protected:
284
285   Standard_EXPORT virtual void ComputePlane();
286
287   //! Checks if the plane includes three angle points to build dimension.
288   Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const;
289
290   Standard_EXPORT virtual Standard_Real ComputeValue() const;
291
292   Standard_EXPORT  virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePM,
293                                          const Handle(Prs3d_Presentation)& thePresentation,
294                                          const Standard_Integer theMode = 0);
295
296   Standard_EXPORT virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection,
297                                                        const Handle(SelectMgr_EntityOwner)& theOwner);
298
299 protected:
300
301   //! Init angular dimension to measure angle between two linear edges.
302   //! @return TRUE if the angular dimension can be constructured
303   //!         for the passed edges.
304   Standard_EXPORT Standard_Boolean InitTwoEdgesAngle (gp_Pln& theComputedPlane);
305
306   //! Init angular dimension to measure angle between two planar faces.
307   //! there is no user-defined poisitoning. So attach points are set
308   //! according to faces geometry (in origin of the first face basis surface).
309   //! @return TRUE if the angular dimension can be constructed
310   //!         for the passed faces.
311   Standard_EXPORT Standard_Boolean InitTwoFacesAngle();
312
313   //! Init angular dimension to measure angle between two planar faces.
314   //! @param thePointOnFirstFace [in] the point which the dimension plane should pass through.
315   //! This point can lay on the one of the faces or not.
316   //! It will be projected on the first face and this point will be set
317   //! as the first point attach point.
318   //! It defines some kind of dimension positioning over the faces.
319   //! @return TRUE if the angular dimension can be constructed
320   //!         for the passed faces.
321   Standard_EXPORT Standard_Boolean InitTwoFacesAngle (const gp_Pnt thePointOnFirstFace);
322
323   //! Init angular dimension to measure cone face.
324   //! @return TRUE if the angular dimension can be constructed
325   //!              for the passed cone.
326   Standard_EXPORT Standard_Boolean InitConeAngle();
327
328   //! Check that the points forming angle are valid.
329   //! @return TRUE if the points met the following requirements:
330   //!         The (P1, Center), (P2, Center) can be built.
331   //!         The angle between the vectors > Precision::Angular().
332   Standard_EXPORT Standard_Boolean IsValidPoints (const gp_Pnt& theFirstPoint,
333                                                   const gp_Pnt& theCenterPoint,
334                                                   const gp_Pnt& theSecondPoint) const;
335
336 private:
337
338   gp_Pnt myFirstPoint;
339   gp_Pnt mySecondPoint;
340   gp_Pnt myCenterPoint;
341   TopoDS_Shape myFirstShape;
342   TopoDS_Shape mySecondShape;
343   TopoDS_Shape myThirdShape;
344 };
345
346 #endif // _AIS_AngleDimension_HeaderFile