diff --git a/src/QABugs/QABugs_19.cxx b/src/QABugs/QABugs_19.cxx index a988e5c4ee..4903457536 100644 --- a/src/QABugs/QABugs_19.cxx +++ b/src/QABugs/QABugs_19.cxx @@ -54,6 +54,7 @@ #include #include +#include #include @@ -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; } diff --git a/src/SelectMgr/SelectMgr_SelectionManager.cxx b/src/SelectMgr/SelectMgr_SelectionManager.cxx index c24fd61ecc..8072850b7d 100644 --- a/src/SelectMgr/SelectMgr_SelectionManager.cxx +++ b/src/SelectMgr/SelectMgr_SelectionManager.cxx @@ -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,25 +708,23 @@ void SelectMgr_SelectionManager::RecomputeSelection (const Handle(SelectMgr_Sele if (!(myGlobal.Contains (theObject) || myLocal.IsBound (theObject))) return; - for(theObject->Init(); theObject->More(); theObject->Next()) + if (theMode == -1) { - const Handle(SelectMgr_Selection)& aSelection = theObject->CurrentSelection(); - aSelection->UpdateStatus (SelectMgr_TOU_Full); - Standard_Integer aSelMode = aSelection->Mode(); - - for (TColStd_MapIteratorOfMapOfTransient aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next()) + for (theObject->Init(); theObject->More(); theObject->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->CurrentSelection(); + Standard_Integer aSelMode = aSelection->Mode(); + recomputeSelectionMode (theObject, aSelection, aSelMode); } } + else + { + if (!theObject->HasSelection (theMode)) + return; + + const Handle(SelectMgr_Selection)& aSelection = theObject->Selection (theMode); + recomputeSelectionMode (theObject, aSelection, theMode); + } } //======================================================================= diff --git a/src/SelectMgr/SelectMgr_SelectionManager.hxx b/src/SelectMgr/SelectMgr_SelectionManager.hxx index cb4d5af6f2..afdef8f862 100644 --- a/src/SelectMgr/SelectMgr_SelectionManager.hxx +++ b/src/SelectMgr/SelectMgr_SelectionManager.hxx @@ -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: diff --git a/tests/bugs/vis/bug27523 b/tests/bugs/vis/bug27523 new file mode 100644 index 0000000000..3173c61964 --- /dev/null +++ b/tests/bugs/vis/bug27523 @@ -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