0031313: Foundation Classes - Dump improvement for classes
[occt.git] / src / SelectMgr / SelectMgr_SelectableObject.cxx
index 7b48df1..d20c30f 100644 (file)
 // 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);
+    }
   }
 }
 
@@ -121,216 +158,236 @@ void SelectMgr_SelectableObject::ClearSelections(const Standard_Boolean update)
 // 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())
@@ -340,20 +397,176 @@ void SelectMgr_SelectableObject::SetZLayer
     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)
 }