9d8d0c876abe519de92a53d5f2adda45e2b77ecb
[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 <OSD_Environment.hxx>
20 #include <SelectMgr_DataMapIteratorOfDataMapOfObjectSelectors.hxx>
21 #include <SelectMgr_SelectableObject.hxx>
22 #include <SelectMgr_Selection.hxx>
23 #include <SelectMgr_SequenceOfSelector.hxx>
24 #include <SelectMgr_ViewerSelector.hxx>
25 #include <Standard_Type.hxx>
26 #include <TCollection_AsciiString.hxx>
27 #include <TColStd_ListIteratorOfListOfInteger.hxx>
28 #include <TColStd_ListOfInteger.hxx>
29 #include <TColStd_MapIteratorOfMapOfTransient.hxx>
30
31 IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_SelectionManager,Standard_Transient)
32
33 namespace
34 {
35   static bool containsSelector (const SelectMgr_SequenceOfSelector& theSelectorsSeq,
36                                 const Handle(SelectMgr_ViewerSelector)& theSelector)
37   {
38     for (SelectMgr_SequenceOfSelector::Iterator aSelectorIter (theSelectorsSeq); aSelectorIter.More(); aSelectorIter.Next())
39     {
40       if (aSelectorIter.Value() == theSelector)
41       {
42         return true;
43       }
44     }
45     return false;
46   }
47 }
48
49 //==================================================
50 // Function: Create
51 // Purpose :
52 //==================================================
53 SelectMgr_SelectionManager::SelectMgr_SelectionManager()
54 {
55   //
56 }
57
58 //==================================================
59 // Function: Add
60 // Purpose :
61 //==================================================
62 void SelectMgr_SelectionManager::Add (const Handle(SelectMgr_ViewerSelector)& theSelector)
63 {
64   mySelectors.Add (theSelector);
65 }
66
67 //==================================================
68 // Function: Remove
69 // Purpose :
70 //==================================================
71 void SelectMgr_SelectionManager::Remove (const Handle(SelectMgr_ViewerSelector)& theSelector)
72 {
73   for (SelectMgr_DataMapIteratorOfDataMapOfObjectSelectors aSelIter (myLocal); aSelIter.More(); aSelIter.Next())
74   {
75     SelectMgr_SequenceOfSelector& theSelectors = myLocal.ChangeFind (aSelIter.Key());
76     for (SelectMgr_SequenceOfSelector::Iterator aSelectorIter (theSelectors); aSelectorIter.More(); aSelectorIter.Next())
77     {
78       if (aSelectorIter.Value() == theSelector)
79       {
80         theSelectors.Remove (aSelectorIter);
81         break;
82       }
83     }
84   }
85
86   mySelectors.Remove (theSelector);
87 }
88
89 //==================================================
90 // Function: Contains
91 // Purpose :
92 //==================================================
93 Standard_Boolean SelectMgr_SelectionManager::Contains (const Handle(SelectMgr_ViewerSelector)& theSelector) const
94 {
95   return mySelectors.Contains (theSelector);
96 }
97
98 //==================================================
99 // Function: Contains
100 // Purpose :
101 //==================================================
102 Standard_Boolean SelectMgr_SelectionManager::Contains (const Handle(SelectMgr_SelectableObject)& theObject) const
103 {
104   return myGlobal.Contains (theObject)
105       || myLocal.IsBound (theObject);
106 }
107
108 //==================================================
109 // Function: Load
110 // Purpose :
111 //==================================================
112 void SelectMgr_SelectionManager::Load (const Handle(SelectMgr_SelectableObject)& theObject,
113                                        const Standard_Integer theMode)
114 {
115   if (myGlobal.Contains(theObject))
116     return;
117
118   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
119   {
120     Load (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode);
121   }
122
123   if (!theObject->HasOwnPresentations())
124     return;
125
126   myGlobal.Add(theObject);
127   for (NCollection_Map<Handle(SelectMgr_ViewerSelector)>::Iterator aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
128   {
129     const Handle(SelectMgr_ViewerSelector)& aSelector = aSelectorsIter.Key();
130     if (!aSelector->Contains (theObject) && theObject->HasOwnPresentations())
131     {
132       aSelector->AddSelectableObject (theObject);
133     }
134   }
135   if (theMode != -1)
136     loadMode (theObject, theMode);
137 }
138
139
140 //==================================================
141 // Function: Load
142 // Purpose :
143 //==================================================
144 void SelectMgr_SelectionManager::Load (const Handle(SelectMgr_SelectableObject)& theObject,
145                                        const Handle(SelectMgr_ViewerSelector)& theSelector,
146                                        const Standard_Integer theMode)
147 {
148   mySelectors.Add (theSelector);
149   if (theMode != -1)
150   {
151     loadMode (theObject, theMode, theSelector);
152   }
153
154   if (theObject->HasOwnPresentations())
155   {
156     theSelector->AddSelectableObject (theObject);
157   }
158
159   if (SelectMgr_SequenceOfSelector* aSelectors = myLocal.ChangeSeek (theObject))
160   {
161     if (!containsSelector (*aSelectors, theSelector))
162     {
163       aSelectors->Append (theSelector);
164     }
165   }
166   else
167   {
168     if (!myGlobal.Contains (theObject))
169     {
170       for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
171       {
172         Load (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theSelector, theMode);
173       }
174       if (!theObject->HasOwnPresentations())
175         return;
176
177       SelectMgr_SequenceOfSelector aGlobSelectors;
178       aGlobSelectors.Append (theSelector);
179       myLocal.Bind (theObject, aGlobSelectors);
180     }
181   }
182 }
183
184 //==================================================
185 // Function: Remove
186 // Purpose :
187 //==================================================
188 void SelectMgr_SelectionManager::Remove (const Handle(SelectMgr_SelectableObject)& theObject)
189 {
190   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
191   {
192     Remove (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()));
193   }
194
195   if (!theObject->HasOwnPresentations())
196     return;
197
198   if (myGlobal.Contains (theObject))
199   {
200     for (NCollection_Map<Handle(SelectMgr_ViewerSelector)>::Iterator aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
201     {
202       const Handle(SelectMgr_ViewerSelector)& aCurSelector = aSelectorsIter.Key();
203       if (!aCurSelector->Contains (theObject))
204       {
205         continue;
206       }
207
208       for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObject->Selections()); aSelIter.More(); aSelIter.Next())
209       {
210         aCurSelector->RemoveSelectionOfObject (theObject, aSelIter.Value());
211         aSelIter.Value()->UpdateBVHStatus (SelectMgr_TBU_Remove);
212       }
213       aCurSelector->RemoveSelectableObject (theObject);
214     }
215
216     myGlobal.Remove (theObject);
217   }
218   else if (SelectMgr_SequenceOfSelector* aSelectors = myLocal.ChangeSeek (theObject))
219   {
220     for (SelectMgr_SequenceOfSelector::Iterator aSelectorIter (*aSelectors); aSelectorIter.More(); aSelectorIter.Next())
221     {
222       const Handle(SelectMgr_ViewerSelector)& aCurSelector = aSelectorIter.Value();
223       if (!aCurSelector->Contains (theObject))
224         continue;
225
226       for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObject->Selections()); aSelIter.More(); aSelIter.Next())
227       {
228         aCurSelector->RemoveSelectionOfObject (theObject, aSelIter.Value());
229         aSelIter.Value()->UpdateBVHStatus (SelectMgr_TBU_Remove);
230       }
231       aCurSelector->RemoveSelectableObject (theObject);
232     }
233
234     myLocal.UnBind (theObject);
235   }
236
237   theObject->ClearSelections();
238 }
239
240 //==================================================
241 // Function: Remove
242 // Purpose :
243 //==================================================
244 void SelectMgr_SelectionManager::Remove (const Handle(SelectMgr_SelectableObject)& theObject,
245                                          const Handle(SelectMgr_ViewerSelector)& theSelector)
246 {
247   if (!theSelector->Contains (theObject))
248     return;
249
250   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
251   {
252     Remove (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theSelector);
253   }
254   if (!theObject->HasOwnPresentations())
255     return;
256
257   for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObject->Selections()); aSelIter.More(); aSelIter.Next())
258   {
259     theSelector->RemoveSelectionOfObject (theObject, aSelIter.Value());
260     aSelIter.Value()->UpdateBVHStatus (SelectMgr_TBU_Remove);
261   }
262   theSelector->RemoveSelectableObject (theObject);
263
264   if (SelectMgr_SequenceOfSelector* aSelectors = myLocal.ChangeSeek (theObject))
265   {
266     for (SelectMgr_SequenceOfSelector::Iterator aSelectorIter (*aSelectors); aSelectorIter.More(); aSelectorIter.Next())
267     {
268       if (aSelectorIter.Value() == theSelector)
269       {
270         aSelectors->Remove (aSelectorIter);
271         break;
272       }
273     }
274
275     if (aSelectors->IsEmpty())
276     {
277       myLocal.UnBind (theObject);
278     }
279   }
280 }
281
282 //==================================================
283 // Function: Activate
284 // Purpose :
285 //==================================================
286 void SelectMgr_SelectionManager::Activate (const Handle(SelectMgr_SelectableObject)& theObject,
287                                            const Standard_Integer theMode,
288                                            const Handle(SelectMgr_ViewerSelector)& theSelector)
289 {
290   if (theMode == -1)
291     return;
292
293   if (!theSelector.IsNull() && !mySelectors.Contains (theSelector))
294     return;
295
296   for (PrsMgr_ListOfPresentableObjectsIter anChildIter (theObject->Children()); anChildIter.More(); anChildIter.Next())
297   {
298     Activate (Handle(SelectMgr_SelectableObject)::DownCast (anChildIter.Value()), theMode, theSelector);
299   }
300   if (!theObject->HasOwnPresentations())
301     return;
302
303   Standard_Boolean isComputed = Standard_False;
304   if (const Handle(SelectMgr_Selection)& aSelOld = theObject->Selection (theMode))
305   {
306     isComputed = !aSelOld->IsEmpty();
307   }
308   if (!isComputed)
309   {
310     loadMode (theObject, theMode);
311   }
312
313   if (theSelector.IsNull())
314   {
315     if (myGlobal.Contains (theObject))
316     {
317       for (NCollection_Map<Handle(SelectMgr_ViewerSelector)>::Iterator aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
318       {
319         const Handle(SelectMgr_ViewerSelector)& aCurSelector = aSelectorsIter.Key();
320         Activate (theObject, theMode, aCurSelector);
321       }
322     }
323     else if (SelectMgr_SequenceOfSelector* aSelectors = myLocal.ChangeSeek (theObject))
324     {
325       for (SelectMgr_SequenceOfSelector::Iterator aSelectorIter (*aSelectors); aSelectorIter.More(); aSelectorIter.Next())
326       {
327         Handle(SelectMgr_ViewerSelector) aCurSelector = aSelectorIter.Value();
328         Activate (theObject, theMode, aCurSelector);
329       }
330     }
331   }
332
333   const Handle(SelectMgr_Selection)& aSelection = theObject->Selection (theMode);
334   switch (aSelection->UpdateStatus())
335   {
336     case SelectMgr_TOU_Full:
337     {
338       if (theObject->HasSelection (theMode))
339       {
340         theSelector->RemoveSelectionOfObject (theObject, aSelection);
341       }
342       theObject->RecomputePrimitives (theMode);
343       // pass through SelectMgr_TOU_Partial
344     }
345     case SelectMgr_TOU_Partial:
346     {
347       if(theObject->HasTransformation())
348       {
349         theObject->UpdateTransformations (aSelection);
350       }
351       theSelector->RebuildObjectsTree();
352       break;
353     }
354     default:
355       break;
356   }
357   aSelection->UpdateStatus(SelectMgr_TOU_None);
358
359   switch (aSelection->BVHUpdateStatus())
360   {
361     case SelectMgr_TBU_Add:
362     case SelectMgr_TBU_Renew:
363     {
364       theSelector->AddSelectionToObject (theObject, aSelection);
365       break;
366     }
367     case SelectMgr_TBU_Remove:
368     {
369       if (aSelection->GetSelectionState() == SelectMgr_SOS_Deactivated)
370       {
371         theSelector->AddSelectionToObject (theObject, aSelection);
372       }
373       break;
374     }
375     default:
376       break;
377   }
378   aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
379
380   if (myGlobal.Contains (theObject))
381   {
382     const Standard_Integer aGlobalSelMode = theObject->GlobalSelectionMode();
383     if (theMode != aGlobalSelMode
384      && theSelector->IsActive (theObject, aGlobalSelMode))
385     {
386       theSelector->Deactivate (theObject->Selection (aGlobalSelMode));
387     }
388     theSelector->Activate (theObject->Selection (theMode));
389   }
390   else
391   {
392     if (SelectMgr_SequenceOfSelector* aSelectors = myLocal.ChangeSeek (theObject))
393     {
394       if (!containsSelector (*aSelectors, theSelector))
395       {
396         aSelectors->Append (theSelector);
397       }
398       theSelector->Activate (theObject->Selection (theMode));
399     }
400   }
401 }
402
403 //==================================================
404 // Function: Deactivate
405 // Purpose :
406 //==================================================
407 void SelectMgr_SelectionManager::Deactivate (const Handle(SelectMgr_SelectableObject)& theObject,
408                                              const Standard_Integer theMode,
409                                              const Handle(SelectMgr_ViewerSelector)& theSelector)
410 {
411   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
412   {
413     Deactivate (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode, theSelector);
414   }
415   if (!theObject->HasOwnPresentations())
416   {
417     return;
418   }
419   if (!myGlobal.Contains(theObject)
420    && !myLocal.IsBound  (theObject))
421   {
422     return;
423   }
424
425   const Handle(SelectMgr_Selection)& aSel = theObject->Selection (theMode);
426   if (!theSelector.IsNull())
427   {
428     if (theMode == -1)
429     {
430       for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObject->Selections()); aSelIter.More(); aSelIter.Next())
431       {
432         theSelector->Deactivate (aSelIter.Value());
433       }
434     }
435     else if (!aSel.IsNull())
436     {
437       theSelector->Deactivate (aSel);
438     }
439     return;
440   }
441
442   for (NCollection_Map<Handle(SelectMgr_ViewerSelector)>::Iterator aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next())
443   {
444     const Handle(SelectMgr_ViewerSelector)& aSelector = aSelectorIter.Key();
445     if (theMode == -1)
446     {
447       for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObject->Selections()); aSelIter.More(); aSelIter.Next())
448       {
449         aSelector->Deactivate (aSelIter.Value());
450       }
451     }
452     else if (!aSel.IsNull())
453     {
454       aSelector->Deactivate (aSel);
455     }
456   }
457 }
458
459 //=======================================================================
460 //function : IsActivated
461 //purpose  :
462 //=======================================================================
463 Standard_Boolean SelectMgr_SelectionManager::IsActivated (const Handle(SelectMgr_SelectableObject)& theObject,
464                                                           const Standard_Integer theMode,
465                                                           const Handle(SelectMgr_ViewerSelector)& theSelector) const
466 {
467   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
468   {
469     if (IsActivated (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode, theSelector))
470       return Standard_True;
471   }
472   if (!theObject->HasOwnPresentations())
473   {
474     return Standard_False;
475   }
476   if (!myGlobal.Contains(theObject)
477    && !myLocal.IsBound  (theObject))
478   {
479     return Standard_False;
480   }
481
482   if (theMode == -1 && theSelector.IsNull())
483   {
484     for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObject->Selections()); aSelIter.More(); aSelIter.Next())
485     {
486       if (IsActivated (theObject, aSelIter.Value()->Mode()))
487       {
488         return Standard_True;
489       }
490     }
491     return Standard_False;
492   }
493
494   const Handle(SelectMgr_Selection)& aSelection = theObject->Selection (theMode);
495   if (aSelection.IsNull())
496   {
497     return Standard_False;
498   }
499
500   if (!theSelector.IsNull())
501   {
502     return theSelector->Status (aSelection) == SelectMgr_SOS_Activated;
503   }
504
505   for (NCollection_Map<Handle(SelectMgr_ViewerSelector)>::Iterator aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next())
506   {
507     const Handle(SelectMgr_ViewerSelector)& aSelector = aSelectorIter.Key();
508     if (aSelector->Status (aSelection) == SelectMgr_SOS_Activated)
509     {
510       return Standard_True;
511     }
512   }
513   return Standard_False;
514 }
515
516 //=======================================================================
517 //function : ClearSelectionStructures
518 //purpose  : Removes sensitive entities from all viewer selectors
519 //           after method Clear() was called to the selection they belonged to
520 //           or it was recomputed somehow
521 //=======================================================================
522 void SelectMgr_SelectionManager::ClearSelectionStructures (const Handle(SelectMgr_SelectableObject)& theObj,
523                                                            const Standard_Integer theMode,
524                                                            const Handle(SelectMgr_ViewerSelector)& theSelector)
525 {
526   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObj->Children()); anChildrenIter.More(); anChildrenIter.Next())
527   {
528     ClearSelectionStructures (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode, theSelector);
529   }
530
531   if (!theObj->HasOwnPresentations())
532   {
533     return;
534   }
535   if (!myGlobal.Contains(theObj)
536    && !myLocal.IsBound  (theObj))
537   {
538     return;
539   }
540
541   if (theSelector.IsNull())
542   {
543     for (NCollection_Map<Handle(SelectMgr_ViewerSelector)>::Iterator aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
544     {
545       const Handle(SelectMgr_ViewerSelector)& aSelector = aSelectorsIter.Key();
546       ClearSelectionStructures (theObj, theMode, aSelector);
547     }
548     return;
549   }
550
551   if (theMode != -1)
552   {
553     if (const Handle(SelectMgr_Selection)& aSelection = theObj->Selection (theMode))
554     {
555       theSelector->RemoveSelectionOfObject (theObj, aSelection);
556       aSelection->UpdateBVHStatus (SelectMgr_TBU_Add);
557     }
558   }
559   else
560   {
561     for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObj->Selections()); aSelIter.More(); aSelIter.Next())
562     {
563       const Handle(SelectMgr_Selection)& aSelection = aSelIter.Value();
564       theSelector->RemoveSelectionOfObject (theObj, aSelection);
565       aSelection->UpdateBVHStatus (SelectMgr_TBU_Add);
566     }
567   }
568   theSelector->RebuildObjectsTree();
569 }
570
571 //=======================================================================
572 //function : RestoreSelectionStructuress
573 //purpose  : Re-adds newely calculated sensitive  entities of recomputed selection
574 //           defined by mode theMode to all viewer selectors contained that selection.
575 //=======================================================================
576 void SelectMgr_SelectionManager::RestoreSelectionStructures (const Handle(SelectMgr_SelectableObject)& theObj,
577                                                              const Standard_Integer theMode,
578                                                              const Handle(SelectMgr_ViewerSelector)& theSelector)
579 {
580   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObj->Children()); anChildrenIter.More(); anChildrenIter.Next())
581   {
582     RestoreSelectionStructures (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode, theSelector);
583   }
584   if (!theObj->HasOwnPresentations())
585   {
586     return;
587   }
588   if (!myGlobal.Contains(theObj)
589    && !myLocal.IsBound  (theObj))
590   {
591     return;
592   }
593
594   if (theSelector.IsNull())
595   {
596     for (NCollection_Map<Handle(SelectMgr_ViewerSelector)>::Iterator aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
597     {
598       const Handle(SelectMgr_ViewerSelector)& aSelector = aSelectorsIter.Key();
599       RestoreSelectionStructures (theObj, theMode, aSelector);
600     }
601     return;
602   }
603
604   if (theMode != -1)
605   {
606     if (const Handle(SelectMgr_Selection)& aSelection = theObj->Selection (theMode))
607     {
608       theSelector->AddSelectionToObject (theObj, aSelection);
609       aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
610     }
611   }
612   else
613   {
614     for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObj->Selections()); aSelIter.More(); aSelIter.Next())
615     {
616       const Handle(SelectMgr_Selection)& aSelection = aSelIter.Value();
617       theSelector->AddSelectionToObject (theObj, aSelection);
618       aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
619     }
620   }
621   theSelector->RebuildObjectsTree();
622 }
623
624 //=======================================================================
625 //function : rebuildSelectionStructures
626 //purpose  : Internal function that marks 1st level BVH of object theObj
627 //           as outdated
628 //=======================================================================
629 void SelectMgr_SelectionManager::rebuildSelectionStructures (const Handle(SelectMgr_ViewerSelector)& theSelector)
630 {
631   if (!theSelector.IsNull())
632   {
633     theSelector->RebuildObjectsTree();
634     return;
635   }
636
637   for (NCollection_Map<Handle(SelectMgr_ViewerSelector)>::Iterator aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
638   {
639     const Handle(SelectMgr_ViewerSelector)& aSelector = aSelectorsIter.Key();
640     rebuildSelectionStructures (aSelector);
641   }
642 }
643
644 //==================================================
645 // Function: recomputeSelectionMode
646 // Purpose :
647 //==================================================
648 void SelectMgr_SelectionManager::recomputeSelectionMode (const Handle(SelectMgr_SelectableObject)& theObject,
649                                                          const Handle(SelectMgr_Selection)& theSelection,
650                                                          const Standard_Integer theMode)
651 {
652   theSelection->UpdateStatus (SelectMgr_TOU_Full);
653
654   for (NCollection_Map<Handle(SelectMgr_ViewerSelector)>::Iterator aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next())
655   {
656     const Handle(SelectMgr_ViewerSelector)& aCurSelector = aSelectorIter.Key();
657
658     ClearSelectionStructures (theObject, theMode, aCurSelector);
659     theObject->RecomputePrimitives (theMode);
660     RestoreSelectionStructures (theObject, theMode, aCurSelector);
661     theSelection->UpdateStatus (SelectMgr_TOU_None);
662     theSelection->UpdateBVHStatus (SelectMgr_TBU_None);
663   }
664 }
665
666 //==================================================
667 // Function: Update
668 // Purpose :
669 //==================================================
670 void SelectMgr_SelectionManager::RecomputeSelection (const Handle(SelectMgr_SelectableObject)& theObject,
671                                                      const Standard_Boolean theIsForce,
672                                                      const Standard_Integer theMode)
673 {
674   if (theIsForce)
675   {
676     if (theMode == -1)
677     {
678       ClearSelectionStructures (theObject);
679       theObject->RecomputePrimitives();
680       theObject->UpdateTransformation();
681       RestoreSelectionStructures (theObject);
682     }
683     else if (theObject->HasSelection (theMode))
684     {
685       ClearSelectionStructures (theObject, theMode);
686       theObject->RecomputePrimitives (theMode);
687       theObject->UpdateTransformation();
688       RestoreSelectionStructures (theObject, theMode);
689     }
690     return;
691   }
692
693   for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
694   {
695     RecomputeSelection (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theIsForce, theMode);
696   }
697   if (!theObject->HasOwnPresentations())
698   {
699     return;
700   }
701   if (!myGlobal.Contains (theObject)
702    && !myLocal.IsBound (theObject))
703   {
704     return;
705   }
706
707   if (theMode == -1)
708   {
709     for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObject->Selections()); aSelIter.More(); aSelIter.Next())
710     {
711       const Handle(SelectMgr_Selection)& aSelection = aSelIter.Value();
712       const Standard_Integer aSelMode = aSelection->Mode();
713       recomputeSelectionMode (theObject, aSelection, aSelMode);
714     }
715   }
716   else
717   {
718     if (const Handle(SelectMgr_Selection)& aSelection = theObject->Selection (theMode))
719     {
720       recomputeSelectionMode (theObject, aSelection, theMode);
721     }
722   }
723 }
724
725 //=======================================================================
726 //function : Update
727 //purpose  : Selections are recalculated if they are flagged
728 //           "TO RECALCULATE" and activated in one of selectors.
729 //           If ForceUpdate = True, and they are "TO RECALCULATE"
730 //           This is done without caring for the state of activation.
731 //=======================================================================
732 void SelectMgr_SelectionManager::Update (const Handle(SelectMgr_SelectableObject)& theObject,
733                                          const Standard_Boolean theIsForce)
734 {
735   for (PrsMgr_ListOfPresentableObjectsIter aChildIter (theObject->Children()); aChildIter.More(); aChildIter.Next())
736   {
737     Update (Handle(SelectMgr_SelectableObject)::DownCast (aChildIter.Value()), theIsForce);
738   }
739   if (!theObject->HasOwnPresentations())
740   {
741     return;
742   }
743
744   for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObject->Selections()); aSelIter.More(); aSelIter.Next())
745   {
746     const Handle(SelectMgr_Selection)& aSelection = aSelIter.Value();
747     if (theIsForce)
748     {
749       switch (aSelection->UpdateStatus())
750       {
751         case SelectMgr_TOU_Full:
752         {
753           ClearSelectionStructures (theObject, aSelection->Mode());
754           theObject->RecomputePrimitives (aSelection->Mode()); // no break on purpose...
755           RestoreSelectionStructures (theObject, aSelection->Mode());
756           // pass through SelectMgr_TOU_Partial
757         }
758         case SelectMgr_TOU_Partial:
759         {
760           theObject->UpdateTransformations (aSelection);
761           rebuildSelectionStructures();
762           break;
763         }
764         default:
765           break;
766       }
767       aSelection->UpdateStatus (SelectMgr_TOU_None);
768       aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
769     }
770
771     for (NCollection_Map<Handle(SelectMgr_ViewerSelector)>::Iterator aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next())
772     {
773       const Handle(SelectMgr_ViewerSelector)& aSelector = aSelectorIter.Key();
774       Update (theObject, aSelector, Standard_False);
775     }
776   }
777 }
778
779 //==================================================
780 // Function: Update
781 // Purpose : Attention, it is required to know what is done...
782 //==================================================
783 void SelectMgr_SelectionManager::Update (const Handle(SelectMgr_SelectableObject)& theObject,
784                                          const Handle(SelectMgr_ViewerSelector)& theSelector,
785                                          const Standard_Boolean theIsForce)
786 {
787   if (!mySelectors.Contains (theSelector))
788   {
789     return;
790   }
791
792   if (!myGlobal.Contains (theObject))
793   {
794     const SelectMgr_SequenceOfSelector* aSelectors = myLocal.Seek (theObject);
795     if (aSelectors == NULL
796     || !containsSelector (*aSelectors, theSelector))
797     {
798       return;
799     }
800   }
801
802   for (PrsMgr_ListOfPresentableObjectsIter aChildIter (theObject->Children()); aChildIter.More(); aChildIter.Next())
803   {
804     Update (Handle(SelectMgr_SelectableObject)::DownCast (aChildIter.Value()), theSelector, theIsForce);
805   }
806   if (!theObject->HasOwnPresentations())
807   {
808     return;
809   }
810
811   for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObject->Selections()); aSelIter.More(); aSelIter.Next())
812   {
813     const Handle(SelectMgr_Selection)& aSelection = aSelIter.Value();
814     if (theIsForce)
815     {
816       switch (aSelection->UpdateStatus())
817       {
818         case SelectMgr_TOU_Full:
819         {
820           ClearSelectionStructures (theObject, aSelection->Mode());
821           theObject->RecomputePrimitives (aSelection->Mode());
822           RestoreSelectionStructures (theObject, aSelection->Mode());
823           // pass through SelectMgr_TOU_Partial
824         }
825         case SelectMgr_TOU_Partial:
826         {
827           theObject->UpdateTransformations (aSelection);
828           rebuildSelectionStructures();
829           break;
830         }
831         default:
832           break;
833       }
834       aSelection->UpdateStatus (SelectMgr_TOU_None);
835       aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
836     }
837
838     if (theSelector->Status (aSelection) == SelectMgr_SOS_Activated)
839     {
840       switch (aSelection->UpdateStatus())
841       {
842         case SelectMgr_TOU_Full:
843         {
844           ClearSelectionStructures (theObject, aSelection->Mode(), theSelector);
845           theObject->RecomputePrimitives (aSelection->Mode());
846           RestoreSelectionStructures (theObject, aSelection->Mode(), theSelector);
847           // pass through SelectMgr_TOU_Partial
848         }
849         case SelectMgr_TOU_Partial:
850         {
851           if (theObject->HasTransformation())
852           {
853             theObject->UpdateTransformations (aSelection);
854             theSelector->RebuildObjectsTree();
855           }
856           break;
857         }
858         default:
859           break;
860       }
861
862       aSelection->UpdateStatus (SelectMgr_TOU_None);
863       aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
864     }
865   }
866 }
867
868 //==================================================
869 // Function: loadMode
870 // Purpose : Private Method
871 //==================================================
872 void SelectMgr_SelectionManager::loadMode (const Handle(SelectMgr_SelectableObject)& theObject,
873                                            const Standard_Integer theMode,
874                                            const Handle(SelectMgr_ViewerSelector)& theSelector)
875 {
876   if (theMode == -1)
877   {
878     return;
879   }
880
881   if (const Handle(SelectMgr_Selection)& aSelOld = theObject->Selection (theMode))
882   {
883     if (aSelOld->IsEmpty())
884     {
885       if (aSelOld->BVHUpdateStatus() == SelectMgr_TBU_Remove)
886       {
887         Handle(SelectMgr_Selection) aNewSel = new SelectMgr_Selection (theMode);
888         theObject->AddSelection (aNewSel, theMode);
889         aNewSel->UpdateBVHStatus (SelectMgr_TBU_Remove);
890         aNewSel->SetSelectionState (SelectMgr_SOS_Deactivated);
891       }
892     }
893     return;
894   }
895
896   Handle(SelectMgr_Selection) aNewSel = new SelectMgr_Selection (theMode);
897   theObject->AddSelection (aNewSel, theMode);
898   if (!theSelector.IsNull())
899   {
900     theSelector->AddSelectionToObject (theObject, aNewSel);
901     aNewSel->UpdateBVHStatus (SelectMgr_TBU_None);
902     return;
903   }
904
905   if (myGlobal.Contains (theObject))
906   {
907     for (NCollection_Map<Handle(SelectMgr_ViewerSelector)>::Iterator aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next())
908     {
909       const Handle(SelectMgr_ViewerSelector)& aSelector = aSelectorIter.Key();
910       aSelector->AddSelectionToObject (theObject, aNewSel);
911       aNewSel->UpdateBVHStatus (SelectMgr_TBU_None);
912     }
913   }
914   else if (SelectMgr_SequenceOfSelector* aSelectors = myLocal.ChangeSeek (theObject))
915   {
916     for (SelectMgr_SequenceOfSelector::Iterator aSelectorIter (*aSelectors); aSelectorIter.More(); aSelectorIter.Next())
917     {
918       aSelectorIter.Value()->AddSelectionToObject (theObject, aNewSel);
919       aNewSel->UpdateBVHStatus (SelectMgr_TBU_None);
920     }
921   }
922 }
923
924 //=======================================================================
925 //function : SetUpdateMode
926 //purpose  :
927 //=======================================================================
928 void SelectMgr_SelectionManager::SetUpdateMode (const Handle(SelectMgr_SelectableObject)& theObject,
929                                                 const SelectMgr_TypeOfUpdate theType)
930 {
931   for (SelectMgr_SequenceOfSelection::Iterator aSelIter (theObject->Selections()); aSelIter.More(); aSelIter.Next())
932   {
933     aSelIter.Value()->UpdateStatus (theType);
934   }
935 }
936
937 //=======================================================================
938 //function : SetUpdateMode
939 //purpose  :
940 //=======================================================================
941 void SelectMgr_SelectionManager::SetUpdateMode (const Handle(SelectMgr_SelectableObject)& theObject,
942                                                 const Standard_Integer theMode,
943                                                 const SelectMgr_TypeOfUpdate theType)
944 {
945   if (const Handle(SelectMgr_Selection)& aSel = theObject->Selection (theMode))
946   {
947     aSel->UpdateStatus (theType);
948   }
949 }
950
951 //=======================================================================
952 //function : SetSelectionSensitivity
953 //purpose  : Allows to manage sensitivity of a particular selection of interactive object theObject and
954 //           changes previous sensitivity value of all sensitive entities in selection with theMode
955 //           to the given theNewSensitivity.
956 //=======================================================================
957 void SelectMgr_SelectionManager::SetSelectionSensitivity (const Handle(SelectMgr_SelectableObject)& theObject,
958                                                           const Standard_Integer theMode,
959                                                           const Standard_Integer theNewSens)
960 {
961   Standard_ASSERT_RAISE (theNewSens > 0, "Error! Selection sensitivity have positive value.");
962   if (theObject.IsNull())
963   {
964     return;
965   }
966
967   const Handle(SelectMgr_Selection)& aSel = theObject->Selection (theMode);
968   if (theObject.IsNull())
969   {
970     return;
971   }
972
973   const Standard_Integer aPrevSens = aSel->Sensitivity();
974   aSel->SetSensitivity (theNewSens);
975   if (myGlobal.Contains (theObject))
976   {
977     for (NCollection_Map<Handle(SelectMgr_ViewerSelector)>::Iterator aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
978     {
979       const Handle(SelectMgr_ViewerSelector)& aSelector = aSelectorsIter.Key();
980       if (aSelector->Contains (theObject))
981       {
982         aSelector->myTolerances.Decrement (aPrevSens);
983         aSelector->myTolerances.Add (theNewSens);
984         aSelector->myToUpdateTolerance = Standard_True;
985       }
986     }
987   }
988   if (myLocal.IsBound (theObject))
989   {
990     const SelectMgr_SequenceOfSelector& aSelectors = myLocal (theObject);
991     for (SelectMgr_SequenceOfSelector::Iterator aLocalIter (aSelectors); aLocalIter.More(); aLocalIter.Next())
992     {
993       Handle(SelectMgr_ViewerSelector)& aCurSel = aLocalIter.ChangeValue();
994       aCurSel->myTolerances.Decrement (aPrevSens);
995       aCurSel->myTolerances.Add (theNewSens);
996       aCurSel->myToUpdateTolerance = Standard_True;
997     }
998   }
999 }
1000
1001 //=======================================================================
1002 //function : UpdateSelection
1003 //purpose  :
1004 //=======================================================================
1005 void SelectMgr_SelectionManager::UpdateSelection (const Handle(SelectMgr_SelectableObject)& theObject)
1006 {
1007   if (myGlobal.Contains (theObject))
1008   {
1009     for (NCollection_Map<Handle(SelectMgr_ViewerSelector)>::Iterator aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
1010     {
1011       const Handle(SelectMgr_ViewerSelector)& aSelector = aSelectorsIter.Key();
1012       if (aSelector->Contains (theObject))
1013       {
1014         aSelector->MoveSelectableObject (theObject);
1015       }
1016     }
1017   }
1018
1019   if (myLocal.IsBound (theObject))
1020   {
1021     const SelectMgr_SequenceOfSelector& aSelectors = myLocal (theObject);
1022     for (SelectMgr_SequenceOfSelector::Iterator aSelectorsIter (aSelectors); aSelectorsIter.More(); aSelectorsIter.Next())
1023     {
1024       Handle(SelectMgr_ViewerSelector)& aSelector = aSelectorsIter.ChangeValue();
1025       if (aSelector->Contains (theObject))
1026       {
1027         aSelector->MoveSelectableObject (theObject);
1028       }
1029     }
1030   }
1031 }