0024623: Visualization - improve selection mechanism
[occt.git] / src / SelectMgr / SelectMgr_Selection.hxx
1 // Created on: 1995-02-16
2 // Created by: Mister rmi
3 // Copyright (c) 1995-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #ifndef _SelectMgr_Selection_HeaderFile
18 #define _SelectMgr_Selection_HeaderFile
19
20 #include <NCollection_Handle.hxx>
21 #include <NCollection_Vector.hxx>
22
23 #include <Standard.hxx>
24 #include <Standard_Type.hxx>
25 #include <Standard_DefineHandle.hxx>
26
27 #include <SelectMgr_TypeOfUpdate.hxx>
28 #include <MMgt_TShared.hxx>
29 #include <Handle_SelectBasics_SensitiveEntity.hxx>
30 #include <SelectMgr_SensitiveEntity.hxx>
31 #include <SelectMgr_StateOfSelection.hxx>
32 #include <SelectMgr_TypeOfBVHUpdate.hxx>
33
34 class Standard_NullObject;
35 class SelectBasics_SensitiveEntity;
36
37 typedef NCollection_Handle<SelectMgr_SensitiveEntity> SelectMgr_HSensitiveEntity;
38
39 //!  Represents the state of a given selection mode for a
40 //! Selectable Object. Contains all the sensitive entities available for this mode.
41 //! An interactive object can have an indefinite number of
42 //! modes of selection, each representing a
43 //! "decomposition" into sensitive primitives; each
44 //! primitive has an Owner (SelectMgr_EntityOwner)
45 //! which allows us to identify the exact entity which has
46 //! been detected. Each Selection mode is identified by
47 //! an index. The set of sensitive primitives which
48 //! correspond to a given mode is stocked in a
49 //! SelectMgr_Selection object. By Convention, the
50 //! default selection mode which allows us to grasp the
51 //! Interactive object in its entirety will be mode 0.
52 //! AIS_Trihedron : 4 selection modes
53 //! -   mode 0 : selection of a trihedron
54 //! -   mode 1 : selection of the origin of the trihedron
55 //! -   mode 2 : selection of the axes
56 //! -   mode 3 : selection of the planes XOY, YOZ, XOZ
57 //! when you activate one of modes 1 2 3 4 , you pick AIS objects of type:
58 //! -   AIS_Point
59 //! -   AIS_Axis (and information on the type of axis)
60 //! -   AIS_Plane (and information on the type of plane).
61 //!   AIS_PlaneTrihedron offers 3 selection modes:
62 //! -   mode 0 : selection of the whole trihedron
63 //! -   mode 1 : selection of the origin of the trihedron
64 //! -   mode 2 : selection of the axes - same remarks as for the Trihedron.
65 //! AIS_Shape : 7 maximum selection modes, depending
66 //! on the complexity of the shape :
67 //! -   mode 0 : selection of the AIS_Shape
68 //! -   mode 1 : selection of the vertices
69 //! -   mode 2 : selection of the edges
70 //! -   mode 3 : selection of the wires
71 //! -   mode 4 : selection of the faces
72 //! -   mode 5 : selection of the shells
73 //! -   mode 6 :   selection of the constituent solids.
74 class SelectMgr_Selection : public MMgt_TShared
75 {
76
77 public:
78
79   //! Constructs a selection object defined by the selection mode IdMode.
80   //! The default setting 0 is the selection mode for a shape in its entirety.
81   Standard_EXPORT SelectMgr_Selection (const Standard_Integer theModeIdx = 0);
82
83   ~SelectMgr_Selection();
84
85   Standard_EXPORT void Destroy();
86
87   //! Adds the sensitive primitive aprimitive to the list of
88   //! stored entities in this object.
89   //! Raises NullObject if the primitive is a null handle.
90   Standard_EXPORT void Add (const Handle(SelectBasics_SensitiveEntity)& theSensitive);
91
92   //! empties the selection from all the stored entities
93   Standard_EXPORT void Clear();
94
95   //! returns true if no sensitive entity is stored.
96   Standard_EXPORT Standard_Boolean IsEmpty() const;
97
98   //! returns the selection mode represented by this selection
99   Standard_Integer Mode() const;
100
101   //! Begins an iteration scanning for sensitive primitives.
102   void Init();
103
104   //! Continues the iteration scanning for sensitive
105   //! primitives with the mode defined in this framework.
106   Standard_Boolean More() const;
107
108   //! Returns the next sensitive primitive found in the
109   //! iteration. This is a scan for entities with the mode
110   //! defined in this framework.
111   void Next();
112
113   //! Returns any sensitive primitive in this framework.
114   const SelectMgr_HSensitiveEntity& Sensitive() const;
115
116   //! Returns the flag UpdateFlag.
117   //! This flage gives the update status of this framework
118   //! in a ViewerSelector object:
119   //! -   full
120   //! -   partial, or
121   //! -   none.
122   SelectMgr_TypeOfUpdate UpdateStatus() const;
123
124   void UpdateStatus (const SelectMgr_TypeOfUpdate theStatus);
125
126   void UpdateBVHStatus (const SelectMgr_TypeOfBVHUpdate theStatus);
127
128   SelectMgr_TypeOfBVHUpdate BVHUpdateStatus() const;
129
130   //! Returns status of selection
131   Standard_EXPORT const SelectMgr_StateOfSelection GetSelectionState() const;
132
133   //! Sets status of selection
134   Standard_EXPORT void SetSelectionState (const SelectMgr_StateOfSelection theState) const;
135
136   //! Returns sensitivity of the selection
137   Standard_EXPORT const Standard_Real Sensitivity() const;
138
139   DEFINE_STANDARD_RTTI (SelectMgr_Selection)
140
141 protected:
142
143   //! Returns sensitive entity stored by index theIdx in entites vector
144   SelectMgr_HSensitiveEntity& GetEntityById (const Standard_Integer theIdx);
145
146 private:
147
148   NCollection_Vector<SelectMgr_HSensitiveEntity>           myEntities;
149   NCollection_Vector<SelectMgr_HSensitiveEntity>::Iterator myEntityIter;
150   Standard_Integer                                         myMode;
151   SelectMgr_TypeOfUpdate                                   myUpdateStatus;
152   mutable SelectMgr_StateOfSelection                       mySelectionState;
153   mutable SelectMgr_TypeOfBVHUpdate                        myBVHUpdateStatus;
154   Standard_Real                                            mySensFactor;
155 };
156
157 DEFINE_STANDARD_HANDLE(SelectMgr_Selection, MMgt_TShared)
158
159 #include <SelectMgr_Selection.lxx>
160
161 #endif