0029938: Visualization - SelectMgr_ViewerSelector::PickedPoint() should return point...
[occt.git] / src / SelectBasics / SelectBasics_PickResult.hxx
1 // Created on: 2014-11-14
2 // Created by: Varvara POSKONINA
3 // Copyright (c) 2005-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #ifndef _SelectBasics_PickResult_HeaderFile
17 #define _SelectBasics_PickResult_HeaderFile
18
19 #include <Standard.hxx>
20 #include <NCollection_Vec4.hxx>
21
22 //! This structure provides unified access to the results of Matches() method in all sensitive entities,
23 //! so that it defines a Depth (distance to the entity along picking ray) and a closest Point on entity.
24 struct SelectBasics_PickResult
25 {
26 public:
27   //! Return closest result between two Pick Results according to Depth value.
28   static const SelectBasics_PickResult& Min (const SelectBasics_PickResult& thePickResult1,
29                                              const SelectBasics_PickResult& thePickResult2)
30   {
31     return thePickResult1.Depth() <= thePickResult2.Depth() ? thePickResult1 : thePickResult2;
32   }
33
34 public:
35   //! Empty constructor defining an invalid result.
36   SelectBasics_PickResult()
37   : myObjPickedPnt (RealLast(), 0.0, 0.0),
38     myDepth (RealLast()),
39     myDistToCenter (RealLast()) {}
40
41   //! Constructor with initialization.
42   SelectBasics_PickResult (Standard_Real theDepth,
43                            Standard_Real theDistToCenter,
44                            const gp_Pnt& theObjPickedPnt)
45   : myObjPickedPnt (theObjPickedPnt),
46     myDepth (theDepth),
47     myDistToCenter (theDistToCenter) {}
48
49 public:
50
51   //! Return TRUE if result was been defined.
52   Standard_Boolean IsValid() const { return myDepth != RealLast(); }
53
54   //! Reset depth value.
55   void Invalidate()
56   {
57     myDepth = RealLast();
58     myObjPickedPnt = gp_Pnt (RealLast(), 0.0, 0.0);
59   }
60
61   //! Return depth along picking ray.
62   Standard_Real Depth() const { return myDepth; }
63
64   //! Set depth along picking ray.
65   void SetDepth (Standard_Real theDepth) { myDepth = theDepth; }
66
67   //! Return TRUE if Picked Point lying on detected entity was set.
68   Standard_Boolean HasPickedPoint() const { return myObjPickedPnt.X() != RealLast(); }
69
70   //! Return picked point lying on detected entity.
71   //! WARNING! Point is defined in local coordinate system and should be translated into World System before usage!
72   const gp_Pnt& PickedPoint() const { return myObjPickedPnt; }
73
74   //! Set picked point.
75   void SetPickedPoint (const gp_Pnt& theObjPickedPnt) { myObjPickedPnt = theObjPickedPnt; }
76
77   //! Return distance to geometry center (auxiliary value for comparing results).
78   Standard_Real DistToGeomCenter() const { return myDistToCenter; }
79
80   //! Set distance to geometry center.
81   void SetDistToGeomCenter (Standard_Real theDistToCenter) { myDistToCenter = theDistToCenter; }
82
83 private:
84   gp_Pnt        myObjPickedPnt; //!< User-picked selection point onto object
85   Standard_Real myDepth;        //!< Depth to detected point
86   Standard_Real myDistToCenter; //!< Distance from 3d projection user-picked selection point to entity's geometry center
87 };
88
89 #endif // _SelectBasics_PickResult_HeaderFile