1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +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.
This commit is contained in:
vpa 2016-06-10 13:24:42 +03:00 committed by nds
parent 415fb570ce
commit cf9192329b
4 changed files with 134 additions and 17 deletions

View File

@ -55,6 +55,7 @@
#include <Standard_Atomic.hxx> #include <Standard_Atomic.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx> #include <TopTools_ListIteratorOfListOfShape.hxx>
#include <StdSelect_BRepOwner.hxx>
#include <Standard_Version.hxx> #include <Standard_Version.hxx>
#define QCOMPARE(val1, val2) \ #define QCOMPARE(val1, val2) \
@ -4396,6 +4397,78 @@ static Standard_Integer OCC27065(Draw_Interpretor& di,
return 0; 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) { void QABugs::Commands_19(Draw_Interpretor& theCommands) {
const char *group = "QABugs"; const char *group = "QABugs";
@ -4491,5 +4564,9 @@ void QABugs::Commands_19(Draw_Interpretor& theCommands) {
"OCC27065 spine profile", "OCC27065 spine profile",
__FILE__, OCC27065, group); __FILE__, OCC27065, group);
theCommands.Add ("OCC27523",
"OCC27523: Checks recomputation of deactivated selection mode after object's redisplaying",
__FILE__, OCC27523, group);
return; return;
} }

View File

@ -32,6 +32,7 @@ uses
AsciiString from TCollection, AsciiString from TCollection,
ViewerSelector from SelectMgr, ViewerSelector from SelectMgr,
SelectableObject from SelectMgr, SelectableObject from SelectMgr,
Selection from SelectMgr,
CString from Standard, CString from Standard,
MapOfTransient from TColStd, MapOfTransient from TColStd,
TypeOfUpdate from SelectMgr, TypeOfUpdate from SelectMgr,
@ -163,7 +164,7 @@ is
theObject : SelectableObject from SelectMgr; theObject : SelectableObject from SelectMgr;
theIsForce : Boolean from Standard = Standard_False; theIsForce : Boolean from Standard = Standard_False;
theMode : Integer from Standard = -1); theMode : Integer from Standard = -1);
---Purpose: Recomputes activated selections of theObject for all known viewer selectors according to theMode specified. ---Purpose: Recomputes all selections of theObject for all known viewer selectors according to theMode specified.
-- If theMode is set to default (-1), then all activated selections will be recomputed. If theIsForce is set to true, -- If theMode is set to default (-1), then all activated selections will be recomputed. If theIsForce is set to true,
-- then selection mode theMode for object theObject will be recomputed regardless of its activation status. -- then selection mode theMode for object theObject will be recomputed regardless of its activation status.
@ -210,7 +211,11 @@ is
-- changes previous sensitivity value of all sensitive entities in selection with theMode -- changes previous sensitivity value of all sensitive entities in selection with theMode
-- to the given theNewSensitivity. -- to the given theNewSensitivity.
recomputeSelectionMode (me : mutable;
theObject : SelectableObject from SelectMgr;
theSelection : Selection from SelectMgr;
theMode : Integer from Standard) is protected;
---Purpose: Recomputes given selection mode and updates BVHs in all viewer selectors
loadMode (me : mutable; loadMode (me : mutable;
theObject : SelectableObject from SelectMgr; theObject : SelectableObject from SelectMgr;

View File

@ -646,6 +646,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 // Function: Update
// Purpose : // Purpose :
@ -684,25 +706,23 @@ void SelectMgr_SelectionManager::RecomputeSelection (const Handle(SelectMgr_Sele
if (!(myGlobal.Contains (theObject) || myLocal.IsBound (theObject))) if (!(myGlobal.Contains (theObject) || myLocal.IsBound (theObject)))
return; return;
for(theObject->Init(); theObject->More(); theObject->Next()) if (theMode == -1)
{ {
const Handle(SelectMgr_Selection)& aSelection = theObject->CurrentSelection(); for (theObject->Init(); theObject->More(); theObject->Next())
aSelection->UpdateStatus (SelectMgr_TOU_Full);
Standard_Integer aSelMode = aSelection->Mode();
for (TColStd_MapIteratorOfMapOfTransient aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next())
{ {
const Handle(SelectMgr_ViewerSelector)& aCurSelector = Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorIter.Key()); const Handle(SelectMgr_Selection)& aSelection = theObject->CurrentSelection();
if (aCurSelector->Status (aSelection) == SelectMgr_SOS_Activated) Standard_Integer aSelMode = aSelection->Mode();
{ recomputeSelectionMode (theObject, aSelection, aSelMode);
ClearSelectionStructures (theObject, aSelMode, aCurSelector);
theObject->RecomputePrimitives(aSelMode);
RestoreSelectionStructures (theObject, aSelMode, aCurSelector);
aSelection->UpdateStatus (SelectMgr_TOU_None);
aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
}
} }
} }
else
{
if (!theObject->HasSelection (theMode))
return;
const Handle(SelectMgr_Selection)& aSelection = theObject->Selection (theMode);
recomputeSelectionMode (theObject, aSelection, theMode);
}
} }
//======================================================================= //=======================================================================

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
set only_screen 1