// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
-#include <Standard_NotImplemented.hxx>
-
-#include <SelectMgr_SelectableObject.ixx>
-#include <Standard_NoSuchObject.hxx>
-#include <SelectMgr_Selection.hxx>
+#include <SelectMgr_SelectableObject.hxx>
+
+#include <Graphic3d_AspectLine3d.hxx>
+#include <Graphic3d_AspectMarker3d.hxx>
+#include <Prs3d_Drawer.hxx>
+#include <Prs3d_LineAspect.hxx>
+#include <Prs3d_PlaneAspect.hxx>
+#include <Prs3d_PointAspect.hxx>
+#include <Prs3d_Presentation.hxx>
+#include <PrsMgr_PresentationManager.hxx>
#include <Select3D_SensitiveEntity.hxx>
-#include <SelectBasics_EntityOwner.hxx>
#include <SelectMgr_EntityOwner.hxx>
-#include <PrsMgr_PresentationManager3d.hxx>
-
+#include <SelectMgr_IndexedMapOfOwner.hxx>
+#include <SelectMgr_Selection.hxx>
+#include <SelectMgr_SelectionManager.hxx>
+#include <Standard_NoSuchObject.hxx>
+#include <Standard_NotImplemented.hxx>
#include <TopLoc_Location.hxx>
-#include <gp_Pnt.hxx>
-
-static Standard_Integer Search (const SelectMgr_SequenceOfSelection& seq,
- const Handle (SelectMgr_Selection)& theSel)
-{
- Standard_Integer ifound=0;
- for (Standard_Integer i=1;i<=seq.Length()&& ifound==0;i++)
- {if(theSel == seq.Value(i)) ifound=i;}
- return ifound;
-}
+IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_SelectableObject,PrsMgr_PresentableObject)
+namespace
+{
+ static const Handle(SelectMgr_Selection) THE_NULL_SELECTION;
+ static const Handle(SelectMgr_EntityOwner) THE_NULL_ENTITYOWNER;
+}
//==================================================
-// Function:
+// Function: SelectMgr_SelectableObject
// Purpose :
//==================================================
-SelectMgr_SelectableObject::SelectMgr_SelectableObject( const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d):PrsMgr_PresentableObject(aTypeOfPresentation3d)
+SelectMgr_SelectableObject::SelectMgr_SelectableObject (const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d)
+: PrsMgr_PresentableObject (aTypeOfPresentation3d),
+ myGlobalSelMode (0),
+ myAutoHilight (Standard_True)
{
- myAutoHilight = Standard_True;
+ //
}
-
//==================================================
-// Function:
-// Purpose :
+// Function: Destructor
+// Purpose : Clears all selections of the object
//==================================================
-
-Standard_Boolean SelectMgr_SelectableObject
-::HasSelection(const Standard_Integer aMode) const
+SelectMgr_SelectableObject::~SelectMgr_SelectableObject()
{
- Standard_Boolean Found=Standard_False;
- for (Standard_Integer I=1;I<= myselections.Length() && !Found;I++)
- { if(((myselections.Value(I))->Mode())==aMode)
- return Standard_True;
- }
- return Standard_False;
+ for (SelectMgr_SequenceOfSelection::Iterator aSelIter (myselections); aSelIter.More(); aSelIter.Next())
+ {
+ aSelIter.Value()->Clear();
+ }
}
//==================================================
-// Function: UpdateSelection
-// Purpose :
+// Function: RecomputePrimitives
+// Purpose : IMPORTANT: Do not use this method to update
+// selection primitives except implementing custom
+// selection manager! This method does not take
+// into account necessary BVH updates, but may
+// invalidate the pointers it refers to.
+// TO UPDATE SELECTION properly from outside classes,
+// use method UpdateSelection.
//==================================================
-void SelectMgr_SelectableObject::UpdateSelection()
+void SelectMgr_SelectableObject::RecomputePrimitives()
{
- for (Standard_Integer I=1;I<=myselections.Length();I++)
- {
- UpdateSelection(myselections.ChangeValue(I)->Mode());
- }
+ for (SelectMgr_SequenceOfSelection::Iterator aSelIter (myselections); aSelIter.More(); aSelIter.Next())
+ {
+ RecomputePrimitives (aSelIter.Value()->Mode());
+ }
}
-Standard_Integer SelectMgr_SelectableObject::NbPossibleSelection() const
-{return 0;}
-
//==================================================
-// Function: UpdateSelection
-// Purpose :
+// Function: RecomputePrimitives
+// Purpose : IMPORTANT: Do not use this method to update
+// selection primitives except implementing custom
+// selection manager! This method does not take
+// into account necessary BVH updates, but may
+// invalidate the pointers it refers to.
+// TO UPDATE SELECTION properly from outside classes,
+// use method UpdateSelection.
//==================================================
-void SelectMgr_SelectableObject::UpdateSelection(const Standard_Integer aMode)
+void SelectMgr_SelectableObject::RecomputePrimitives (const Standard_Integer theMode)
{
- for (Standard_Integer i =1; i<= myselections.Length(); i++ ) {
- if (myselections.Value(i)->Mode() == aMode) {
- myselections(i)->Clear();
- ComputeSelection(myselections(i),aMode);
- myselections(i)->UpdateStatus(SelectMgr_TOU_Partial);
+ SelectMgr_SelectableObject* aSelParent = dynamic_cast<SelectMgr_SelectableObject* > (Parent());
+ for (SelectMgr_SequenceOfSelection::Iterator aSelIter (myselections); aSelIter.More(); aSelIter.Next())
+ {
+ const Handle(SelectMgr_Selection)& aSel = aSelIter.Value();
+ if (aSel->Mode() == theMode)
+ {
+ aSel->Clear();
+ ComputeSelection (aSel, theMode);
+ aSel->UpdateStatus (SelectMgr_TOU_Partial);
+ aSel->UpdateBVHStatus (SelectMgr_TBU_Renew);
+ if (theMode == 0 && aSelParent != NULL)
+ {
+ if (const Handle(SelectMgr_EntityOwner)& anAsmOwner = aSelParent->GetAssemblyOwner())
+ {
+ SetAssemblyOwner (anAsmOwner, theMode);
+ }
+ }
return;
}
}
- Handle(SelectMgr_Selection) S = new SelectMgr_Selection(aMode);
- ComputeSelection(S,aMode);
- S->UpdateStatus(SelectMgr_TOU_Partial);
-
- myselections.Append(S);
-
+
+ Handle(SelectMgr_Selection) aNewSel = new SelectMgr_Selection (theMode);
+ ComputeSelection (aNewSel, theMode);
+
+ if (theMode == 0 && aSelParent != NULL)
+ {
+ if (const Handle(SelectMgr_EntityOwner)& anAsmOwner = aSelParent->GetAssemblyOwner())
+ {
+ SetAssemblyOwner (anAsmOwner, theMode);
+ }
+ }
+
+ aNewSel->UpdateStatus (SelectMgr_TOU_Partial);
+ aNewSel->UpdateBVHStatus (SelectMgr_TBU_Add);
+
+ myselections.Append (aNewSel);
}
//==================================================
// Function: ClearSelections
// Purpose :
//==================================================
-void SelectMgr_SelectableObject::ClearSelections(const Standard_Boolean update)
+void SelectMgr_SelectableObject::ClearSelections (const Standard_Boolean theToUpdate)
{
- for (Standard_Integer i =1; i<= myselections.Length(); i++ ) {
- myselections.Value(i)->Clear();
- if(update)
- myselections.Value(i)->UpdateStatus(SelectMgr_TOU_Full);
+ for (SelectMgr_SequenceOfSelection::Iterator aSelIter (myselections); aSelIter.More(); aSelIter.Next())
+ {
+ const Handle(SelectMgr_Selection)& aSel = aSelIter.Value();
+ aSel->Clear();
+ aSel->UpdateBVHStatus (SelectMgr_TBU_Remove);
+ if (theToUpdate)
+ {
+ aSel->UpdateStatus (SelectMgr_TOU_Full);
+ }
}
}
// Purpose :
//==================================================
-const Handle(SelectMgr_Selection)& SelectMgr_SelectableObject
-::Selection(const Standard_Integer aMode) const
+const Handle(SelectMgr_Selection)& SelectMgr_SelectableObject::Selection (const Standard_Integer theMode) const
{
- static Handle(SelectMgr_Selection) bidsel;
- Standard_Boolean Found = Standard_False;
- Standard_Integer Rank=0;
- for (Standard_Integer i=1;i<=myselections.Length() && !Found;i++)
+ if (theMode == -1)
+ {
+ return THE_NULL_SELECTION;
+ }
+
+ for (SelectMgr_SequenceOfSelection::Iterator aSelIter (myselections); aSelIter.More(); aSelIter.Next())
+ {
+ const Handle(SelectMgr_Selection)& aSel = aSelIter.Value();
+ if (aSel->Mode() == theMode)
{
- if((myselections.Value(i))->Mode()==aMode){ Found = Standard_True;
- Rank=i;}}
- return myselections.Value(Rank);
+ return aSel;
+ }
+ }
+ return THE_NULL_SELECTION;
}
-
//==================================================
// Function: AddSelection
// Purpose :
//==================================================
-void SelectMgr_SelectableObject
-::AddSelection(const Handle(SelectMgr_Selection)& aSel,
- const Standard_Integer aMode)
+void SelectMgr_SelectableObject::AddSelection (const Handle(SelectMgr_Selection)& theSel,
+ const Standard_Integer theMode)
{
- if(aSel->IsEmpty()){
- ComputeSelection(aSel,aMode);
- aSel->UpdateStatus(SelectMgr_TOU_Partial);
+ if(theSel->IsEmpty())
+ {
+ ComputeSelection(theSel, theMode);
+ theSel->UpdateStatus(SelectMgr_TOU_Partial);
+ theSel->UpdateBVHStatus (SelectMgr_TBU_Add);
}
- if(HasSelection(aMode))
+
+ Standard_Boolean isReplaced = Standard_False;
+ for (SelectMgr_SequenceOfSelection::Iterator aSelIter (myselections); aSelIter.More(); aSelIter.Next())
+ {
+ if (aSelIter.Value()->Mode() == theMode)
{
- const Handle(SelectMgr_Selection)& temp= Selection(aMode);
- Standard_Integer I = Search(myselections,temp);
- if(I!=0) myselections.Remove(I);
+ isReplaced = Standard_True;
+ myselections.Remove (aSelIter);
+ break;
}
- myselections.Append(aSel);
-
-}
+ }
+ myselections.Append (theSel);
+ if (isReplaced)
+ {
+ myselections.Last()->UpdateBVHStatus (SelectMgr_TBU_Renew);
+ }
+ if (theMode == 0)
+ {
+ SelectMgr_SelectableObject* aSelParent = dynamic_cast<SelectMgr_SelectableObject* > (Parent());
+ if (aSelParent != NULL)
+ {
+ if (const Handle(SelectMgr_EntityOwner)& anAsmOwner = aSelParent->GetAssemblyOwner())
+ {
+ SetAssemblyOwner (anAsmOwner, theMode);
+ }
+ }
+ }
+}
//=======================================================================
//function : ReSetTransformation
-//purpose :
+//purpose :
//=======================================================================
void SelectMgr_SelectableObject::ResetTransformation()
{
- TopLoc_Location aLoc;
-
- TopLoc_Location aSelfLocation (Transformation());
-
- // les selections
- Handle(Select3D_SensitiveEntity) SE;
- for(Init();More();Next()){
- const Handle(SelectMgr_Selection) & Sel = CurrentSelection();
- for(Sel->Init();Sel->More();Sel->Next()){
- SE = *((Handle(Select3D_SensitiveEntity)*) &(Sel->Sensitive()));
- if(!SE.IsNull()){
- if(SE->HasLocation()) {
- if( SE->Location()==aSelfLocation){
- SE->ResetLocation();
- const Handle(SelectBasics_EntityOwner)& EO = SE->OwnerId();
- (*((Handle(SelectMgr_EntityOwner)*)&EO))->ResetLocation();}
- else{
- const TopLoc_Location& iniloc =SE->Location();
- SE->SetLocation(iniloc*aSelfLocation.Inverted());
- const Handle(SelectBasics_EntityOwner)& EO = SE->OwnerId();
- (*((Handle(SelectMgr_EntityOwner)*)&EO))->SetLocation(SE->Location());}
- }
- }
- }
- Sel->UpdateStatus(SelectMgr_TOU_None);
+ for (SelectMgr_SequenceOfSelection::Iterator aSelIter (myselections); aSelIter.More(); aSelIter.Next())
+ {
+ const Handle(SelectMgr_Selection)& aSel = aSelIter.Value();
+ aSel->UpdateStatus (SelectMgr_TOU_Partial);
+ aSel->UpdateBVHStatus (SelectMgr_TBU_None);
}
PrsMgr_PresentableObject::ResetTransformation();
}
-
//=======================================================================
//function : UpdateTransformation
-//purpose :
+//purpose :
//=======================================================================
-void SelectMgr_SelectableObject::UpdateTransformation()
+void SelectMgr_SelectableObject::UpdateTransformation()
{
-
- Handle(Select3D_SensitiveEntity) SE;
- for(Init();More();Next()){
- const Handle(SelectMgr_Selection) & Sel = CurrentSelection();
- Sel->UpdateStatus(SelectMgr_TOU_Partial);
+ for (SelectMgr_SequenceOfSelection::Iterator aSelIter (myselections); aSelIter.More(); aSelIter.Next())
+ {
+ aSelIter.Value()->UpdateStatus (SelectMgr_TOU_Partial);
}
- PrsMgr_PresentableObject::UpdateTransformation();
+ PrsMgr_PresentableObject::UpdateTransformation();
+ if (!mySelectionPrs.IsNull())
+ {
+ mySelectionPrs->SetTransformation (TransformationGeom());
+ }
+ if (!myHilightPrs.IsNull())
+ {
+ myHilightPrs->SetTransformation (TransformationGeom());
+ }
}
-
//=======================================================================
//function : UpdateTransformation
-//purpose :
+//purpose :
//=======================================================================
-void SelectMgr_SelectableObject::UpdateTransformations(const Handle(SelectMgr_Selection)& Sel)
+void SelectMgr_SelectableObject::UpdateTransformations (const Handle(SelectMgr_Selection)& theSel)
{
- TopLoc_Location aSelfLocation (Transformation());
- Handle(Select3D_SensitiveEntity) SE;
- if(aSelfLocation.IsIdentity()) return;
- for(Sel->Init();Sel->More();Sel->Next()){
- SE = *((Handle(Select3D_SensitiveEntity)*) &(Sel->Sensitive()));
- if(!SE.IsNull()){
- SE->UpdateLocation(aSelfLocation);
- const Handle(SelectBasics_EntityOwner)& aEOwner = SE->OwnerId();
- Handle(SelectMgr_EntityOwner) aMgrEO =
- Handle(SelectMgr_EntityOwner)::DownCast (aEOwner);
- if (!aMgrEO.IsNull())
- aMgrEO->SetLocation (aSelfLocation);
+ const TopLoc_Location aSelfLocation (Transformation());
+ for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator aSelEntIter (theSel->Entities()); aSelEntIter.More(); aSelEntIter.Next())
+ {
+ if (const Handle(Select3D_SensitiveEntity)& aSensEntity = aSelEntIter.Value()->BaseSensitive())
+ {
+ if (const Handle(SelectMgr_EntityOwner)& aEOwner = aSensEntity->OwnerId())
+ {
+ aEOwner->SetLocation (aSelfLocation);
+ }
}
}
}
//=======================================================================
//function : HilightSelected
-//purpose :
+//purpose :
//=======================================================================
-void SelectMgr_SelectableObject::HilightSelected
- ( const Handle(PrsMgr_PresentationManager3d)&,
- const SelectMgr_SequenceOfOwner&)
+void SelectMgr_SelectableObject::HilightSelected (const Handle(PrsMgr_PresentationManager)&,
+ const SelectMgr_SequenceOfOwner&)
{
- Standard_NotImplemented::Raise ("SelectMgr_SelectableObject::HilightSelected");
+ throw Standard_NotImplemented("SelectMgr_SelectableObject::HilightSelected");
}
//=======================================================================
//function : ClearSelected
-//purpose :
+//purpose :
//=======================================================================
-void SelectMgr_SelectableObject::ClearSelected ()
+void SelectMgr_SelectableObject::ClearSelected()
{
- if( !mySelectionPrs.IsNull() )
+ if(!mySelectionPrs.IsNull())
+ {
mySelectionPrs->Clear();
+ }
}
//=======================================================================
-//function : HilightOwnerWithColor
-//purpose :
+//function : ClearDynamicHighlight
+//purpose :
//=======================================================================
-void SelectMgr_SelectableObject::HilightOwnerWithColor
- ( const Handle(PrsMgr_PresentationManager3d)&,
- const Quantity_NameOfColor,
- const Handle(SelectMgr_EntityOwner)&)
+void SelectMgr_SelectableObject::ClearDynamicHighlight (const Handle(PrsMgr_PresentationManager)& theMgr)
{
- Standard_NotImplemented::Raise ("SelectMgr_SelectableObject::HilightOwnerWithColor");
+ theMgr->ClearImmediateDraw();
}
//=======================================================================
-//function : MaxFaceNodes
-//purpose :
+//function : HilightOwnerWithColor
+//purpose :
//=======================================================================
-Standard_Boolean SelectMgr_SelectableObject::IsAutoHilight () const
+void SelectMgr_SelectableObject::HilightOwnerWithColor (const Handle(PrsMgr_PresentationManager)&,
+ const Handle(Prs3d_Drawer)&,
+ const Handle(SelectMgr_EntityOwner)&)
{
- return myAutoHilight;
+ throw Standard_NotImplemented("SelectMgr_SelectableObject::HilightOwnerWithColor");
}
//=======================================================================
-//function : MaxFaceNodes
-//purpose :
+//function : GetHilightPresentation
+//purpose :
//=======================================================================
-void SelectMgr_SelectableObject::SetAutoHilight ( const Standard_Boolean newAutoHilight )
+Handle(Prs3d_Presentation) SelectMgr_SelectableObject::GetHilightPresentation (const Handle(PrsMgr_PresentationManager)& theMgr)
{
- myAutoHilight = newAutoHilight;
+ if (myHilightPrs.IsNull() && !theMgr.IsNull())
+ {
+ myHilightPrs = new Prs3d_Presentation (theMgr->StructureManager());
+ myHilightPrs->SetTransformPersistence (TransformPersistence());
+ myHilightPrs->SetClipPlanes (myClipPlanes);
+ myHilightPrs->SetTransformation (TransformationGeom());
+ }
+
+ return myHilightPrs;
}
//=======================================================================
-//function : GetHilightPresentation
-//purpose :
+//function : GetSelectPresentation
+//purpose :
//=======================================================================
-Handle(Prs3d_Presentation) SelectMgr_SelectableObject::GetHilightPresentation( const Handle(PrsMgr_PresentationManager3d)& TheMgr )
+Handle(Prs3d_Presentation) SelectMgr_SelectableObject::GetSelectPresentation (const Handle(PrsMgr_PresentationManager)& theMgr)
{
- if( myHilightPrs.IsNull() && !TheMgr.IsNull() )
- {
- myHilightPrs = new Prs3d_Presentation( TheMgr->StructureManager() );
- myHilightPrs->SetTransformPersistence( GetTransformPersistenceMode(),
- GetTransformPersistencePoint() );
- }
+ if (mySelectionPrs.IsNull() && !theMgr.IsNull())
+ {
+ mySelectionPrs = new Prs3d_Presentation (theMgr->StructureManager());
+ mySelectionPrs->SetTransformPersistence (TransformPersistence());
+ mySelectionPrs->SetClipPlanes (myClipPlanes);
+ mySelectionPrs->SetTransformation (TransformationGeom());
+ }
- return myHilightPrs;
+ return mySelectionPrs;
}
-
//=======================================================================
-//function : GetSelectPresentation
-//purpose :
+//function : ErasePresentations
+//purpose :
//=======================================================================
-Handle(Prs3d_Presentation) SelectMgr_SelectableObject::GetSelectPresentation( const Handle(PrsMgr_PresentationManager3d)& TheMgr )
+void SelectMgr_SelectableObject::ErasePresentations (Standard_Boolean theToRemove)
{
- if( mySelectionPrs.IsNull() && !TheMgr.IsNull() ) {
- mySelectionPrs = new Prs3d_Presentation( TheMgr->StructureManager() );
- mySelectionPrs->SetTransformPersistence( GetTransformPersistenceMode(),
- GetTransformPersistencePoint() );
+ if (!mySelectionPrs.IsNull())
+ {
+ mySelectionPrs->Erase();
+ if (theToRemove)
+ {
+ mySelectionPrs->Clear();
+ mySelectionPrs.Nullify();
+ }
+ }
+ if (!myHilightPrs.IsNull())
+ {
+ myHilightPrs->Erase();
+ if (theToRemove)
+ {
+ myHilightPrs->Clear();
+ myHilightPrs.Nullify();
+ }
}
- return mySelectionPrs;
}
//=======================================================================
//function : SetZLayer
//purpose :
//=======================================================================
-void SelectMgr_SelectableObject::SetZLayer
- (const Handle(PrsMgr_PresentationManager)& thePrsMgr,
- const Standard_Integer theLayerId)
+void SelectMgr_SelectableObject::SetZLayer (const Graphic3d_ZLayerId theLayerId)
{
- if (thePrsMgr.IsNull())
- return;
-
// update own presentations
- PrsMgr_PresentableObject::SetZLayer (thePrsMgr, theLayerId);
+ PrsMgr_PresentableObject::SetZLayer (theLayerId);
// update selection presentations
if (!mySelectionPrs.IsNull())
myHilightPrs->SetZLayer (theLayerId);
// update all entity owner presentations
- for (Init (); More () ;Next ())
+ for (SelectMgr_SequenceOfSelection::Iterator aSelIter (myselections); aSelIter.More(); aSelIter.Next())
+ {
+ const Handle(SelectMgr_Selection)& aSel = aSelIter.Value();
+ for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator aSelEntIter (aSel->Entities()); aSelEntIter.More(); aSelEntIter.Next())
+ {
+ if (const Handle(Select3D_SensitiveEntity)& aEntity = aSelEntIter.Value()->BaseSensitive())
+ {
+ if (const Handle(SelectMgr_EntityOwner)& aOwner = aEntity->OwnerId())
+ {
+ aOwner->SetZLayer (theLayerId);
+ }
+ }
+ }
+ }
+}
+
+//=======================================================================
+//function : UpdateClipping
+//purpose :
+//=======================================================================
+void SelectMgr_SelectableObject::UpdateClipping()
+{
+ PrsMgr_PresentableObject::UpdateClipping();
+ if (!mySelectionPrs.IsNull())
+ {
+ mySelectionPrs->SetClipPlanes (myClipPlanes);
+ }
+ if (!myHilightPrs.IsNull())
+ {
+ myHilightPrs->SetClipPlanes (myClipPlanes);
+ }
+}
+
+//=======================================================================
+//function : updateSelection
+//purpose : Sets update status FULL to selections of the object. Must be
+// used as the only method of UpdateSelection from outer classes
+// to prevent BVH structures from being outdated.
+//=======================================================================
+void SelectMgr_SelectableObject::updateSelection (const Standard_Integer theMode)
+{
+ if (theMode == -1)
+ {
+ for (SelectMgr_SequenceOfSelection::Iterator aSelIter (myselections); aSelIter.More(); aSelIter.Next())
+ {
+ const Handle(SelectMgr_Selection)& aSel = aSelIter.Value();
+ aSel->UpdateStatus (SelectMgr_TOU_Full);
+ }
+ return;
+ }
+
+ for (SelectMgr_SequenceOfSelection::Iterator aSelIter (myselections); aSelIter.More(); aSelIter.Next())
+ {
+ const Handle(SelectMgr_Selection)& aSel = aSelIter.Value();
+ if (aSel->Mode() == theMode)
+ {
+ aSel->UpdateStatus (SelectMgr_TOU_Full);
+ return;
+ }
+ }
+}
+
+//=======================================================================
+//function : SetAssemblyOwner
+//purpose : Sets common entity owner for assembly sensitive object entities
+//=======================================================================
+void SelectMgr_SelectableObject::SetAssemblyOwner (const Handle(SelectMgr_EntityOwner)& theOwner,
+ const Standard_Integer theMode)
+{
+ if (theMode == -1)
+ {
+ for (SelectMgr_SequenceOfSelection::Iterator aSelIter (myselections); aSelIter.More(); aSelIter.Next())
+ {
+ const Handle(SelectMgr_Selection)& aSel = aSelIter.Value();
+ for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator aSelEntIter (aSel->Entities()); aSelEntIter.More(); aSelEntIter.Next())
+ {
+ aSelEntIter.Value()->BaseSensitive()->Set (theOwner);
+ }
+ }
+ return;
+ }
+
+ for (SelectMgr_SequenceOfSelection::Iterator aSelIter (myselections); aSelIter.More(); aSelIter.Next())
+ {
+ const Handle(SelectMgr_Selection)& aSel = aSelIter.Value();
+ if (aSel->Mode() == theMode)
+ {
+ for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator aSelEntIter (aSel->Entities()); aSelEntIter.More(); aSelEntIter.Next())
+ {
+ aSelEntIter.Value()->BaseSensitive()->Set (theOwner);
+ }
+ return;
+ }
+ }
+}
+
+//=======================================================================
+//function : BndBoxOfSelected
+//purpose :
+//=======================================================================
+Bnd_Box SelectMgr_SelectableObject::BndBoxOfSelected (const Handle(SelectMgr_IndexedMapOfOwner)& theOwners)
+{
+ if (theOwners->IsEmpty())
+ return Bnd_Box();
+
+ Bnd_Box aBnd;
+ for (SelectMgr_SequenceOfSelection::Iterator aSelIter (myselections); aSelIter.More(); aSelIter.Next())
{
- const Handle(SelectMgr_Selection)& aSel = CurrentSelection();
- for (aSel->Init (); aSel->More (); aSel->Next ())
+ const Handle(SelectMgr_Selection)& aSel = aSelIter.Value();
+ if (aSel->GetSelectionState() != SelectMgr_SOS_Activated)
+ continue;
+
+ for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator aSelEntIter (aSel->Entities()); aSelEntIter.More(); aSelEntIter.Next())
{
- Handle(Select3D_SensitiveEntity) aEntity =
- Handle(Select3D_SensitiveEntity)::DownCast (aSel->Sensitive());
- if (!aEntity.IsNull())
+ const Handle(SelectMgr_EntityOwner)& anOwner = aSelEntIter.Value()->BaseSensitive()->OwnerId();
+ if (theOwners->Contains (anOwner))
{
- Handle(SelectMgr_EntityOwner) aOwner =
- Handle(SelectMgr_EntityOwner)::DownCast (aEntity->OwnerId());
- if (!aOwner.IsNull())
- aOwner->SetZLayer (thePrsMgr, theLayerId);
+ Select3D_BndBox3d aBox = aSelEntIter.Value()->BaseSensitive()->BoundingBox();
+ aBnd.Update (aBox.CornerMin().x(), aBox.CornerMin().y(), aBox.CornerMin().z(),
+ aBox.CornerMax().x(), aBox.CornerMax().y(), aBox.CornerMax().z());
}
}
}
+
+ return aBnd;
+}
+
+//=======================================================================
+//function : GlobalSelOwner
+//purpose : Returns entity owner corresponding to selection of the object as a whole
+//=======================================================================
+Handle(SelectMgr_EntityOwner) SelectMgr_SelectableObject::GlobalSelOwner() const
+{
+ const Handle(SelectMgr_Selection)& aGlobalSel = Selection (myGlobalSelMode);
+ if (!aGlobalSel.IsNull()
+ && !aGlobalSel->IsEmpty())
+ {
+ return aGlobalSel->Entities().First()->BaseSensitive()->OwnerId();
+ }
+ return THE_NULL_ENTITYOWNER;
+}
+
+//=======================================================================
+//function : GetAssemblyOwner
+//purpose :
+//=======================================================================
+const Handle(SelectMgr_EntityOwner)& SelectMgr_SelectableObject::GetAssemblyOwner() const
+{
+ return THE_NULL_ENTITYOWNER;
+}
+
+// =======================================================================
+// function : DumpJson
+// purpose :
+// =======================================================================
+void SelectMgr_SelectableObject::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
+{
+ OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
+
+ OCCT_DUMP_BASE_CLASS (theOStream, theDepth, PrsMgr_PresentableObject)
+
+ OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, mySelectionPrs.get())
+ OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myHilightPrs.get())
+
+ for (SelectMgr_SequenceOfSelection::Iterator anIterator (myselections); anIterator.More(); anIterator.Next())
+ {
+ const Handle(SelectMgr_Selection)& aSelection = anIterator.Value();
+ OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aSelection.get())
+ }
+
+ OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myGlobalSelMode)
+ OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAutoHilight)
}