1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-29 14:00:49 +03:00

0031221: Visualization - selection filter in context

This commit is contained in:
sshutina
2019-12-13 16:27:51 +03:00
parent b6eba2db9b
commit 68d804c4e7
6 changed files with 59 additions and 9 deletions

View File

@@ -35,6 +35,7 @@
#include <SelectMgr_DisabledObjectsFilter.hxx> #include <SelectMgr_DisabledObjectsFilter.hxx>
#include <SelectMgr_EntityOwner.hxx> #include <SelectMgr_EntityOwner.hxx>
#include <SelectMgr_Filter.hxx> #include <SelectMgr_Filter.hxx>
#include <SelectMgr_FilterReaction.hxx>
#include <SelectMgr_OrFilter.hxx> #include <SelectMgr_OrFilter.hxx>
#include <SelectMgr_Selection.hxx> #include <SelectMgr_Selection.hxx>
#include <SelectMgr_SelectionManager.hxx> #include <SelectMgr_SelectionManager.hxx>
@@ -351,7 +352,7 @@ AIS_StatusOfDetection AIS_InteractiveContext::MoveTo (const Standard_Integer th
{ {
Handle(SelectMgr_EntityOwner) anOwner = myMainSel->Picked (aDetIter); Handle(SelectMgr_EntityOwner) anOwner = myMainSel->Picked (aDetIter);
if (anOwner.IsNull() if (anOwner.IsNull()
|| !myFilters->IsOk (anOwner)) || !myFilters->IsOk (anOwner, SelectMgr_FilterReaction_Highlight))
{ {
if (myPickingStrategy == SelectMgr_PickingStrategy_OnlyTopmost) 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()) for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
{ {
const Handle(SelectMgr_EntityOwner)& aSelOwner = aSelIter.Value(); const Handle(SelectMgr_EntityOwner)& aSelOwner = aSelIter.Value();
if (!myFilters->IsOk (aSelOwner)) if (!myFilters->IsOk (aSelOwner, SelectMgr_FilterReaction_Select))
{ {
continue; continue;
} }
@@ -885,7 +886,7 @@ void AIS_InteractiveContext::SetSelected (const Handle(AIS_InteractiveObject)& t
void AIS_InteractiveContext::SetSelected (const Handle(SelectMgr_EntityOwner)& theOwner, void AIS_InteractiveContext::SetSelected (const Handle(SelectMgr_EntityOwner)& theOwner,
const Standard_Boolean theToUpdateViewer) const Standard_Boolean theToUpdateViewer)
{ {
if (theOwner.IsNull() || !theOwner->HasSelectable() || !myFilters->IsOk (theOwner)) if (theOwner.IsNull() || !theOwner->HasSelectable() || !myFilters->IsOk (theOwner, SelectMgr_FilterReaction_Select))
return; return;
const Handle(AIS_InteractiveObject) anObject = Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable()); 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()) if (theOwner.IsNull() || !theOwner->HasSelectable())
return; return;
if (!myFilters->IsOk(theOwner) && !theOwner->IsSelected()) if (!myFilters->IsOk(theOwner, SelectMgr_FilterReaction_Select) && !theOwner->IsSelected())
return; return;
mySelection->Select (theOwner); mySelection->Select (theOwner);

View File

@@ -11,6 +11,7 @@ SelectMgr_EntityOwner.cxx
SelectMgr_EntityOwner.hxx SelectMgr_EntityOwner.hxx
SelectMgr_Filter.cxx SelectMgr_Filter.cxx
SelectMgr_Filter.hxx SelectMgr_Filter.hxx
SelectMgr_FilterReaction.hxx
SelectMgr_Frustum.hxx SelectMgr_Frustum.hxx
SelectMgr_Frustum.lxx SelectMgr_Frustum.lxx
SelectMgr_FrustumBuilder.cxx SelectMgr_FrustumBuilder.cxx

View File

@@ -24,11 +24,12 @@ IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_AndFilter,SelectMgr_CompositionFilter)
SelectMgr_AndFilter::SelectMgr_AndFilter() 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); SelectMgr_ListIteratorOfListOfFilter it(myFilters);
for ( ; it.More();it.Next()) for ( ; it.More();it.Next())
if(!it.Value()->IsOk(anobj)) if(!it.Value()->IsOk(theObj, theReaction))
return Standard_False; return Standard_False;
return Standard_True; return Standard_True;
} }

View File

@@ -40,9 +40,11 @@ public:
//! more types of entity. //! more types of entity.
Standard_EXPORT SelectMgr_AndFilter(); 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) DEFINE_STANDARD_RTTIEXT(SelectMgr_AndFilter,SelectMgr_CompositionFilter)

View File

@@ -20,6 +20,7 @@
#include <Standard.hxx> #include <Standard.hxx>
#include <Standard_Type.hxx> #include <Standard_Type.hxx>
#include <SelectMgr_FilterReaction.hxx>
#include <Standard_Transient.hxx> #include <Standard_Transient.hxx>
#include <Standard_Boolean.hxx> #include <Standard_Boolean.hxx>
#include <TopAbs_ShapeEnum.hxx> #include <TopAbs_ShapeEnum.hxx>
@@ -60,6 +61,24 @@ public:
//! virtual function ActsOn. //! virtual function ActsOn.
Standard_EXPORT virtual Standard_Boolean IsOk (const Handle(SelectMgr_EntityOwner)& anObj) const = 0; 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 //! Returns true in an AIS local context, if this filter
//! operates on a type of subshape defined in a filter //! operates on a type of subshape defined in a filter
//! class inheriting this framework. //! class inheriting this framework.

View File

@@ -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