ab29dbe6e9ed6afe49956f677349a411b24e7055
[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
18 #include <Aspect_TypeOfMarker.hxx>
19 #include <Bnd_Box.hxx>
20 #include <gp_Pnt.hxx>
21 #include <Graphic3d_AspectLine3d.hxx>
22 #include <Graphic3d_AspectMarker3d.hxx>
23 #include <Prs3d_Drawer.hxx>
24 #include <Prs3d_LineAspect.hxx>
25 #include <Prs3d_PlaneAspect.hxx>
26 #include <Prs3d_PointAspect.hxx>
27 #include <Prs3d_Presentation.hxx>
28 #include <PrsMgr_PresentableObjectPointer.hxx>
29 #include <PrsMgr_PresentationManager3d.hxx>
30 #include <Select3D_SensitiveEntity.hxx>
31 #include <SelectBasics_EntityOwner.hxx>
32 #include <SelectMgr_EntityOwner.hxx>
33 #include <SelectMgr_IndexedMapOfOwner.hxx>
34 #include <SelectMgr_SelectableObject.hxx>
35 #include <SelectMgr_Selection.hxx>
36 #include <SelectMgr_SelectionManager.hxx>
37 #include <Standard_NoSuchObject.hxx>
38 #include <Standard_NotImplemented.hxx>
39 #include <Standard_Type.hxx>
40 #include <TopLoc_Location.hxx>
41
42 IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_SelectableObject,PrsMgr_PresentableObject)
43
44 static Standard_Integer Search (const SelectMgr_SequenceOfSelection& seq,
45                                 const Handle (SelectMgr_Selection)& theSel)
46 {
47   Standard_Integer ifound=0;
48   for (Standard_Integer i=1;i<=seq.Length()&& ifound==0;i++)
49     {if(theSel == seq.Value(i)) ifound=i;}
50   return ifound;
51
52
53
54
55 //==================================================
56 // Function: 
57 // Purpose :
58 //==================================================
59
60 SelectMgr_SelectableObject::SelectMgr_SelectableObject (const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d)
61 : PrsMgr_PresentableObject (aTypeOfPresentation3d),
62   myDrawer                 (new Prs3d_Drawer()),
63   myHilightDrawer          (new Prs3d_Drawer()),
64   myAssemblyOwner          (NULL),
65   myAutoHilight            (Standard_True),
66   myGlobalSelMode          (0)
67 {
68   InitDefaultHilightAttributes (myHilightDrawer);
69   myHilightDrawer->Link (myDrawer);
70 }
71
72
73 //==================================================
74 // Function: 
75 // Purpose :
76 //==================================================
77
78 Standard_Boolean SelectMgr_SelectableObject
79 ::HasSelection(const Standard_Integer aMode) const
80 {
81   Standard_Boolean Found=Standard_False;
82   for (Standard_Integer I=1;I<= myselections.Length() && !Found;I++)
83     { if(((myselections.Value(I))->Mode())==aMode) 
84         return Standard_True;
85     }
86   return Standard_False;
87 }
88
89 //==================================================
90 // Function: RecomputePrimitives
91 // Purpose : IMPORTANT: Do not use this method to update
92 //           selection primitives except implementing custom
93 //           selection manager! This method does not take
94 //           into account necessary BVH updates, but may
95 //           invalidate the pointers it refers to.
96 //           TO UPDATE SELECTION properly from outside classes,
97 //           use method UpdateSelection.
98 //==================================================
99 void SelectMgr_SelectableObject::RecomputePrimitives()
100 {
101   for (Standard_Integer aSelIdx = 1; aSelIdx <= myselections.Length(); aSelIdx++)
102     {
103       RecomputePrimitives (myselections.ChangeValue (aSelIdx)->Mode());
104     }
105 }
106
107 //==================================================
108 // Function: RecomputePrimitives
109 // Purpose : IMPORTANT: Do not use this method to update
110 //           selection primitives except implementing custom
111 //           selection manager! This method does not take
112 //           into account necessary BVH updates, but may
113 //           invalidate the pointers it refers to.
114 //           TO UPDATE SELECTION properly from outside classes,
115 //           use method UpdateSelection.
116 //==================================================
117 void SelectMgr_SelectableObject::RecomputePrimitives (const Standard_Integer theMode)
118 {
119   Handle(PrsMgr_PresentableObject) aPrsParent (Parent());
120   Handle(SelectMgr_SelectableObject) aSelParent = Handle(SelectMgr_SelectableObject)::DownCast (aPrsParent);
121
122   for (Standard_Integer aSelIdx =1; aSelIdx <= myselections.Length(); aSelIdx++ )
123   {
124     if (myselections.Value (aSelIdx)->Mode() == theMode)
125     {
126       myselections (aSelIdx)->Clear();
127       ComputeSelection (myselections (aSelIdx), theMode);
128       myselections (aSelIdx)->UpdateStatus (SelectMgr_TOU_Partial);
129       myselections (aSelIdx)->UpdateBVHStatus (SelectMgr_TBU_Renew);
130       if (theMode == 0 && ! aSelParent.IsNull() && ! aSelParent->GetAssemblyOwner().IsNull())
131       {
132         SetAssemblyOwner (aSelParent->GetAssemblyOwner(), theMode);
133       }
134       return;
135     }
136   }
137
138   Handle(SelectMgr_Selection) aNewSel = new SelectMgr_Selection (theMode);
139   ComputeSelection (aNewSel, theMode);
140
141   if (theMode == 0 && ! aSelParent.IsNull() && ! aSelParent->GetAssemblyOwner().IsNull())
142   {
143     SetAssemblyOwner (aSelParent->GetAssemblyOwner(), theMode);
144   }
145
146   aNewSel->UpdateStatus (SelectMgr_TOU_Partial);
147   aNewSel->UpdateBVHStatus (SelectMgr_TBU_Add);
148
149   myselections.Append (aNewSel);
150 }
151
152 //==================================================
153 // Function: ClearSelections
154 // Purpose :
155 //==================================================
156 void SelectMgr_SelectableObject::ClearSelections(const Standard_Boolean update)
157 {
158   for (Standard_Integer i =1; i<= myselections.Length(); i++ ) {
159     myselections.Value(i)->Clear();
160     myselections.Value (i)->UpdateBVHStatus (SelectMgr_TBU_Remove);
161     if(update)
162     {
163       myselections.Value(i)->UpdateStatus(SelectMgr_TOU_Full);
164     }
165   }
166 }
167
168
169 //==================================================
170 // Function: Selection
171 // Purpose :
172 //==================================================
173
174 const Handle(SelectMgr_Selection)& SelectMgr_SelectableObject
175 ::Selection(const Standard_Integer aMode) const
176 {
177   static Handle(SelectMgr_Selection) bidsel;
178   Standard_Boolean Found = Standard_False;
179   Standard_Integer Rank=0;
180   for (Standard_Integer i=1;i<=myselections.Length() && !Found;i++)
181     {
182       if((myselections.Value(i))->Mode()==aMode){ Found = Standard_True;
183                                                   Rank=i;}}
184   return myselections.Value(Rank);
185 }
186
187
188 //==================================================
189 // Function: AddSelection
190 // Purpose :
191 //==================================================
192
193 void SelectMgr_SelectableObject
194 ::AddSelection(const Handle(SelectMgr_Selection)& aSel,
195                const Standard_Integer aMode)
196 {
197   Standard_Boolean isReplaced = Standard_False;
198   if(aSel->IsEmpty())
199   {
200     ComputeSelection(aSel, aMode);
201     aSel->UpdateStatus(SelectMgr_TOU_Partial);
202     aSel->UpdateBVHStatus (SelectMgr_TBU_Add);
203   }
204   if (HasSelection(aMode))
205   {
206     const Handle(SelectMgr_Selection)& temp= Selection(aMode);
207     Standard_Integer I = Search(myselections,temp);
208     if(I!=0)
209     {
210       myselections.Remove(I);
211       isReplaced = Standard_True;
212     }
213   }
214
215   myselections.Append(aSel);
216   if (isReplaced)
217   {
218     myselections.Last()->UpdateBVHStatus (SelectMgr_TBU_Renew);
219   }
220
221   if (aMode == 0)
222   {
223     Handle(PrsMgr_PresentableObject) aPrsParent (Parent());
224     Handle(SelectMgr_SelectableObject) aSelParent = Handle(SelectMgr_SelectableObject)::DownCast (aPrsParent);
225     if (! aSelParent.IsNull() && ! aSelParent->GetAssemblyOwner().IsNull())
226     {
227       SetAssemblyOwner (aSelParent->GetAssemblyOwner(), aMode);
228     }
229   }
230 }
231
232
233
234 //=======================================================================
235 //function : ReSetTransformation
236 //purpose  : 
237 //=======================================================================
238 void SelectMgr_SelectableObject::ResetTransformation() 
239 {
240   for (Init(); More(); Next())
241   {
242     const Handle(SelectMgr_Selection) & aSel = CurrentSelection();
243     for (aSel->Init(); aSel->More(); aSel->Next())
244     {
245       aSel->UpdateStatus(SelectMgr_TOU_Partial);
246       aSel->UpdateBVHStatus (SelectMgr_TBU_None);
247     }
248   }
249
250   PrsMgr_PresentableObject::ResetTransformation();
251 }
252
253 //=======================================================================
254 //function : UpdateTransformation
255 //purpose  : 
256 //=======================================================================
257 void SelectMgr_SelectableObject::UpdateTransformation()
258 {
259   for (Init(); More(); Next())
260   {
261     CurrentSelection()->UpdateStatus (SelectMgr_TOU_Partial);
262   }
263
264   PrsMgr_PresentableObject::UpdateTransformation();
265 }
266
267 //=======================================================================
268 //function : UpdateTransformation
269 //purpose  : 
270 //=======================================================================
271 void SelectMgr_SelectableObject::UpdateTransformations(const Handle(SelectMgr_Selection)& Sel)
272 {
273   TopLoc_Location aSelfLocation (Transformation());
274   Handle(Select3D_SensitiveEntity) SE;
275   if(aSelfLocation.IsIdentity()) return;
276   for(Sel->Init();Sel->More();Sel->Next()){
277     SE =  Handle(Select3D_SensitiveEntity)::DownCast (Sel->Sensitive()->BaseSensitive());
278     if(!SE.IsNull()){
279       const Handle(SelectBasics_EntityOwner)& aEOwner = SE->OwnerId();
280       Handle(SelectMgr_EntityOwner) aMgrEO =
281                               Handle(SelectMgr_EntityOwner)::DownCast (aEOwner);
282       if (!aMgrEO.IsNull())
283         aMgrEO->SetLocation (aSelfLocation);
284     }
285   }
286 }
287
288 //=======================================================================
289 //function : HilightSelected
290 //purpose  : 
291 //=======================================================================
292 void SelectMgr_SelectableObject::HilightSelected 
293   ( const Handle(PrsMgr_PresentationManager3d)&,
294     const SelectMgr_SequenceOfOwner&)
295 {
296   Standard_NotImplemented::Raise ("SelectMgr_SelectableObject::HilightSelected");
297 }
298
299 //=======================================================================
300 //function : ClearSelected
301 //purpose  : 
302 //=======================================================================
303 void SelectMgr_SelectableObject::ClearSelected ()
304 {
305   if( !mySelectionPrs.IsNull() )
306     mySelectionPrs->Clear();
307 }
308
309 //=======================================================================
310 //function : HilightOwnerWithColor
311 //purpose  : 
312 //=======================================================================
313 void SelectMgr_SelectableObject::HilightOwnerWithColor 
314   ( const Handle(PrsMgr_PresentationManager3d)&,
315     const Quantity_NameOfColor,
316     const Handle(SelectMgr_EntityOwner)&)
317 {
318   Standard_NotImplemented::Raise ("SelectMgr_SelectableObject::HilightOwnerWithColor");
319 }
320
321 //=======================================================================
322 //function : MaxFaceNodes
323 //purpose  : 
324 //=======================================================================
325 Standard_Boolean SelectMgr_SelectableObject::IsAutoHilight () const
326 {
327   return myAutoHilight;
328 }
329
330 //=======================================================================
331 //function : MaxFaceNodes
332 //purpose  : 
333 //=======================================================================
334 void SelectMgr_SelectableObject::SetAutoHilight ( const Standard_Boolean newAutoHilight )
335 {
336   myAutoHilight = newAutoHilight;
337 }
338
339 //=======================================================================
340 //function : GetHilightPresentation
341 //purpose  : 
342 //=======================================================================
343 Handle(Prs3d_Presentation) SelectMgr_SelectableObject::GetHilightPresentation( const Handle(PrsMgr_PresentationManager3d)& TheMgr )
344 {
345   if( myHilightPrs.IsNull() && !TheMgr.IsNull() )
346     {
347       myHilightPrs = new Prs3d_Presentation( TheMgr->StructureManager() );
348       myHilightPrs->SetTransformPersistence( GetTransformPersistenceMode(), 
349                                          GetTransformPersistencePoint() );
350     }
351
352   return myHilightPrs;
353 }
354
355
356 //=======================================================================
357 //function : GetSelectPresentation
358 //purpose  : 
359 //=======================================================================
360 Handle(Prs3d_Presentation) SelectMgr_SelectableObject::GetSelectPresentation( const Handle(PrsMgr_PresentationManager3d)& TheMgr )
361 {
362   if( mySelectionPrs.IsNull() && !TheMgr.IsNull() ) {
363     mySelectionPrs = new Prs3d_Presentation( TheMgr->StructureManager() );
364     mySelectionPrs->SetTransformPersistence( GetTransformPersistenceMode(), 
365                                              GetTransformPersistencePoint() );
366   }
367   return mySelectionPrs;
368 }
369
370 //=======================================================================
371 //function : SetZLayer
372 //purpose  :
373 //=======================================================================
374 void SelectMgr_SelectableObject::SetZLayer (const Graphic3d_ZLayerId theLayerId)
375 {
376   // update own presentations
377   PrsMgr_PresentableObject::SetZLayer (theLayerId);
378
379   // update selection presentations
380   if (!mySelectionPrs.IsNull())
381     mySelectionPrs->SetZLayer (theLayerId);
382
383   if (!myHilightPrs.IsNull())
384     myHilightPrs->SetZLayer (theLayerId);
385
386   // update all entity owner presentations
387   for (Init (); More () ;Next ())
388   {
389     const Handle(SelectMgr_Selection)& aSel = CurrentSelection();
390     for (aSel->Init (); aSel->More (); aSel->Next ())
391     {
392       Handle(Select3D_SensitiveEntity) aEntity = 
393         Handle(Select3D_SensitiveEntity)::DownCast (aSel->Sensitive()->BaseSensitive());
394       if (!aEntity.IsNull())
395       {
396         Handle(SelectMgr_EntityOwner) aOwner = 
397           Handle(SelectMgr_EntityOwner)::DownCast (aEntity->OwnerId());
398         if (!aOwner.IsNull())
399           aOwner->SetZLayer (theLayerId);
400       }
401     }
402   }
403 }
404
405 //=======================================================================
406 //function : UpdateSelection
407 //purpose  : Sets update status FULL to selections of the object. Must be
408 //           used as the only method of UpdateSelection from outer classes
409 //           to prevent BVH structures from being outdated.
410 //=======================================================================
411 void SelectMgr_SelectableObject::UpdateSelection (const Standard_Integer theMode)
412 {
413   if (theMode == -1)
414   {
415     for (Init(); More(); Next())
416     {
417       const Handle(SelectMgr_Selection)& aSel = CurrentSelection();
418       aSel->UpdateStatus (SelectMgr_TOU_Full);
419     }
420
421     return;
422   }
423
424   for (Init(); More(); Next())
425   {
426     if (CurrentSelection()->Mode() == theMode)
427     {
428       CurrentSelection()->UpdateStatus (SelectMgr_TOU_Full);
429       return;
430     }
431   }
432 }
433
434 //=======================================================================
435 //function : SetAttributes
436 //purpose  : 
437 //=======================================================================
438 void SelectMgr_SelectableObject::SetAttributes (const Handle(Prs3d_Drawer)& theDrawer)
439 {
440   myDrawer = theDrawer;
441 }
442
443 //=======================================================================
444 //function : UnsetAttributes
445 //purpose  : 
446 //=======================================================================
447 void SelectMgr_SelectableObject::UnsetAttributes()
448 {
449   Handle(Prs3d_Drawer) aDrawer = new Prs3d_Drawer();
450   if (myDrawer->HasLink())
451   {
452     aDrawer->Link (myDrawer->Link());
453   }
454   myDrawer = aDrawer;
455 }
456
457 //=======================================================================
458 //function : SetHilightAttributes
459 //purpose  :
460 //=======================================================================
461 void SelectMgr_SelectableObject::SetHilightAttributes (const Handle(Prs3d_Drawer)& theDrawer)
462 {
463   myHilightDrawer = theDrawer;
464 }
465
466 //=======================================================================
467 //function : UnsetAttributes
468 //purpose  :
469 //=======================================================================
470 void SelectMgr_SelectableObject::UnsetHilightAttributes()
471 {
472   Handle(Prs3d_Drawer) aDrawer = new Prs3d_Drawer();
473   InitDefaultHilightAttributes (aDrawer);
474   aDrawer->Link (myDrawer);
475   myHilightDrawer = aDrawer;
476 }
477
478 //=======================================================================
479 //function : InitDefaultHilightAttributes
480 //purpose  :
481 //=======================================================================
482 void SelectMgr_SelectableObject::InitDefaultHilightAttributes (const Handle(Prs3d_Drawer)& theDrawer)
483 {
484   if (!theDrawer->HasOwnPointAspect())
485   {
486     theDrawer->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_POINT, Quantity_NOC_BLACK, 1.0));
487     if (theDrawer->HasLink())
488     {
489       *theDrawer->PointAspect()->Aspect() = *theDrawer->Link()->PointAspect()->Aspect();
490     }
491   }
492   if (!theDrawer->HasOwnLineAspect())
493   {
494     theDrawer->SetLineAspect  (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
495     if (theDrawer->HasLink())
496     {
497       *theDrawer->LineAspect()->Aspect() = *theDrawer->Link()->LineAspect()->Aspect();
498     }
499   }
500   if (!theDrawer->HasOwnWireAspect())
501   {
502     theDrawer->SetWireAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
503     if (theDrawer->HasLink())
504     {
505       *theDrawer->WireAspect()->Aspect() = *theDrawer->Link()->WireAspect()->Aspect();
506     }
507   }
508   if (!theDrawer->HasOwnPlaneAspect())
509   {
510     theDrawer->SetPlaneAspect (new Prs3d_PlaneAspect());
511     if (theDrawer->HasLink())
512     {
513       *theDrawer->PlaneAspect()->EdgesAspect() = *theDrawer->Link()->PlaneAspect()->EdgesAspect();
514     }
515   }
516   if (!theDrawer->HasOwnFreeBoundaryAspect())
517   {
518     theDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
519     if (theDrawer->HasLink())
520     {
521       *theDrawer->FreeBoundaryAspect()->Aspect() = *theDrawer->Link()->FreeBoundaryAspect()->Aspect();
522     }
523   }
524   if (!theDrawer->HasOwnUnFreeBoundaryAspect())
525   {
526     theDrawer->SetUnFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
527     if (theDrawer->HasLink())
528     {
529       *theDrawer->UnFreeBoundaryAspect()->Aspect() = *theDrawer->Link()->UnFreeBoundaryAspect()->Aspect();
530     }
531   }
532
533   theDrawer->WireAspect()->SetWidth(2.);
534   theDrawer->LineAspect()->SetWidth(2.);
535   theDrawer->PlaneAspect()->EdgesAspect()->SetWidth(2.);
536   theDrawer->FreeBoundaryAspect()->SetWidth(2.);
537   theDrawer->UnFreeBoundaryAspect()->SetWidth(2.);
538   theDrawer->PointAspect()->SetTypeOfMarker(Aspect_TOM_O_POINT);
539   theDrawer->PointAspect()->SetScale(2.);
540
541   // By default the hilight drawer has absolute type of deflection.
542   // It is supposed that absolute deflection is taken from Link().
543   // It is necessary to use for all sub-shapes identical coefficient
544   // computed in ::Compute() call for whole shape and stored in base drawer.
545   theDrawer->SetTypeOfDeflection (Aspect_TOD_ABSOLUTE);
546 }
547
548 //=======================================================================
549 //function : SetAssemblyOwner
550 //purpose  : Sets common entity owner for assembly sensitive object entities
551 //=======================================================================
552 void SelectMgr_SelectableObject::SetAssemblyOwner (const Handle(SelectMgr_EntityOwner)& theOwner,
553                                                    const Standard_Integer theMode)
554 {
555   if (theMode == -1)
556   {
557     for (Standard_Integer aModeIter = 1; aModeIter <= myselections.Length(); ++aModeIter)
558     {
559       Handle(SelectMgr_Selection)& aSel = myselections.ChangeValue (aModeIter);
560       for (aSel->Init(); aSel->More(); aSel->Next())
561       {
562         aSel->Sensitive()->BaseSensitive()->Set (theOwner);
563       }
564     }
565
566     return;
567   }
568
569   if (!HasSelection (theMode))
570     return;
571
572   for (Standard_Integer aModeIter = 1; aModeIter <= myselections.Length(); ++aModeIter)
573   {
574     if (myselections.Value (aModeIter)->Mode() == theMode)
575     {
576       Handle(SelectMgr_Selection)& aSel = myselections.ChangeValue (aModeIter);
577       for (aSel->Init(); aSel->More(); aSel->Next())
578       {
579         aSel->Sensitive()->BaseSensitive()->Set (theOwner);
580       }
581       return;
582     }
583   }
584 }
585
586 //=======================================================================
587 //function : GetAssemblyOwner
588 //purpose  : Returns common entity owner if it is an assembly
589 //=======================================================================
590 const Handle(SelectMgr_EntityOwner)& SelectMgr_SelectableObject::GetAssemblyOwner() const
591 {
592   return myAssemblyOwner;
593 }
594
595 //=======================================================================
596 //function : BndBoxOfSelected
597 //purpose  : Returns a bounding box of sensitive entities with the owners given
598 //           if they are a part of activated selection
599 //=======================================================================
600 Bnd_Box SelectMgr_SelectableObject::BndBoxOfSelected (Handle(SelectMgr_IndexedMapOfOwner)& theOwners)
601 {
602   Bnd_Box aBnd;
603
604   if (theOwners->IsEmpty())
605     return aBnd;
606
607   for (Init(); More(); Next())
608   {
609     const Handle(SelectMgr_Selection)& aSel = CurrentSelection();
610     if (aSel->GetSelectionState() != SelectMgr_SOS_Activated)
611       continue;
612
613     for (aSel->Init(); aSel->More(); aSel->Next())
614     {
615       const Handle(SelectMgr_EntityOwner) anOwner =
616         Handle(SelectMgr_EntityOwner)::DownCast (aSel->Sensitive()->BaseSensitive()->OwnerId());
617       if (theOwners->Contains (anOwner))
618       {
619         Select3D_BndBox3d aBox = aSel->Sensitive()->BaseSensitive()->BoundingBox();
620         Bnd_Box aTmpBnd;
621         aTmpBnd.Update (aBox.CornerMin().x(), aBox.CornerMin().y(), aBox.CornerMin().z(),
622                         aBox.CornerMax().x(), aBox.CornerMax().y(), aBox.CornerMax().z());
623         aBnd.Add (aTmpBnd);
624
625         Standard_Integer anOwnerIdx = theOwners->FindIndex (anOwner);
626         if (theOwners->Size() != anOwnerIdx)
627         {
628           theOwners->Swap (anOwnerIdx, theOwners->Size());
629         }
630         theOwners->RemoveLast();
631
632         if (theOwners->IsEmpty())
633           return aBnd;
634       }
635     }
636   }
637
638   return aBnd;
639 }
640
641 //=======================================================================
642 //function : GlobalSelOwner
643 //purpose  : Returns entity owner corresponding to selection of the object as a whole
644 //=======================================================================
645 Handle(SelectMgr_EntityOwner) SelectMgr_SelectableObject::GlobalSelOwner() const
646 {
647    Handle(SelectMgr_EntityOwner) anOwner;
648
649   if (!HasSelection (myGlobalSelMode))
650     return anOwner;
651
652   const Handle(SelectMgr_Selection)& aGlobalSel = Selection (myGlobalSelMode);
653   if (aGlobalSel->IsEmpty())
654     return anOwner;
655
656   aGlobalSel->Init();
657   anOwner =
658     Handle(SelectMgr_EntityOwner)::DownCast (aGlobalSel->Sensitive()->BaseSensitive()->OwnerId());
659
660   return anOwner;
661 }