"""
This submodule is a collection of data providers that are used to extract information from a given Revit model.
"""
from abc import ABCMeta, abstractmethod, abstractproperty
[docs]class AbstractDataProvider(object):
"""
The abstract data provider. A data provider must implement a ``run()`` method
that actually defines the extracted data.
"""
__metaclass__ = ABCMeta
[docs] def __init__(self, config):
"""
Init a new data provider with a given configuration.
Args:
config (dict): The data provider configuration
"""
self.config = config
def _filterElements(self):
"""
Filter elements in the target model by applying all filters that
are defined in the configuration.
Returns:
list: The list of filtered elements
"""
import revitron
filters = self.config.get('filters')
fltr = revitron.Filter()
for f in filters:
evaluator = getattr(revitron.Filter, f.get('rule'))
fltr = evaluator(fltr, *f.get('args'))
return fltr.noTypes().getElements()
[docs] @abstractmethod
def run(self):
"""
The abstract method for data extraction. This method
must be implemented by a data provider.
"""
pass
@property
def dataType(self):
"""
The data type property defines the data type of the provided data in the database.
Returns:
string: The data type that is used for provided values in the database
"""
return 'integer'
@abstractproperty
def valueType(self):
"""
The value type property defines the type of the provided data in the database, such as
length, area, volume or count.
Returns:
string: The value type
"""
pass
[docs]class ElementCountProvider(AbstractDataProvider):
"""
This data provider returns the count of filtered elements after applying all
filters that are defined in the provider configuration.
"""
[docs] def run(self):
"""
Run the data provider and return the number of filtered elements.
Returns:
integer: The number of filtered elements
"""
return len(self._filterElements())
@property
def valueType(self):
"""
The value type for the counter is ``count``.
Returns:
string: The value type
"""
return 'num'
[docs]class ElementAreaProvider(AbstractDataProvider):
"""
This data provider returns the accumulated area of a set of elements after applying all
filters that are defined in the provider configuration.
"""
[docs] def run(self):
"""
Apply filters and accumulate the area of the filtered elements.
Returns:
integer: The accumulated area
"""
from revitron import _
area = 0.0
for element in self._filterElements():
area += _(element).getParameter('Area').getDouble()
return round(area, 3)
@property
def dataType(self):
"""
The area data type is ``real``.
Returns:
string: The data type
"""
return 'real'
@property
def valueType(self):
"""
The value type is ``area``.
Returns:
string: The value type
"""
return 'are'
[docs]class ElementVolumeProvider(AbstractDataProvider):
"""
This data provider returns the accumulated area of a set of elements after applying all
filters that are defined in the provider configuration.
"""
[docs] def run(self):
"""
Apply filters and accumulate the volume of the filtered elements.
Returns:
integer: The accumulated area
"""
from revitron import _
volume = 0.0
for element in self._filterElements():
volume += _(element).getParameter('Volume').getDouble()
return round(volume, 3)
@property
def dataType(self):
"""
The volume data type is ``real``.
Returns:
string: The data type
"""
return 'real'
@property
def valueType(self):
"""
The value type is ``volume``.
Returns:
string: The value type
"""
return 'vol'
[docs]class ElementLengthProvider(AbstractDataProvider):
"""
This data provider returns the accumulated length of a set of elements after applying all
filters that are defined in the provider configuration.
"""
[docs] def run(self):
"""
Apply filters and accumulate the length of the filtered elements.
Returns:
integer: The accumulated length
"""
from revitron import _
length = 0.0
for element in self._filterElements():
length += _(element).getParameter('Length').getDouble()
return round(length, 3)
@property
def dataType(self):
"""
The length data type is ``real``.
Returns:
string: The data type
"""
return 'real'
@property
def valueType(self):
"""
The value type is ``length``.
Returns:
string: The value type
"""
return 'len'
[docs]class WarningCountProvider(AbstractDataProvider):
"""
This data provider returns the number of warnings in a model.
"""
[docs] def run(self):
"""
Get the number of warnings.
Returns:
integer: The number of warnings
"""
import revitron
return len(revitron.DOC.GetWarnings())
@property
def valueType(self):
"""
The value type is ``count``.
Returns:
string: The value type
"""
return 'num'