1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-14 13:30:48 +03:00

0027757: Visualization - handle child objects in selection manager regardless of HasOwnPresentations() flag

- all methods of SelectMgr_SelectionManager now processes children first, then check HasOwnPresentations() flag;
- test case for issue #27757

Small correction of test case for issue CR27757
This commit is contained in:
vpa
2016-08-08 17:38:02 +03:00
committed by bugmaster
parent c885cfda24
commit 520cde8769
3 changed files with 89 additions and 40 deletions

View File

@@ -165,19 +165,16 @@ void SelectMgr_SelectionManager::Load (const Handle(SelectMgr_SelectableObject)&
{
if (!myGlobal.Contains (theObject))
{
if (theObject->HasOwnPresentations())
for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
{
SelectMgr_SequenceOfSelector aSelectors;
aSelectors.Append (theSelector);
myLocal.Bind (theObject, aSelectors);
}
else
{
for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
{
Load (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theSelector, theMode);
}
Load (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theSelector, theMode);
}
if (!theObject->HasOwnPresentations())
return;
SelectMgr_SequenceOfSelector aSelectors;
aSelectors.Append (theSelector);
myLocal.Bind (theObject, aSelectors);
}
}
}
@@ -189,6 +186,14 @@ void SelectMgr_SelectionManager::Load (const Handle(SelectMgr_SelectableObject)&
//==================================================
void SelectMgr_SelectionManager::Remove (const Handle(SelectMgr_SelectableObject)& theObject)
{
for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
{
Remove (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()));
}
if (!theObject->HasOwnPresentations())
return;
if (myGlobal.Contains (theObject))
{
for (TColStd_MapIteratorOfMapOfTransient aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
@@ -228,13 +233,6 @@ void SelectMgr_SelectionManager::Remove (const Handle(SelectMgr_SelectableObject
myLocal.UnBind (theObject);
}
else if (!theObject->HasOwnPresentations())
{
for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
{
Remove (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()));
}
}
theObject->ClearSelections();
}
@@ -298,16 +296,14 @@ void SelectMgr_SelectionManager::Activate (const Handle(SelectMgr_SelectableObje
if (!theSelector.IsNull() && !mySelectors.Contains (theSelector))
return;
if (!theObject->HasOwnPresentations())
for (PrsMgr_ListOfPresentableObjectsIter anChildIter (theObject->Children()); anChildIter.More(); anChildIter.Next())
{
for (PrsMgr_ListOfPresentableObjectsIter anChildIter (theObject->Children()); anChildIter.More(); anChildIter.Next())
{
Activate (Handle(SelectMgr_SelectableObject)::DownCast (anChildIter.Value()), theMode, theSelector);
}
return;
Activate (Handle(SelectMgr_SelectableObject)::DownCast (anChildIter.Value()), theMode, theSelector);
}
if (!theObject->HasOwnPresentations())
return;
Standard_Boolean isComputed = Standard_False;
if (theObject->HasSelection (theMode))
{
@@ -399,16 +395,13 @@ void SelectMgr_SelectionManager::Deactivate (const Handle(SelectMgr_SelectableOb
const Standard_Integer theMode,
const Handle(SelectMgr_ViewerSelector)& theSelector)
{
for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
{
Deactivate (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode, theSelector);
}
if (!theObject->HasOwnPresentations())
{
for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
{
Deactivate (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode, theSelector);
}
return;
}
Standard_Boolean isInGlobal = myGlobal.Contains (theObject);
Standard_Boolean hasSelection = theMode == -1 ? Standard_True : theObject->HasSelection (theMode);
@@ -459,17 +452,15 @@ Standard_Boolean SelectMgr_SelectionManager::IsActivated (const Handle(SelectMgr
const Standard_Integer theMode,
const Handle(SelectMgr_ViewerSelector)& theSelector) const
{
if (!theObject->HasOwnPresentations())
for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
{
for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
{
if (IsActivated (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode, theSelector))
return Standard_True;
}
return Standard_False;
if (IsActivated (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode, theSelector))
return Standard_True;
}
if (!theObject->HasOwnPresentations())
return Standard_False;
if (!(myGlobal.Contains (theObject) || myLocal.IsBound (theObject)))
return Standard_False;