1 // Copyright (c) 2020 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13 
14 #include <SelectMgr_AndOrFilter.hxx>
15 #include <SelectMgr_EntityOwner.hxx>
16 #include <SelectMgr_Filter.hxx>
17 #include <SelectMgr_ListIteratorOfListOfFilter.hxx>
18 #include <SelectMgr_SelectableObject.hxx>
19 #include <Standard_Type.hxx>
20 
IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_AndOrFilter,SelectMgr_CompositionFilter)21 IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_AndOrFilter, SelectMgr_CompositionFilter)
22 
23 //=============================================================================
24 //function : SelectMgr_AndOrFilter
25 //purpose  :
26 //=============================================================================
27 SelectMgr_AndOrFilter::SelectMgr_AndOrFilter (const SelectMgr_FilterType theFilterType):
28 myFilterType (theFilterType)
29 {
30 }
31 
32 //=============================================================================
33 //function : SetDisabledObjects
34 //purpose  :
35 //=============================================================================
SetDisabledObjects(const Handle (Graphic3d_NMapOfTransient)& theObjects)36 void SelectMgr_AndOrFilter::SetDisabledObjects (const Handle(Graphic3d_NMapOfTransient)& theObjects)
37 {
38   myDisabledObjects = theObjects;
39 }
40 
41 //=============================================================================
42 //function : IsOk
43 //purpose  :
44 //=============================================================================
IsOk(const Handle (SelectMgr_EntityOwner)& theObj) const45 Standard_Boolean SelectMgr_AndOrFilter::IsOk (const Handle(SelectMgr_EntityOwner)& theObj) const
46 {
47   const SelectMgr_SelectableObject* aSelectable = theObj->Selectable().operator->();
48   if (!myDisabledObjects.IsNull() && myDisabledObjects->Contains (aSelectable))
49   {
50     return Standard_False;
51   }
52 
53   for (SelectMgr_ListIteratorOfListOfFilter anIter(myFilters); anIter.More();anIter.Next())
54   {
55     Standard_Boolean isOK = anIter.Value()->IsOk(theObj);
56     if(isOK && myFilterType == SelectMgr_FilterType_OR)
57     {
58       return Standard_True;
59     }
60     else if (!isOK && myFilterType == SelectMgr_FilterType_AND)
61     {
62       return Standard_False;
63     }
64   }
65 
66   if (myFilterType == SelectMgr_FilterType_OR && !myFilters.IsEmpty())
67   {
68     return Standard_False;
69   }
70   return Standard_True;
71 }
72