From: sshutina Date: Fri, 13 Dec 2019 13:27:51 +0000 (+0300) Subject: 0031221: Visualization - selection filter in context X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=68d804c4e7a76e05369807cf01657965c65ddde6;p=occt-copy.git 0031221: Visualization - selection filter in context --- diff --git a/src/AIS/AIS_InteractiveContext_1.cxx b/src/AIS/AIS_InteractiveContext_1.cxx index 6252c69fd5..bdf4d9852f 100644 --- a/src/AIS/AIS_InteractiveContext_1.cxx +++ b/src/AIS/AIS_InteractiveContext_1.cxx @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -351,7 +352,7 @@ AIS_StatusOfDetection AIS_InteractiveContext::MoveTo (const Standard_Integer th { Handle(SelectMgr_EntityOwner) anOwner = myMainSel->Picked (aDetIter); if (anOwner.IsNull() - || !myFilters->IsOk (anOwner)) + || !myFilters->IsOk (anOwner, SelectMgr_FilterReaction_Highlight)) { if (myPickingStrategy == SelectMgr_PickingStrategy_OnlyTopmost) { @@ -837,7 +838,7 @@ void AIS_InteractiveContext::SetSelected (const Handle(AIS_InteractiveObject)& t for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next()) { const Handle(SelectMgr_EntityOwner)& aSelOwner = aSelIter.Value(); - if (!myFilters->IsOk (aSelOwner)) + if (!myFilters->IsOk (aSelOwner, SelectMgr_FilterReaction_Select)) { continue; } @@ -885,7 +886,7 @@ void AIS_InteractiveContext::SetSelected (const Handle(AIS_InteractiveObject)& t void AIS_InteractiveContext::SetSelected (const Handle(SelectMgr_EntityOwner)& theOwner, const Standard_Boolean theToUpdateViewer) { - if (theOwner.IsNull() || !theOwner->HasSelectable() || !myFilters->IsOk (theOwner)) + if (theOwner.IsNull() || !theOwner->HasSelectable() || !myFilters->IsOk (theOwner, SelectMgr_FilterReaction_Select)) return; const Handle(AIS_InteractiveObject) anObject = Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable()); @@ -961,7 +962,7 @@ void AIS_InteractiveContext::AddOrRemoveSelected (const Handle(SelectMgr_EntityO if (theOwner.IsNull() || !theOwner->HasSelectable()) return; - if (!myFilters->IsOk(theOwner) && !theOwner->IsSelected()) + if (!myFilters->IsOk(theOwner, SelectMgr_FilterReaction_Select) && !theOwner->IsSelected()) return; mySelection->Select (theOwner); diff --git a/src/SelectMgr/FILES b/src/SelectMgr/FILES index a51f8d0eb1..3c05be68b8 100755 --- a/src/SelectMgr/FILES +++ b/src/SelectMgr/FILES @@ -11,6 +11,7 @@ SelectMgr_EntityOwner.cxx SelectMgr_EntityOwner.hxx SelectMgr_Filter.cxx SelectMgr_Filter.hxx +SelectMgr_FilterReaction.hxx SelectMgr_Frustum.hxx SelectMgr_Frustum.lxx SelectMgr_FrustumBuilder.cxx diff --git a/src/SelectMgr/SelectMgr_AndFilter.cxx b/src/SelectMgr/SelectMgr_AndFilter.cxx index 15425280b5..03f9530e6b 100644 --- a/src/SelectMgr/SelectMgr_AndFilter.cxx +++ b/src/SelectMgr/SelectMgr_AndFilter.cxx @@ -24,11 +24,12 @@ IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_AndFilter,SelectMgr_CompositionFilter) SelectMgr_AndFilter::SelectMgr_AndFilter() { } -Standard_Boolean SelectMgr_AndFilter::IsOk(const Handle(SelectMgr_EntityOwner)& anobj) const +Standard_Boolean SelectMgr_AndFilter::IsOk(const Handle(SelectMgr_EntityOwner)& theObj, + const SelectMgr_FilterReaction& theReaction) const { SelectMgr_ListIteratorOfListOfFilter it(myFilters); - for ( ; it.More();it.Next()) - if(!it.Value()->IsOk(anobj)) + for ( ; it.More();it.Next()) + if(!it.Value()->IsOk(theObj, theReaction)) return Standard_False; return Standard_True; } diff --git a/src/SelectMgr/SelectMgr_AndFilter.hxx b/src/SelectMgr/SelectMgr_AndFilter.hxx index 9b76728b4b..5406056738 100644 --- a/src/SelectMgr/SelectMgr_AndFilter.hxx +++ b/src/SelectMgr/SelectMgr_AndFilter.hxx @@ -40,9 +40,11 @@ public: //! more types of entity. Standard_EXPORT SelectMgr_AndFilter(); - Standard_EXPORT Standard_Boolean IsOk (const Handle(SelectMgr_EntityOwner)& anobj) const Standard_OVERRIDE; - + Standard_EXPORT Standard_Boolean IsOk (const Handle(SelectMgr_EntityOwner)& anobj) const Standard_OVERRIDE + { return Standard_False; } + Standard_EXPORT virtual Standard_Boolean IsOk (const Handle(SelectMgr_EntityOwner)& theObj, + const SelectMgr_FilterReaction& theReaction) const; DEFINE_STANDARD_RTTIEXT(SelectMgr_AndFilter,SelectMgr_CompositionFilter) diff --git a/src/SelectMgr/SelectMgr_Filter.hxx b/src/SelectMgr/SelectMgr_Filter.hxx index af9cf7e8b3..be2a82bf0d 100644 --- a/src/SelectMgr/SelectMgr_Filter.hxx +++ b/src/SelectMgr/SelectMgr_Filter.hxx @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -60,6 +61,24 @@ public: //! virtual function ActsOn. Standard_EXPORT virtual Standard_Boolean IsOk (const Handle(SelectMgr_EntityOwner)& anObj) const = 0; + //! Indicates that the selected Interactive Object + //! passes the filter. The owner, anObj, can be either + //! direct or user. A direct owner is the corresponding + //! construction element, whereas a user is the + //! compound shape of which the entity forms a part. + //! When an object is detected by the mouse - in AIS, + //! this is done through a context selector - its owner + //! is passed to the filter as an argument. + //! If the object returns Standard_True, it is kept; if + //! not, it is rejected. + //! If you are creating a filter class inheriting this + //! framework, and the daughter class is to be used in + //! an AIS local context, you will need to implement the + //! virtual function ActsOn. + Standard_EXPORT virtual Standard_Boolean IsOk (const Handle(SelectMgr_EntityOwner)& theObj, + const SelectMgr_FilterReaction& theReaction) + { return IsOk (theObj); } + //! Returns true in an AIS local context, if this filter //! operates on a type of subshape defined in a filter //! class inheriting this framework. diff --git a/src/SelectMgr/SelectMgr_FilterReaction.hxx b/src/SelectMgr/SelectMgr_FilterReaction.hxx new file mode 100644 index 0000000000..939adb1565 --- /dev/null +++ b/src/SelectMgr/SelectMgr_FilterReaction.hxx @@ -0,0 +1,26 @@ +// 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 _SelectMgr_FilterReaction_HeaderFile +#define _SelectMgr_FilterReaction_HeaderFile + +//! Enumeration defines picking reaction - which action causes the filter check +enum SelectMgr_FilterReaction +{ + SelectMgr_FilterReaction_Empty = 0x0000, //!< do nothing + SelectMgr_FilterReaction_Highlight = 0x0001, //!< the reaction to highlght presentation (MoveTo) + SelectMgr_FilterReaction_Select = 0x0002, //!< the reaction to highlght presentation (Select) + SelectMgr_FilterReaction_SelectAndHighlight = SelectMgr_FilterReaction_Highlight | SelectMgr_FilterReaction_Select +}; + +#endif // _SelectMgr_FilterReaction_HeaderFile