0024624: Lost word in license statement in source files
[occt.git] / src / AIS / AIS_LengthDimension.hxx
1 // Copyright (c) 1999-2013 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #ifndef _AIS_LengthDimension_HeaderFile
15 #define _AIS_LengthDimension_HeaderFile
16
17 #include <AIS.hxx>
18 #include <AIS_Dimension.hxx>
19 #include <AIS_Drawer.hxx>
20 #include <AIS_KindOfDimension.hxx>
21 #include <Geom_Plane.hxx>
22 #include <Geom_Transformation.hxx>
23 #include <gp_Pnt.hxx>
24 #include <gp_Dir.hxx>
25 #include <Prs3d_DimensionAspect.hxx>
26 #include <Prs3d_Presentation.hxx>
27 #include <Prs3d_Projector.hxx>
28 #include <PrsMgr_PresentationManager3d.hxx>
29 #include <SelectMgr_Selection.hxx>
30 #include <Standard.hxx>
31 #include <Standard_Macro.hxx>
32 #include <Standard_DefineHandle.hxx>
33 #include <TopoDS.hxx>
34 #include <TopoDS_Vertex.hxx>
35 #include <TCollection_ExtendedString.hxx>
36
37 class TopoDS_Face;
38 class TCollection_ExtendedString;
39 class gp_Pnt;
40 class TopoDS_Edge;
41 class TopoDS_Shape;
42 class Geom_Plane;
43 class PrsMgr_PresentationManager3d;
44 class Prs3d_Presentation;
45 class Prs3d_Projector;
46 class Geom_Transformation;
47 class SelectMgr_Selection;
48 class AIS_Drawer;
49 class Bnd_Box;
50 class gp_Dir;
51 class TopoDS_Vertex;
52 class Standard_Transient;
53 class Handle(Standard_Type);
54 class Handle(AIS_Relation);
55 class AIS_LengthDimension;
56
57 DEFINE_STANDARD_HANDLE (AIS_LengthDimension, AIS_Dimension)
58
59 //! Length dimension. Can be constructued:
60 //! - Between two generic points.
61 //! - Between two vertices.
62 //! - Between two faces.
63 //! - Between two parallel edges.
64 //! - Between face and edge.
65 //!
66 //! In case of two points (vertices) or one linear edge the user-defined plane
67 //! that includes this geometry is necessary to be set.
68 //!
69 //! In case of face-edge, edge-vertex or face-face lengthes the automatic plane
70 //! computing is allowed. For this plane the third point is found on the
71 //! edge or on the face.
72 //! 
73 //! Please note that if the inappropriate geometry is defined
74 //! or the distance between measured points is less than
75 //! Precision::Confusion(), the dimension is invalid and its
76 //! presentation can not be computed.
77 class AIS_LengthDimension : public AIS_Dimension
78 {
79 public:
80
81   //! Construct length dimension between face and edge.
82   //! Here dimension can be built without user-defined plane.
83   //! @param theFace [in] the face (first shape).
84   //! @param theEdge [in] the edge (second shape).
85   Standard_EXPORT AIS_LengthDimension (const TopoDS_Face& theFace,
86                                        const TopoDS_Edge& theEdge);
87
88 public:
89
90   //! Construct length dimension between two faces.
91   //! @param theFirstFace [in] the first face (first shape).
92   //! @param theSecondFace [in] the second face (second shape).
93   Standard_EXPORT AIS_LengthDimension (const TopoDS_Face& theFirstFace,
94                                        const TopoDS_Face& theSecondFace);
95
96   //! Construct length dimension between two points in
97   //! the specified plane.
98   //! @param theFirstPoint [in] the first point.
99   //! @param theSecondPoint [in] the second point.
100   //! @param thePlane [in] the plane to orient dimension.
101   Standard_EXPORT AIS_LengthDimension (const gp_Pnt& theFirstPoint,
102                                        const gp_Pnt& theSecondPoint,
103                                        const gp_Pln& thePlane);
104
105   //! Construct length dimension between two arbitrary shapes in
106   //! the specified plane.
107   //! @param theFirstShape [in] the first shape.
108   //! @param theSecondShape [in] the second shape.
109   //! @param thePlane [in] the plane to orient dimension.
110   Standard_EXPORT AIS_LengthDimension (const TopoDS_Shape& theFirstShape,
111                                        const TopoDS_Shape& theSecondShape,
112                                        const gp_Pln& thePlane);
113
114   //! Construct length dimension of linear edge.
115   //! @param theEdge [in] the edge to measure.
116   //! @param thePlane [in] the plane to orient dimension.
117   Standard_EXPORT AIS_LengthDimension (const TopoDS_Edge& theEdge,
118                                        const gp_Pln& thePlane);
119
120 public:
121
122   //! @return first attachement point.
123   const gp_Pnt& FirstPoint() const
124   {
125     return myFirstPoint;
126   }
127
128   //! @return second attachement point.
129   const gp_Pnt& SecondPoint() const
130   {
131     return mySecondPoint;
132   }
133
134   //! @return first attachement shape.
135   const TopoDS_Shape& FirstShape() const
136   {
137     return myFirstShape;
138   }
139
140   //! @return second attachement shape.
141   const TopoDS_Shape& SecondShape() const
142   {
143     return mySecondShape;
144   }
145
146 public:
147
148   //! Measure distance between two points.
149   //! The dimension will become invalid if the new distance between
150   //! attachement points is less than Precision::Confusion().
151   //! @param theFirstPoint [in] the first point.
152   //! @param theSecondPoint [in] the second point.
153   //! @param thePlane [in] the user-defined plane
154   Standard_EXPORT void SetMeasuredGeometry (const gp_Pnt& theFirstPoint,
155                                             const gp_Pnt& theSecondPoint,
156                                             const gp_Pln& thePlane);
157
158   //! Measure length of edge.
159   //! The dimension will become invalid if the new length of edge
160   //! is less than Precision::Confusion().
161   //! @param theEdge [in] the edge to measure.
162   //! @param thePlane [in] the user-defined plane
163   Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Edge& theEdge,
164                                             const gp_Pln& thePlane);
165
166   //! Measure distance between two faces.
167   //! The dimension will become invalid if the distance can not
168   //! be measured or it is less than Precision::Confusion().
169   //! @param theFirstFace [in] the first face (first shape).
170   //! @param theSecondFace [in] the second face (second shape).
171   Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFirstFace,
172                                             const TopoDS_Face& theSecondFace);
173
174   //! Measure distance between face and edge.
175   //! The dimension will become invalid if the distance can not
176   //! be measured or it is less than Precision::Confusion().
177   //! @param theFace [in] the face (first shape).
178   //! @param theEdge [in] the edge (second shape).
179   Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFace,
180                                             const TopoDS_Edge& theEdge);
181
182   //! Measure distance between generic pair of shapes (edges, vertices, length),
183   //! where measuring is applicable.
184   //! @param theFirstShape [in] the first shape.
185   //! @param theSecondShape [in] the second shape.
186   Standard_EXPORT void SetMeasuredShapes (const TopoDS_Shape& theFirstShape,
187                                           const TopoDS_Shape& theSecondShape);
188
189   //! @return the display units string.
190   Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const;
191
192   //! @return the model units string.
193   Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const;
194
195   Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits);
196
197   Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits);
198
199   Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos);
200
201   Standard_EXPORT virtual const gp_Pnt GetTextPosition() const;
202
203 public:
204
205   DEFINE_STANDARD_RTTI(AIS_LengthDimension)
206
207 protected:
208
209   //! Checks if the plane includes first and second points to build dimension.
210   Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const;
211
212   Standard_EXPORT virtual gp_Pln ComputePlane(const gp_Dir& theAttachDir) const;
213
214   Standard_EXPORT Standard_Real ComputeValue() const;
215
216   Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager,
217                                         const Handle(Prs3d_Presentation)& thePresentation,
218                                         const Standard_Integer theMode = 0);
219
220   Standard_EXPORT virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection,
221                                                        const Handle(SelectMgr_EntityOwner)& theEntityOwner);
222
223 protected:
224
225   //! Checks that distance between two points is valid.
226   //! @param theFirstPoint [in] the first point.
227   //! @param theSecondPoint [in] the second point.
228   Standard_EXPORT Standard_Boolean IsValidPoints (const gp_Pnt& theFirstPoint,
229                                                   const gp_Pnt& theSecondPoint) const;
230
231   Standard_EXPORT Standard_Boolean InitTwoEdgesLength (const TopoDS_Edge & theFirstEdge,
232                                                        const TopoDS_Edge& theSecondEdge,
233                                                        gp_Dir& theEdgeDir);
234
235   //! Auxiliary method for InitTwoShapesPoints()
236   //! in case of the distance between edge and vertex.
237   //! Finds the point on the edge that is the closest one to <theVertex>.
238   //! @param theEdgeDir [out] is the direction on the edge to build
239   //! automatical plane.
240   Standard_EXPORT Standard_Boolean InitEdgeVertexLength (const TopoDS_Edge& theEdge,
241                                                          const TopoDS_Vertex& theVertex,
242                                                          gp_Dir& theEdgeDir,
243                                                          Standard_Boolean isInfinite);
244
245   //! Auxiliary method for InitTwoShapesPoints()
246   //! in case of the distance between face and edge.
247   //! The first attachment point is first parameter point from <theEdge>.
248   //! Find the second attachment point which belongs to <theFace>
249   //! Iterate over the edges of the face and find the closest point according
250   //! to finded point on edge.
251   //! @param theEdgeDir [out] is the direction on the edge to build
252   //! automatical plane.
253   Standard_EXPORT Standard_Boolean InitEdgeFaceLength (const TopoDS_Edge& theEdge,
254                                                        const TopoDS_Face& theFace,
255                                                        gp_Dir& theEdgeDir);
256
257   //! Initialization of two attach points in case of two owner shapes.
258   Standard_EXPORT Standard_Boolean InitTwoShapesPoints (const TopoDS_Shape& theFirstShape,
259                                                         const TopoDS_Shape& theSecondShape,
260                                                         gp_Pln& theComputedPlane,
261                                                         Standard_Boolean& theIsPlaneComputed);
262
263   //! Initialization of two attach points in case of one owner shape.
264   Standard_EXPORT Standard_Boolean InitOneShapePoints (const TopoDS_Shape& theShape);
265
266 private:
267
268   gp_Pnt myFirstPoint;
269   gp_Pnt mySecondPoint;
270   TopoDS_Shape myFirstShape;
271   TopoDS_Shape mySecondShape;
272 };
273
274 #endif // _AIS_LengthDimension_HeaderFile