Source code for honeybee_radiance.mutil
"""Modifier utility functions."""
import honeybee_radiance.modifier.material as material
import honeybee_radiance.modifier.mixture as mixture
import honeybee_radiance.modifier.pattern as pattern
import honeybee_radiance.modifier.texture as texture
from honeybee_radiance.primitive import Primitive, Void
_MAPPER = {'bsdf': 'BSDF', 'absdf': 'aBSDF', 'brtdfunc': 'BRTDfunc'}
[docs]
def modifier_class_from_type_string(type_string):
"""Get the class of any modifier using its 'type' string.
This function is equivalent to the primitive_class_from_type_string function
but it is only for modifiers (not geometry) and is slightly faster when one
is sure that the type_string is a modifier.
Note that this function returns the class itself and not a class instance.
Args:
type_string: Text for the name of a modifier module/class. This should
be the same as the 'type' key used in the dictionary representation
of the modifier.
"""
lower_str = type_string.lower()
if lower_str == 'void':
return Void
elif lower_str in Primitive.MATERIALTYPES:
target_module = material
elif lower_str in Primitive.MIXTURETYPES:
target_module = mixture
elif lower_str in Primitive.PATTERNTYPES:
target_module = pattern
elif lower_str in Primitive.TEXTURETYPES:
target_module = texture
else:
if lower_str in _MAPPER:
return getattr(material, _MAPPER[lower_str])
else:
raise ValueError('%s is not a Radiance modifier.' % type_string)
return getattr(target_module, lower_str.capitalize())
[docs]
def dict_to_modifier(mdict):
"""Convert a dictionary representation of any modifier to a class instance.
The returned object will have the correct class type and will not be the
generic Modifier base class. Note that this function is recursive and will
re-serialize modifiers of modifiers.
Args:
mdict: A dictionary of any Radiance Modifier.
"""
mod_class = modifier_class_from_type_string(mdict['type'])
if 'values' in mdict:
return mod_class.from_primitive_dict(mdict)
else:
return mod_class.from_dict(mdict)