b8cb33e2fadb15f7d8fb5fbf1d6c603391375e20
[occt.git] / src / SelectMgr / SelectMgr_SelectionManager.cxx
1 // Created on: 1995-02-13
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 <SelectMgr_SelectionManager.hxx>
18
19 #include <SelectMgr_SelectableObject.hxx>
20 #include <SelectMgr_Selection.hxx>
21 #include <TCollection_AsciiString.hxx>
22
23 IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_SelectionManager,Standard_Transient)
24
25 //==================================================
26 // Function: Create
27 // Purpose :
28 //==================================================
29 SelectMgr_SelectionManager::SelectMgr_SelectionManager (const Handle(SelectMgr_ViewerSelector)& theSelector)
30 : mySelector (theSelector)
31 {
32   //
33 }
34
35 //==================================================
36 // Function: Contains
37 // Purpose :
38 //==================================================
39 Standard_Boolean SelectMgr_SelectionManager::Contains (const Handle(SelectMgr_SelectableObject)& theObject) const
40 {
41   return myGlobal.Contains (theObject);
42 }
43
44 //==================================================
45 // Function: Load
46 // Purpose :
47 //==================================================
48 void SelectMgr_SelectionManager::Load (const Handle(SelectMgr_SelectableObject)& theObject,
49                                        const Standard_Integer theMode)
50 {
51   if (myGlobal.Contains(theObject))
52     return;
53
54   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
55   {
56     Load (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode);
57   }
58
59   if (!theObject->HasOwnPresentations())
60     return;
61
62   myGlobal.Add(theObject);
63   if (!mySelector->Contains (theObject) && theObject->HasOwnPresentations())
64   {
65     mySelector->AddSelectableObject (theObject);
66   }
67   if (theMode != -1)
68     loadMode (theObject, theMode);
69 }
70
71 //==================================================
72 // Function: Remove
73 // Purpose :
74 //==================================================
75 void SelectMgr_SelectionManager::Remove (const Handle(SelectMgr_SelectableObject)& theObject)
76 {
77   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
78   {
79     Remove (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()));
80   }
81
82   if (!theObject->HasOwnPresentations())
83     return;
84
85   if (myGlobal.Contains (theObject))
86   {
87     if (mySelector->Contains (theObject))
88     {
89       for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObject->Selections()); aSelIter.More(); aSelIter.Next())
90       {
91         mySelector->RemoveSelectionOfObject (theObject, aSelIter.Value());
92         aSelIter.Value()->UpdateBVHStatus (SelectMgr_TBU_Remove);
93       }
94       mySelector->RemoveSelectableObject (theObject);
95     }
96     myGlobal.Remove (theObject);
97   }
98
99   theObject->ClearSelections();
100 }
101
102 //==================================================
103 // Function: Activate
104 // Purpose :
105 //==================================================
106 void SelectMgr_SelectionManager::Activate (const Handle(SelectMgr_SelectableObject)& theObject,
107                                            const Standard_Integer theMode)
108 {
109   if (theMode == -1)
110     return;
111
112   for (PrsMgr_ListOfPresentableObjectsIter anChildIter (theObject->Children()); anChildIter.More(); anChildIter.Next())
113   {
114     Activate (Handle(SelectMgr_SelectableObject)::DownCast (anChildIter.Value()), theMode);
115   }
116   if (!theObject->HasOwnPresentations())
117     return;
118
119   Standard_Boolean isComputed = Standard_False;
120   if (const Handle(SelectMgr_Selection)& aSelOld = theObject->Selection (theMode))
121   {
122     isComputed = !aSelOld->IsEmpty();
123   }
124   if (!isComputed)
125   {
126     loadMode (theObject, theMode);
127   }
128
129   const Handle(SelectMgr_Selection)& aSelection = theObject->Selection (theMode);
130   switch (aSelection->UpdateStatus())
131   {
132     case SelectMgr_TOU_Full:
133     {
134       if (theObject->HasSelection (theMode))
135       {
136         mySelector->RemoveSelectionOfObject (theObject, aSelection);
137       }
138       theObject->RecomputePrimitives (theMode);
139       // pass through SelectMgr_TOU_Partial
140     }
141     Standard_FALLTHROUGH
142     case SelectMgr_TOU_Partial:
143     {
144       theObject->UpdateTransformations (aSelection);
145       mySelector->RebuildObjectsTree();
146       break;
147     }
148     default:
149       break;
150   }
151   aSelection->UpdateStatus(SelectMgr_TOU_None);
152
153   switch (aSelection->BVHUpdateStatus())
154   {
155     case SelectMgr_TBU_Add:
156     case SelectMgr_TBU_Renew:
157     {
158       mySelector->AddSelectionToObject (theObject, aSelection);
159       break;
160     }
161     case SelectMgr_TBU_Remove:
162     {
163       if (aSelection->GetSelectionState() == SelectMgr_SOS_Deactivated)
164       {
165         mySelector->AddSelectionToObject (theObject, aSelection);
166       }
167       break;
168     }
169     default:
170       break;
171   }
172   aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
173
174   if (myGlobal.Contains (theObject))
175   {
176     mySelector->Activate (theObject->Selection (theMode));
177   }
178 }
179
180 //==================================================
181 // Function: Deactivate
182 // Purpose :
183 //==================================================
184 void SelectMgr_SelectionManager::Deactivate (const Handle(SelectMgr_SelectableObject)& theObject,
185                                              const Standard_Integer theMode)
186 {
187   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
188   {
189     Deactivate (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode);
190   }
191   if (!theObject->HasOwnPresentations())
192   {
193     return;
194   }
195   if (!myGlobal.Contains(theObject))
196   {
197     return;
198   }
199
200   const Handle(SelectMgr_Selection)& aSel = theObject->Selection (theMode);
201   if (theMode == -1)
202   {
203     for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObject->Selections()); aSelIter.More(); aSelIter.Next())
204     {
205       mySelector->Deactivate (aSelIter.Value());
206     }
207   }
208   else if (!aSel.IsNull())
209   {
210     mySelector->Deactivate (aSel);
211   }
212 }
213
214 //=======================================================================
215 //function : IsActivated
216 //purpose  :
217 //=======================================================================
218 Standard_Boolean SelectMgr_SelectionManager::IsActivated (const Handle(SelectMgr_SelectableObject)& theObject,
219                                                           const Standard_Integer theMode) const
220 {
221   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
222   {
223     if (IsActivated (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode))
224       return Standard_True;
225   }
226   if (!theObject->HasOwnPresentations())
227   {
228     return Standard_False;
229   }
230   if (!myGlobal.Contains(theObject))
231   {
232     return Standard_False;
233   }
234
235   if (theMode == -1)
236   {
237     for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObject->Selections()); aSelIter.More(); aSelIter.Next())
238     {
239       if (mySelector->Status (aSelIter.Value()) == SelectMgr_SOS_Activated)
240       {
241         return Standard_True;
242       }
243     }
244     return Standard_False;
245   }
246
247   const Handle(SelectMgr_Selection)& aSelection = theObject->Selection (theMode);
248   if (aSelection.IsNull())
249   {
250     return Standard_False;
251   }
252   return !aSelection.IsNull()
253        && mySelector->Status (aSelection) == SelectMgr_SOS_Activated;
254 }
255
256 //=======================================================================
257 //function : ClearSelectionStructures
258 //purpose  : Removes sensitive entities from all viewer selectors
259 //           after method Clear() was called to the selection they belonged to
260 //           or it was recomputed somehow
261 //=======================================================================
262 void SelectMgr_SelectionManager::ClearSelectionStructures (const Handle(SelectMgr_SelectableObject)& theObj,
263                                                            const Standard_Integer theMode)
264 {
265   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObj->Children()); anChildrenIter.More(); anChildrenIter.Next())
266   {
267     ClearSelectionStructures (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode);
268   }
269
270   if (!theObj->HasOwnPresentations())
271   {
272     return;
273   }
274   if (!myGlobal.Contains(theObj))
275   {
276     return;
277   }
278
279   if (theMode != -1)
280   {
281     if (const Handle(SelectMgr_Selection)& aSelection = theObj->Selection (theMode))
282     {
283       mySelector->RemoveSelectionOfObject (theObj, aSelection);
284       aSelection->UpdateBVHStatus (SelectMgr_TBU_Add);
285     }
286   }
287   else
288   {
289     for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObj->Selections()); aSelIter.More(); aSelIter.Next())
290     {
291       const Handle(SelectMgr_Selection)& aSelection = aSelIter.Value();
292       mySelector->RemoveSelectionOfObject (theObj, aSelection);
293       aSelection->UpdateBVHStatus (SelectMgr_TBU_Add);
294     }
295   }
296   mySelector->RebuildObjectsTree();
297 }
298
299 //=======================================================================
300 //function : RestoreSelectionStructuress
301 //purpose  : Re-adds newely calculated sensitive  entities of recomputed selection
302 //           defined by mode theMode to all viewer selectors contained that selection.
303 //=======================================================================
304 void SelectMgr_SelectionManager::RestoreSelectionStructures (const Handle(SelectMgr_SelectableObject)& theObj,
305                                                              const Standard_Integer theMode)
306 {
307   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObj->Children()); anChildrenIter.More(); anChildrenIter.Next())
308   {
309     RestoreSelectionStructures (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode);
310   }
311   if (!theObj->HasOwnPresentations())
312   {
313     return;
314   }
315   if (!myGlobal.Contains(theObj))
316   {
317     return;
318   }
319
320   if (theMode != -1)
321   {
322     if (const Handle(SelectMgr_Selection)& aSelection = theObj->Selection (theMode))
323     {
324       mySelector->AddSelectionToObject (theObj, aSelection);
325       aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
326     }
327   }
328   else
329   {
330     for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObj->Selections()); aSelIter.More(); aSelIter.Next())
331     {
332       const Handle(SelectMgr_Selection)& aSelection = aSelIter.Value();
333       mySelector->AddSelectionToObject (theObj, aSelection);
334       aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
335     }
336   }
337   mySelector->RebuildObjectsTree();
338 }
339
340 //==================================================
341 // Function: recomputeSelectionMode
342 // Purpose :
343 //==================================================
344 void SelectMgr_SelectionManager::recomputeSelectionMode (const Handle(SelectMgr_SelectableObject)& theObject,
345                                                          const Handle(SelectMgr_Selection)& theSelection,
346                                                          const Standard_Integer theMode)
347 {
348   theSelection->UpdateStatus (SelectMgr_TOU_Full);
349
350   ClearSelectionStructures (theObject, theMode);
351   theObject->RecomputePrimitives (theMode);
352   RestoreSelectionStructures (theObject, theMode);
353   theSelection->UpdateStatus (SelectMgr_TOU_None);
354   theSelection->UpdateBVHStatus (SelectMgr_TBU_None);
355 }
356
357 //==================================================
358 // Function: Update
359 // Purpose :
360 //==================================================
361 void SelectMgr_SelectionManager::RecomputeSelection (const Handle(SelectMgr_SelectableObject)& theObject,
362                                                      const Standard_Boolean theIsForce,
363                                                      const Standard_Integer theMode)
364 {
365   if (theIsForce)
366   {
367     if (theMode == -1)
368     {
369       ClearSelectionStructures (theObject);
370       theObject->RecomputePrimitives();
371       theObject->UpdateTransformation();
372       RestoreSelectionStructures (theObject);
373     }
374     else if (theObject->HasSelection (theMode))
375     {
376       ClearSelectionStructures (theObject, theMode);
377       theObject->RecomputePrimitives (theMode);
378       theObject->UpdateTransformation();
379       RestoreSelectionStructures (theObject, theMode);
380     }
381     return;
382   }
383
384   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
385   {
386     RecomputeSelection (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theIsForce, theMode);
387   }
388   if (!theObject->HasOwnPresentations())
389   {
390     return;
391   }
392   if (!myGlobal.Contains (theObject))
393   {
394     return;
395   }
396
397   if (theMode == -1)
398   {
399     for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObject->Selections()); aSelIter.More(); aSelIter.Next())
400     {
401       const Handle(SelectMgr_Selection)& aSelection = aSelIter.Value();
402       const Standard_Integer aSelMode = aSelection->Mode();
403       recomputeSelectionMode (theObject, aSelection, aSelMode);
404     }
405   }
406   else
407   {
408     if (const Handle(SelectMgr_Selection)& aSelection = theObject->Selection (theMode))
409     {
410       recomputeSelectionMode (theObject, aSelection, theMode);
411     }
412   }
413 }
414
415 //=======================================================================
416 //function : Update
417 //purpose  : Selections are recalculated if they are flagged
418 //           "TO RECALCULATE" and activated in one of selectors.
419 //           If ForceUpdate = True, and they are "TO RECALCULATE"
420 //           This is done without caring for the state of activation.
421 //=======================================================================
422 void SelectMgr_SelectionManager::Update (const Handle(SelectMgr_SelectableObject)& theObject,
423                                          const Standard_Boolean theIsForce)
424 {
425   for (PrsMgr_ListOfPresentableObjectsIter aChildIter (theObject->Children()); aChildIter.More(); aChildIter.Next())
426   {
427     Update (Handle(SelectMgr_SelectableObject)::DownCast (aChildIter.Value()), theIsForce);
428   }
429   if (!theObject->HasOwnPresentations())
430   {
431     return;
432   }
433
434   for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObject->Selections()); aSelIter.More(); aSelIter.Next())
435   {
436     const Handle(SelectMgr_Selection)& aSelection = aSelIter.Value();
437     if (theIsForce || mySelector->Status (aSelection) == SelectMgr_SOS_Activated)
438     {
439       switch (aSelection->UpdateStatus())
440       {
441         case SelectMgr_TOU_Full:
442         {
443           ClearSelectionStructures (theObject, aSelection->Mode());
444           theObject->RecomputePrimitives (aSelection->Mode()); // no break on purpose...
445           RestoreSelectionStructures (theObject, aSelection->Mode());
446           // pass through SelectMgr_TOU_Partial
447         }
448         Standard_FALLTHROUGH
449         case SelectMgr_TOU_Partial:
450         {
451           theObject->UpdateTransformations (aSelection);
452           mySelector->RebuildObjectsTree();
453           break;
454         }
455         default:
456           break;
457       }
458       aSelection->UpdateStatus (SelectMgr_TOU_None);
459       aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
460     }
461   }
462 }
463
464 //==================================================
465 // Function: loadMode
466 // Purpose : Private Method
467 //==================================================
468 void SelectMgr_SelectionManager::loadMode (const Handle(SelectMgr_SelectableObject)& theObject,
469                                            const Standard_Integer theMode)
470 {
471   if (theMode == -1)
472   {
473     return;
474   }
475
476   if (const Handle(SelectMgr_Selection)& aSelOld = theObject->Selection (theMode))
477   {
478     if (aSelOld->IsEmpty())
479     {
480       if (aSelOld->BVHUpdateStatus() == SelectMgr_TBU_Remove)
481       {
482         Handle(SelectMgr_Selection) aNewSel = new SelectMgr_Selection (theMode);
483         theObject->AddSelection (aNewSel, theMode);
484         aNewSel->UpdateBVHStatus (SelectMgr_TBU_Remove);
485         aNewSel->SetSelectionState (SelectMgr_SOS_Deactivated);
486       }
487     }
488     return;
489   }
490
491   Handle(SelectMgr_Selection) aNewSel = new SelectMgr_Selection (theMode);
492   theObject->AddSelection (aNewSel, theMode);
493   if (myGlobal.Contains (theObject))
494   {
495     mySelector->AddSelectionToObject (theObject, aNewSel);
496     aNewSel->UpdateBVHStatus (SelectMgr_TBU_None);
497   }
498 }
499
500 //=======================================================================
501 //function : SetUpdateMode
502 //purpose  :
503 //=======================================================================
504 void SelectMgr_SelectionManager::SetUpdateMode (const Handle(SelectMgr_SelectableObject)& theObject,
505                                                 const SelectMgr_TypeOfUpdate theType)
506 {
507   for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObject->Selections()); aSelIter.More(); aSelIter.Next())
508   {
509     aSelIter.Value()->UpdateStatus (theType);
510   }
511 }
512
513 //=======================================================================
514 //function : SetUpdateMode
515 //purpose  :
516 //=======================================================================
517 void SelectMgr_SelectionManager::SetUpdateMode (const Handle(SelectMgr_SelectableObject)& theObject,
518                                                 const Standard_Integer theMode,
519                                                 const SelectMgr_TypeOfUpdate theType)
520 {
521   if (const Handle(SelectMgr_Selection)& aSel = theObject->Selection (theMode))
522   {
523     aSel->UpdateStatus (theType);
524   }
525 }
526
527 //=======================================================================
528 //function : SetSelectionSensitivity
529 //purpose  : Allows to manage sensitivity of a particular selection of interactive object theObject and
530 //           changes previous sensitivity value of all sensitive entities in selection with theMode
531 //           to the given theNewSensitivity.
532 //=======================================================================
533 void SelectMgr_SelectionManager::SetSelectionSensitivity (const Handle(SelectMgr_SelectableObject)& theObject,
534                                                           const Standard_Integer theMode,
535                                                           const Standard_Integer theNewSens)
536 {
537   Standard_ASSERT_RAISE (theNewSens > 0, "Error! Selection sensitivity have positive value.");
538   if (theObject.IsNull())
539   {
540     return;
541   }
542
543   const Handle(SelectMgr_Selection)& aSel = theObject->Selection (theMode);
544   if (aSel.IsNull())
545   {
546     return;
547   }
548
549   const Standard_Integer aPrevSens = aSel->Sensitivity();
550   aSel->SetSensitivity (theNewSens);
551   if (myGlobal.Contains (theObject)
552    && mySelector->Contains (theObject))
553   {
554     mySelector->myTolerances.Decrement (aPrevSens);
555     mySelector->myTolerances.Add (theNewSens);
556     mySelector->myToUpdateTolerance = Standard_True;
557   }
558 }
559
560 //=======================================================================
561 //function : UpdateSelection
562 //purpose  :
563 //=======================================================================
564 void SelectMgr_SelectionManager::UpdateSelection (const Handle(SelectMgr_SelectableObject)& theObject)
565 {
566   if (myGlobal.Contains (theObject)
567    && mySelector->Contains (theObject))
568   {
569     mySelector->MoveSelectableObject (theObject);
570   }
571 }