Skip to content

Commit

Permalink
Update filter.py
Browse files Browse the repository at this point in the history
  • Loading branch information
marcantondahmen committed Jan 18, 2021
1 parent b070f05 commit 3f05667
Showing 1 changed file with 42 additions and 15 deletions.
57 changes: 42 additions & 15 deletions revitron/filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,24 +94,18 @@ def applyStringFilter(self, paramName, value, evaluator, invert = False):
for valueProvider in revitron.ParameterValueProviders(paramName).get():
rule = revitron.DB.FilterStringRule(valueProvider, evaluator, value, True)
_filter = Filter()
# Try to get elements from the collector as base for the fresh collector.
# In case there was never a filter applied before, getting elements will raise an exception
# and new Filter() instance is created with the same scope.
try:
_filter.collector = revitron.DB.FilteredElementCollector(revitron.DOC, self.collector.ToElementIds())
except:
_filter.collector = Filter(self.scope).collector
_filter.collector = revitron.DB.FilteredElementCollector(revitron.DOC, self.getElementIds())
_filter.applyParameterFilter(rule, invert)
filters.append(_filter)

self.collector = filters[0].collector

if len(filters) > 1:
for i in range(1, len(filters)):
if not invert:
self.collector.UnionWith(filters[i].collector)
else:
self.collector.IntersectWith(filters[i].collector)
if len(filters):
self.collector = filters[0].collector
if len(filters) > 1:
for i in range(1, len(filters)):
if not invert:
self.collector.UnionWith(filters[i].collector)
else:
self.collector.IntersectWith(filters[i].collector)


def byIntersection(self, element):
Expand Down Expand Up @@ -217,6 +211,39 @@ def byStringContains(self, paramName, value, invert = False):
return self


def byStringContainsOneInCsv(self, paramName, csv, invert = False):
"""
Filters the collection by testing whether a string contains at lease one ot the items in a CSV list.
Note that by setting the ``invert`` to ``True``, all elements that match one of the items will be removed from the collection.
Args:
paramName (string): The name of the parameter
csv (string): A comma separated list of items
invert (bool, optional): Inverts the filter. Defaults to False.
Returns:
object: The Filter instance
"""
import revitron
filters = []
for item in csv.split(','):
_filter = Filter()
_filter.collector = revitron.DB.FilteredElementCollector(revitron.DOC, self.getElementIds())
_filter.byStringContains(paramName, item.strip(), invert)
filters.append(_filter)

if len(filters):
self.collector = filters[0].collector
if len(filters) > 1:
for i in range(1, len(filters)):
if not invert:
self.collector.UnionWith(filters[i].collector)
else:
self.collector.IntersectWith(filters[i].collector)
return self


def byStringEquals(self, paramName, value, invert = False):
"""
Filters the collection by a string that equals a parameter value.
Expand Down

0 comments on commit 3f05667

Please sign in to comment.