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