From bd970341a9481bfeee18824a23068e87e0cb6602 Mon Sep 17 00:00:00 2001 From: age Date: Tue, 24 Nov 2020 10:25:32 +0300 Subject: [PATCH] Revert "0030737: Visualization - implementing new selection schemes in context" This reverts commit 502194e4fca701d2a5cf7e54e62862ff9c90db03. # Conflicts: # src/AIS/AIS_Selection.cxx --- src/AIS/AIS_InteractiveContext.hxx | 26 ---- src/AIS/AIS_InteractiveContext_1.cxx | 218 +++++++++++++++------------ src/AIS/AIS_Selection.cxx | 70 --------- src/AIS/AIS_Selection.hxx | 24 --- src/AIS/AIS_SelectionScheme.hxx | 34 ----- src/AIS/FILES | 1 - 6 files changed, 124 insertions(+), 249 deletions(-) delete mode 100644 src/AIS/AIS_SelectionScheme.hxx diff --git a/src/AIS/AIS_InteractiveContext.hxx b/src/AIS/AIS_InteractiveContext.hxx index a30f9f94f8..8f26fb51fe 100644 --- a/src/AIS/AIS_InteractiveContext.hxx +++ b/src/AIS/AIS_InteractiveContext.hxx @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include @@ -476,24 +475,6 @@ public: //! @name Selection management return AddSelect (theObject->GlobalSelOwner()); } - //! 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); - - //! 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. Standard_EXPORT AIS_StatusOfPick Select (const Standard_Integer theXPMin, @@ -535,13 +516,6 @@ public: //! @name Selection management //! Returns bounding box of selected objects. Standard_EXPORT Bnd_Box BoundingBoxOfSelection() const; - //! 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, diff --git a/src/AIS/AIS_InteractiveContext_1.cxx b/src/AIS/AIS_InteractiveContext_1.cxx index f448ece0b7..5f317a1484 100644 --- a/src/AIS/AIS_InteractiveContext_1.cxx +++ b/src/AIS/AIS_InteractiveContext_1.cxx @@ -495,37 +495,38 @@ AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Integer theXPMi const Standard_Integer theXPMax, const Standard_Integer theYPMax, const Handle(V3d_View)& theView, - const AIS_SelectionScheme theSelScheme) + const Standard_Boolean toUpdateViewer) { 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... + ClearSelected (Standard_False); myLastActiveView = theView.get(); - if (!myLastPicked.IsNull()) + myMainSel->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView); + for (Standard_Integer aPickIter = 1; aPickIter <= myMainSel->NbPicked(); ++aPickIter) { - Graphic3d_Vec2i aMousePos (-1, -1); - if (myMainSel->GetManager().GetActiveSelectionType() == SelectBasics_SelectingVolumeManager::Point) - { - aMousePos.SetValues ((Standard_Integer )myMainSel->GetManager().GetMousePosition().X(), - (Standard_Integer )myMainSel->GetManager().GetMousePosition().Y()); - } - if (myLastPicked->HandleMouseClick (aMousePos, Aspect_VKeyMouse_LeftButton, Aspect_VKeyFlags_NONE, false)) - { - return AIS_SOP_NothingSelected; - } - } + const Handle(SelectMgr_EntityOwner)& aCurOwner = myMainSel->Picked (aPickIter); + if (aCurOwner.IsNull() || !aCurOwner->HasSelectable() || !myFilters->IsOk (aCurOwner)) + continue; - myMainSel->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView); + mySelection->Select (aCurOwner); + } - AIS_NListOfEntityOwner aPickedOwners; - for (Standard_Integer aPickIter = 1; aPickIter <= myMainSel->NbPicked(); ++aPickIter) + if (myAutoHilight) { - aPickedOwners.Append (myMainSel->Picked (aPickIter)); + HilightSelected (toUpdateViewer); } - return Select (aPickedOwners, theSelScheme); + Standard_Integer aSelNum = NbSelected(); + + return (aSelNum == 0) ? AIS_SOP_NothingSelected + : (aSelNum == 1) ? AIS_SOP_OneSelected + : AIS_SOP_SeveralSelected; + } //======================================================================= @@ -534,38 +535,48 @@ AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Integer theXPMi //======================================================================= AIS_StatusOfPick AIS_InteractiveContext::Select (const TColgp_Array1OfPnt2d& thePolyline, const Handle(V3d_View)& theView, - const AIS_SelectionScheme theSelScheme) + const Standard_Boolean toUpdateViewer) { 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... + ClearSelected (Standard_False); + myLastActiveView = theView.get(); myMainSel->Pick (thePolyline, theView); - - AIS_NListOfEntityOwner aPickedOwners; for (Standard_Integer aPickIter = 1; aPickIter <= myMainSel->NbPicked(); ++aPickIter) { - aPickedOwners.Append (myMainSel->Picked (aPickIter)); + const Handle(SelectMgr_EntityOwner) anOwner = myMainSel->Picked (aPickIter); + if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner)) + continue; + + mySelection->Select (anOwner); + } + + if (myAutoHilight) + { + HilightSelected (toUpdateViewer); } - return Select (aPickedOwners, theSelScheme); + Standard_Integer aSelNum = NbSelected(); + + return (aSelNum == 0) ? AIS_SOP_NothingSelected + : (aSelNum == 1) ? AIS_SOP_OneSelected + : AIS_SOP_SeveralSelected; + } //======================================================================= //function : Select //purpose : //======================================================================= -AIS_StatusOfPick AIS_InteractiveContext::Select (const AIS_SelectionScheme theSelScheme) +AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Boolean toUpdateViewer) { - // special case: single selection of detected owner - is it necessary ? - /*if (myWasLastMain && !myLastinMain.IsNull() && !myAutoHilight && - (myLastinMain->IsSelected() - && !myLastinMain->IsForcedHilight() - && NbSelected() <= 1)) + if (!myLastPicked.IsNull()) { - mySelection->selectOwner(myLastinMain, aPrevSelected, theSelScheme); - Graphic3d_Vec2i aMousePos (-1, -1); if (myMainSel->GetManager().GetActiveSelectionType() == SelectBasics_SelectingVolumeManager::Point) { @@ -576,65 +587,54 @@ AIS_StatusOfPick AIS_InteractiveContext::Select (const AIS_SelectionScheme theSe { return AIS_SOP_NothingSelected; } - return getStatusOfPick (NbSelected()); - }*/ - AIS_NListOfEntityOwner aPickedOwners; - if (!myLastPicked.IsNull() && - myLastPicked->HasSelectable()) - { - Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast(myLastPicked->Selectable()); - if (!anIO.IsNull() && - myObjects.IsBound(anIO)) + if (myAutoHilight) { - aPickedOwners.Append (myLastPicked); + clearDynamicHighlight(); + } + if (!myLastPicked->IsSelected() + || myLastPicked->IsForcedHilight() + || NbSelected() > 1) + { + SetSelected (myLastPicked, Standard_False); + if(toUpdateViewer) + { + UpdateCurrentViewer(); + } } } + else + { + ClearSelected (toUpdateViewer); + } - return Select (aPickedOwners, theSelScheme); -} - -//======================================================================= -//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); -} - -//======================================================================= -//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); -} + Standard_Integer aSelNum = NbSelected(); -//======================================================================= -//function : Select -//purpose : -//======================================================================= -AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Boolean) -{ - return Select (AIS_SelectionScheme_ClearAndAdd); + return (aSelNum == 0) ? AIS_SOP_NothingSelected + : (aSelNum == 1) ? AIS_SOP_OneSelected + : AIS_SOP_SeveralSelected; } //======================================================================= //function : ShiftSelect //purpose : //======================================================================= -AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Boolean) +AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Boolean toUpdateViewer) { - return Select (AIS_SelectionScheme_Switch); + if (myAutoHilight) + { + clearDynamicHighlight(); + } + if (!myLastPicked.IsNull()) + { + AddOrRemoveSelected (myLastPicked, toUpdateViewer); + } + + Standard_Integer aSelNum = NbSelected(); + + return (aSelNum == 0) ? AIS_SOP_NothingSelected + : (aSelNum == 1) ? AIS_SOP_OneSelected + : AIS_SOP_SeveralSelected; } //======================================================================= @@ -646,9 +646,39 @@ 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) + const Standard_Boolean toUpdateViewer) { - return Select (theXPMin, theYPMin, theXPMax, theYPMax, theView, AIS_SelectionScheme_Switch); + if (theView->Viewer() != myMainVwr) + { + throw Standard_ProgramError ("AIS_InteractiveContext::ShiftSelect() - invalid argument"); + } + + myLastActiveView = theView.get(); + if (myAutoHilight) + { + UnhilightSelected (Standard_False); + } + myMainSel->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView); + for (Standard_Integer aPickIter = 1; aPickIter <= myMainSel->NbPicked(); ++aPickIter) + { + const Handle(SelectMgr_EntityOwner) anOwner = myMainSel->Picked (aPickIter); + if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner)) + continue; + + mySelection->Select (anOwner); + } + + if (myAutoHilight) + { + HilightSelected (toUpdateViewer); + } + + Standard_Integer aSelNum = NbSelected(); + + return (aSelNum == 0) ? AIS_SOP_NothingSelected + : (aSelNum == 1) ? AIS_SOP_OneSelected + : AIS_SOP_SeveralSelected; + } //======================================================================= @@ -657,31 +687,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) + const Standard_Boolean toUpdateViewer) { - return Select (thePolyline, theView, AIS_SelectionScheme_Switch); -} + if (theView->Viewer() != myMainVwr) + { + throw Standard_ProgramError ("AIS_InteractiveContext::ShiftSelect() - invalid argument"); + } -//======================================================================= -//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... + myLastActiveView = theView.get(); if (myAutoHilight) { - clearDynamicHighlight(); UnhilightSelected (Standard_False); } + myMainSel->Pick (thePolyline, theView); + for (Standard_Integer aPickIter = 1; aPickIter <= myMainSel->NbPicked(); ++aPickIter) + { + const Handle(SelectMgr_EntityOwner) anOwner = myMainSel->Picked (aPickIter); + if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner)) + continue; - mySelection->SelectOwners (theOwners, theSelScheme, myFilters); + mySelection->Select (anOwner); + } if (myAutoHilight) { - HilightSelected (Standard_False); + HilightSelected (toUpdateViewer); } Standard_Integer aSelNum = NbSelected(); diff --git a/src/AIS/AIS_Selection.cxx b/src/AIS/AIS_Selection.cxx index 8569e8a2b7..e26bddf828 100644 --- a/src/AIS/AIS_Selection.cxx +++ b/src/AIS/AIS_Selection.cxx @@ -15,8 +15,6 @@ #include #include -#include -#include IMPLEMENT_STANDARD_RTTIEXT(AIS_Selection, Standard_Transient) @@ -132,71 +130,3 @@ AIS_SelectStatus AIS_Selection::AddSelect (const Handle(SelectMgr_EntityOwner)& theObject->SetSelected (Standard_True); return AIS_SS_Added; } - -//======================================================================= -//function : SelectOwners -//purpose : -//======================================================================= -void AIS_Selection::SelectOwners (const AIS_NListOfEntityOwner& thePickedOwners, - const int theSelScheme, - const Handle(SelectMgr_Filter)& theFilter) -{ - int aSelScheme = theSelScheme; - AIS_NListOfEntityOwner aPrevSelected = Objects(); - if (theSelScheme & AIS_SelectionScheme_Clear) - { - Clear(); - - if (theSelScheme & AIS_SelectionScheme_Switch && - theSelScheme & AIS_SelectionScheme_PickedIfEmpty && - thePickedOwners.Size() < aPrevSelected.Size()) - { - // check if all picked objects are in previous selected list, if so, all objects will be deselected, - // but in mode AIS_SelectionScheme_PickedIfEmpty new picked objects should be selected, here, after Clear, Add - Standard_Boolean anOtherFound = Standard_False; - for (AIS_NListOfEntityOwner::Iterator aSelIter (thePickedOwners); aSelIter.More(); aSelIter.Next()) - { - anOtherFound = !aPrevSelected.Contains (aSelIter.Value()); - if (anOtherFound) - break; - } - if (!anOtherFound) - aSelScheme = AIS_SelectionScheme_Add; - } - } - - for (AIS_NListOfEntityOwner::Iterator aSelIter (thePickedOwners); aSelIter.More(); aSelIter.Next()) - { - selectOwner(aSelIter.Value(), aPrevSelected, aSelScheme, theFilter); - } -} - -//======================================================================= -//function : selectOwner -//purpose : -//======================================================================= -AIS_SelectStatus AIS_Selection::selectOwner (const Handle(SelectMgr_EntityOwner)& theOwner, - const AIS_NListOfEntityOwner& thePreviousSelected, - const int theSelScheme, - const Handle(SelectMgr_Filter)& theFilter) -{ - if (theOwner.IsNull() || !theOwner->HasSelectable() || !theFilter->IsOk (theOwner)) - return AIS_SS_NotDone; - - if (theSelScheme & AIS_SelectionScheme_Add) - { - return AddSelect (theOwner); - } - else if (theSelScheme & AIS_SelectionScheme_Switch) - { - if (thePreviousSelected.Contains (theOwner)) // was selected, should not be now - { - if (theOwner->IsSelected()) - return Select (theOwner); // deselect - } - else - return AddSelect (theOwner); // was not selected, should be now - } - - return AIS_SS_NotDone; -} diff --git a/src/AIS/AIS_Selection.hxx b/src/AIS/AIS_Selection.hxx index dc56d6dad6..8e7cf50e91 100644 --- a/src/AIS/AIS_Selection.hxx +++ b/src/AIS/AIS_Selection.hxx @@ -22,8 +22,6 @@ #include #include -class SelectMgr_Filter; - //! Class holding the list of selected owners. class AIS_Selection : public Standard_Transient { @@ -77,28 +75,6 @@ public: //! Return selected object at iterator position. const Handle(SelectMgr_EntityOwner)& Value() const { return myIterator.Value(); } - //! Select or deselect owners depending on the selection scheme - //! \param theOwners elements to change selection state - //! \param theSelScheme selection scheme, defines how owner is selected - //! \param theFilter context filter to skip not acceptable owners - //! \return result of selection - Standard_EXPORT virtual void SelectOwners (const AIS_NListOfEntityOwner& thePickedOwners, - const int theSelScheme, - const Handle(SelectMgr_Filter)& theFilter); - -protected: - //! Select or deselect owner depending on the selection scheme - //! \param theOwner element to change selection state - //! \param thePreviousSelected previous selected objects - //! \param theSelScheme selection scheme, defines how owner is selected - //! \param theFilter context filter to skip not acceptable owners - //! \return result of selection - Standard_EXPORT virtual AIS_SelectStatus selectOwner (const Handle(SelectMgr_EntityOwner)& theOwner, - const AIS_NListOfEntityOwner& thePreviousSelected, - const int theSelScheme, - const Handle(SelectMgr_Filter)& theFilter); - - private: AIS_NListOfEntityOwner myresult; diff --git a/src/AIS/AIS_SelectionScheme.hxx b/src/AIS/AIS_SelectionScheme.hxx deleted file mode 100644 index 0dc03a367c..0000000000 --- a/src/AIS/AIS_SelectionScheme.hxx +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2019 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#ifndef _AIS_SelectionScheme_HeaderFile -#define _AIS_SelectionScheme_HeaderFile - - -//! Sets selection schemes for interactive contexts. -//! 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_ClearAndSwitchAndPicked = AIS_SelectionScheme_ClearAndSwitch | AIS_SelectionScheme_PickedIfEmpty, - AIS_SelectionScheme_Custom // reserved item for custom selection scheme -}; - -#endif // _AIS_SelectionScheme_HeaderFile diff --git a/src/AIS/FILES b/src/AIS/FILES index 1f9b18b48f..e5bebe3142 100644 --- a/src/AIS/FILES +++ b/src/AIS/FILES @@ -88,7 +88,6 @@ AIS_Selection.cxx AIS_Selection.hxx AIS_SelectStatus.hxx AIS_SelectionModesConcurrency.hxx -AIS_SelectionScheme.hxx AIS_SequenceOfInteractive.hxx AIS_Shape.cxx AIS_Shape.hxx -- 2.39.5