From b56df3a60aa8f8bcd6e4df569b5dd8dd3cad7990 Mon Sep 17 00:00:00 2001 From: kgv Date: Mon, 16 May 2022 23:02:31 +0300 Subject: [PATCH] 0032976: Visualization - AIS_InteractiveContext::FitSelected() includes objects invisible in current View --- src/AIS/AIS_InteractiveContext.cxx | 12 ++++++++++-- src/AIS/AIS_InteractiveContext.hxx | 5 ++++- src/AIS/AIS_ViewController.cxx | 2 +- src/AIS/AIS_ViewCube.cxx | 2 +- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/AIS/AIS_InteractiveContext.cxx b/src/AIS/AIS_InteractiveContext.cxx index a2130989ac..1cd4cb8f91 100644 --- a/src/AIS/AIS_InteractiveContext.cxx +++ b/src/AIS/AIS_InteractiveContext.cxx @@ -2214,10 +2214,11 @@ void AIS_InteractiveContext::FitSelected (const Handle(V3d_View)& theView) //function : BoundingBoxOfSelection //purpose : //======================================================================= -Bnd_Box AIS_InteractiveContext::BoundingBoxOfSelection() const +Bnd_Box AIS_InteractiveContext::BoundingBoxOfSelection (const Handle(V3d_View)& theView) const { Bnd_Box aBndSelected; AIS_MapOfObjectOwners anObjectOwnerMap; + const Standard_Integer aViewId = !theView.IsNull() ? theView->View()->Identification() : -1; for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next()) { const Handle(SelectMgr_EntityOwner)& anOwner = aSelIter.Value(); @@ -2227,6 +2228,13 @@ Bnd_Box AIS_InteractiveContext::BoundingBoxOfSelection() const continue; } + Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->StructureManager()->ObjectAffinity (anObj); + const Standard_Boolean isVisible = aViewId == -1 || anAffinity->IsVisible (aViewId); + if (!isVisible) + { + continue; + } + if (anOwner == anObj->GlobalSelOwner()) { Bnd_Box aTmpBnd; @@ -2264,7 +2272,7 @@ void AIS_InteractiveContext::FitSelected (const Handle(V3d_View)& theView, const Standard_Real theMargin, const Standard_Boolean theToUpdate) { - Bnd_Box aBndSelected = BoundingBoxOfSelection(); + Bnd_Box aBndSelected = BoundingBoxOfSelection (theView); if (!aBndSelected.IsVoid()) { theView->FitAll (aBndSelected, theMargin, theToUpdate); diff --git a/src/AIS/AIS_InteractiveContext.hxx b/src/AIS/AIS_InteractiveContext.hxx index 5b9ec24c28..5e79807ea6 100644 --- a/src/AIS/AIS_InteractiveContext.hxx +++ b/src/AIS/AIS_InteractiveContext.hxx @@ -502,7 +502,10 @@ public: //! @name Selection management Standard_EXPORT AIS_StatusOfPick SelectDetected (const AIS_SelectionScheme theSelScheme = AIS_SelectionScheme_Replace); //! Returns bounding box of selected objects. - Standard_EXPORT Bnd_Box BoundingBoxOfSelection() const; + Standard_EXPORT Bnd_Box BoundingBoxOfSelection (const Handle(V3d_View)& theView) const; + + Standard_DEPRECATED ("BoundingBoxOfSelection() should be called with View argument") + Bnd_Box BoundingBoxOfSelection() const { return BoundingBoxOfSelection (Handle(V3d_View)()); } //! Sets list of owner selected/deselected using specified selection scheme. //! @param theOwners owners to change selection state diff --git a/src/AIS/AIS_ViewController.cxx b/src/AIS/AIS_ViewController.cxx index 8ce7822d48..12ad1ef617 100644 --- a/src/AIS/AIS_ViewController.cxx +++ b/src/AIS/AIS_ViewController.cxx @@ -1969,7 +1969,7 @@ gp_Pnt AIS_ViewController::GravityPoint (const Handle(AIS_InteractiveContext)& t void AIS_ViewController::FitAllAuto (const Handle(AIS_InteractiveContext)& theCtx, const Handle(V3d_View)& theView) { - const Bnd_Box aBoxSel = theCtx->BoundingBoxOfSelection(); + const Bnd_Box aBoxSel = theCtx->BoundingBoxOfSelection (theView); const double aFitMargin = 0.01; if (aBoxSel.IsVoid()) { diff --git a/src/AIS/AIS_ViewCube.cxx b/src/AIS/AIS_ViewCube.cxx index 2af2fef307..d2ec561fc1 100644 --- a/src/AIS/AIS_ViewCube.cxx +++ b/src/AIS/AIS_ViewCube.cxx @@ -859,7 +859,7 @@ Standard_Boolean AIS_ViewCube::HasAnimation() const void AIS_ViewCube::viewFitAll (const Handle(V3d_View)& theView, const Handle(Graphic3d_Camera)& theCamera) { - Bnd_Box aBndBox = myToFitSelected ? GetContext()->BoundingBoxOfSelection() : theView->View()->MinMaxValues(); + Bnd_Box aBndBox = myToFitSelected ? GetContext()->BoundingBoxOfSelection (theView) : theView->View()->MinMaxValues(); if (aBndBox.IsVoid() && myToFitSelected) {