theOwner : EntityOwner from SelectMgr;
toUpdateViewer : Boolean from Standard = Standard_True);
+ ClearSelected (me : mutable;
+ toUpdateViewer : Boolean from Standard = Standard_True);
+ ---Purpose: Clears local context selection.
+ -- @param toUpdateViewer [in] if TRUE the viewer will be updated.
+
+ ClearSelected (me : mutable;
+ theIO : InteractiveObject from AIS;
+ toUpdateViewer : Boolean from Standard = Standard_True);
+ ---Purpose: Removes an interactive object from the local context selection.
+ -- Method deselects all associated entity owners.
+ -- @param theIO [in] the interactive object.
+ -- @param toUpdateViewer [in] if TRUE the viewer will be updated.
-
- ClearSelected(me:mutable;updateviewer : Boolean from Standard=Standard_True);
- ---Purpose:
-
-
---Category: GET THE DETECTED
-
HasDetected (me) returns Boolean from Standard;
---C++: inline
if(myMainPM->IsDisplayed(anInteractive,STAT->HilightMode()))
myMainPM->SetVisibility (anInteractive, STAT->HilightMode(), Standard_False);
}
- //selection step
-
- TColStd_ListIteratorOfListOfInteger It(STAT->SelectionModes());
- for(;It.More();It.Next())
- mySM->Deactivate(anInteractive,It.Value(),myMainVS);
- // STAT->ClearSelectionModes();
+
+ // Deactivate selectable entities of interactive object
+ if (mySM->Contains (anInteractive))
+ {
+ TColStd_ListIteratorOfListOfInteger aModeIter (STAT->SelectionModes());
+ for (; aModeIter.More(); aModeIter.Next())
+ {
+ mySM->Deactivate (anInteractive, aModeIter.Value(), myMainVS);
+ }
+ }
+
+ UpdateSort();
+
+ // Remove object from current selection of local context
+ ClearSelected (anInteractive, Standard_False);
+
return status;
}
AddOrRemoveSelected(aSelectable);
myActiveObjects.UnBind(aSelectable);
- //Last detected object keeps for lastindex initialization.
- Handle(SelectMgr_EntityOwner) aLastPicked = myMainVS->OnePicked();
-
- UpdateSort();
-
- //Object removes from SelectMgr
- if( mySM->Contains(aSelectable) )
- mySM->Remove(aSelectable);
-
- //Object removes from Detected sequence
- AIS_SequenceOfInteractive detectAIS;
-
- Standard_Integer i = 1;
- for(i = 1 ; i < myAISDetectedSeq.Length(); i++)
+ // Remove the interactive object from selection manager
+ if (mySM->Contains (aSelectable))
{
- Handle(AIS_InteractiveObject) anObj = DetectedCurrentObject();
- if( !anObj.IsNull() && anObj != aSelectable )
- myAISDetectedSeq.Remove( i );
+ mySM->Remove (aSelectable);
}
- Standard_Integer aHM = aSelectable->HasHilightMode() ? aSelectable->HilightMode() : 0;
-
- //EntityOwners remove from AIS_Selection
- Handle(AIS_Selection) aSel = AIS_Selection::Selection(mySelName.ToCString());
- AIS_NListTransient::Iterator anIter(aSel->Objects());
- AIS_NListTransient removeEntites;
- for(; anIter.More(); anIter.Next()){
- const Handle(Standard_Transient)& Tr = anIter.Value();
- if (!Tr.IsNull()){
- const Handle(SelectMgr_EntityOwner)& anOwnr = *((const Handle(SelectMgr_EntityOwner)*) &Tr);
- if(anOwnr->Selectable() == aSelectable){
- removeEntites.Append(Tr);
- if(IsSelected(anOwnr))
- anOwnr->Unhilight(myMainPM, aHM);//Unhilight selected
- }
- }
- }
- AIS_NListTransient::Iterator anIterRemove(removeEntites);
- for(; anIterRemove.More(); anIterRemove.Next())
- aSel->Select(anIterRemove.Value());//EntityOwner removes from the selection data
-
- //EntityOwners remove from myMapOfOwner
- SelectMgr_IndexedMapOfOwner ownersToKeep;
- const Handle(V3d_Viewer)& aViewer = myCTX->CurrentViewer();
- for(i = 1; i <= myMapOfOwner.Extent(); i++){
- const Handle(SelectMgr_EntityOwner)& anOwner = myMapOfOwner(i) ;
- if(!anOwner.IsNull()) {
- if(anOwner->Selectable() != aSelectable)
- ownersToKeep.Add(anOwner);
- else
- {
- if(anOwner->IsHilighted(myMainPM, aHM))
- {
- for(aViewer->InitActiveViews(); aViewer->MoreActiveViews(); aViewer->NextActiveViews())
- Unhilight(anOwner, aViewer->ActiveView());
- }
- }
- }
- }
- myMapOfOwner.Clear();
- myMapOfOwner.Assign(ownersToKeep);
- mylastindex = myMapOfOwner.FindIndex(aLastPicked);
+ UpdateSort();
+
+ // Remove object from current selection of local context
+ ClearSelected (aSelectable, Standard_False);
return Standard_True;
}
mylastindex = 0;
}
+//==================================================
+// Function: ClearSelected
+// Purpose :
+//==================================================
+void AIS_LocalContext::ClearSelected (const Handle(AIS_InteractiveObject)& theIO,
+ const Standard_Boolean toUpdateViewer)
+{
+ // Keep last detected object for lastindex initialization.
+ Handle(SelectMgr_EntityOwner) aLastPicked = myMainVS->OnePicked();
+
+ // Remove the interactive object from detected sequence
+ for (Standard_Integer anIdx = 1; anIdx <= myAISDetectedSeq.Length(); ++anIdx)
+ {
+ Handle(AIS_InteractiveObject) aDetectedIO = myAISDetectedSeq.Value (anIdx);
+ if (!aDetectedIO.IsNull() && aDetectedIO == theIO)
+ {
+ myAISDetectedSeq.Remove (anIdx--);
+ }
+ }
+
+ Standard_Integer aHilightMode = theIO->HasHilightMode() ? theIO->HilightMode() : 0;
+
+ // Remove entity owners from AIS_Selection
+ Handle(AIS_Selection) aSelection = AIS_Selection::Selection (mySelName.ToCString());
+ AIS_NListTransient::Iterator anIter (aSelection->Objects());
+ AIS_NListTransient aRemoveEntites;
+ for (; anIter.More(); anIter.Next())
+ {
+ Handle(SelectMgr_EntityOwner) anOwner = Handle(SelectMgr_EntityOwner)::DownCast (anIter.Value());
+ if (anOwner.IsNull() || anOwner->Selectable() != theIO)
+ {
+ continue;
+ }
+
+ aRemoveEntites.Append (anOwner);
+
+ if (IsSelected (anOwner))
+ {
+ anOwner->Unhilight (myMainPM, aHilightMode);
+ }
+ }
+ AIS_NListTransient::Iterator anIterRemove (aRemoveEntites);
+ for (; anIterRemove.More(); anIterRemove.Next())
+ {
+ aSelection->Select (anIterRemove.Value());
+ }
+
+ // Remove entity owners from myMapOfOwner
+ SelectMgr_IndexedMapOfOwner anOwnersToKeep;
+ const Handle(V3d_Viewer)& aViewer = myCTX->CurrentViewer();
+ for (Standard_Integer anIdx = 1; anIdx <= myMapOfOwner.Extent(); anIdx++)
+ {
+ Handle(SelectMgr_EntityOwner) anOwner = myMapOfOwner (anIdx);
+ if (anOwner.IsNull())
+ {
+ continue;
+ }
+
+ if (anOwner->Selectable() != theIO)
+ {
+ anOwnersToKeep.Add (anOwner);
+ }
+ else
+ {
+ for (aViewer->InitActiveViews(); aViewer->MoreActiveViews(); aViewer->NextActiveViews())
+ {
+ Unhilight (anOwner, aViewer->ActiveView());
+ }
+ }
+ }
+ myMapOfOwner.Clear();
+ myMapOfOwner.Assign (anOwnersToKeep);
+ mylastindex = myMapOfOwner.FindIndex (aLastPicked);
+
+ if (toUpdateViewer)
+ {
+ aViewer->Update();
+ }
+}
//=======================================================================
//function : SetSelected