856ee5b17074e9c0937e8adda39021c180b83781
[occt.git] / src / SelectMgr / SelectMgr_SelectableObject.cxx
1 // Created on: 1995-02-20
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 #include <Standard_NotImplemented.hxx>
18
19 #include <SelectMgr_SelectableObject.ixx>
20 #include <Standard_NoSuchObject.hxx>
21 #include <SelectMgr_Selection.hxx>
22 #include <Select3D_SensitiveEntity.hxx>
23 #include <SelectBasics_EntityOwner.hxx>
24 #include <SelectMgr_EntityOwner.hxx>
25 #include <PrsMgr_PresentationManager3d.hxx>
26
27 #include <gp_Pnt.hxx>
28
29 static Standard_Integer Search (const SelectMgr_SequenceOfSelection& seq,
30                                 const Handle (SelectMgr_Selection)& theSel)
31 {
32   Standard_Integer ifound=0;
33   for (Standard_Integer i=1;i<=seq.Length()&& ifound==0;i++)
34     {if(theSel == seq.Value(i)) ifound=i;}
35   return ifound;
36
37
38
39
40 //==================================================
41 // Function: 
42 // Purpose :
43 //==================================================
44
45 SelectMgr_SelectableObject::SelectMgr_SelectableObject( const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d):PrsMgr_PresentableObject(aTypeOfPresentation3d)
46 {
47   myAutoHilight = Standard_True;
48 }
49
50
51 //==================================================
52 // Function: 
53 // Purpose :
54 //==================================================
55
56 Standard_Boolean SelectMgr_SelectableObject
57 ::HasSelection(const Standard_Integer aMode) const
58 {
59   Standard_Boolean Found=Standard_False;
60   for (Standard_Integer I=1;I<= myselections.Length() && !Found;I++)
61     { if(((myselections.Value(I))->Mode())==aMode) 
62         return Standard_True;
63     }
64   return Standard_False;
65 }
66
67 //==================================================
68 // Function: UpdateSelection
69 // Purpose :
70 //==================================================
71 void SelectMgr_SelectableObject::UpdateSelection()
72 {
73   for (Standard_Integer I=1;I<=myselections.Length();I++)
74     {
75       UpdateSelection(myselections.ChangeValue(I)->Mode());
76     }
77 }
78
79 Standard_Integer  SelectMgr_SelectableObject::NbPossibleSelection() const
80 {return 0;}
81
82 //==================================================
83 // Function: UpdateSelection
84 // Purpose :
85 //==================================================
86 void SelectMgr_SelectableObject::UpdateSelection(const Standard_Integer aMode)
87 {
88   for (Standard_Integer i =1; i<= myselections.Length(); i++ ) {
89     if (myselections.Value(i)->Mode() == aMode) {
90       myselections(i)->Clear();
91       ComputeSelection(myselections(i),aMode);
92       myselections(i)->UpdateStatus(SelectMgr_TOU_Partial);
93       return;
94     }
95   }
96   Handle(SelectMgr_Selection) S = new SelectMgr_Selection(aMode);
97   ComputeSelection(S,aMode);
98   S->UpdateStatus(SelectMgr_TOU_Partial);
99   
100   myselections.Append(S);
101   
102 }
103
104 //==================================================
105 // Function: ClearSelections
106 // Purpose :
107 //==================================================
108 void SelectMgr_SelectableObject::ClearSelections(const Standard_Boolean update)
109 {
110   for (Standard_Integer i =1; i<= myselections.Length(); i++ ) {
111     myselections.Value(i)->Clear();
112     if(update)
113       myselections.Value(i)->UpdateStatus(SelectMgr_TOU_Full);
114   }
115 }
116
117
118 //==================================================
119 // Function: Selection
120 // Purpose :
121 //==================================================
122
123 const Handle(SelectMgr_Selection)& SelectMgr_SelectableObject
124 ::Selection(const Standard_Integer aMode) const
125 {
126   static Handle(SelectMgr_Selection) bidsel;
127   Standard_Boolean Found = Standard_False;
128   Standard_Integer Rank=0;
129   for (Standard_Integer i=1;i<=myselections.Length() && !Found;i++)
130     {
131       if((myselections.Value(i))->Mode()==aMode){ Found = Standard_True;
132                                                   Rank=i;}}
133   return myselections.Value(Rank);
134 }
135
136
137 //==================================================
138 // Function: AddSelection
139 // Purpose :
140 //==================================================
141
142 void SelectMgr_SelectableObject
143 ::AddSelection(const Handle(SelectMgr_Selection)& aSel,
144                const Standard_Integer aMode)
145 {
146   if(aSel->IsEmpty()){
147     ComputeSelection(aSel,aMode);
148     aSel->UpdateStatus(SelectMgr_TOU_Partial);
149   }
150   if(HasSelection(aMode))
151     {
152       const Handle(SelectMgr_Selection)& temp= Selection(aMode);
153       Standard_Integer I = Search(myselections,temp);
154       if(I!=0) myselections.Remove(I);
155     }
156   myselections.Append(aSel);
157   
158 }
159
160
161
162 //=======================================================================
163 //function : ReSetLocation
164 //purpose  : 
165 //=======================================================================
166 void SelectMgr_SelectableObject::ResetLocation() 
167 {
168   TopLoc_Location aLoc;
169
170
171   // les selections
172   Handle(Select3D_SensitiveEntity) SE;
173   for(Init();More();Next()){
174     const Handle(SelectMgr_Selection) & Sel =  CurrentSelection();
175     for(Sel->Init();Sel->More();Sel->Next()){
176       SE =  *((Handle(Select3D_SensitiveEntity)*) &(Sel->Sensitive()));
177       if(!SE.IsNull()){
178         if(SE->HasLocation()) {
179           if( SE->Location()==myLocation){
180             SE->ResetLocation();
181             const Handle(SelectBasics_EntityOwner)& EO = SE->OwnerId();
182             (*((Handle(SelectMgr_EntityOwner)*)&EO))->ResetLocation();}
183           else{
184             const TopLoc_Location& iniloc =SE->Location();
185             SE->SetLocation(iniloc*myLocation.Inverted());
186             const Handle(SelectBasics_EntityOwner)& EO = SE->OwnerId();
187             (*((Handle(SelectMgr_EntityOwner)*)&EO))->SetLocation(SE->Location());}
188         }
189       }
190     }
191     Sel->UpdateStatus(SelectMgr_TOU_None);
192   }
193
194   PrsMgr_PresentableObject::ResetLocation();
195 }
196
197
198 //=======================================================================
199 //function : UpdateLocation
200 //purpose  : 
201 //=======================================================================
202 void SelectMgr_SelectableObject::UpdateLocation() 
203 {
204   
205   Handle(Select3D_SensitiveEntity) SE;
206   for(Init();More();Next()){
207     const Handle(SelectMgr_Selection) & Sel =  CurrentSelection();
208     Sel->UpdateStatus(SelectMgr_TOU_Partial);
209   }
210   PrsMgr_PresentableObject::UpdateLocation();
211
212 }
213
214
215 //=======================================================================
216 //function : UpdateLocation
217 //purpose  : 
218 //=======================================================================
219 void SelectMgr_SelectableObject::UpdateLocation(const Handle(SelectMgr_Selection)& Sel)
220 {
221   Handle(Select3D_SensitiveEntity) SE;
222   if(myLocation.IsIdentity()) return;
223   for(Sel->Init();Sel->More();Sel->Next()){
224     SE =  *((Handle(Select3D_SensitiveEntity)*) &(Sel->Sensitive()));
225     if(!SE.IsNull()){
226       SE->UpdateLocation(myLocation);
227       const Handle(SelectBasics_EntityOwner)& aEOwner = SE->OwnerId();
228       Handle(SelectMgr_EntityOwner) aMgrEO =
229                               Handle(SelectMgr_EntityOwner)::DownCast (aEOwner);
230       if (!aMgrEO.IsNull())
231         aMgrEO->SetLocation (myLocation);
232     }
233   }
234 }
235
236 //=======================================================================
237 //function : HilightSelected
238 //purpose  : 
239 //=======================================================================
240 void SelectMgr_SelectableObject::HilightSelected 
241   ( const Handle(PrsMgr_PresentationManager3d)&,
242     const SelectMgr_SequenceOfOwner&)
243 {
244   Standard_NotImplemented::Raise ("SelectMgr_SelectableObject::HilightSelected");
245 }
246
247 //=======================================================================
248 //function : ClearSelected
249 //purpose  : 
250 //=======================================================================
251 void SelectMgr_SelectableObject::ClearSelected ()
252 {
253   if( !mySelectionPrs.IsNull() )
254     mySelectionPrs->Clear();
255 }
256
257 //=======================================================================
258 //function : HilightOwnerWithColor
259 //purpose  : 
260 //=======================================================================
261 void SelectMgr_SelectableObject::HilightOwnerWithColor 
262   ( const Handle(PrsMgr_PresentationManager3d)&,
263     const Quantity_NameOfColor,
264     const Handle(SelectMgr_EntityOwner)&)
265 {
266   Standard_NotImplemented::Raise ("SelectMgr_SelectableObject::HilightOwnerWithColor");
267 }
268
269 //=======================================================================
270 //function : MaxFaceNodes
271 //purpose  : 
272 //=======================================================================
273 Standard_Boolean SelectMgr_SelectableObject::IsAutoHilight () const
274 {
275   return myAutoHilight;
276 }
277
278 //=======================================================================
279 //function : MaxFaceNodes
280 //purpose  : 
281 //=======================================================================
282 void SelectMgr_SelectableObject::SetAutoHilight ( const Standard_Boolean newAutoHilight )
283 {
284   myAutoHilight = newAutoHilight;
285 }
286
287 //=======================================================================
288 //function : GetHilightPresentation
289 //purpose  : 
290 //=======================================================================
291 Handle(Prs3d_Presentation) SelectMgr_SelectableObject::GetHilightPresentation( const Handle(PrsMgr_PresentationManager3d)& TheMgr )
292 {
293   if( myHilightPrs.IsNull() && !TheMgr.IsNull() )
294     {
295       myHilightPrs = new Prs3d_Presentation( TheMgr->StructureManager() );
296       myHilightPrs->SetTransformPersistence( GetTransformPersistenceMode(), 
297                                          GetTransformPersistencePoint() );
298     }
299
300   return myHilightPrs;
301 }
302
303
304 //=======================================================================
305 //function : GetSelectPresentation
306 //purpose  : 
307 //=======================================================================
308 Handle(Prs3d_Presentation) SelectMgr_SelectableObject::GetSelectPresentation( const Handle(PrsMgr_PresentationManager3d)& TheMgr )
309 {
310   if( mySelectionPrs.IsNull() && !TheMgr.IsNull() ) {
311     mySelectionPrs = new Prs3d_Presentation( TheMgr->StructureManager() );
312     mySelectionPrs->SetTransformPersistence( GetTransformPersistenceMode(), 
313                                              GetTransformPersistencePoint() );
314   }
315   return mySelectionPrs;
316 }
317
318 //=======================================================================
319 //function : SetZLayer
320 //purpose  :
321 //=======================================================================
322 void SelectMgr_SelectableObject::SetZLayer 
323   (const Handle(PrsMgr_PresentationManager)& thePrsMgr,
324    const Standard_Integer theLayerId)
325 {
326   if (thePrsMgr.IsNull())
327     return;
328
329   // update own presentations
330   PrsMgr_PresentableObject::SetZLayer (thePrsMgr, theLayerId);
331
332   // update selection presentations
333   if (!mySelectionPrs.IsNull())
334     mySelectionPrs->SetZLayer (theLayerId);
335
336   if (!myHilightPrs.IsNull())
337     myHilightPrs->SetZLayer (theLayerId);
338
339   // update all entity owner presentations
340   for (Init (); More () ;Next ())
341   {
342     const Handle(SelectMgr_Selection)& aSel = CurrentSelection();
343     for (aSel->Init (); aSel->More (); aSel->Next ())
344     {
345       Handle(Select3D_SensitiveEntity) aEntity = 
346         Handle(Select3D_SensitiveEntity)::DownCast (aSel->Sensitive());
347       if (!aEntity.IsNull())
348       {
349         Handle(SelectMgr_EntityOwner) aOwner = 
350           Handle(SelectMgr_EntityOwner)::DownCast (aEntity->OwnerId());
351         if (!aOwner.IsNull())
352           aOwner->SetZLayer (thePrsMgr, theLayerId);
353       }
354     }
355   }
356 }