| 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 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 | #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 |