1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-05-16 10:54:53 +03:00

0027523: Visualization - selection owner contains obsolete shape

- remove check for selection activation in SelectMgr_SelectionManager::RecomputeSelection;
- given selection mode is now handled properly and single selection mode can be recomputed;
- test case for issue #27523.

Small correction of test case for issue CR27523
This commit is contained in:
vpa 2016-06-09 19:02:49 +03:00 committed by bugmaster
parent 913295d5dd
commit 45d5cbf836
4 changed files with 130 additions and 16 deletions

View File

@ -54,6 +54,7 @@
#include <TopExp_Explorer.hxx>
#include <SelectMgr_Filter.hxx>
#include <StdSelect_BRepOwner.hxx>
#include <Standard_Version.hxx>
@ -5160,6 +5161,78 @@ static Standard_Integer OCC27318 (Draw_Interpretor& /*theDI*/, Standard_Integer
return 0;
}
//========================================================================
//function : OCC27523
//purpose : Checks recomputation of deactivated selection mode after object's redisplaying
//========================================================================
static Standard_Integer OCC27523 (Draw_Interpretor& theDI, Standard_Integer theArgNb, const char** theArgVec)
{
if (theArgNb != 1)
{
std::cerr << "Error: wrong number of arguments! See usage:\n";
theDI.PrintHelp (theArgVec[0]);
return 1;
}
Handle(AIS_InteractiveContext) anAISContext = ViewerTest::GetAISContext();
if(anAISContext.IsNull())
{
std::cerr << "Error: no active view. Please call vinit.\n";
return 1;
}
gp_Pnt aStart (100, 100, 100);
gp_Pnt anEnd (300, 400, 600);
BRepBuilderAPI_MakeEdge anEdgeBuilder (aStart, anEnd);
TopoDS_Edge anEdge = anEdgeBuilder.Edge();
Handle(AIS_InteractiveObject) aTestAISShape = new AIS_Shape (anEdge);
anAISContext->Display (aTestAISShape);
// activate it in selection modes
TColStd_SequenceOfInteger aModes;
aModes.Append (AIS_Shape::SelectionMode ((TopAbs_ShapeEnum) TopAbs_VERTEX));
anAISContext->OpenLocalContext();
anAISContext->Deactivate (aTestAISShape);
anAISContext->Load (aTestAISShape, -1, true);
anAISContext->Activate (aTestAISShape, 0);
anAISContext->Deactivate (aTestAISShape, 0);
// activate in vertices mode
for (Standard_Integer anIt = 1; anIt <= aModes.Length(); ++anIt)
{
anAISContext->Activate (aTestAISShape, aModes (anIt));
}
TopoDS_Shape aVertexShape = BRepBuilderAPI_MakeVertex (gp_Pnt (75, 0, 0));
TopAbs_ShapeEnum aVertexShapeType = aVertexShape.ShapeType();
Handle(AIS_Shape)::DownCast (aTestAISShape)->Set (aVertexShape);
aTestAISShape->Redisplay();
anAISContext->AddOrRemoveSelected (aTestAISShape);
bool aValidShapeType = false;
for (anAISContext->InitSelected(); anAISContext->MoreSelected(); anAISContext->NextSelected())
{
Handle(SelectMgr_EntityOwner) anOwner = anAISContext->SelectedOwner();
Handle(StdSelect_BRepOwner) aBRO = Handle(StdSelect_BRepOwner)::DownCast (anOwner);
if (!aBRO.IsNull() && aBRO->HasShape())
{
TopoDS_Shape aShape = aBRO->Shape();
aValidShapeType = aShape.ShapeType() == aVertexShapeType;
}
}
if (!aValidShapeType)
{
std::cerr << "Error: shape type is invalid.\n";
return 1;
}
return 0;
}
void QABugs::Commands_19(Draw_Interpretor& theCommands) {
const char *group = "QABugs";
@ -5277,6 +5350,9 @@ void QABugs::Commands_19(Draw_Interpretor& theCommands) {
theCommands.Add ("OCC27318",
"OCC27318: Creates a box that is not listed in map of AIS objects of ViewerTest",
__FILE__, OCC27318, group);
theCommands.Add ("OCC27523",
"OCC27523: Checks recomputation of deactivated selection mode after object's redisplaying",
__FILE__, OCC27523, group);
return;
}

View File

@ -648,6 +648,28 @@ void SelectMgr_SelectionManager::rebuildSelectionStructures (const Handle(Select
}
}
//==================================================
// Function: recomputeSelectionMode
// Purpose :
//==================================================
void SelectMgr_SelectionManager::recomputeSelectionMode (const Handle(SelectMgr_SelectableObject)& theObject,
const Handle(SelectMgr_Selection)& theSelection,
const Standard_Integer theMode)
{
theSelection->UpdateStatus (SelectMgr_TOU_Full);
for (TColStd_MapIteratorOfMapOfTransient aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next())
{
Handle(SelectMgr_ViewerSelector) aCurSelector = Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorIter.Key());
ClearSelectionStructures (theObject, theMode, aCurSelector);
theObject->RecomputePrimitives (theMode);
RestoreSelectionStructures (theObject, theMode, aCurSelector);
theSelection->UpdateStatus (SelectMgr_TOU_None);
theSelection->UpdateBVHStatus (SelectMgr_TBU_None);
}
}
//==================================================
// Function: Update
// Purpose :
@ -686,24 +708,22 @@ void SelectMgr_SelectionManager::RecomputeSelection (const Handle(SelectMgr_Sele
if (!(myGlobal.Contains (theObject) || myLocal.IsBound (theObject)))
return;
if (theMode == -1)
{
for (theObject->Init(); theObject->More(); theObject->Next())
{
const Handle(SelectMgr_Selection)& aSelection = theObject->CurrentSelection();
aSelection->UpdateStatus (SelectMgr_TOU_Full);
Standard_Integer aSelMode = aSelection->Mode();
recomputeSelectionMode (theObject, aSelection, aSelMode);
}
}
else
{
if (!theObject->HasSelection (theMode))
return;
for (TColStd_MapIteratorOfMapOfTransient aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next())
{
Handle(SelectMgr_ViewerSelector) aCurSelector (Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorIter.Key()));
if (aCurSelector->Status (aSelection) == SelectMgr_SOS_Activated)
{
ClearSelectionStructures (theObject, aSelMode, aCurSelector);
theObject->RecomputePrimitives(aSelMode);
RestoreSelectionStructures (theObject, aSelMode, aCurSelector);
aSelection->UpdateStatus (SelectMgr_TOU_None);
aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
}
}
const Handle(SelectMgr_Selection)& aSelection = theObject->Selection (theMode);
recomputeSelectionMode (theObject, aSelection, theMode);
}
}

View File

@ -129,7 +129,10 @@ public:
protected:
//! Recomputes given selection mode and updates BVHs in all viewer selectors
Standard_EXPORT void recomputeSelectionMode (const Handle(SelectMgr_SelectableObject)& theObject,
const Handle(SelectMgr_Selection)& theSelection,
const Standard_Integer theMode);
private:

15
tests/bugs/vis/bug27523 Normal file
View File

@ -0,0 +1,15 @@
puts "============"
puts "OCC27523"
puts "============"
puts ""
####################################################################################
# Visualization - selection owner contains obsolete shape
####################################################################################
pload QAcommands VISUALIZATION
vinit
OCC27523
checkview -screenshot -3d -path ${imagedir}/${casename}.png