From 184a20c4fa5e1d62abb1e8f7008daef9c9e531c4 Mon Sep 17 00:00:00 2001 From: nds Date: Sat, 1 Jun 2019 20:18:48 +0300 Subject: [PATCH] 0030737: Visualization - implementing new selection schemes in context #apply selection scheme to container of owners (cherry picked from commit 91ed0554e0c7d8b8cca6f86b8fe1a0891e55c3ed) # Conflicts: # src/AIS/AIS_InteractiveContext_1.cxx --- src/AIS/AIS_InteractiveContext.cxx | 41 ++++-- src/AIS/AIS_InteractiveContext.hxx | 39 ++++-- src/AIS/AIS_InteractiveContext_1.cxx | 188 ++++++++------------------- src/AIS/AIS_SelectionScheme.hxx | 5 +- 4 files changed, 119 insertions(+), 154 deletions(-) diff --git a/src/AIS/AIS_InteractiveContext.cxx b/src/AIS/AIS_InteractiveContext.cxx index 7cc82a3524..3f33ce13ed 100644 --- a/src/AIS/AIS_InteractiveContext.cxx +++ b/src/AIS/AIS_InteractiveContext.cxx @@ -161,13 +161,6 @@ myIsAutoActivateSelMode(Standard_True) aStyle->SetMethod(Aspect_TOHM_COLOR); aStyle->SetColor (Quantity_NOC_GRAY40); } - SetSelectionScheme (AIS_SelectionType_Select, AIS_SelectionScheme_ClearAndAdd); - SetSelectionScheme (AIS_SelectionType_SelectInRect, AIS_SelectionScheme_ClearAndAdd); - SetSelectionScheme (AIS_SelectionType_SelectInPoly, AIS_SelectionScheme_ClearAndAdd); - SetSelectionScheme (AIS_SelectionType_ShiftSelect, AIS_SelectionScheme_Switch); - SetSelectionScheme (AIS_SelectionType_ShiftSelectInRect, AIS_SelectionScheme_Switch); - SetSelectionScheme (AIS_SelectionType_ShiftSelectInPoly, AIS_SelectionScheme_Switch); - InitAttributes(); } @@ -430,8 +423,7 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO setContextToObject (theIObj); if (!myObjects.IsBound (theIObj)) { - Handle(AIS_GlobalStatus) aStatus = new AIS_GlobalStatus (AIS_DS_Displayed, theDispMode, theSelectionMode); - myObjects.Bind (theIObj, aStatus); + setObjectStatus (theIObj, AIS_DS_Displayed, theDispMode, theSelectionMode); myMainVwr->StructureManager()->RegisterObject (theIObj); myMainPM->Display(theIObj, theDispMode); if (theSelectionMode != -1) @@ -508,8 +500,7 @@ void AIS_InteractiveContext::Load (const Handle(AIS_InteractiveObject)& theIObj, { Standard_Integer aDispMode, aHiMod, aSelModeDef; GetDefModes (theIObj, aDispMode, aHiMod, aSelModeDef); - Handle(AIS_GlobalStatus) aStatus = new AIS_GlobalStatus (AIS_DS_Erased, aDispMode, theSelMode != -1 ? theSelMode : aSelModeDef); - myObjects.Bind (theIObj, aStatus); + setObjectStatus (theIObj, AIS_DS_Erased, aDispMode, theSelMode != -1 ? theSelMode : aSelModeDef); myMainVwr->StructureManager()->RegisterObject (theIObj); } @@ -2062,7 +2053,7 @@ void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& t const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity mgrSelector->Remove (anObj); - myObjects.UnBind (theIObj); + setObjectStatus (theIObj, AIS_DS_None, -1, -1); myMainVwr->StructureManager()->UnregisterObject (theIObj); for (V3d_ListOfViewIterator aDefViewIter (myMainVwr->DefinedViewIterator()); aDefViewIter.More(); aDefViewIter.Next()) @@ -2530,3 +2521,29 @@ void AIS_InteractiveContext::SetTransformPersistence (const Handle(AIS_Interacti anActiveViewIter.Value()->View()->InvalidateZLayerBoundingBox (aLayerId); } } +//======================================================================= +//function : setObjectStatus +//purpose : +//======================================================================= +void AIS_InteractiveContext::setObjectStatus (const Handle(AIS_InteractiveObject)& theIObj, + const AIS_DisplayStatus theStatus, + const Standard_Integer theDispMode, + const Standard_Integer theSelectionMode) +{ + if (theStatus != AIS_DS_None) + { + Handle(AIS_GlobalStatus) aStatus = new AIS_GlobalStatus (AIS_DS_Displayed, theDispMode, theSelectionMode); + myObjects.Bind (theIObj, aStatus); + } + else + myObjects.UnBind (theIObj); + + for (PrsMgr_ListOfPresentableObjectsIter aPrsIter (theIObj->Children()); aPrsIter.More(); aPrsIter.Next()) + { + Handle(AIS_InteractiveObject) aChild (Handle(AIS_InteractiveObject)::DownCast (aPrsIter.Value())); + if (aChild.IsNull()) + continue; + + setObjectStatus (aChild, theStatus, theDispMode, theSelectionMode); + } +} diff --git a/src/AIS/AIS_InteractiveContext.hxx b/src/AIS/AIS_InteractiveContext.hxx index 1a5597531c..b136388c85 100644 --- a/src/AIS/AIS_InteractiveContext.hxx +++ b/src/AIS/AIS_InteractiveContext.hxx @@ -469,13 +469,23 @@ public: //! @name Selection management return AddSelect (theObject->GlobalSelOwner()); } - //! Returns selection scheme used in Select - AIS_SelectionScheme SelectionScheme (const AIS_SelectionType theType) const - { return mySelectionSchemes.Find (theType); } + //! Selects everything found in the bounding rectangle defined by the pixel minima and maxima, XPMin, YPMin, XPMax, and YPMax in the view. + //! The objects detected are passed to the main viewer, which is then updated. + Standard_EXPORT AIS_StatusOfPick Select (const Standard_Integer theXPMin, + const Standard_Integer theYPMin, + const Standard_Integer theXPMax, + const Standard_Integer theYPMax, + const Handle(V3d_View)& theView, + const AIS_SelectionScheme theSelScheme); + + //! polyline selection; clears the previous picked list + Standard_EXPORT AIS_StatusOfPick Select (const TColgp_Array1OfPnt2d& thePolyline, + const Handle(V3d_View)& theView, + const AIS_SelectionScheme theSelScheme); - //! Returns selection scheme used in Select - void SetSelectionScheme (const AIS_SelectionType theType, const AIS_SelectionScheme theScheme) - { mySelectionSchemes.Bind (theType, theScheme); } + //! Stores and hilights the previous detected; Unhilights the previous picked. + //! @sa MoveTo(). + Standard_EXPORT AIS_StatusOfPick Select (const AIS_SelectionScheme theSelScheme); //! Selects everything found in the bounding rectangle defined by the pixel minima and maxima, XPMin, YPMin, XPMax, and YPMax in the view. //! The objects detected are passed to the main viewer, which is then updated. @@ -515,6 +525,13 @@ public: //! @name Selection management const Handle(V3d_View)& theView, const Standard_Boolean theToUpdateViewer); + //! Sets list of owner selected/deselected using selection scheme + //! It is possible that selection of other objects is changed relatively selection scheme . + //! \param theOwner owners to change selection state + //! \param theSelScheme selection scheme + Standard_EXPORT AIS_StatusOfPick Select (const AIS_NListOfEntityOwner& theOwners, + const AIS_SelectionScheme theSelScheme); + //! Fits the view correspondingly to the bounds of selected objects. //! Infinite objects are ignored if infinite state of AIS_InteractiveObject is set to true. Standard_EXPORT void FitSelected (const Handle(V3d_View)& theView, @@ -1380,6 +1397,14 @@ protected: //! @name internal methods } } + //! Bind/Unbind status to object and object children + //! \param theIObj object + //! \param theStatus status, if NULL, unbind object + Standard_EXPORT void setObjectStatus (const Handle(AIS_InteractiveObject)& theIObj, + const AIS_DisplayStatus theStatus, + const Standard_Integer theDispyMode, + const Standard_Integer theSelectionMode); + protected: //! @name internal fields AIS_DataMapOfIOStatus myObjects; @@ -1399,8 +1424,6 @@ protected: //! @name internal fields SelectMgr_PickingStrategy myPickingStrategy; //!< picking strategy to be applied within MoveTo() Standard_Boolean myAutoHilight; Standard_Boolean myIsAutoActivateSelMode; - - NCollection_DataMap mySelectionSchemes; }; DEFINE_STANDARD_HANDLE(AIS_InteractiveContext, Standard_Transient) diff --git a/src/AIS/AIS_InteractiveContext_1.cxx b/src/AIS/AIS_InteractiveContext_1.cxx index aec3d2a25d..19dce11974 100644 --- a/src/AIS/AIS_InteractiveContext_1.cxx +++ b/src/AIS/AIS_InteractiveContext_1.cxx @@ -452,21 +452,13 @@ AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Integer theXPMi const Standard_Integer theXPMax, const Standard_Integer theYPMax, const Handle(V3d_View)& theView, - const Standard_Boolean toUpdateViewer) + const AIS_SelectionScheme theSelScheme) { if (theView->Viewer() != myMainVwr) { throw Standard_ProgramError ("AIS_InteractiveContext::Select() - invalid argument"); } - // all objects detected by the selector are taken, previous current objects are emptied, - // new objects are put... - if (myAutoHilight) - { - clearDynamicHighlight(); - UnhilightSelected (Standard_False); - } - myMainSel->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView); AIS_NListOfEntityOwner aPickedOwners; @@ -474,19 +466,8 @@ AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Integer theXPMi { aPickedOwners.Append (myMainSel->Picked (aPickIter)); } - mySelection->SelectOwners (aPickedOwners, SelectionScheme (AIS_SelectionType_SelectInRect), myFilters); - - if (myAutoHilight) - { - HilightSelected (toUpdateViewer); - } - - Standard_Integer aSelNum = NbSelected(); - return (aSelNum == 0) ? AIS_SOP_NothingSelected - : (aSelNum == 1) ? AIS_SOP_OneSelected - : AIS_SOP_SeveralSelected; - + return Select (aPickedOwners, theSelScheme); } //======================================================================= @@ -495,21 +476,13 @@ AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Integer theXPMi //======================================================================= AIS_StatusOfPick AIS_InteractiveContext::Select (const TColgp_Array1OfPnt2d& thePolyline, const Handle(V3d_View)& theView, - const Standard_Boolean toUpdateViewer) + const AIS_SelectionScheme theSelScheme) { if (theView->Viewer() != myMainVwr) { throw Standard_ProgramError ("AIS_InteractiveContext::Select() - invalid argument"); } - // all objects detected by the selector are taken, previous current objects are emptied, - // new objects are put... - if (myAutoHilight) - { - clearDynamicHighlight(); - UnhilightSelected (Standard_False); - } - myMainSel->Pick (thePolyline, theView); AIS_NListOfEntityOwner aPickedOwners; @@ -517,26 +490,15 @@ AIS_StatusOfPick AIS_InteractiveContext::Select (const TColgp_Array1OfPnt2d& the { aPickedOwners.Append (myMainSel->Picked (aPickIter)); } - mySelection->SelectOwners (aPickedOwners, SelectionScheme (AIS_SelectionType_SelectInPoly), myFilters); - if (myAutoHilight) - { - HilightSelected (toUpdateViewer); - } - - Standard_Integer aSelNum = NbSelected(); - - return (aSelNum == 0) ? AIS_SOP_NothingSelected - : (aSelNum == 1) ? AIS_SOP_OneSelected - : AIS_SOP_SeveralSelected; - + return Select (aPickedOwners, theSelScheme); } //======================================================================= //function : Select //purpose : //======================================================================= -AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Boolean toUpdateViewer) +AIS_StatusOfPick AIS_InteractiveContext::Select (const AIS_SelectionScheme theSelScheme) { // special case: single selection of detected owner - is it necessary ? /*if (myWasLastMain && !myLastinMain.IsNull() && !myAutoHilight && @@ -548,63 +510,53 @@ AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Boolean toUpdate return getStatusOfPick (NbSelected()); }*/ - if (myAutoHilight) - { - clearDynamicHighlight(); - UnhilightSelected (Standard_False); - } - AIS_NListOfEntityOwner aPickedOwners; aPickedOwners.Append (myLastinMain); - mySelection->SelectOwners (aPickedOwners, SelectionScheme (AIS_SelectionType_Select), myFilters); - if (myAutoHilight) - { - HilightSelected (toUpdateViewer); - } + return Select (aPickedOwners, theSelScheme); +} - if(toUpdateViewer) - { - UpdateCurrentViewer(); - } +//======================================================================= +//function : Select +//purpose : +//======================================================================= +AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Integer theXPMin, + const Standard_Integer theYPMin, + const Standard_Integer theXPMax, + const Standard_Integer theYPMax, + const Handle(V3d_View)& theView, + const Standard_Boolean) +{ + return Select (theXPMin, theYPMin, theXPMax, theYPMax, theView, AIS_SelectionScheme_ClearAndAdd); +} - Standard_Integer aSelNum = NbSelected(); +//======================================================================= +//function : Select +//purpose : Selection by polyline +//======================================================================= +AIS_StatusOfPick AIS_InteractiveContext::Select (const TColgp_Array1OfPnt2d& thePolyline, + const Handle(V3d_View)& theView, + const Standard_Boolean) +{ + return Select (thePolyline, theView, AIS_SelectionScheme_ClearAndAdd); +} - return (aSelNum == 0) ? AIS_SOP_NothingSelected - : (aSelNum == 1) ? AIS_SOP_OneSelected - : AIS_SOP_SeveralSelected; +//======================================================================= +//function : Select +//purpose : +//======================================================================= +AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Boolean) +{ + return Select (AIS_SelectionScheme_ClearAndAdd); } //======================================================================= //function : ShiftSelect //purpose : //======================================================================= -AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Boolean toUpdateViewer) +AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Boolean) { - AIS_NListOfEntityOwner aPrevSelected = mySelection->Objects(); - if (myAutoHilight) - { - clearDynamicHighlight(); - UnhilightSelected (Standard_False); - } - - AIS_NListOfEntityOwner aPickedOwners; - aPickedOwners.Append (myLastinMain); - mySelection->SelectOwners (aPickedOwners, SelectionScheme (AIS_SelectionType_ShiftSelect), myFilters); - - if (myAutoHilight) - { - HilightSelected (toUpdateViewer); - } - - if (toUpdateViewer) - UpdateCurrentViewer(); - - Standard_Integer aSelNum = NbSelected(); - - return (aSelNum == 0) ? AIS_SOP_NothingSelected - : (aSelNum == 1) ? AIS_SOP_OneSelected - : AIS_SOP_SeveralSelected; + return Select (AIS_SelectionScheme_Switch); } //======================================================================= @@ -616,39 +568,9 @@ AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Integer the const Standard_Integer theXPMax, const Standard_Integer theYPMax, const Handle(V3d_View)& theView, - const Standard_Boolean toUpdateViewer) + const Standard_Boolean) { - if (theView->Viewer() != myMainVwr) - { - throw Standard_ProgramError ("AIS_InteractiveContext::ShiftSelect() - invalid argument"); - } - - AIS_NListOfEntityOwner aPrevSelected = mySelection->Objects(); - if (myAutoHilight) - { - clearDynamicHighlight(); - UnhilightSelected (Standard_False); - } - myMainSel->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView); - - AIS_NListOfEntityOwner aPickedOwners; - for (Standard_Integer aPickIter = 1; aPickIter <= myMainSel->NbPicked(); ++aPickIter) - { - aPickedOwners.Append (myMainSel->Picked (aPickIter)); - } - mySelection->SelectOwners (aPickedOwners, SelectionScheme (AIS_SelectionType_ShiftSelectInRect), myFilters); - - if (myAutoHilight) - { - HilightSelected (toUpdateViewer); - } - - Standard_Integer aSelNum = NbSelected(); - - return (aSelNum == 0) ? AIS_SOP_NothingSelected - : (aSelNum == 1) ? AIS_SOP_OneSelected - : AIS_SOP_SeveralSelected; - + return Select (theXPMin, theYPMin, theXPMax, theYPMax, theView, AIS_SelectionScheme_Switch); } //======================================================================= @@ -657,31 +579,31 @@ AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Integer the //======================================================================= AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const TColgp_Array1OfPnt2d& thePolyline, const Handle(V3d_View)& theView, - const Standard_Boolean toUpdateViewer) + const Standard_Boolean) { - if (theView->Viewer() != myMainVwr) - { - throw Standard_ProgramError ("AIS_InteractiveContext::ShiftSelect() - invalid argument"); - } + return Select (thePolyline, theView, AIS_SelectionScheme_Switch); +} - AIS_NListOfEntityOwner aPrevSelected = mySelection->Objects(); +//======================================================================= +//function : Select +//purpose : +//======================================================================= +AIS_StatusOfPick AIS_InteractiveContext::Select (const AIS_NListOfEntityOwner& theOwners, + const AIS_SelectionScheme theSelScheme) +{ + // all objects detected by the selector are taken, previous current objects are emptied, + // new objects are put... if (myAutoHilight) { clearDynamicHighlight(); UnhilightSelected (Standard_False); } - myMainSel->Pick (thePolyline, theView); - AIS_NListOfEntityOwner aPickedOwners; - for (Standard_Integer aPickIter = 1; aPickIter <= myMainSel->NbPicked(); ++aPickIter) - { - aPickedOwners.Append (myMainSel->Picked (aPickIter)); - } - mySelection->SelectOwners (aPickedOwners, SelectionScheme (AIS_SelectionType_ShiftSelectInPoly), myFilters); + mySelection->SelectOwners (theOwners, theSelScheme, myFilters); if (myAutoHilight) { - HilightSelected (toUpdateViewer); + HilightSelected (Standard_False); } Standard_Integer aSelNum = NbSelected(); diff --git a/src/AIS/AIS_SelectionScheme.hxx b/src/AIS/AIS_SelectionScheme.hxx index d34c3f40c3..0dc03a367c 100644 --- a/src/AIS/AIS_SelectionScheme.hxx +++ b/src/AIS/AIS_SelectionScheme.hxx @@ -20,12 +20,15 @@ //! It is possible to use combination of schemes. enum AIS_SelectionScheme { + AIS_SelectionScheme_Empty = 0x0000, // do nothing AIS_SelectionScheme_Clear = 0x0001, // clears current selection AIS_SelectionScheme_Add = 0x0002, // add detected object to current selection AIS_SelectionScheme_Switch = 0x0004, // switch selection state in values selected/deselected AIS_SelectionScheme_PickedIfEmpty = 0x0008, // if after switch, result selection is empty, select picked objects AIS_SelectionScheme_ClearAndSwitch = AIS_SelectionScheme_Clear | AIS_SelectionScheme_Switch, - AIS_SelectionScheme_ClearAndAdd = AIS_SelectionScheme_Clear | AIS_SelectionScheme_Add + AIS_SelectionScheme_ClearAndAdd = AIS_SelectionScheme_Clear | AIS_SelectionScheme_Add, + AIS_SelectionScheme_ClearAndSwitchAndPicked = AIS_SelectionScheme_ClearAndSwitch | AIS_SelectionScheme_PickedIfEmpty, + AIS_SelectionScheme_Custom // reserved item for custom selection scheme }; #endif // _AIS_SelectionScheme_HeaderFile -- 2.39.5