0024947: Redesign OCCT legacy type system -- automatic
[occt.git] / src / AIS / AIS_AngleDimension.hxx
CommitLineData
a6eb515f 1// Copyright (c) 1995-1999 Matra Datavision
2// Copyright (c) 1999-2013 OPEN CASCADE SAS
3//
973c2be1 4// This file is part of Open CASCADE Technology software library.
a6eb515f 5//
d5f74e42 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
973c2be1 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.
a6eb515f 11//
973c2be1 12// Alternatively, this file may be used under the terms of Open CASCADE
13// commercial license or contractual agreement.
a6eb515f 14
a6eb515f 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>
ec357c5c 31#include <Standard_Type.hxx>
a6eb515f 32#include <TopoDS.hxx>
33#include <TopoDS_Edge.hxx>
34#include <TopoDS_Face.hxx>
60bf98ae 35#include <TopoDS_Vertex.hxx>
a6eb515f 36
37DEFINE_STANDARD_HANDLE (AIS_AngleDimension, AIS_Dimension)
38
60bf98ae 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//!
af203d54 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
60bf98ae 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//!
a6eb515f 62class AIS_AngleDimension : public AIS_Dimension
63{
64public:
d7bffd44 65
60bf98ae 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);
a6eb515f 72
73 //! Constructs the angle display object defined by three points.
60bf98ae 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
108public:
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
146public:
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);
a6eb515f 154
60bf98ae 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);
a6eb515f 162
60bf98ae 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);
a6eb515f 170
60bf98ae 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.
af203d54 191 Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const;
60bf98ae 192
193 //! @return the model units string.
af203d54 194 Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const;
60bf98ae 195
196 Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits);
197
198 Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits);
a6eb515f 199
af203d54 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
d7bffd44 210public:
211
ec357c5c 212 DEFINE_STANDARD_RTTI (AIS_AngleDimension, AIS_Dimension)
a6eb515f 213
214protected:
215
60bf98ae 216 //! Initialization of fields that is common to all constructors.
217 Standard_EXPORT void Init();
a6eb515f 218
60bf98ae 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,
af203d54 225 const gp_Pnt& theCenter) const;
a6eb515f 226
60bf98ae 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);
a6eb515f 240
60bf98ae 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);
a6eb515f 259
af203d54 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.
af203d54 275 //! @param theTextPos [in] the user defined 3d point of text position.
276 //! @param theExtensionSize [out] the adjusted extension size.
277 //! @param theAlignment [out] the horizontal label alignment.
91b16a64 278 //! @param theFlyout [out] the adjusted value of flyout.
af203d54 279 Standard_EXPORT void AdjustParameters (const gp_Pnt& theTextPos,
280 Standard_Real& theExtensionSize,
91b16a64 281 Prs3d_DimensionTextHorizontalPosition& theAlignment,
282 Standard_Real& theFlyout) const;
af203d54 283
60bf98ae 284protected:
285
286 Standard_EXPORT virtual void ComputePlane();
287
288 //! Checks if the plane includes three angle points to build dimension.
289 Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const;
290
291 Standard_EXPORT virtual Standard_Real ComputeValue() const;
a6eb515f 292
293 Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePM,
294 const Handle(Prs3d_Presentation)& thePresentation,
295 const Standard_Integer theMode = 0);
296
60bf98ae 297 Standard_EXPORT virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection,
298 const Handle(SelectMgr_EntityOwner)& theOwner);
a6eb515f 299
60bf98ae 300protected:
a6eb515f 301
60bf98ae 302 //! Init angular dimension to measure angle between two linear edges.
303 //! @return TRUE if the angular dimension can be constructured
304 //! for the passed edges.
305 Standard_EXPORT Standard_Boolean InitTwoEdgesAngle (gp_Pln& theComputedPlane);
a6eb515f 306
60bf98ae 307 //! Init angular dimension to measure angle between two planar faces.
308 //! there is no user-defined poisitoning. So attach points are set
309 //! according to faces geometry (in origin of the first face basis surface).
310 //! @return TRUE if the angular dimension can be constructed
311 //! for the passed faces.
312 Standard_EXPORT Standard_Boolean InitTwoFacesAngle();
a6eb515f 313
60bf98ae 314 //! Init angular dimension to measure angle between two planar faces.
315 //! @param thePointOnFirstFace [in] the point which the dimension plane should pass through.
316 //! This point can lay on the one of the faces or not.
317 //! It will be projected on the first face and this point will be set
318 //! as the first point attach point.
319 //! It defines some kind of dimension positioning over the faces.
320 //! @return TRUE if the angular dimension can be constructed
321 //! for the passed faces.
322 Standard_EXPORT Standard_Boolean InitTwoFacesAngle (const gp_Pnt thePointOnFirstFace);
a6eb515f 323
60bf98ae 324 //! Init angular dimension to measure cone face.
325 //! @return TRUE if the angular dimension can be constructed
326 //! for the passed cone.
327 Standard_EXPORT Standard_Boolean InitConeAngle();
328
329 //! Check that the points forming angle are valid.
330 //! @return TRUE if the points met the following requirements:
331 //! The (P1, Center), (P2, Center) can be built.
332 //! The angle between the vectors > Precision::Angular().
333 Standard_EXPORT Standard_Boolean IsValidPoints (const gp_Pnt& theFirstPoint,
334 const gp_Pnt& theCenterPoint,
335 const gp_Pnt& theSecondPoint) const;
a6eb515f 336
60bf98ae 337private:
a6eb515f 338
60bf98ae 339 gp_Pnt myFirstPoint;
340 gp_Pnt mySecondPoint;
341 gp_Pnt myCenterPoint;
342 TopoDS_Shape myFirstShape;
343 TopoDS_Shape mySecondShape;
344 TopoDS_Shape myThirdShape;
a6eb515f 345};
346
60bf98ae 347#endif // _AIS_AngleDimension_HeaderFile